[openchrome-devel] drm-openchrome: Branch 'drm-next-5.11' - 1899 commits - arch/alpha/kernel arch/arc/include arch/arc/kernel arch/arc/mm arch/arm64/boot arch/arm64/include arch/arm64/Kconfig arch/arm64/kernel arch/arm64/kvm arch/arm64/Makefile arch/arm64/mm arch/arm/boot arch/arm/configs arch/arm/include arch/arm/Kconfig arch/arm/kernel arch/arm/mach-imx arch/arm/mach-keystone arch/arm/mach-omap1 arch/arm/mach-omap2 arch/arm/mach-sunxi arch/arm/Makefile arch/arm/probes arch/csky/kernel arch/h8300/kernel arch/hexagon/kernel arch/ia64/include arch/ia64/kernel arch/Kconfig arch/microblaze/kernel arch/mips/alchemy arch/mips/include arch/mips/kernel arch/mips/mm arch/nios2/kernel arch/openrisc/kernel arch/parisc/kernel arch/powerpc/include arch/powerpc/Kconfig arch/powerpc/kernel arch/powerpc/kvm arch/powerpc/lib arch/powerpc/Makefile arch/powerpc/mm arch/powerpc/perf arch/powerpc/platforms arch/riscv/include arch/riscv/kernel arch/s390/configs arch/s390/kernel arch/s390/kvm arch/s390/lib arch/s39 0/mm arch/s390/pci arch/sh/kernel arch/sparc/kernel arch/sparc/lib arch/um/include arch/um/kernel arch/x86/boot arch/x86/events arch/x86/include arch/x86/Kconfig arch/x86/kernel arch/x86/kvm arch/x86/lib arch/x86/Makefile arch/x86/mm arch/x86/platform arch/x86/xen arch/xtensa/include arch/xtensa/mm block/blk-cgroup.c block/blk-flush.c block/blk-merge.c block/blk-settings.c block/genhd.c block/keyslot-manager.c CREDITS Documentation/ABI/testing Documentation/admin-guide/bootconfig.rst Documentation/admin-guide/kernel-parameters.txt Documentation/devicetree/bindings Documentation/dev-tools/kunit Documentation/driver-api/dma-buf.rst Documentation/driver-api/media Documentation/filesystems/ext4 Documentation/filesystems/journalling.rst Documentation/firmware-guide/acpi Documentation/kbuild/llvm.rst Documentation/networking/netdev-FAQ.rst Documentation/networking/phy.rst Documentation/process/stable-kernel-rules.rst Documentation/translations/it_IT Documentation/virt/kvm Documentation/xt ensa/mmu.rst drivers/accessibility/speakup drivers/acpi/acpi_video.c drivers/acpi/apei drivers/acpi/arm64 drivers/acpi/battery.c drivers/acpi/button.c drivers/acpi/dptf drivers/acpi/event.c drivers/acpi/evged.c drivers/acpi/fan.c drivers/acpi/internal.h drivers/acpi/nfit drivers/acpi/pci_irq.c drivers/acpi/pci_link.c drivers/acpi/pci_mcfg.c drivers/acpi/power.c drivers/acpi/processor_perflib.c drivers/acpi/sbs.c drivers/acpi/sbshc.c drivers/acpi/sbshc.h drivers/acpi/scan.c drivers/acpi/video_detect.c drivers/acpi/wakeup.c drivers/atm/nicstar.c drivers/block/loop.c drivers/block/nbd.c drivers/block/xen-blkback drivers/bus/ti-sysc.c drivers/char/agp drivers/char/virtio_console.c drivers/clk/imx drivers/clk/meson drivers/clk/qcom drivers/clk/renesas drivers/counter/ti-eqep.c drivers/cpufreq/cpufreq.c drivers/cpufreq/cpufreq_governor.h drivers/cpufreq/cpufreq_performance.c drivers/cpufreq/cpufreq_powersave.c drivers/cpufreq/intel_pstate.c drivers/cpufreq/scmi-cpufreq.c drivers/cpufreq/t egra186-cpufreq.c drivers/cpuidle/cpuidle-tegra.c drivers/dax/Kconfig drivers/dma-buf/dma-buf.c drivers/dma-buf/dma-resv.c drivers/dma-buf/heaps drivers/dma/dmaengine.c drivers/dma/idxd drivers/dma/ioat drivers/dma/pl330.c drivers/dma/ti drivers/dma/xilinx drivers/firmware/efi drivers/firmware/xilinx drivers/fpga/Kconfig drivers/gpio/gpio-arizona.c drivers/gpio/gpio-aspeed.c drivers/gpio/gpio-dwapb.c drivers/gpio/gpio-eic-sprd.c drivers/gpio/gpiolib.c drivers/gpio/gpiolib-cdev.h drivers/gpio/gpio-mvebu.c drivers/gpio/gpio-omap.c drivers/gpio/gpio-pcie-idio-24.c drivers/gpio/gpio-sifive.c drivers/gpio/gpio-zynq.c drivers/gpu/drm drivers/hid/hid-cypress.c drivers/hid/hid-ids.h drivers/hid/hid-input.c drivers/hid/hid-ite.c drivers/hid/hid-logitech-dj.c drivers/hid/hid-logitech-hidpp.c drivers/hid/hid-mcp2221.c drivers/hid/hid-quirks.c drivers/hid/hid-sensor-hub.c drivers/hid/hid-uclogic-core.c drivers/hid/hid-uclogic-params.c drivers/hid/i2c-hid drivers/hv/hv.c drivers/hwmon/amd_energy .c drivers/hwmon/applesmc.c drivers/hwmon/pmbus drivers/hwmon/pwm-fan.c drivers/i2c/busses drivers/idle/intel_idle.c drivers/iio/accel drivers/iio/adc drivers/iio/common drivers/iio/imu drivers/iio/light drivers/infiniband/core drivers/infiniband/hw drivers/infiniband/Kconfig drivers/infiniband/sw drivers/input/joystick drivers/input/keyboard drivers/input/misc drivers/input/mouse drivers/input/serio drivers/input/touchscreen drivers/interconnect/core.c drivers/interconnect/qcom drivers/iommu/amd drivers/iommu/arm drivers/iommu/intel drivers/iommu/iommu.c drivers/irqchip/irq-gic-v3-its.c drivers/irqchip/irq-sni-exiu.c drivers/Makefile drivers/md/dm.c drivers/md/dm-cache-target.c drivers/md/dm-integrity.c drivers/md/dm-raid.c drivers/md/dm-table.c drivers/md/dm-writecache.c drivers/md/md.c drivers/md/md.h drivers/md/raid0.c drivers/md/raid10.c drivers/md/raid10.h drivers/media/cec drivers/media/common drivers/media/platform drivers/media/rc drivers/media/test-drivers drivers/misc/eep rom drivers/misc/habanalabs drivers/misc/mei drivers/mmc/core drivers/mmc/host drivers/mtd/nand drivers/net/bonding drivers/net/can drivers/net/dsa drivers/net/ethernet drivers/net/geneve.c drivers/net/ipa drivers/net/netdevsim drivers/net/phy drivers/net/tun.c drivers/net/usb drivers/net/vrf.c drivers/net/vxlan.c drivers/net/wan drivers/net/wireless drivers/nfc/s3fwrn5 drivers/nvme/host drivers/of/address.c drivers/phy/broadcom drivers/phy/intel drivers/phy/mediatek drivers/phy/motorola drivers/phy/qualcomm drivers/phy/tegra drivers/pinctrl/aspeed drivers/pinctrl/intel drivers/pinctrl/pinctrl-amd.c drivers/pinctrl/pinctrl-ingenic.c drivers/pinctrl/pinctrl-mcp23s08_spi.c drivers/pinctrl/pinctrl-rockchip.c drivers/pinctrl/qcom drivers/platform/x86 drivers/powercap/powercap_sys.c drivers/ptp/ptp_clockmatrix.c drivers/pwm/pwm-sl28cpld.c drivers/regulator/core.c drivers/regulator/pfuze100-regulator.c drivers/regulator/ti-abb-regulator.c drivers/s390/block drivers/s390/net drivers/scsi/b e2iscsi drivers/scsi/bnx2i drivers/scsi/hisi_sas drivers/scsi/libiscsi.c drivers/scsi/megaraid drivers/scsi/mpt3sas drivers/scsi/scsi_lib.c drivers/scsi/storvsc_drv.c drivers/scsi/ufs drivers/soc/fsl drivers/spi/spi-bcm2835aux.c drivers/spi/spi-bcm2835.c drivers/spi/spi-bcm-qspi.c drivers/spi/spi.c drivers/spi/spi-cadence-quadspi.c drivers/spi/spi-dw-core.c drivers/spi/spi-fsi.c drivers/spi/spi-fsl-lpspi.c drivers/spi/spi-imx.c drivers/spi/spi-npcm-fiu.c drivers/spi/spi-nxp-fspi.c drivers/staging/android drivers/staging/media drivers/staging/mt7621-pci drivers/staging/ralink-gdma drivers/staging/rtl8723bs drivers/target/iscsi drivers/tee/amdtee drivers/tee/optee drivers/thermal/ti-soc-thermal drivers/thunderbolt/debugfs.c drivers/thunderbolt/icm.c drivers/thunderbolt/nhi.c drivers/thunderbolt/nhi.h drivers/thunderbolt/tb.h drivers/thunderbolt/usb4.c drivers/thunderbolt/xdomain.c drivers/tty/serial drivers/tty/tty_io.c drivers/tty/tty_jobctrl.c drivers/uio/uio.c drivers/usb/cdns3 dri vers/usb/class drivers/usb/core drivers/usb/gadget drivers/usb/host drivers/usb/musb drivers/usb/serial drivers/usb/storage drivers/usb/typec drivers/vdpa/Kconfig drivers/vhost/scsi.c drivers/vhost/vdpa.c drivers/vhost/vhost.c drivers/vhost/vhost.h drivers/vhost/vringh.c drivers/video/fbdev drivers/virt/nitro_enclaves drivers/xen/grant-table.c drivers/xen/swiotlb-xen.c drivers/xen/unpopulated-alloc.c drivers/xen/xen-scsiback.c fs/9p/vfs_file.c fs/afs/dir.c fs/afs/inode.c fs/afs/internal.h fs/afs/super.c fs/afs/write.c fs/aio.c fs/btrfs/block-rsv.c fs/btrfs/ctree.h fs/btrfs/dev-replace.c fs/btrfs/file.c fs/btrfs/inode.c fs/btrfs/ioctl.c fs/btrfs/qgroup.c fs/btrfs/ref-verify.c fs/btrfs/relocation.c fs/btrfs/scrub.c fs/btrfs/tests fs/btrfs/tree-checker.c fs/btrfs/volumes.c fs/cifs/cifsacl.c fs/cifs/connect.c fs/cifs/smb2ops.c fs/cifs/smb2pdu.c fs/cifs/smb2pdu.h fs/cifs/transport.c fs/coredump.c fs/crypto/inline_crypt.c fs/crypto/keysetup.c fs/efivarfs/inode.c fs/erofs/inode.c fs/erofs/ zdata.c fs/ext4/ext4.h fs/ext4/extents.c fs/ext4/fast_commit.c fs/ext4/fast_commit.h fs/ext4/file.c fs/ext4/fsmap.c fs/ext4/fsync.c fs/ext4/inline.c fs/ext4/inode.c fs/ext4/mballoc.c fs/ext4/namei.c fs/ext4/super.c fs/gfs2/aops.c fs/gfs2/bmap.c fs/gfs2/glock.c fs/gfs2/glops.c fs/gfs2/incore.h fs/gfs2/inode.c fs/gfs2/log.c fs/gfs2/rgrp.c fs/io_uring.c fs/jbd2/checkpoint.c fs/jbd2/commit.c fs/jbd2/journal.c fs/jbd2/recovery.c fs/jbd2/transaction.c fs/libfs.c fs/nfs/dir.c fs/nfsd/nfs3proc.c fs/nfsd/nfs3xdr.c fs/nfsd/nfs4proc.c fs/nfs/flexfilelayout fs/nfs/Kconfig fs/nfs/nfs42proc.c fs/nfs/nfs42xattr.c fs/nfs/nfs42xdr.c fs/nfs/nfs4file.c fs/nfs/nfs4proc.c fs/nfs/nfsroot.c fs/nfs/pagelist.c fs/notify/fsnotify.c fs/ocfs2/journal.c fs/ocfs2/super.c fs/proc/self.c fs/proc/task_mmu.c fs/seq_file.c fs/super.c fs/xfs/libxfs fs/xfs/scrub fs/xfs/xfs_iomap.c fs/xfs/xfs_iwalk.c fs/xfs/xfs_mount.c fs/xfs/xfs_pnfs.c fs/zonefs/super.c include/asm-generic/barrier.h include/asm-generic/percpu.h include /drm/drm_fb_helper.h include/drm/drm_gem_shmem_helper.h include/drm/drm_modeset_helper_vtables.h include/drm/drm_modes.h include/kunit/test.h include/linux/blkdev.h include/linux/bootconfig.h include/linux/build_bug.h include/linux/compiler-clang.h include/linux/compiler-gcc.h include/linux/compiler.h include/linux/compiler_types.h include/linux/cpufreq.h include/linux/dma-buf-map.h include/linux/elfcore.h include/linux/filter.h include/linux/firmware include/linux/fs.h include/linux/genhd.h include/linux/intel-iommu.h include/linux/irqdomain.h include/linux/jbd2.h include/linux/memcontrol.h include/linux/memory_hotplug.h include/linux/mlx5 include/linux/mm.h include/linux/netdevice.h include/linux/netfilter include/linux/nfs_page.h include/linux/numa.h include/linux/pagemap.h include/linux/perf_event.h include/linux/perf_regs.h include/linux/pgtable.h include/linux/platform_data include/linux/pm_runtime.h include/linux/sched.h include/linux/security.h include/linux/spi include/linu x/stmmac.h include/linux/swiotlb.h include/linux/tty.h include/linux/zsmalloc.h include/net/bonding.h include/net/inet_ecn.h include/net/inet_hashtables.h include/net/ip_tunnels.h include/net/ipv6_frag.h include/net/neighbour.h include/net/netfilter include/net/tls.h include/net/xdp.h include/net/xdp_sock.h include/net/xsk_buff_pool.h include/scsi/libiscsi.h include/soc/mscc include/sound/rt1015.h include/trace/events include/uapi/drm include/uapi/linux include/xen/grant_table.h init/initramfs.c init/Kconfig init/main.c kernel/bpf/bpf_lsm.c kernel/bpf/core.c kernel/bpf/hashtab.c kernel/bpf/helpers.c kernel/bpf/Makefile kernel/bpf/preload kernel/bpf/verifier.c kernel/cpu.c kernel/dma/swiotlb.c kernel/elfcore.c kernel/events/core.c kernel/events/internal.h kernel/events/ring_buffer.c kernel/exit.c kernel/fail_function.c kernel/futex.c kernel/irq/irqdomain.c kernel/locking/lockdep.c kernel/Makefile kernel/panic.c kernel/printk/printk.c kernel/printk/printk_ringbuffer.c kernel/ptrace.c kernel/rcu/tree.c kernel/rcu/tree_stall.h kernel/reboot.c kernel/sched/core.c kernel/sched/cpufreq_schedutil.c kernel/sched/deadline.c kernel/sched/debug.c kernel/sched/fair.c kernel/sched/idle.c kernel/sched/membarrier.c kernel/seccomp.c kernel/trace/bpf_trace.c kernel/trace/ftrace.c kernel/trace/Kconfig kernel/trace/ring_buffer.c kernel/trace/trace.c kernel/trace/trace_hwlat.c kernel/watchdog.c lib/Makefile lib/strncpy_from_user.c lib/syscall.c lib/zlib_dfltcc/dfltcc_inflate.c .mailmap MAINTAINERS Makefile mm/compaction.c mm/filemap.c mm/gup.c mm/huge_memory.c mm/hugetlb.c mm/hugetlb_cgroup.c mm/kasan/quarantine.c mm/Kconfig mm/list_lru.c mm/madvise.c mm/memcontrol.c mm/memory-failure.c mm/memory_hotplug.c mm/migrate.c mm/mmap.c mm/page_alloc.c mm/page-writeback.c mm/percpu.c mm/rmap.c mm/slab.h mm/slub.c mm/swapfile.c mm/util.c mm/vmscan.c mm/zsmalloc.c net/batman-adv/fragmentation.c net/batman-adv/hard-interface.c net/batman-adv/log.c net/bridge/br_device.c net/bridge/br_multica st.c net/bridge/br_netfilter_hooks.c net/bridge/br_private.h net/bridge/br_vlan.c net/can/af_can.c net/can/isotp.c net/core/dev.c net/core/devlink.c net/core/flow_offload.c net/core/gro_cells.c net/core/lwt_bpf.c net/core/neighbour.c net/core/netpoll.c net/core/skbuff.c net/core/skmsg.c net/core/xdp.c net/dccp/ipv4.c net/dccp/ipv6.c net/ethtool/bitset.c net/ethtool/features.c net/ipv4/arp.c net/ipv4/fib_frontend.c net/ipv4/inet_connection_sock.c net/ipv4/inet_diag.c net/ipv4/inet_hashtables.c net/ipv4/ip_tunnel_core.c net/ipv4/netfilter net/ipv4/route.c net/ipv4/syncookies.c net/ipv4/tcp_bbr.c net/ipv4/tcp_bpf.c net/ipv4/tcp_cong.c net/ipv4/tcp_input.c net/ipv4/tcp_ipv4.c net/ipv4/tcp_output.c net/ipv4/udp.c net/ipv4/udp_offload.c net/ipv6/addrconf.c net/ipv6/addrlabel.c net/ipv6/ah6.c net/ipv6/ip6_gre.c net/ipv6/ndisc.c net/ipv6/netfilter net/ipv6/reassembly.c net/ipv6/sit.c net/ipv6/syncookies.c net/ipv6/tcp_ipv6.c net/ipv6/udp_offload.c net/iucv/af_iucv.c net/mac80211/iface.c net /mac80211/mesh_pathtbl.c net/mac80211/rc80211_minstrel.c net/mac80211/rc80211_minstrel.h net/mac80211/sta_info.c net/mac80211/status.c net/mac80211/util.c net/mptcp/mib.c net/mptcp/protocol.c net/mptcp/subflow.c net/ncsi/ncsi-manage.c net/ncsi/ncsi-netlink.c net/ncsi/ncsi-netlink.h net/netfilter/ipset net/netfilter/ipvs net/netfilter/nf_tables_api.c net/netfilter/nf_tables_offload.c net/netfilter/nft_cmp.c net/netfilter/nft_ct.c net/netfilter/nft_dynset.c net/netfilter/nft_meta.c net/netfilter/nft_payload.c net/netfilter/x_tables.c net/netlabel/netlabel_unlabeled.c net/openvswitch/actions.c net/openvswitch/flow_netlink.c net/packet/af_packet.c net/rfkill/core.c net/rose/rose_loopback.c net/sched/act_mpls.c net/sched/cls_flower.c net/sched/sch_fq_pie.c net/sctp/input.c net/sctp/sm_sideeffect.c net/sctp/transport.c net/smc/af_smc.c net/smc/smc_core.c net/smc/smc_ib.c net/sunrpc/sysctl.c net/tipc/node.c net/tipc/topsrv.c net/tls/tls_device.c net/tls/tls_sw.c net/vmw_vsock/af_vsock.c ne t/vmw_vsock/virtio_transport_common.c net/wireless/nl80211.c net/x25/af_x25.c net/xdp/xdp_umem.c net/xdp/xdp_umem.h net/xdp/xsk_buff_pool.c net/xdp/xsk.c net/xdp/xsk_queue.h net/xfrm/xfrm_compat.c net/xfrm/xfrm_state.c samples/bpf/task_fd_query_user.c samples/bpf/tracex2_user.c samples/bpf/tracex3_user.c samples/bpf/xdp_redirect_cpu_user.c samples/bpf/xdp_rxq_info_user.c samples/ftrace/ftrace-direct.c samples/ftrace/ftrace-direct-modify.c samples/ftrace/ftrace-direct-too.c scripts/bpf_helpers_doc.py scripts/lld-version.sh scripts/Makefile.build scripts/Makefile.extrawarn scripts/package/builddeb security/selinux/ibpkey.c sound/core/control.c sound/firewire/fireworks sound/pci/hda sound/pci/mixart sound/soc/codecs sound/soc/intel sound/soc/qcom sound/usb/card.c sound/usb/mixer_maps.c sound/usb/mixer_us16x08.c sound/usb/quirks.c tools/arch/x86 tools/bootconfig/main.c tools/bootconfig/test-bootconfig.sh tools/bpf/bpftool tools/include/uapi tools/kvm/kvm_stat tools/lib/bpf tools/perf/ar ch tools/perf/bench tools/perf/builtin-diff.c tools/perf/builtin-inject.c tools/perf/builtin-lock.c tools/perf/tests tools/perf/util tools/power/x86 tools/testing/ktest tools/testing/kunit tools/testing/scatterlist tools/testing/selftests

Kevin Brace kevinbrace at kemper.freedesktop.org
Sat Dec 19 01:57:36 UTC 2020


 .mailmap                                                          |    8 
 CREDITS                                                           |   67 
 Documentation/ABI/testing/sysfs-bus-iio-timer-stm32               |   24 
 Documentation/admin-guide/bootconfig.rst                          |   20 
 Documentation/admin-guide/kernel-parameters.txt                   |    7 
 Documentation/dev-tools/kunit/faq.rst                             |    2 
 Documentation/dev-tools/kunit/style.rst                           |   18 
 Documentation/dev-tools/kunit/usage.rst                           |   10 
 Documentation/devicetree/bindings/clock/imx5-clock.yaml           |    2 
 Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml  |    6 
 Documentation/devicetree/bindings/display/panel/panel-simple.yaml |    2 
 Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml        |   18 
 Documentation/devicetree/bindings/net/can/tcan4x5x.txt            |    2 
 Documentation/devicetree/bindings/net/nfc/nxp-nci.txt             |    2 
 Documentation/devicetree/bindings/net/nfc/pn544.txt               |    2 
 Documentation/devicetree/bindings/sound/rt1015.txt                |    6 
 Documentation/driver-api/dma-buf.rst                              |    2 
 Documentation/driver-api/media/drivers/vidtv.rst                  |  120 
 Documentation/filesystems/ext4/journal.rst                        |    6 
 Documentation/filesystems/ext4/super.rst                          |    7 
 Documentation/filesystems/journalling.rst                         |    6 
 Documentation/firmware-guide/acpi/acpi-lid.rst                    |    8 
 Documentation/firmware-guide/acpi/gpio-properties.rst             |   55 
 Documentation/firmware-guide/acpi/method-tracing.rst              |    2 
 Documentation/kbuild/llvm.rst                                     |    5 
 Documentation/networking/netdev-FAQ.rst                           |   30 
 Documentation/networking/phy.rst                                  |    4 
 Documentation/process/stable-kernel-rules.rst                     |    2 
 Documentation/translations/it_IT/process/stable-kernel-rules.rst  |    2 
 Documentation/virt/kvm/api.rst                                    |    5 
 Documentation/virt/kvm/mmu.rst                                    |    2 
 Documentation/xtensa/mmu.rst                                      |    9 
 MAINTAINERS                                                       |  157 -
 Makefile                                                          |   16 
 arch/Kconfig                                                      |    9 
 arch/alpha/kernel/process.c                                       |    2 
 arch/arc/include/asm/bitops.h                                     |    4 
 arch/arc/include/asm/pgtable.h                                    |    2 
 arch/arc/kernel/stacktrace.c                                      |   56 
 arch/arc/mm/tlb.c                                                 |   24 
 arch/arm/Kconfig                                                  |    1 
 arch/arm/Makefile                                                 |    4 
 arch/arm/boot/compressed/Makefile                                 |    4 
 arch/arm/boot/compressed/head.S                                   |    3 
 arch/arm/boot/dts/am437x-l4.dtsi                                  |    2 
 arch/arm/boot/dts/dra76x.dtsi                                     |    4 
 arch/arm/boot/dts/exynos4412-odroid-common.dtsi                   |    1 
 arch/arm/boot/dts/imx50-evk.dts                                   |    2 
 arch/arm/boot/dts/imx6q-prti6q.dts                                |    4 
 arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi                     |    2 
 arch/arm/boot/dts/imx6qdl-udoo.dtsi                               |    2 
 arch/arm/boot/dts/imx6qdl-wandboard-revd1.dtsi                    |    1 
 arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts                           |    3 
 arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi                     |   19 
 arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi                      |    2 
 arch/arm/boot/dts/stm32mp15xx-dhcor-som.dtsi                      |    4 
 arch/arm/boot/dts/sun6i-a31-hummingbird.dts                       |    2 
 arch/arm/boot/dts/sun7i-a20-bananapi-m1-plus.dts                  |    2 
 arch/arm/boot/dts/sun7i-a20-bananapi.dts                          |    2 
 arch/arm/boot/dts/sun7i-a20-cubietruck.dts                        |    2 
 arch/arm/boot/dts/sun7i-a20-pcduino3-nano.dts                     |    4 
 arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts                      |    2 
 arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts                  |    2 
 arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dts                   |    5 
 arch/arm/boot/dts/sun8i-h3-orangepi-plus2e.dts                    |    2 
 arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts                 |    2 
 arch/arm/boot/dts/sun8i-s3-pinecube.dts                           |    2 
 arch/arm/boot/dts/sun8i-v3s.dtsi                                  |    2 
 arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts                 |   12 
 arch/arm/boot/dts/sun9i-a80-cubieboard4.dts                       |    2 
 arch/arm/boot/dts/sun9i-a80-optimus.dts                           |    2 
 arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi                     |    2 
 arch/arm/boot/dts/vf610-zii-dev-rev-b.dts                         |    3 
 arch/arm/configs/omap2plus_defconfig                              |    1 
 arch/arm/include/asm/kprobes.h                                    |   22 
 arch/arm/include/asm/pgtable-2level.h                             |    2 
 arch/arm/include/asm/pgtable-3level.h                             |    2 
 arch/arm/kernel/perf_regs.c                                       |    3 
 arch/arm/kernel/process.c                                         |    2 
 arch/arm/mach-imx/anatop.c                                        |    2 
 arch/arm/mach-keystone/memory.h                                   |    3 
 arch/arm/mach-omap1/board-osk.c                                   |    2 
 arch/arm/mach-omap2/Kconfig                                       |    3 
 arch/arm/mach-omap2/cpuidle44xx.c                                 |    8 
 arch/arm/mach-sunxi/sunxi.c                                       |    1 
 arch/arm/probes/kprobes/opt-arm.c                                 |   18 
 arch/arm64/Kconfig                                                |    1 
 arch/arm64/Makefile                                               |    4 
 arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts         |    2 
 arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts         |    2 
 arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts          |    2 
 arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts              |    3 
 arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts     |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h5-cc.dts   |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts      |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts          |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-prime.dts        |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts           |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts     |    2 
 arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts              |    2 
 arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts            |    2 
 arch/arm64/boot/dts/altera/socfpga_stratix10_socdk_nand.dts       |    2 
 arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi           |   20 
 arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dts        |    1 
 arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi                    |    1 
 arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi                    |    1 
 arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi                    |    1 
 arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi              |    2 
 arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi                     |    1 
 arch/arm64/boot/dts/freescale/imx8mm-var-som.dtsi                 |    9 
 arch/arm64/boot/dts/freescale/imx8mm.dtsi                         |    2 
 arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts                 |    1 
 arch/arm64/boot/dts/freescale/imx8mn-evk.dts                      |    1 
 arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi                 |    9 
 arch/arm64/boot/dts/freescale/imx8mn.dtsi                         |   30 
 arch/arm64/boot/dts/freescale/qoriq-fman3-0.dtsi                  |    1 
 arch/arm64/boot/dts/intel/socfpga_agilex_socdk.dts                |    2 
 arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts                |   12 
 arch/arm64/boot/dts/nvidia/tegra194-p3668-0000.dtsi               |    2 
 arch/arm64/boot/dts/nvidia/tegra194.dtsi                          |    2 
 arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi                    |   20 
 arch/arm64/boot/dts/nvidia/tegra234-sim-vdk.dts                   |    6 
 arch/arm64/boot/dts/qcom/ipq6018.dtsi                             |   72 
 arch/arm64/boot/dts/renesas/r8a774e1.dtsi                         |    6 
 arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts                |    1 
 arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts                |    2 
 arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi                   |    4 
 arch/arm64/boot/dts/rockchip/rk3399.dtsi                          |    3 
 arch/arm64/include/asm/cpufeature.h                               |    2 
 arch/arm64/include/asm/cputype.h                                  |    4 
 arch/arm64/include/asm/daifflags.h                                |    3 
 arch/arm64/include/asm/esr.h                                      |    1 
 arch/arm64/include/asm/exception.h                                |    5 
 arch/arm64/include/asm/kvm_emulate.h                              |    5 
 arch/arm64/include/asm/kvm_host.h                                 |    2 
 arch/arm64/include/asm/pgtable.h                                  |   34 
 arch/arm64/include/asm/probes.h                                   |    2 
 arch/arm64/include/asm/ptrace.h                                   |    4 
 arch/arm64/include/asm/sysreg.h                                   |    6 
 arch/arm64/kernel/cpu_errata.c                                    |    2 
 arch/arm64/kernel/cpufeature.c                                    |    2 
 arch/arm64/kernel/entry-common.c                                  |  254 +
 arch/arm64/kernel/entry.S                                         |   78 
 arch/arm64/kernel/irq.c                                           |   15 
 arch/arm64/kernel/kexec_image.c                                   |    2 
 arch/arm64/kernel/perf_regs.c                                     |    3 
 arch/arm64/kernel/process.c                                       |   15 
 arch/arm64/kernel/proton-pack.c                                   |    1 
 arch/arm64/kernel/psci.c                                          |    5 
 arch/arm64/kernel/sdei.c                                          |    7 
 arch/arm64/kernel/smp.c                                           |    1 
 arch/arm64/kernel/syscall.c                                       |    1 
 arch/arm64/kernel/traps.c                                         |   22 
 arch/arm64/kvm/arm.c                                              |   16 
 arch/arm64/kvm/hyp/nvhe/hyp.lds.S                                 |    5 
 arch/arm64/kvm/hyp/pgtable.c                                      |   17 
 arch/arm64/kvm/mmu.c                                              |   13 
 arch/arm64/kvm/sys_regs.c                                         |  191 -
 arch/arm64/kvm/sys_regs.h                                         |   16 
 arch/arm64/kvm/vgic/vgic-mmio-v3.c                                |   22 
 arch/arm64/mm/fault.c                                             |   25 
 arch/arm64/mm/mmu.c                                               |   17 
 arch/csky/kernel/perf_regs.c                                      |    3 
 arch/csky/kernel/process.c                                        |    2 
 arch/h8300/kernel/process.c                                       |    2 
 arch/hexagon/kernel/process.c                                     |    2 
 arch/ia64/include/asm/sparsemem.h                                 |    6 
 arch/ia64/kernel/process.c                                        |    2 
 arch/microblaze/kernel/process.c                                  |    2 
 arch/mips/alchemy/common/clock.c                                  |    9 
 arch/mips/include/asm/pgtable-32.h                                |    3 
 arch/mips/kernel/idle.c                                           |   12 
 arch/mips/kernel/setup.c                                          |    6 
 arch/mips/mm/tlb-r4k.c                                            |    1 
 arch/nios2/kernel/process.c                                       |    2 
 arch/openrisc/kernel/process.c                                    |    2 
 arch/parisc/kernel/process.c                                      |    2 
 arch/powerpc/Kconfig                                              |    1 
 arch/powerpc/Makefile                                             |    2 
 arch/powerpc/include/asm/book3s/32/pgtable.h                      |    2 
 arch/powerpc/include/asm/book3s/64/kup-radix.h                    |   68 
 arch/powerpc/include/asm/book3s/64/mmu.h                          |   12 
 arch/powerpc/include/asm/exception-64s.h                          |   12 
 arch/powerpc/include/asm/feature-fixups.h                         |   19 
 arch/powerpc/include/asm/kup.h                                    |   26 
 arch/powerpc/include/asm/mmzone.h                                 |    5 
 arch/powerpc/include/asm/nohash/32/pgtable.h                      |    2 
 arch/powerpc/include/asm/security_features.h                      |    7 
 arch/powerpc/include/asm/setup.h                                  |    4 
 arch/powerpc/include/asm/sparsemem.h                              |    5 
 arch/powerpc/kernel/exceptions-64s.S                              |   93 
 arch/powerpc/kernel/head_book3s_32.S                              |    3 
 arch/powerpc/kernel/idle.c                                        |    4 
 arch/powerpc/kernel/setup_64.c                                    |  122 
 arch/powerpc/kernel/syscall_64.c                                  |    2 
 arch/powerpc/kernel/vmlinux.lds.S                                 |   14 
 arch/powerpc/kvm/book3s_xive.c                                    |    7 
 arch/powerpc/kvm/book3s_xive_native.c                             |    7 
 arch/powerpc/lib/feature-fixups.c                                 |  104 
 arch/powerpc/mm/Makefile                                          |    2 
 arch/powerpc/mm/book3s64/hash_native.c                            |   23 
 arch/powerpc/mm/book3s64/mmu_context.c                            |   20 
 arch/powerpc/mm/maccess.c                                         |    9 
 arch/powerpc/mm/mem.c                                             |    1 
 arch/powerpc/mm/numa.c                                            |    3 
 arch/powerpc/perf/imc-pmu.c                                       |    2 
 arch/powerpc/perf/perf_regs.c                                     |    3 
 arch/powerpc/platforms/powermac/smp.c                             |    2 
 arch/powerpc/platforms/powernv/setup.c                            |   33 
 arch/powerpc/platforms/powernv/smp.c                              |    3 
 arch/powerpc/platforms/pseries/hotplug-cpu.c                      |    3 
 arch/powerpc/platforms/pseries/mobility.c                         |    4 
 arch/powerpc/platforms/pseries/msi.c                              |    3 
 arch/powerpc/platforms/pseries/pseries.h                          |    2 
 arch/powerpc/platforms/pseries/setup.c                            |   15 
 arch/riscv/include/asm/pgtable-32.h                               |    2 
 arch/riscv/include/asm/timex.h                                    |    4 
 arch/riscv/include/asm/vdso/processor.h                           |    2 
 arch/riscv/kernel/perf_regs.c                                     |    3 
 arch/riscv/kernel/process.c                                       |    2 
 arch/riscv/kernel/setup.c                                         |    1 
 arch/riscv/kernel/vdso/Makefile                                   |    2 
 arch/s390/configs/debug_defconfig                                 |    1 
 arch/s390/kernel/asm-offsets.c                                    |   10 
 arch/s390/kernel/entry.S                                          |   19 
 arch/s390/kernel/idle.c                                           |    6 
 arch/s390/kernel/perf_cpum_sf.c                                   |    4 
 arch/s390/kernel/perf_regs.c                                      |    3 
 arch/s390/kernel/uv.c                                             |    9 
 arch/s390/kvm/kvm-s390.c                                          |    4 
 arch/s390/kvm/pv.c                                                |    3 
 arch/s390/lib/delay.c                                             |    5 
 arch/s390/mm/gmap.c                                               |    2 
 arch/s390/pci/pci_irq.c                                           |   14 
 arch/sh/kernel/idle.c                                             |    2 
 arch/sparc/kernel/leon_pmc.c                                      |    4 
 arch/sparc/kernel/process_32.c                                    |    2 
 arch/sparc/kernel/process_64.c                                    |    4 
 arch/sparc/lib/csum_copy.S                                        |    2 
 arch/um/include/asm/pgalloc.h                                     |    8 
 arch/um/kernel/process.c                                          |    2 
 arch/x86/Kconfig                                                  |    1 
 arch/x86/Makefile                                                 |    3 
 arch/x86/boot/compressed/Makefile                                 |    4 
 arch/x86/boot/compressed/sev-es.c                                 |    5 
 arch/x86/events/intel/core.c                                      |   12 
 arch/x86/events/intel/cstate.c                                    |    6 
 arch/x86/events/intel/ds.c                                        |   57 
 arch/x86/events/intel/uncore.c                                    |    4 
 arch/x86/events/intel/uncore.h                                    |   12 
 arch/x86/events/intel/uncore_snb.c                                |    2 
 arch/x86/events/perf_event.h                                      |    3 
 arch/x86/events/rapl.c                                            |   14 
 arch/x86/include/asm/insn.h                                       |   15 
 arch/x86/include/asm/kvm_host.h                                   |    2 
 arch/x86/include/asm/mwait.h                                      |    2 
 arch/x86/include/asm/perf_event.h                                 |    4 
 arch/x86/include/asm/pgtable_types.h                              |    1 
 arch/x86/include/asm/sparsemem.h                                  |   10 
 arch/x86/include/asm/sync_core.h                                  |    9 
 arch/x86/include/asm/uv/uv.h                                      |   10 
 arch/x86/kernel/apic/vector.c                                     |   24 
 arch/x86/kernel/apic/x2apic_uv_x.c                                |    8 
 arch/x86/kernel/cpu/bugs.c                                        |    4 
 arch/x86/kernel/cpu/mce/core.c                                    |    6 
 arch/x86/kernel/cpu/microcode/intel.c                             |   63 
 arch/x86/kernel/cpu/resctrl/core.c                                |    4 
 arch/x86/kernel/cpu/resctrl/internal.h                            |    3 
 arch/x86/kernel/cpu/resctrl/monitor.c                             |    6 
 arch/x86/kernel/cpu/resctrl/rdtgroup.c                            |   74 
 arch/x86/kernel/dumpstack.c                                       |   23 
 arch/x86/kernel/kprobes/opt.c                                     |   22 
 arch/x86/kernel/perf_regs.c                                       |   15 
 arch/x86/kernel/process.c                                         |   12 
 arch/x86/kernel/tboot.c                                           |    8 
 arch/x86/kernel/uprobes.c                                         |   10 
 arch/x86/kvm/cpuid.c                                              |   29 
 arch/x86/kvm/cpuid.h                                              |    1 
 arch/x86/kvm/emulate.c                                            |    8 
 arch/x86/kvm/irq.c                                                |   85 
 arch/x86/kvm/lapic.c                                              |    2 
 arch/x86/kvm/mmu/mmu.c                                            |   14 
 arch/x86/kvm/mmu/spte.c                                           |    4 
 arch/x86/kvm/mmu/spte.h                                           |   25 
 arch/x86/kvm/mmu/tdp_mmu.c                                        |   11 
 arch/x86/kvm/svm/sev.c                                            |    2 
 arch/x86/kvm/svm/svm.c                                            |   16 
 arch/x86/kvm/x86.c                                                |   92 
 arch/x86/kvm/x86.h                                                |    8 
 arch/x86/lib/insn-eval.c                                          |   10 
 arch/x86/mm/mem_encrypt_identity.c                                |    4 
 arch/x86/mm/numa.c                                                |    2 
 arch/x86/mm/tlb.c                                                 |   10 
 arch/x86/platform/efi/efi_64.c                                    |   24 
 arch/x86/xen/spinlock.c                                           |   12 
 arch/xtensa/include/asm/pgtable.h                                 |    2 
 arch/xtensa/include/asm/uaccess.h                                 |    2 
 arch/xtensa/mm/cache.c                                            |   14 
 block/blk-cgroup.c                                                |    1 
 block/blk-flush.c                                                 |    7 
 block/blk-merge.c                                                 |    2 
 block/blk-settings.c                                              |    5 
 block/genhd.c                                                     |    5 
 block/keyslot-manager.c                                           |    7 
 drivers/Makefile                                                  |    1 
 drivers/accessibility/speakup/main.c                              |    1 
 drivers/accessibility/speakup/selection.c                         |   11 
 drivers/accessibility/speakup/speakup.h                           |    1 
 drivers/accessibility/speakup/spk_ttyio.c                         |   35 
 drivers/accessibility/speakup/spk_types.h                         |    8 
 drivers/acpi/acpi_video.c                                         |    6 
 drivers/acpi/apei/apei-base.c                                     |    4 
 drivers/acpi/arm64/iort.c                                         |    8 
 drivers/acpi/battery.c                                            |    2 
 drivers/acpi/button.c                                             |   13 
 drivers/acpi/dptf/dptf_pch_fivr.c                                 |    1 
 drivers/acpi/dptf/dptf_power.c                                    |    2 
 drivers/acpi/dptf/int340x_thermal.c                               |    6 
 drivers/acpi/event.c                                              |    2 
 drivers/acpi/evged.c                                              |    2 
 drivers/acpi/fan.c                                                |    2 
 drivers/acpi/internal.h                                           |    2 
 drivers/acpi/nfit/core.c                                          |   10 
 drivers/acpi/pci_irq.c                                            |    2 
 drivers/acpi/pci_link.c                                           |   12 
 drivers/acpi/pci_mcfg.c                                           |    2 
 drivers/acpi/power.c                                              |    6 
 drivers/acpi/processor_perflib.c                                  |    6 
 drivers/acpi/sbs.c                                                |    2 
 drivers/acpi/sbshc.c                                              |    2 
 drivers/acpi/sbshc.h                                              |    6 
 drivers/acpi/scan.c                                               |    2 
 drivers/acpi/video_detect.c                                       |   16 
 drivers/acpi/wakeup.c                                             |    4 
 drivers/atm/nicstar.c                                             |    2 
 drivers/block/loop.c                                              |    3 
 drivers/block/nbd.c                                               |    1 
 drivers/block/xen-blkback/blkback.c                               |   89 
 drivers/block/xen-blkback/common.h                                |    4 
 drivers/block/xen-blkback/xenbus.c                                |    6 
 drivers/bus/ti-sysc.c                                             |   29 
 drivers/char/agp/Makefile                                         |    6 
 drivers/char/agp/agp.h                                            |    5 
 drivers/char/virtio_console.c                                     |    8 
 drivers/clk/imx/Kconfig                                           |    4 
 drivers/clk/imx/clk-imx8mm.c                                      |   10 
 drivers/clk/imx/clk-imx8mn.c                                      |    6 
 drivers/clk/imx/clk-imx8mp.c                                      |   10 
 drivers/clk/imx/clk-imx8mq.c                                      |    8 
 drivers/clk/imx/clk.h                                             |    5 
 drivers/clk/meson/clk-regmap.h                                    |    5 
 drivers/clk/qcom/clk-regmap.h                                     |    6 
 drivers/clk/renesas/r9a06g032-clocks.c                            |    2 
 drivers/counter/ti-eqep.c                                         |    4 
 drivers/cpufreq/cpufreq.c                                         |    4 
 drivers/cpufreq/cpufreq_governor.h                                |    2 
 drivers/cpufreq/cpufreq_performance.c                             |    1 
 drivers/cpufreq/cpufreq_powersave.c                               |    1 
 drivers/cpufreq/intel_pstate.c                                    |   16 
 drivers/cpufreq/scmi-cpufreq.c                                    |   10 
 drivers/cpufreq/tegra186-cpufreq.c                                |   33 
 drivers/cpuidle/cpuidle-tegra.c                                   |    4 
 drivers/dax/Kconfig                                               |    1 
 drivers/dma-buf/dma-buf.c                                         |   19 
 drivers/dma-buf/dma-resv.c                                        |    2 
 drivers/dma-buf/heaps/Makefile                                    |    1 
 drivers/dma-buf/heaps/cma_heap.c                                  |  329 +-
 drivers/dma-buf/heaps/heap-helpers.c                              |  274 -
 drivers/dma-buf/heaps/heap-helpers.h                              |   53 
 drivers/dma-buf/heaps/system_heap.c                               |  414 ++
 drivers/dma/dmaengine.c                                           |   17 
 drivers/dma/idxd/device.c                                         |   31 
 drivers/dma/idxd/idxd.h                                           |    3 
 drivers/dma/idxd/init.c                                           |    5 
 drivers/dma/idxd/registers.h                                      |   25 
 drivers/dma/idxd/submit.c                                         |    2 
 drivers/dma/ioat/dca.c                                            |   10 
 drivers/dma/pl330.c                                               |    2 
 drivers/dma/ti/k3-udma-private.c                                  |    2 
 drivers/dma/ti/omap-dma.c                                         |   37 
 drivers/dma/xilinx/xilinx_dma.c                                   |   40 
 drivers/firmware/efi/Kconfig                                      |    2 
 drivers/firmware/efi/efi.c                                        |    2 
 drivers/firmware/xilinx/zynqmp.c                                  |   64 
 drivers/fpga/Kconfig                                              |    1 
 drivers/gpio/gpio-arizona.c                                       |    1 
 drivers/gpio/gpio-aspeed.c                                        |    1 
 drivers/gpio/gpio-dwapb.c                                         |    6 
 drivers/gpio/gpio-eic-sprd.c                                      |    2 
 drivers/gpio/gpio-mvebu.c                                         |   16 
 drivers/gpio/gpio-omap.c                                          |   12 
 drivers/gpio/gpio-pcie-idio-24.c                                  |   62 
 drivers/gpio/gpio-sifive.c                                        |    2 
 drivers/gpio/gpio-zynq.c                                          |    4 
 drivers/gpio/gpiolib-cdev.h                                       |   15 
 drivers/gpio/gpiolib.c                                            |   23 
 drivers/gpu/drm/amd/amdgpu/amdgpu.h                               |    8 
 drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c                          |    8 
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c                  |    2 
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c                        |   43 
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c                           |   25 
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c                           |    9 
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c                           |   17 
 drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h                         |    5 
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c                           |   53 
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c                           |    4 
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c                           |    2 
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c                           |    4 
 drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c                           |    1 
 drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c                             |   11 
 drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h                             |    3 
 drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c                             |   11 
 drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h                             |    1 
 drivers/gpu/drm/amd/amdgpu/nv.c                                   |    1 
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c                            |   42 
 drivers/gpu/drm/amd/amdkfd/Kconfig                                |    2 
 drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c             |    4 
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c                 |   29 
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h                 |   21 
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c             |   13 
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c       |    5 
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c         |   12 
 drivers/gpu/drm/amd/display/dc/core/dc.c                          |   20 
 drivers/gpu/drm/amd/display/dc/core/dc_link.c                     |    3 
 drivers/gpu/drm/amd/display/dc/dc.h                               |    2 
 drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c             |   44 
 drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h             |    2 
 drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c   |    2 
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c               |    6 
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c         |    2 
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c                 |   15 
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h                 |    2 
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h       |    6 
 drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c                |   29 
 drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.h       |    2 
 drivers/gpu/drm/amd/display/dc/dcn21/dcn21_dccg.h                 |    1 
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.c     |    2 
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h     |    4 
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c                |    2 
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c                 |    2 
 drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h          |    2 
 drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h                   |   62 
 drivers/gpu/drm/amd/display/modules/color/color_gamma.c           |   22 
 drivers/gpu/drm/amd/include/atomfirmware.h                        |    1 
 drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h                           |    1 
 drivers/gpu/drm/amd/pm/inc/smu_types.h                            |    4 
 drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h                    |    6 
 drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h                      |    2 
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c                         |   10 
 drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c           |  289 +
 drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.h           |    4 
 drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c                    |   46 
 drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c                  |    9 
 drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h                  |    4 
 drivers/gpu/drm/bridge/cadence/Kconfig                            |    2 
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c                         |    6 
 drivers/gpu/drm/drm_atomic_helper.c                               |    8 
 drivers/gpu/drm/drm_blend.c                                       |    2 
 drivers/gpu/drm/drm_bufs.c                                        |    1 
 drivers/gpu/drm/drm_client.c                                      |    4 
 drivers/gpu/drm/drm_crtc.c                                        |   12 
 drivers/gpu/drm/drm_fb_helper.c                                   |  155 -
 drivers/gpu/drm/drm_gem_shmem_helper.c                            |   40 
 drivers/gpu/drm/etnaviv/etnaviv_gem.c                             |    4 
 drivers/gpu/drm/exynos/Kconfig                                    |    3 
 drivers/gpu/drm/gma500/psb_irq.c                                  |   34 
 drivers/gpu/drm/i915/display/intel_display.c                      |    2 
 drivers/gpu/drm/i915/display/intel_dp.c                           |    2 
 drivers/gpu/drm/i915/display/intel_dp_mst.c                       |    7 
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c                        |    3 
 drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c                    |    9 
 drivers/gpu/drm/i915/gem/i915_gem_mman.c                          |    5 
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c                       |  303 +
 drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h                 |    8 
 drivers/gpu/drm/i915/gt/intel_context.c                           |   15 
 drivers/gpu/drm/i915/gt/intel_context_types.h                     |   23 
 drivers/gpu/drm/i915/gt/intel_lrc.c                               |   68 
 drivers/gpu/drm/i915/gt/intel_mocs.c                              |   23 
 drivers/gpu/drm/i915/gt/intel_rps.c                               |    4 
 drivers/gpu/drm/i915/gt/intel_workarounds.c                       |    4 
 drivers/gpu/drm/i915/gt/shmem_utils.c                             |    9 
 drivers/gpu/drm/i915/gvt/display.c                                |    2 
 drivers/gpu/drm/i915/gvt/kvmgt.c                                  |    4 
 drivers/gpu/drm/i915/gvt/vgpu.c                                   |    3 
 drivers/gpu/drm/i915/i915_drv.h                                   |   12 
 drivers/gpu/drm/i915/i915_irq.c                                   |   27 
 drivers/gpu/drm/i915/i915_perf.c                                  |    2 
 drivers/gpu/drm/i915/i915_request.h                               |    2 
 drivers/gpu/drm/i915/selftests/i915_gem.c                         |    4 
 drivers/gpu/drm/i915/selftests/i915_request.c                     |    8 
 drivers/gpu/drm/imx/dcss/dcss-dev.h                               |    3 
 drivers/gpu/drm/imx/dcss/dcss-plane.c                             |   24 
 drivers/gpu/drm/imx/dcss/dcss-scaler.c                            |   47 
 drivers/gpu/drm/lima/lima_gem.c                                   |    2 
 drivers/gpu/drm/mcde/Kconfig                                      |    1 
 drivers/gpu/drm/mcde/Makefile                                     |    2 
 drivers/gpu/drm/mcde/mcde_clk_div.c                               |  192 +
 drivers/gpu/drm/mcde/mcde_display.c                               |  456 ++
 drivers/gpu/drm/mcde/mcde_display_regs.h                          |   91 
 drivers/gpu/drm/mcde/mcde_drm.h                                   |   10 
 drivers/gpu/drm/mcde/mcde_drv.c                                   |   54 
 drivers/gpu/drm/mediatek/mtk_dsi.c                                |   61 
 drivers/gpu/drm/meson/meson_dw_hdmi.c                             |   51 
 drivers/gpu/drm/mgag200/mgag200_drv.c                             |    1 
 drivers/gpu/drm/msm/msm_gem.c                                     |    4 
 drivers/gpu/drm/mxsfb/mxsfb_drv.c                                 |   10 
 drivers/gpu/drm/mxsfb/mxsfb_kms.c                                 |    3 
 drivers/gpu/drm/nouveau/dispnv50/disp.c                           |   34 
 drivers/gpu/drm/nouveau/nouveau_bo.c                              |   33 
 drivers/gpu/drm/nouveau/nouveau_connector.c                       |   14 
 drivers/gpu/drm/nouveau/nouveau_gem.c                             |    8 
 drivers/gpu/drm/omapdrm/dss/sdi.c                                 |   10 
 drivers/gpu/drm/omapdrm/omap_gem.c                                |    3 
 drivers/gpu/drm/panel/panel-samsung-s6e63m0.c                     |  345 +-
 drivers/gpu/drm/panel/panel-simple.c                              |   28 
 drivers/gpu/drm/panel/panel-sony-acx565akm.c                      |    2 
 drivers/gpu/drm/panfrost/panfrost_gem.c                           |    2 
 drivers/gpu/drm/qxl/qxl_ttm.c                                     |    2 
 drivers/gpu/drm/radeon/radeon_ttm.c                               |   54 
 drivers/gpu/drm/radeon/radeon_uvd.c                               |    2 
 drivers/gpu/drm/radeon/radeon_vce.c                               |    2 
 drivers/gpu/drm/rockchip/rockchip_lvds.c                          |    2 
 drivers/gpu/drm/sun4i/sun4i_backend.c                             |    8 
 drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c                             |    1 
 drivers/gpu/drm/tegra/drm.c                                       |    2 
 drivers/gpu/drm/tegra/output.c                                    |    1 
 drivers/gpu/drm/tegra/sor.c                                       |   76 
 drivers/gpu/drm/ttm/ttm_pool.c                                    |   22 
 drivers/gpu/drm/udl/udl_drv.c                                     |    2 
 drivers/gpu/drm/v3d/v3d_bo.c                                      |    2 
 drivers/gpu/drm/vc4/vc4_drv.h                                     |    4 
 drivers/gpu/drm/vc4/vc4_hdmi.c                                    |   48 
 drivers/gpu/drm/vc4/vc4_hdmi.h                                    |   11 
 drivers/gpu/drm/vc4/vc4_kms.c                                     |  244 +
 drivers/gpu/drm/vc4/vc4_txp.c                                     |    4 
 drivers/gpu/drm/vgem/vgem_drv.c                                   |    3 
 drivers/gpu/drm/via/via_irq.c                                     |    1 
 drivers/gpu/drm/via/via_verifier.c                                |    7 
 drivers/gpu/drm/virtio/virtgpu_debugfs.c                          |    4 
 drivers/gpu/drm/virtio/virtgpu_drv.h                              |    8 
 drivers/gpu/drm/virtio/virtgpu_fence.c                            |   13 
 drivers/gpu/drm/virtio/virtgpu_ioctl.c                            |    7 
 drivers/gpu/drm/virtio/virtgpu_object.c                           |    1 
 drivers/gpu/drm/vkms/vkms_drv.c                                   |    1 
 drivers/gpu/drm/vkms/vkms_writeback.c                             |    7 
 drivers/hid/hid-cypress.c                                         |   44 
 drivers/hid/hid-ids.h                                             |    9 
 drivers/hid/hid-input.c                                           |    3 
 drivers/hid/hid-ite.c                                             |   61 
 drivers/hid/hid-logitech-dj.c                                     |   22 
 drivers/hid/hid-logitech-hidpp.c                                  |   32 
 drivers/hid/hid-mcp2221.c                                         |   48 
 drivers/hid/hid-quirks.c                                          |    5 
 drivers/hid/hid-sensor-hub.c                                      |    3 
 drivers/hid/hid-uclogic-core.c                                    |    2 
 drivers/hid/hid-uclogic-params.c                                  |    2 
 drivers/hid/i2c-hid/i2c-hid-core.c                                |    9 
 drivers/hv/hv.c                                                   |    8 
 drivers/hwmon/amd_energy.c                                        |    2 
 drivers/hwmon/applesmc.c                                          |  130 
 drivers/hwmon/pmbus/max20730.c                                    |   26 
 drivers/hwmon/pmbus/pmbus_core.c                                  |   13 
 drivers/hwmon/pwm-fan.c                                           |   16 
 drivers/i2c/busses/Kconfig                                        |    1 
 drivers/i2c/busses/i2c-imx.c                                      |   44 
 drivers/i2c/busses/i2c-mlxbf.c                                    |   12 
 drivers/i2c/busses/i2c-qcom-cci.c                                 |    4 
 drivers/i2c/busses/i2c-qup.c                                      |    3 
 drivers/idle/intel_idle.c                                         |   37 
 drivers/iio/accel/kxcjk-1013.c                                    |   51 
 drivers/iio/adc/ingenic-adc.c                                     |   34 
 drivers/iio/adc/mt6577_auxadc.c                                   |    6 
 drivers/iio/adc/stm32-adc-core.c                                  |   41 
 drivers/iio/adc/stm32-adc.c                                       |   50 
 drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c         |   16 
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c                      |    6 
 drivers/iio/light/Kconfig                                         |    1 
 drivers/infiniband/Kconfig                                        |    3 
 drivers/infiniband/core/cache.c                                   |    3 
 drivers/infiniband/core/cm.c                                      |   14 
 drivers/infiniband/hw/efa/efa_verbs.c                             |    4 
 drivers/infiniband/hw/hfi1/chip.c                                 |    3 
 drivers/infiniband/hw/hfi1/file_ops.c                             |    4 
 drivers/infiniband/hw/hfi1/hfi.h                                  |    2 
 drivers/infiniband/hw/hfi1/mmu_rb.c                               |   68 
 drivers/infiniband/hw/hfi1/mmu_rb.h                               |   16 
 drivers/infiniband/hw/hfi1/user_exp_rcv.c                         |   12 
 drivers/infiniband/hw/hfi1/user_exp_rcv.h                         |    6 
 drivers/infiniband/hw/hfi1/user_sdma.c                            |   13 
 drivers/infiniband/hw/hfi1/user_sdma.h                            |    7 
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c                        |    9 
 drivers/infiniband/hw/hns/hns_roce_hw_v2.h                        |    2 
 drivers/infiniband/hw/i40iw/i40iw_main.c                          |    5 
 drivers/infiniband/hw/i40iw/i40iw_verbs.c                         |   37 
 drivers/infiniband/hw/mthca/mthca_cq.c                            |   10 
 drivers/infiniband/hw/qedr/verbs.c                                |    9 
 drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c                    |    2 
 drivers/infiniband/sw/rdmavt/Kconfig                              |    3 
 drivers/infiniband/sw/rxe/Kconfig                                 |    2 
 drivers/infiniband/sw/siw/Kconfig                                 |    1 
 drivers/input/joystick/xpad.c                                     |    2 
 drivers/input/keyboard/cros_ec_keyb.c                             |    1 
 drivers/input/keyboard/sunkbd.c                                   |   41 
 drivers/input/misc/adxl34x.c                                      |    2 
 drivers/input/misc/cm109.c                                        |    7 
 drivers/input/misc/soc_button_array.c                             |   12 
 drivers/input/mouse/elan_i2c.h                                    |    2 
 drivers/input/mouse/elan_i2c_core.c                               |    3 
 drivers/input/mouse/elan_i2c_i2c.c                                |   10 
 drivers/input/mouse/elan_i2c_smbus.c                              |    2 
 drivers/input/serio/i8042-x86ia64io.h                             |   46 
 drivers/input/serio/i8042.c                                       |   15 
 drivers/input/touchscreen/Kconfig                                 |    1 
 drivers/input/touchscreen/atmel_mxt_ts.c                          |    4 
 drivers/input/touchscreen/goodix.c                                |   12 
 drivers/input/touchscreen/raydium_i2c_ts.c                        |  126 
 drivers/interconnect/core.c                                       |    1 
 drivers/interconnect/qcom/msm8916.c                               |   12 
 drivers/interconnect/qcom/msm8974.c                               |   12 
 drivers/interconnect/qcom/qcs404.c                                |    4 
 drivers/iommu/amd/amd_iommu_types.h                               |    2 
 drivers/iommu/amd/init.c                                          |   27 
 drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c                        |    4 
 drivers/iommu/intel/dmar.c                                        |   24 
 drivers/iommu/intel/iommu.c                                       |   14 
 drivers/iommu/iommu.c                                             |   10 
 drivers/irqchip/irq-gic-v3-its.c                                  |   16 
 drivers/irqchip/irq-sni-exiu.c                                    |    2 
 drivers/md/dm-cache-target.c                                      |    4 
 drivers/md/dm-integrity.c                                         |    4 
 drivers/md/dm-raid.c                                              |   11 
 drivers/md/dm-table.c                                             |   11 
 drivers/md/dm-writecache.c                                        |    6 
 drivers/md/dm.c                                                   |   29 
 drivers/md/md.c                                                   |   20 
 drivers/md/md.h                                                   |    6 
 drivers/md/raid0.c                                                |   14 
 drivers/md/raid10.c                                               |  423 --
 drivers/md/raid10.h                                               |    1 
 drivers/media/cec/usb/pulse8/pulse8-cec.c                         |   52 
 drivers/media/common/videobuf2/videobuf2-core.c                   |   11 
 drivers/media/platform/Kconfig                                    |   28 
 drivers/media/platform/marvell-ccic/mmp-driver.c                  |    2 
 drivers/media/platform/mtk-vcodec/Makefile                        |   10 
 drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c            |    2 
 drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c            |    2 
 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c                 |  174 -
 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h                 |    7 
 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h            |   52 
 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_scp.c             |   73 
 drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_vpu.c             |  110 
 drivers/media/platform/qcom/venus/core.h                          |   15 
 drivers/media/platform/qcom/venus/pm_helpers.c                    |    4 
 drivers/media/platform/qcom/venus/venc.c                          |   31 
 drivers/media/platform/qcom/venus/venc_ctrls.c                    |   14 
 drivers/media/rc/mtk-cir.c                                        |    9 
 drivers/media/test-drivers/vidtv/vidtv_bridge.c                   |  116 
 drivers/media/test-drivers/vidtv/vidtv_bridge.h                   |    4 
 drivers/media/test-drivers/vidtv/vidtv_channel.c                  |  316 +-
 drivers/media/test-drivers/vidtv/vidtv_channel.h                  |   11 
 drivers/media/test-drivers/vidtv/vidtv_common.h                   |    1 
 drivers/media/test-drivers/vidtv/vidtv_demod.c                    |    2 
 drivers/media/test-drivers/vidtv/vidtv_demod.h                    |   11 
 drivers/media/test-drivers/vidtv/vidtv_encoder.h                  |    9 
 drivers/media/test-drivers/vidtv/vidtv_mux.c                      |  248 +
 drivers/media/test-drivers/vidtv/vidtv_mux.h                      |   21 
 drivers/media/test-drivers/vidtv/vidtv_pes.c                      |  179 -
 drivers/media/test-drivers/vidtv/vidtv_pes.h                      |    8 
 drivers/media/test-drivers/vidtv/vidtv_psi.c                      | 1521 +++++++---
 drivers/media/test-drivers/vidtv/vidtv_psi.h                      |  288 +
 drivers/media/test-drivers/vidtv/vidtv_s302m.c                    |  127 
 drivers/media/test-drivers/vidtv/vidtv_s302m.h                    |    9 
 drivers/media/test-drivers/vidtv/vidtv_ts.c                       |    5 
 drivers/media/test-drivers/vidtv/vidtv_ts.h                       |    7 
 drivers/media/test-drivers/vidtv/vidtv_tuner.c                    |    5 
 drivers/media/test-drivers/vidtv/vidtv_tuner.h                    |    1 
 drivers/misc/eeprom/at24.c                                        |    1 
 drivers/misc/habanalabs/common/command_buffer.c                   |    9 
 drivers/misc/habanalabs/common/device.c                           |   16 
 drivers/misc/habanalabs/common/habanalabs.h                       |   14 
 drivers/misc/habanalabs/common/hw_queue.c                         |   19 
 drivers/misc/habanalabs/common/irq.c                              |   17 
 drivers/misc/habanalabs/common/memory.c                           |    1 
 drivers/misc/habanalabs/gaudi/gaudi.c                             |   40 
 drivers/misc/habanalabs/gaudi/gaudiP.h                            |    1 
 drivers/misc/habanalabs/gaudi/gaudi_coresight.c                   |    5 
 drivers/misc/habanalabs/goya/goya.c                               |   26 
 drivers/misc/habanalabs/goya/goyaP.h                              |    2 
 drivers/misc/habanalabs/include/gaudi/gaudi_masks.h               |    1 
 drivers/misc/mei/Kconfig                                          |   10 
 drivers/misc/mei/Makefile                                         |    3 
 drivers/misc/mei/client.h                                         |    4 
 drivers/misc/mei/hw-virtio.c                                      |  874 -----
 drivers/mmc/core/block.c                                          |    2 
 drivers/mmc/host/mtk-sd.c                                         |   39 
 drivers/mmc/host/renesas_sdhi_core.c                              |   14 
 drivers/mmc/host/sdhci-of-arasan.c                                |   54 
 drivers/mmc/host/sdhci-of-esdhc.c                                 |    2 
 drivers/mmc/host/sdhci-pci-core.c                                 |   13 
 drivers/mmc/host/tmio_mmc_core.c                                  |    7 
 drivers/mtd/nand/raw/ams-delta.c                                  |   14 
 drivers/mtd/nand/raw/au1550nd.c                                   |   13 
 drivers/mtd/nand/raw/cs553x_nand.c                                |   24 
 drivers/mtd/nand/raw/davinci_nand.c                               |    8 
 drivers/mtd/nand/raw/diskonchip.c                                 |   29 
 drivers/mtd/nand/raw/fsmc_nand.c                                  |   30 
 drivers/mtd/nand/raw/gpio.c                                       |   13 
 drivers/mtd/nand/raw/lpc32xx_mlc.c                                |   23 
 drivers/mtd/nand/raw/lpc32xx_slc.c                                |   26 
 drivers/mtd/nand/raw/mpc5121_nfc.c                                |   21 
 drivers/mtd/nand/raw/orion_nand.c                                 |   21 
 drivers/mtd/nand/raw/pasemi_nand.c                                |   21 
 drivers/mtd/nand/raw/plat_nand.c                                  |   22 
 drivers/mtd/nand/raw/r852.c                                       |   40 
 drivers/mtd/nand/raw/r852.h                                       |    1 
 drivers/mtd/nand/raw/sharpsl.c                                    |   32 
 drivers/mtd/nand/raw/socrates_nand.c                              |   23 
 drivers/mtd/nand/raw/tmio_nand.c                                  |   33 
 drivers/mtd/nand/raw/txx9ndfmc.c                                  |   14 
 drivers/mtd/nand/raw/xway_nand.c                                  |   20 
 drivers/net/bonding/bond_main.c                                   |   61 
 drivers/net/bonding/bond_options.c                                |   22 
 drivers/net/bonding/bond_sysfs_slave.c                            |   18 
 drivers/net/can/c_can/c_can.c                                     |   18 
 drivers/net/can/dev.c                                             |    2 
 drivers/net/can/flexcan.c                                         |   28 
 drivers/net/can/kvaser_pciefd.c                                   |    8 
 drivers/net/can/m_can/Kconfig                                     |    3 
 drivers/net/can/m_can/m_can.c                                     |   24 
 drivers/net/can/m_can/m_can.h                                     |    1 
 drivers/net/can/m_can/m_can_platform.c                            |   23 
 drivers/net/can/m_can/tcan4x5x.c                                  |   41 
 drivers/net/can/sja1000/sja1000.c                                 |    1 
 drivers/net/can/softing/softing_main.c                            |    9 
 drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c                    |    4 
 drivers/net/can/sun4i_can.c                                       |    1 
 drivers/net/can/ti_hecc.c                                         |   13 
 drivers/net/can/usb/gs_usb.c                                      |  131 
 drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c                 |    2 
 drivers/net/can/usb/mcba_usb.c                                    |    4 
 drivers/net/can/usb/peak_usb/pcan_usb_core.c                      |    4 
 drivers/net/dsa/lantiq_gswip.c                                    |   11 
 drivers/net/dsa/mv88e6xxx/chip.c                                  |    2 
 drivers/net/dsa/mv88e6xxx/devlink.c                               |    4 
 drivers/net/dsa/mv88e6xxx/global1.c                               |   31 
 drivers/net/dsa/mv88e6xxx/global1.h                               |    1 
 drivers/net/dsa/mv88e6xxx/global1_vtu.c                           |   59 
 drivers/net/dsa/ocelot/felix.c                                    |    7 
 drivers/net/dsa/ocelot/felix_vsc9959.c                            |    1 
 drivers/net/dsa/ocelot/seville_vsc9953.c                          |    1 
 drivers/net/ethernet/agere/Kconfig                                |    1 
 drivers/net/ethernet/amazon/ena/ena_eth_com.c                     |    3 
 drivers/net/ethernet/amazon/ena/ena_netdev.c                      |   80 
 drivers/net/ethernet/aquantia/atlantic/aq_ring.c                  |  126 
 drivers/net/ethernet/atheros/atl1c/atl1c_main.c                   |    4 
 drivers/net/ethernet/atheros/atl1e/atl1e_main.c                   |    4 
 drivers/net/ethernet/broadcom/Kconfig                             |    1 
 drivers/net/ethernet/broadcom/b44.c                               |    3 
 drivers/net/ethernet/broadcom/bnxt/bnxt.c                         |    8 
 drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c                 |    5 
 drivers/net/ethernet/cadence/Kconfig                              |    1 
 drivers/net/ethernet/chelsio/Kconfig                              |    2 
 drivers/net/ethernet/chelsio/cxgb3/sge.c                          |    1 
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h                        |    3 
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c                |    2 
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c                 |    3 
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c                   |    1 
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h                    |    6 
 drivers/net/ethernet/chelsio/cxgb4/sge.c                          |  111 
 drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c    |  592 ++-
 drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.h    |    1 
 drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c       |    1 
 drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c       |    1 
 drivers/net/ethernet/faraday/Kconfig                              |    1 
 drivers/net/ethernet/faraday/ftgmac100.c                          |    4 
 drivers/net/ethernet/freescale/Kconfig                            |    1 
 drivers/net/ethernet/freescale/dpaa/dpaa_eth.c                    |   10 
 drivers/net/ethernet/freescale/dpaa2/Kconfig                      |    2 
 drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c                  |    1 
 drivers/net/ethernet/freescale/enetc/Kconfig                      |    1 
 drivers/net/ethernet/freescale/enetc/enetc.c                      |   62 
 drivers/net/ethernet/freescale/enetc/enetc_ethtool.c              |   10 
 drivers/net/ethernet/freescale/enetc/enetc_hw.h                   |  125 
 drivers/net/ethernet/freescale/enetc/enetc_mdio.c                 |    8 
 drivers/net/ethernet/freescale/enetc/enetc_qos.c                  |   14 
 drivers/net/ethernet/freescale/fec_main.c                         |   12 
 drivers/net/ethernet/freescale/fman/Kconfig                       |    1 
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.h        |    4 
 drivers/net/ethernet/ibm/ibmvnic.c                                |  209 -
 drivers/net/ethernet/ibm/ibmvnic.h                                |    6 
 drivers/net/ethernet/intel/e1000e/netdev.c                        |    8 
 drivers/net/ethernet/intel/i40e/i40e.h                            |    1 
 drivers/net/ethernet/intel/i40e/i40e_main.c                       |   22 
 drivers/net/ethernet/intel/i40e/i40e_txrx.c                       |   27 
 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c                |   52 
 drivers/net/ethernet/intel/i40e/i40e_xsk.c                        |    2 
 drivers/net/ethernet/intel/ice/ice_txrx.c                         |   31 
 drivers/net/ethernet/intel/igb/igb.h                              |    5 
 drivers/net/ethernet/intel/igb/igb_main.c                         |   37 
 drivers/net/ethernet/intel/igc/igc_main.c                         |   14 
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c                     |   24 
 drivers/net/ethernet/marvell/mvneta.c                             |    5 
 drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c                   |    1 
 drivers/net/ethernet/marvell/prestera/Kconfig                     |    1 
 drivers/net/ethernet/marvell/prestera/prestera_main.c             |    4 
 drivers/net/ethernet/marvell/prestera/prestera_pci.c              |    7 
 drivers/net/ethernet/mediatek/mtk_star_emac.c                     |    3 
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c                    |   21 
 drivers/net/ethernet/mellanox/mlx4/en_tx.c                        |   40 
 drivers/net/ethernet/mellanox/mlx4/fw.c                           |    6 
 drivers/net/ethernet/mellanox/mlx4/fw.h                           |    4 
 drivers/net/ethernet/mellanox/mlx4/mlx4_en.h                      |   12 
 drivers/net/ethernet/mellanox/mlx5/core/Kconfig                   |    1 
 drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c             |    2 
 drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c               |    6 
 drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c               |   72 
 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c            |    4 
 drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c               |    4 
 drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c         |    2 
 drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c       |   14 
 drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c     |    3 
 drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h     |    9 
 drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c        |   27 
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c                 |    1 
 drivers/net/ethernet/mellanox/mlx5/core/en_rep.h                  |    2 
 drivers/net/ethernet/mellanox/mlx5/core/en_rx.c                   |    2 
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c                   |    6 
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.h                   |    3 
 drivers/net/ethernet/mellanox/mlx5/core/en_tx.c                   |   35 
 drivers/net/ethernet/mellanox/mlx5/core/eswitch.c                 |   22 
 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c                 |   14 
 drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.c               |   23 
 drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.h               |    2 
 drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c               |   21 
 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c         |    1 
 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_domain.c      |    5 
 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h       |    1 
 drivers/net/ethernet/mellanox/mlxsw/Kconfig                       |    2 
 drivers/net/ethernet/mellanox/mlxsw/core.c                        |    3 
 drivers/net/ethernet/microchip/Kconfig                            |    1 
 drivers/net/ethernet/microchip/lan743x_main.c                     |   37 
 drivers/net/ethernet/microchip/lan743x_main.h                     |    3 
 drivers/net/ethernet/mscc/ocelot.c                                |    9 
 drivers/net/ethernet/mscc/ocelot_vsc7514.c                        |    1 
 drivers/net/ethernet/netronome/Kconfig                            |    1 
 drivers/net/ethernet/netronome/nfp/nfp_net_common.c               |    6 
 drivers/net/ethernet/nxp/Kconfig                                  |    1 
 drivers/net/ethernet/pasemi/pasemi_mac.c                          |    8 
 drivers/net/ethernet/qlogic/qed/qed_cxt.c                         |    4 
 drivers/net/ethernet/qlogic/qed/qed_cxt.h                         |    3 
 drivers/net/ethernet/qlogic/qed/qed_iwarp.c                       |   12 
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c             |    3 
 drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c              |    5 
 drivers/net/ethernet/realtek/r8169_main.c                         |   18 
 drivers/net/ethernet/rocker/Kconfig                               |    1 
 drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c                   |    9 
 drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c            |    4 
 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c               |    6 
 drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c                 |    2 
 drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c                  |    2 
 drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c                   |    2 
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c                 |   53 
 drivers/net/ethernet/ti/am65-cpts.c                               |    3 
 drivers/net/ethernet/ti/cpsw.c                                    |   11 
 drivers/net/ethernet/ti/cpsw_new.c                                |    9 
 drivers/net/ethernet/ti/cpsw_priv.c                               |    3 
 drivers/net/ethernet/xilinx/ll_temac_main.c                       |    9 
 drivers/net/geneve.c                                              |    3 
 drivers/net/ipa/gsi_trans.c                                       |   22 
 drivers/net/netdevsim/bpf.c                                       |   15 
 drivers/net/netdevsim/dev.c                                       |    2 
 drivers/net/netdevsim/health.c                                    |    1 
 drivers/net/netdevsim/netdevsim.h                                 |    1 
 drivers/net/netdevsim/udp_tunnels.c                               |    1 
 drivers/net/phy/mscc/mscc_macsec.c                                |    1 
 drivers/net/phy/realtek.c                                         |    2 
 drivers/net/phy/smsc.c                                            |    4 
 drivers/net/tun.c                                                 |   14 
 drivers/net/usb/cx82310_eth.c                                     |    3 
 drivers/net/usb/ipheth.c                                          |    2 
 drivers/net/usb/qmi_wwan.c                                        |    2 
 drivers/net/vrf.c                                                 |  102 
 drivers/net/vxlan.c                                               |    7 
 drivers/net/wan/cosa.c                                            |    1 
 drivers/net/wireless/intel/iwlwifi/fw/api/sta.h                   |   10 
 drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h            |    8 
 drivers/net/wireless/intel/iwlwifi/iwl-config.h                   |    4 
 drivers/net/wireless/intel/iwlwifi/iwl-csr.h                      |   10 
 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c                 |    5 
 drivers/net/wireless/intel/iwlwifi/mvm/sta.c                      |   18 
 drivers/net/wireless/intel/iwlwifi/mvm/time-event.c               |  103 
 drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c          |   20 
 drivers/net/wireless/intel/iwlwifi/pcie/drv.c                     |    6 
 drivers/net/wireless/intel/iwlwifi/pcie/trans.c                   |   36 
 drivers/net/wireless/mediatek/mt76/usb.c                          |   17 
 drivers/net/wireless/realtek/rtw88/debug.c                        |    2 
 drivers/net/wireless/realtek/rtw88/fw.c                           |    2 
 drivers/nfc/s3fwrn5/i2c.c                                         |    4 
 drivers/nvme/host/core.c                                          |   27 
 drivers/nvme/host/nvme.h                                          |    6 
 drivers/nvme/host/pci.c                                           |   15 
 drivers/of/address.c                                              |    4 
 drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c                 |    5 
 drivers/phy/intel/Kconfig                                         |    2 
 drivers/phy/mediatek/Kconfig                                      |    2 
 drivers/phy/motorola/phy-cpcap-usb.c                              |    3 
 drivers/phy/qualcomm/Kconfig                                      |    4 
 drivers/phy/qualcomm/phy-qcom-qmp.c                               |    2 
 drivers/phy/tegra/xusb.c                                          |    1 
 drivers/pinctrl/aspeed/pinctrl-aspeed.c                           |   73 
 drivers/pinctrl/aspeed/pinmux-aspeed.h                            |    7 
 drivers/pinctrl/intel/pinctrl-baytrail.c                          |    8 
 drivers/pinctrl/intel/pinctrl-intel.c                             |   44 
 drivers/pinctrl/intel/pinctrl-jasperlake.c                        |  452 +-
 drivers/pinctrl/intel/pinctrl-merrifield.c                        |    8 
 drivers/pinctrl/pinctrl-amd.c                                     |   13 
 drivers/pinctrl/pinctrl-ingenic.c                                 |   72 
 drivers/pinctrl/pinctrl-mcp23s08_spi.c                            |    4 
 drivers/pinctrl/pinctrl-rockchip.c                                |   30 
 drivers/pinctrl/qcom/pinctrl-msm.c                                |   32 
 drivers/pinctrl/qcom/pinctrl-sm8250.c                             |   18 
 drivers/platform/x86/acer-wmi.c                                   |    1 
 drivers/platform/x86/intel-vbtn.c                                 |    6 
 drivers/platform/x86/thinkpad_acpi.c                              |   13 
 drivers/platform/x86/toshiba_acpi.c                               |    3 
 drivers/platform/x86/touchscreen_dmi.c                            |   50 
 drivers/powercap/powercap_sys.c                                   |    4 
 drivers/ptp/ptp_clockmatrix.c                                     |   49 
 drivers/pwm/pwm-sl28cpld.c                                        |    6 
 drivers/regulator/core.c                                          |   43 
 drivers/regulator/pfuze100-regulator.c                            |   13 
 drivers/regulator/ti-abb-regulator.c                              |   12 
 drivers/s390/block/dasd.c                                         |    6 
 drivers/s390/net/qeth_core.h                                      |    9 
 drivers/s390/net/qeth_core_main.c                                 |   82 
 drivers/s390/net/qeth_l2_main.c                                   |   18 
 drivers/scsi/be2iscsi/be_main.c                                   |    4 
 drivers/scsi/bnx2i/Kconfig                                        |    1 
 drivers/scsi/hisi_sas/hisi_sas_main.c                             |    6 
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c                            |    5 
 drivers/scsi/libiscsi.c                                           |   23 
 drivers/scsi/megaraid/megaraid_sas_base.c                         |   39 
 drivers/scsi/megaraid/megaraid_sas_fusion.c                       |   29 
 drivers/scsi/mpt3sas/mpt3sas_base.c                               |    2 
 drivers/scsi/mpt3sas/mpt3sas_ctl.c                                |    2 
 drivers/scsi/scsi_lib.c                                           |    3 
 drivers/scsi/storvsc_drv.c                                        |    4 
 drivers/scsi/ufs/ufshcd.c                                         |   71 
 drivers/scsi/ufs/ufshcd.h                                         |    2 
 drivers/soc/fsl/dpio/dpio-driver.c                                |    5 
 drivers/spi/spi-bcm-qspi.c                                        |   34 
 drivers/spi/spi-bcm2835.c                                         |   24 
 drivers/spi/spi-bcm2835aux.c                                      |   20 
 drivers/spi/spi-cadence-quadspi.c                                 |    2 
 drivers/spi/spi-dw-core.c                                         |    7 
 drivers/spi/spi-fsi.c                                             |    2 
 drivers/spi/spi-fsl-lpspi.c                                       |    3 
 drivers/spi/spi-imx.c                                             |    1 
 drivers/spi/spi-npcm-fiu.c                                        |    2 
 drivers/spi/spi-nxp-fspi.c                                        |    7 
 drivers/spi/spi.c                                                 |   86 
 drivers/staging/android/ashmem.c                                  |    6 
 drivers/staging/media/sunxi/cedrus/cedrus_h264.c                  |    2 
 drivers/staging/mt7621-pci/pci-mt7621.c                           |   15 
 drivers/staging/ralink-gdma/Kconfig                               |    1 
 drivers/staging/rtl8723bs/os_dep/sdio_intf.c                      |    1 
 drivers/target/iscsi/iscsi_target.c                               |   17 
 drivers/tee/amdtee/amdtee_private.h                               |    8 
 drivers/tee/amdtee/core.c                                         |   26 
 drivers/tee/optee/call.c                                          |    3 
 drivers/thermal/ti-soc-thermal/ti-bandgap.c                       |   18 
 drivers/thunderbolt/debugfs.c                                     |    1 
 drivers/thunderbolt/icm.c                                         |   12 
 drivers/thunderbolt/nhi.c                                         |   23 
 drivers/thunderbolt/nhi.h                                         |    2 
 drivers/thunderbolt/tb.h                                          |    2 
 drivers/thunderbolt/usb4.c                                        |    4 
 drivers/thunderbolt/xdomain.c                                     |    1 
 drivers/tty/serial/ar933x_uart.c                                  |    6 
 drivers/tty/serial/imx.c                                          |   30 
 drivers/tty/tty_io.c                                              |    7 
 drivers/tty/tty_jobctrl.c                                         |   44 
 drivers/uio/uio.c                                                 |   10 
 drivers/usb/cdns3/core.c                                          |   29 
 drivers/usb/cdns3/gadget.c                                        |   27 
 drivers/usb/class/cdc-acm.c                                       |    9 
 drivers/usb/core/devio.c                                          |   14 
 drivers/usb/core/quirks.c                                         |   10 
 drivers/usb/gadget/function/f_fs.c                                |    6 
 drivers/usb/gadget/function/f_midi.c                              |   10 
 drivers/usb/gadget/legacy/inode.c                                 |    3 
 drivers/usb/host/ohci-omap.c                                      |    4 
 drivers/usb/host/xhci-histb.c                                     |    2 
 drivers/usb/musb/musb_dsps.c                                      |    4 
 drivers/usb/serial/ch341.c                                        |    5 
 drivers/usb/serial/kl5kusb105.c                                   |   10 
 drivers/usb/serial/option.c                                       |   10 
 drivers/usb/storage/scsiglue.c                                    |    2 
 drivers/usb/storage/uas.c                                         |   19 
 drivers/usb/storage/usb.c                                         |    5 
 drivers/usb/typec/Kconfig                                         |    1 
 drivers/usb/typec/stusb160x.c                                     |    2 
 drivers/usb/typec/ucsi/psy.c                                      |    9 
 drivers/usb/typec/ucsi/ucsi.c                                     |    7 
 drivers/usb/typec/ucsi/ucsi.h                                     |    2 
 drivers/vdpa/Kconfig                                              |    2 
 drivers/vhost/scsi.c                                              |  399 +-
 drivers/vhost/vdpa.c                                              |   84 
 drivers/vhost/vhost.c                                             |    6 
 drivers/vhost/vhost.h                                             |    1 
 drivers/vhost/vringh.c                                            |    6 
 drivers/video/fbdev/geode/lxfb_ops.c                              |    1 
 drivers/video/fbdev/hyperv_fb.c                                   |    8 
 drivers/video/fbdev/pm2fb.c                                       |    1 
 drivers/virt/nitro_enclaves/ne_misc_dev.c                         |    6 
 drivers/xen/grant-table.c                                         |  123 
 drivers/xen/swiotlb-xen.c                                         |    3 
 drivers/xen/unpopulated-alloc.c                                   |   20 
 drivers/xen/xen-scsiback.c                                        |   60 
 fs/9p/vfs_file.c                                                  |   12 
 fs/afs/dir.c                                                      |    1 
 fs/afs/inode.c                                                    |    8 
 fs/afs/internal.h                                                 |    1 
 fs/afs/super.c                                                    |    3 
 fs/afs/write.c                                                    |    5 
 fs/aio.c                                                          |    2 
 fs/btrfs/block-rsv.c                                              |    3 
 fs/btrfs/ctree.h                                                  |    5 
 fs/btrfs/dev-replace.c                                            |   26 
 fs/btrfs/file.c                                                   |   57 
 fs/btrfs/inode.c                                                  |   58 
 fs/btrfs/ioctl.c                                                  |   10 
 fs/btrfs/qgroup.c                                                 |  100 
 fs/btrfs/ref-verify.c                                             |    1 
 fs/btrfs/relocation.c                                             |    4 
 fs/btrfs/scrub.c                                                  |    5 
 fs/btrfs/tests/inode-tests.c                                      |   12 
 fs/btrfs/tree-checker.c                                           |    3 
 fs/btrfs/volumes.c                                                |   34 
 fs/cifs/cifsacl.c                                                 |    1 
 fs/cifs/connect.c                                                 |    5 
 fs/cifs/smb2ops.c                                                 |   92 
 fs/cifs/smb2pdu.c                                                 |   71 
 fs/cifs/smb2pdu.h                                                 |    2 
 fs/cifs/transport.c                                               |    4 
 fs/coredump.c                                                     |    3 
 fs/crypto/inline_crypt.c                                          |    2 
 fs/crypto/keysetup.c                                              |    4 
 fs/efivarfs/inode.c                                               |    2 
 fs/erofs/inode.c                                                  |   21 
 fs/erofs/zdata.c                                                  |    7 
 fs/ext4/ext4.h                                                    |   75 
 fs/ext4/extents.c                                                 |    7 
 fs/ext4/fast_commit.c                                             |  174 -
 fs/ext4/fast_commit.h                                             |    6 
 fs/ext4/file.c                                                    |    6 
 fs/ext4/fsmap.c                                                   |    2 
 fs/ext4/fsync.c                                                   |    2 
 fs/ext4/inline.c                                                  |    1 
 fs/ext4/inode.c                                                   |   19 
 fs/ext4/mballoc.c                                                 |    6 
 fs/ext4/namei.c                                                   |   61 
 fs/ext4/super.c                                                   |   62 
 fs/gfs2/aops.c                                                    |    2 
 fs/gfs2/bmap.c                                                    |    8 
 fs/gfs2/glock.c                                                   |    1 
 fs/gfs2/glops.c                                                   |   17 
 fs/gfs2/incore.h                                                  |    1 
 fs/gfs2/inode.c                                                   |   42 
 fs/gfs2/log.c                                                     |    2 
 fs/gfs2/rgrp.c                                                    |   14 
 fs/io_uring.c                                                     |  119 
 fs/jbd2/checkpoint.c                                              |    2 
 fs/jbd2/commit.c                                                  |   11 
 fs/jbd2/journal.c                                                 |  172 -
 fs/jbd2/recovery.c                                                |    6 
 fs/jbd2/transaction.c                                             |   35 
 fs/libfs.c                                                        |    6 
 fs/nfs/Kconfig                                                    |    9 
 fs/nfs/dir.c                                                      |   15 
 fs/nfs/flexfilelayout/flexfilelayout.c                            |   27 
 fs/nfs/nfs42proc.c                                                |   21 
 fs/nfs/nfs42xattr.c                                               |    2 
 fs/nfs/nfs42xdr.c                                                 |    5 
 fs/nfs/nfs4file.c                                                 |    2 
 fs/nfs/nfs4proc.c                                                 |    2 
 fs/nfs/nfsroot.c                                                  |    6 
 fs/nfs/pagelist.c                                                 |   36 
 fs/nfsd/nfs3proc.c                                                |    6 
 fs/nfsd/nfs3xdr.c                                                 |    1 
 fs/nfsd/nfs4proc.c                                                |    3 
 fs/notify/fsnotify.c                                              |   12 
 fs/ocfs2/journal.c                                                |    2 
 fs/ocfs2/super.c                                                  |    1 
 fs/proc/self.c                                                    |    7 
 fs/proc/task_mmu.c                                                |    8 
 fs/seq_file.c                                                     |   57 
 fs/super.c                                                        |   49 
 fs/xfs/libxfs/xfs_attr_leaf.c                                     |    8 
 fs/xfs/libxfs/xfs_rmap.c                                          |    2 
 fs/xfs/scrub/bmap.c                                               |   10 
 fs/xfs/scrub/btree.c                                              |   45 
 fs/xfs/scrub/dir.c                                                |   21 
 fs/xfs/scrub/refcount.c                                           |    8 
 fs/xfs/xfs_iomap.c                                                |   29 
 fs/xfs/xfs_iwalk.c                                                |   27 
 fs/xfs/xfs_mount.c                                                |   11 
 fs/xfs/xfs_pnfs.c                                                 |    2 
 fs/zonefs/super.c                                                 |   14 
 include/asm-generic/barrier.h                                     |    1 
 include/asm-generic/percpu.h                                      |   18 
 include/drm/drm_fb_helper.h                                       |   14 
 include/drm/drm_gem_shmem_helper.h                                |    7 
 include/drm/drm_modes.h                                           |    3 
 include/drm/drm_modeset_helper_vtables.h                          |   13 
 include/kunit/test.h                                              |    2 
 include/linux/blkdev.h                                            |   17 
 include/linux/bootconfig.h                                        |    3 
 include/linux/build_bug.h                                         |    5 
 include/linux/compiler-clang.h                                    |    8 
 include/linux/compiler-gcc.h                                      |   21 
 include/linux/compiler.h                                          |   18 
 include/linux/compiler_types.h                                    |    4 
 include/linux/cpufreq.h                                           |   18 
 include/linux/dma-buf-map.h                                       |    2 
 include/linux/elfcore.h                                           |   22 
 include/linux/filter.h                                            |   22 
 include/linux/firmware/xlnx-zynqmp.h                              |    4 
 include/linux/fs.h                                                |   38 
 include/linux/genhd.h                                             |    2 
 include/linux/intel-iommu.h                                       |    1 
 include/linux/irqdomain.h                                         |   12 
 include/linux/jbd2.h                                              |   25 
 include/linux/memcontrol.h                                        |   39 
 include/linux/memory_hotplug.h                                    |   14 
 include/linux/mlx5/mlx5_ifc.h                                     |    9 
 include/linux/mm.h                                                |    2 
 include/linux/netdevice.h                                         |   19 
 include/linux/netfilter/x_tables.h                                |    5 
 include/linux/nfs_page.h                                          |    4 
 include/linux/numa.h                                              |   30 
 include/linux/pagemap.h                                           |    2 
 include/linux/perf_event.h                                        |   13 
 include/linux/perf_regs.h                                         |    6 
 include/linux/pgtable.h                                           |   13 
 include/linux/platform_data/ti-sysc.h                             |    1 
 include/linux/pm_runtime.h                                        |   21 
 include/linux/sched.h                                             |   26 
 include/linux/security.h                                          |    2 
 include/linux/spi/spi.h                                           |   19 
 include/linux/stmmac.h                                            |    1 
 include/linux/swiotlb.h                                           |   11 
 include/linux/tty.h                                               |    4 
 include/linux/zsmalloc.h                                          |    1 
 include/net/bonding.h                                             |   10 
 include/net/inet_ecn.h                                            |    2 
 include/net/inet_hashtables.h                                     |    5 
 include/net/ip_tunnels.h                                          |    7 
 include/net/ipv6_frag.h                                           |   30 
 include/net/neighbour.h                                           |    1 
 include/net/netfilter/nf_tables.h                                 |    4 
 include/net/netfilter/nf_tables_offload.h                         |    7 
 include/net/tls.h                                                 |   22 
 include/net/xdp.h                                                 |    2 
 include/net/xdp_sock.h                                            |    1 
 include/net/xsk_buff_pool.h                                       |    2 
 include/scsi/libiscsi.h                                           |    3 
 include/soc/mscc/ocelot.h                                         |    3 
 include/sound/rt1015.h                                            |   15 
 include/trace/events/ext4.h                                       |   10 
 include/trace/events/sunrpc.h                                     |   11 
 include/trace/events/writeback.h                                  |    8 
 include/uapi/drm/drm_mode.h                                       |  165 -
 include/uapi/linux/bpf.h                                          |    4 
 include/uapi/linux/devlink.h                                      |    2 
 include/uapi/linux/gpio.h                                         |  106 
 include/uapi/linux/openvswitch.h                                  |    2 
 include/uapi/linux/stat.h                                         |    9 
 include/uapi/linux/virtio_gpu.h                                   |    4 
 include/xen/grant_table.h                                         |   17 
 init/Kconfig                                                      |   12 
 init/initramfs.c                                                  |    2 
 init/main.c                                                       |   18 
 kernel/Makefile                                                   |    1 
 kernel/bpf/Makefile                                               |    6 
 kernel/bpf/bpf_lsm.c                                              |   10 
 kernel/bpf/core.c                                                 |    2 
 kernel/bpf/hashtab.c                                              |   30 
 kernel/bpf/helpers.c                                              |    4 
 kernel/bpf/preload/Kconfig                                        |    1 
 kernel/bpf/verifier.c                                             |   28 
 kernel/cpu.c                                                      |    6 
 kernel/dma/swiotlb.c                                              |   22 
 kernel/elfcore.c                                                  |   26 
 kernel/events/core.c                                              |   57 
 kernel/events/internal.h                                          |   16 
 kernel/events/ring_buffer.c                                       |   20 
 kernel/exit.c                                                     |    5 
 kernel/fail_function.c                                            |    5 
 kernel/futex.c                                                    |    5 
 kernel/irq/irqdomain.c                                            |   13 
 kernel/locking/lockdep.c                                          |   25 
 kernel/panic.c                                                    |    3 
 kernel/printk/printk.c                                            |    4 
 kernel/printk/printk_ringbuffer.c                                 |    2 
 kernel/ptrace.c                                                   |   16 
 kernel/rcu/tree.c                                                 |    2 
 kernel/rcu/tree_stall.h                                           |   22 
 kernel/reboot.c                                                   |   28 
 kernel/sched/core.c                                               |   26 
 kernel/sched/cpufreq_schedutil.c                                  |    2 
 kernel/sched/deadline.c                                           |   97 
 kernel/sched/debug.c                                              |   12 
 kernel/sched/fair.c                                               |   73 
 kernel/sched/idle.c                                               |   28 
 kernel/sched/membarrier.c                                         |   77 
 kernel/seccomp.c                                                  |    5 
 kernel/trace/Kconfig                                              |    2 
 kernel/trace/bpf_trace.c                                          |   16 
 kernel/trace/ftrace.c                                             |   22 
 kernel/trace/ring_buffer.c                                        |   20 
 kernel/trace/trace.c                                              |   15 
 kernel/trace/trace_hwlat.c                                        |    2 
 kernel/watchdog.c                                                 |    4 
 lib/Makefile                                                      |    3 
 lib/strncpy_from_user.c                                           |   19 
 lib/syscall.c                                                     |   11 
 lib/zlib_dfltcc/dfltcc_inflate.c                                  |    3 
 mm/Kconfig                                                        |   13 
 mm/compaction.c                                                   |   12 
 mm/filemap.c                                                      |   26 
 mm/gup.c                                                          |   14 
 mm/huge_memory.c                                                  |    9 
 mm/hugetlb.c                                                      |   91 
 mm/hugetlb_cgroup.c                                               |    8 
 mm/kasan/quarantine.c                                             |   39 
 mm/list_lru.c                                                     |   10 
 mm/madvise.c                                                      |    7 
 mm/memcontrol.c                                                   |    9 
 mm/memory-failure.c                                               |   36 
 mm/memory_hotplug.c                                               |   18 
 mm/migrate.c                                                      |   44 
 mm/mmap.c                                                         |   28 
 mm/page-writeback.c                                               |    6 
 mm/page_alloc.c                                                   |    5 
 mm/percpu.c                                                       |    8 
 mm/rmap.c                                                         |    5 
 mm/slab.h                                                         |   40 
 mm/slub.c                                                         |    2 
 mm/swapfile.c                                                     |    4 
 mm/util.c                                                         |   12 
 mm/vmscan.c                                                       |    5 
 mm/zsmalloc.c                                                     |   54 
 net/batman-adv/fragmentation.c                                    |   26 
 net/batman-adv/hard-interface.c                                   |    3 
 net/batman-adv/log.c                                              |    1 
 net/bridge/br_device.c                                            |    7 
 net/bridge/br_multicast.c                                         |   34 
 net/bridge/br_netfilter_hooks.c                                   |    7 
 net/bridge/br_private.h                                           |   10 
 net/bridge/br_vlan.c                                              |    4 
 net/can/af_can.c                                                  |   45 
 net/can/isotp.c                                                   |    3 
 net/core/dev.c                                                    |   30 
 net/core/devlink.c                                                |   70 
 net/core/flow_offload.c                                           |    4 
 net/core/gro_cells.c                                              |    7 
 net/core/lwt_bpf.c                                                |   12 
 net/core/neighbour.c                                              |    2 
 net/core/netpoll.c                                                |   22 
 net/core/skbuff.c                                                 |    5 
 net/core/skmsg.c                                                  |   87 
 net/core/xdp.c                                                    |   29 
 net/dccp/ipv4.c                                                   |    2 
 net/dccp/ipv6.c                                                   |    2 
 net/ethtool/bitset.c                                              |    2 
 net/ethtool/features.c                                            |    2 
 net/ipv4/arp.c                                                    |    6 
 net/ipv4/fib_frontend.c                                           |    4 
 net/ipv4/inet_connection_sock.c                                   |    2 
 net/ipv4/inet_diag.c                                              |    4 
 net/ipv4/inet_hashtables.c                                        |   68 
 net/ipv4/ip_tunnel_core.c                                         |    4 
 net/ipv4/netfilter/arp_tables.c                                   |   14 
 net/ipv4/netfilter/ip_tables.c                                    |   14 
 net/ipv4/route.c                                                  |    7 
 net/ipv4/syncookies.c                                             |    9 
 net/ipv4/tcp_bbr.c                                                |    2 
 net/ipv4/tcp_bpf.c                                                |   18 
 net/ipv4/tcp_cong.c                                               |    5 
 net/ipv4/tcp_input.c                                              |    3 
 net/ipv4/tcp_ipv4.c                                               |   33 
 net/ipv4/tcp_output.c                                             |    9 
 net/ipv4/udp.c                                                    |    2 
 net/ipv4/udp_offload.c                                            |   19 
 net/ipv6/addrconf.c                                               |    8 
 net/ipv6/addrlabel.c                                              |   26 
 net/ipv6/ah6.c                                                    |    3 
 net/ipv6/ip6_gre.c                                                |   16 
 net/ipv6/ndisc.c                                                  |    7 
 net/ipv6/netfilter/ip6_tables.c                                   |   14 
 net/ipv6/netfilter/nf_conntrack_reasm.c                           |    9 
 net/ipv6/reassembly.c                                             |   26 
 net/ipv6/sit.c                                                    |    2 
 net/ipv6/syncookies.c                                             |   10 
 net/ipv6/tcp_ipv6.c                                               |   31 
 net/ipv6/udp_offload.c                                            |   17 
 net/iucv/af_iucv.c                                                |    7 
 net/mac80211/iface.c                                              |    2 
 net/mac80211/mesh_pathtbl.c                                       |    4 
 net/mac80211/rc80211_minstrel.c                                   |   27 
 net/mac80211/rc80211_minstrel.h                                   |    1 
 net/mac80211/sta_info.c                                           |   14 
 net/mac80211/status.c                                             |   18 
 net/mac80211/util.c                                               |    2 
 net/mptcp/mib.c                                                   |    1 
 net/mptcp/protocol.c                                              |    1 
 net/mptcp/subflow.c                                               |    5 
 net/ncsi/ncsi-manage.c                                            |    5 
 net/ncsi/ncsi-netlink.c                                           |   22 
 net/ncsi/ncsi-netlink.h                                           |    3 
 net/netfilter/ipset/ip_set_core.c                                 |    3 
 net/netfilter/ipvs/ip_vs_ctl.c                                    |   31 
 net/netfilter/nf_tables_api.c                                     |   11 
 net/netfilter/nf_tables_offload.c                                 |   17 
 net/netfilter/nft_cmp.c                                           |    8 
 net/netfilter/nft_ct.c                                            |    2 
 net/netfilter/nft_dynset.c                                        |    8 
 net/netfilter/nft_meta.c                                          |   16 
 net/netfilter/nft_payload.c                                       |   70 
 net/netfilter/x_tables.c                                          |   49 
 net/netlabel/netlabel_unlabeled.c                                 |   17 
 net/openvswitch/actions.c                                         |   10 
 net/openvswitch/flow_netlink.c                                    |   74 
 net/packet/af_packet.c                                            |   18 
 net/rfkill/core.c                                                 |    3 
 net/rose/rose_loopback.c                                          |   17 
 net/sched/act_mpls.c                                              |    3 
 net/sched/cls_flower.c                                            |    4 
 net/sched/sch_fq_pie.c                                            |    2 
 net/sctp/input.c                                                  |    4 
 net/sctp/sm_sideeffect.c                                          |    4 
 net/sctp/transport.c                                              |    2 
 net/smc/af_smc.c                                                  |    3 
 net/smc/smc_core.c                                                |    3 
 net/smc/smc_ib.c                                                  |    6 
 net/sunrpc/sysctl.c                                               |    9 
 net/tipc/node.c                                                   |    4 
 net/tipc/topsrv.c                                                 |   10 
 net/tls/tls_device.c                                              |   42 
 net/tls/tls_sw.c                                                  |    8 
 net/vmw_vsock/af_vsock.c                                          |    2 
 net/vmw_vsock/virtio_transport_common.c                           |    8 
 net/wireless/nl80211.c                                            |    2 
 net/x25/af_x25.c                                                  |    9 
 net/xdp/xdp_umem.c                                                |   19 
 net/xdp/xdp_umem.h                                                |    2 
 net/xdp/xsk.c                                                     |   31 
 net/xdp/xsk_buff_pool.c                                           |   14 
 net/xdp/xsk_queue.h                                               |    6 
 net/xfrm/xfrm_compat.c                                            |    5 
 net/xfrm/xfrm_state.c                                             |    4 
 samples/bpf/task_fd_query_user.c                                  |    2 
 samples/bpf/tracex2_user.c                                        |    2 
 samples/bpf/tracex3_user.c                                        |    2 
 samples/bpf/xdp_redirect_cpu_user.c                               |    2 
 samples/bpf/xdp_rxq_info_user.c                                   |    2 
 samples/ftrace/ftrace-direct-modify.c                             |    2 
 samples/ftrace/ftrace-direct-too.c                                |    1 
 samples/ftrace/ftrace-direct.c                                    |    1 
 scripts/Makefile.build                                            |   12 
 scripts/Makefile.extrawarn                                        |    2 
 scripts/bpf_helpers_doc.py                                        |    1 
 scripts/lld-version.sh                                            |   20 
 scripts/package/builddeb                                          |    2 
 security/selinux/ibpkey.c                                         |    4 
 sound/core/control.c                                              |    2 
 sound/firewire/fireworks/fireworks_transaction.c                  |    4 
 sound/pci/hda/hda_generic.c                                       |   12 
 sound/pci/hda/hda_generic.h                                       |    1 
 sound/pci/hda/hda_intel.c                                         |    3 
 sound/pci/hda/patch_ca0132.c                                      |    2 
 sound/pci/hda/patch_hdmi.c                                        |    1 
 sound/pci/hda/patch_realtek.c                                     |  157 -
 sound/pci/mixart/mixart_core.c                                    |    5 
 sound/soc/codecs/rt1015.c                                         |   22 
 sound/soc/codecs/rt1015.h                                         |    2 
 sound/soc/codecs/rt5682.c                                         |    1 
 sound/soc/codecs/wm_adsp.c                                        |    1 
 sound/soc/intel/boards/bytcr_rt5640.c                             |   17 
 sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c               |    2 
 sound/soc/intel/catpt/pcm.c                                       |    9 
 sound/soc/intel/keembay/kmb_platform.c                            |    6 
 sound/soc/qcom/lpass-cpu.c                                        |   62 
 sound/soc/qcom/lpass-lpaif-reg.h                                  |    7 
 sound/soc/qcom/lpass-platform.c                                   |   25 
 sound/soc/qcom/lpass.h                                            |    1 
 sound/usb/card.c                                                  |    4 
 sound/usb/mixer_maps.c                                            |    3 
 sound/usb/mixer_us16x08.c                                         |    2 
 sound/usb/quirks.c                                                |   10 
 tools/arch/x86/include/asm/insn.h                                 |   15 
 tools/arch/x86/lib/memcpy_64.S                                    |    8 
 tools/arch/x86/lib/memset_64.S                                    |   11 
 tools/bootconfig/main.c                                           |  124 
 tools/bootconfig/test-bootconfig.sh                               |    6 
 tools/bpf/bpftool/btf.c                                           |    1 
 tools/bpf/bpftool/feature.c                                       |    7 
 tools/bpf/bpftool/net.c                                           |   18 
 tools/bpf/bpftool/pids.c                                          |    4 
 tools/bpf/bpftool/prog.c                                          |    2 
 tools/bpf/bpftool/skeleton/profiler.bpf.c                         |    4 
 tools/include/uapi/linux/bpf.h                                    |    4 
 tools/kvm/kvm_stat/kvm_stat                                       |    6 
 tools/lib/bpf/Makefile                                            |    2 
 tools/lib/bpf/hashmap.h                                           |   15 
 tools/lib/bpf/libbpf.c                                            |   23 
 tools/lib/bpf/ringbuf.c                                           |    2 
 tools/lib/bpf/xsk.c                                               |    9 
 tools/perf/arch/x86/tests/dwarf-unwind.c                          |    7 
 tools/perf/bench/mem-memcpy-x86-64-asm.S                          |    3 
 tools/perf/bench/mem-memset-x86-64-asm.S                          |    3 
 tools/perf/builtin-diff.c                                         |    4 
 tools/perf/builtin-inject.c                                       |   12 
 tools/perf/builtin-lock.c                                         |    4 
 tools/perf/tests/shell/test_arm_coresight.sh                      |    4 
 tools/perf/util/dwarf-aux.c                                       |   28 
 tools/perf/util/hashmap.h                                         |   15 
 tools/perf/util/include/linux/linkage.h                           |    7 
 tools/perf/util/probe-finder.c                                    |    3 
 tools/perf/util/stat-display.c                                    |    5 
 tools/perf/util/synthetic-events.c                                |    3 
 tools/power/x86/turbostat/Makefile                                |    3 
 tools/power/x86/turbostat/turbostat.8                             |    2 
 tools/power/x86/turbostat/turbostat.c                             |  573 ++-
 tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c   |   67 
 tools/testing/ktest/ktest.pl                                      |    2 
 tools/testing/kunit/.gitattributes                                |    1 
 tools/testing/kunit/kunit.py                                      |   27 
 tools/testing/kunit/kunit_kernel.py                               |   53 
 tools/testing/kunit/kunit_parser.py                               |   17 
 tools/testing/kunit/kunit_tool_test.py                            |    4 
 tools/testing/scatterlist/linux/mm.h                              |    1 
 tools/testing/scatterlist/main.c                                  |    4 
 tools/testing/selftests/bpf/prog_tests/align.c                    |    8 
 tools/testing/selftests/bpf/prog_tests/map_init.c                 |  214 +
 tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c      |   71 
 tools/testing/selftests/bpf/prog_tests/ringbuf.c                  |    8 
 tools/testing/selftests/bpf/prog_tests/ringbuf_multi.c            |    2 
 tools/testing/selftests/bpf/prog_tests/sockopt_multi.c            |    3 
 tools/testing/selftests/bpf/prog_tests/subprogs.c                 |    6 
 tools/testing/selftests/bpf/prog_tests/test_global_funcs.c        |    1 
 tools/testing/selftests/bpf/progs/profiler.inc.h                  |   11 
 tools/testing/selftests/bpf/progs/test_global_func8.c             |   19 
 tools/testing/selftests/bpf/progs/test_map_init.c                 |   33 
 tools/testing/selftests/bpf/progs/test_probe_read_user_str.c      |   25 
 tools/testing/selftests/bpf/progs/test_subprogs_unused.c          |   21 
 tools/testing/selftests/bpf/test_offload.py                       |   53 
 tools/testing/selftests/bpf/verifier/array_access.c               |    2 
 tools/testing/selftests/bpf/verifier/bounds.c                     |   41 
 tools/testing/selftests/kvm/.gitignore                            |    4 
 tools/testing/selftests/kvm/Makefile                              |   25 
 tools/testing/selftests/kvm/aarch64/get-reg-list-sve.c            |    3 
 tools/testing/selftests/kvm/aarch64/get-reg-list.c                |  841 +++++
 tools/testing/selftests/kvm/clear_dirty_log_test.c                |    6 
 tools/testing/selftests/kvm/demand_paging_test.c                  |  269 -
 tools/testing/selftests/kvm/dirty_log_perf_test.c                 |  376 ++
 tools/testing/selftests/kvm/dirty_log_test.c                      |  191 +
 tools/testing/selftests/kvm/include/kvm_util.h                    |    7 
 tools/testing/selftests/kvm/include/perf_test_util.h              |  198 +
 tools/testing/selftests/kvm/include/test_util.h                   |    2 
 tools/testing/selftests/kvm/include/x86_64/processor.h            |   38 
 tools/testing/selftests/kvm/lib/aarch64/processor.c               |    4 
 tools/testing/selftests/kvm/lib/aarch64/ucall.c                   |    3 
 tools/testing/selftests/kvm/lib/kvm_util.c                        |   67 
 tools/testing/selftests/kvm/lib/kvm_util_internal.h               |    2 
 tools/testing/selftests/kvm/lib/s390x/processor.c                 |    4 
 tools/testing/selftests/kvm/lib/s390x/ucall.c                     |    3 
 tools/testing/selftests/kvm/lib/test_util.c                       |   22 
 tools/testing/selftests/kvm/lib/x86_64/handlers.S                 |   81 
 tools/testing/selftests/kvm/lib/x86_64/processor.c                |  146 
 tools/testing/selftests/kvm/lib/x86_64/ucall.c                    |    3 
 tools/testing/selftests/kvm/set_memory_region_test.c              |   17 
 tools/testing/selftests/kvm/x86_64/kvm_pv_test.c                  |  234 +
 tools/testing/selftests/net/fcnal-test.sh                         |   95 
 tools/testing/selftests/net/udpgso_bench_rx.c                     |    3 
 tools/testing/selftests/powerpc/include/utils.h                   |    5 
 tools/testing/selftests/powerpc/security/.gitignore               |    1 
 tools/testing/selftests/powerpc/security/Makefile                 |    4 
 tools/testing/selftests/powerpc/security/entry_flush.c            |  139 
 tools/testing/selftests/powerpc/security/flush_utils.c            |   70 
 tools/testing/selftests/powerpc/security/flush_utils.h            |   17 
 tools/testing/selftests/powerpc/security/rfi_flush.c              |   96 
 tools/testing/selftests/seccomp/seccomp_bpf.c                     |    8 
 tools/testing/selftests/tc-testing/config                         |    1 
 tools/testing/selftests/tc-testing/tc-tests/filters/tests.json    |    4 
 tools/testing/selftests/vm/Makefile                               |    4 
 tools/testing/selftests/vm/userfaultfd.c                          |   25 
 1498 files changed, 21843 insertions(+), 11174 deletions(-)

New commits:
commit 82d8d2c0d3970526f5f607ec12d423c083d68cf9
Merge: 002dd17efd0c 4efd7faba5e0
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Fri Dec 18 17:35:37 2020 -0800

    Merge tag 'drm-next-2020-12-18' of git://anongit.freedesktop.org/drm/drm into drm-next-5.11
    
    UAPI Changes:
    
    - Only enable char/agp uapi when CONFIG_DRM_LEGACY is set
    
    Cross-subsystem Changes:
    
    - vma_set_file helper to make vma->vm_file changing less brittle,
      acked by Andrew
    
    Core Changes:
    
    - dma-buf heaps improvements
    - pass full atomic modeset state to driver callbacks
    - shmem helpers: cached bo by default
    - cleanups for fbdev, fb-helpers
    - better docs for drm modes and SCALING_FITLER uapi
    - ttm: fix dma32 page pool regression
    
    Driver Changes:
    
    - multi-hop regression fixes for amdgpu, radeon, nouveau
    - lots of small amdgpu hw enabling fixes (display, pm, ...)
    - fixes for imx, mcde, meson, some panels, virtio, qxl, i915, all
      fairly minor
    - some cleanups for legacy drm/fbdev drivers

commit 4efd7faba5e0687ae9143b7e6a19547ede20a7dd
Merge: f96f62597ea4 046f70d31ddb
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Fri Dec 18 16:22:10 2020 +0100

    Merge tag 'drm-intel-next-fixes-2020-12-18' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
    
    drm/i915 fixes for the merge window
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    From: Jani Nikula <jani.nikula at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/87zh2bp34m.fsf@intel.com

commit f96f62597ea48cc15d6b16bddf05dc25437dcf2d
Author: Christian König <ckoenig.leichtzumerken at gmail.com>
Date:   Fri Dec 18 14:42:43 2020 +0100

    drm/qxl: don't allocate a dma_address array
    
    That seems to be unused.
    
    Daniel: Mike reported a warning when booting with qxl, which this
    patch fixes:
    
    [    1.815561] WARNING: CPU: 7 PID: 355 at drivers/gpu/drm/ttm/ttm_pool.c:365 ttm_pool_alloc+0x41b/0x540 [ttm]
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Reported-by: Mike Galbraith <efault at gmx.de>
    Tested-by: Mike Galbraith <efault at gmx.de>
    References: https://lore.kernel.org/lkml/7cb43d5b-4e6a-defc-1ab6-5f713ad5a963@amd.com/
    Reviewed-by: David Airlie <airlied at redhat.com>
    [davnet: bring commit message up to par.]
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201218134243.110884-1-christian.koenig@amd.com

diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index 128c38c8a837..7dd0c69baa47 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -115,7 +115,7 @@ static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
 	ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
 	if (ttm == NULL)
 		return NULL;
-	if (ttm_dma_tt_init(ttm, bo, page_flags, ttm_cached)) {
+	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
 		kfree(ttm);
 		return NULL;
 	}
commit 660a59953f4ff8a4958e73f7618445ff537582b2
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 18 06:09:43 2020 +1000

    drm/nouveau: fix multihop when move doesn't work.
    
    As per the radeon/amdgpu fix don't use multihop if hw moves
    aren't enabled.
    
    Reported-by: Mike Galbraith <efault at gmx.de>
    Tested-by: Mike Galbraith <efault at gmx.de>
    Fixes: 0c8c0659d747 ("drm/nouveau/ttm: use multihop")
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201217200943.30511-1-airlied@gmail.com

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 1386b0fc1640..c85b1af06b7b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -942,16 +942,6 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
 	struct nouveau_drm_tile *new_tile = NULL;
 	int ret = 0;
 
-	if ((old_reg->mem_type == TTM_PL_SYSTEM &&
-	     new_reg->mem_type == TTM_PL_VRAM) ||
-	    (old_reg->mem_type == TTM_PL_VRAM &&
-	     new_reg->mem_type == TTM_PL_SYSTEM)) {
-		hop->fpfn = 0;
-		hop->lpfn = 0;
-		hop->mem_type = TTM_PL_TT;
-		hop->flags = 0;
-		return -EMULTIHOP;
-	}
 
 	if (new_reg->mem_type == TTM_PL_TT) {
 		ret = nouveau_ttm_tt_bind(bo->bdev, bo->ttm, new_reg);
@@ -995,14 +985,25 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
 
 	/* Hardware assisted copy. */
 	if (drm->ttm.move) {
+		if ((old_reg->mem_type == TTM_PL_SYSTEM &&
+		     new_reg->mem_type == TTM_PL_VRAM) ||
+		    (old_reg->mem_type == TTM_PL_VRAM &&
+		     new_reg->mem_type == TTM_PL_SYSTEM)) {
+			hop->fpfn = 0;
+			hop->lpfn = 0;
+			hop->mem_type = TTM_PL_TT;
+			hop->flags = 0;
+			return -EMULTIHOP;
+		}
 		ret = nouveau_bo_move_m2mf(bo, evict, ctx,
 					   new_reg);
-		if (!ret)
-			goto out;
-	}
+	} else
+		ret = -ENODEV;
 
-	/* Fallback to software copy. */
-	ret = ttm_bo_move_memcpy(bo, ctx, new_reg);
+	if (ret) {
+		/* Fallback to software copy. */
+		ret = ttm_bo_move_memcpy(bo, ctx, new_reg);
+	}
 
 out:
 	if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
commit 046f70d31ddb2069941aec54966fec5b7fbc7b7b
Author: Aditya Swarup <aditya.swarup at intel.com>
Date:   Wed Dec 2 23:23:58 2020 -0800

    drm/i915/tgl: Fix REVID macros for TGL to fetch correct stepping
    
    Fix TGL REVID macros to fetch correct display/gt stepping based
    on SOC rev id from INTEL_REVID() macro. Previously, we were just
    returning the first element of the revid array instead of using
    the correct index based on SOC rev id.
    
    Fixes: c33298cb34f5 ("drm/i915/tgl: Fix stepping WA matching")
    Cc: José Roberto de Souza <jose.souza at intel.com>
    Cc: Matt Roper <matthew.d.roper at intel.com>
    Cc: Lucas De Marchi <lucas.demarchi at intel.com>
    Cc: Jani Nikula <jani.nikula at intel.com>
    Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Signed-off-by: Aditya Swarup <aditya.swarup at intel.com>
    Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
    Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201203072359.156682-1-aditya.swarup@intel.com
    (cherry picked from commit 83dbd74f8243f020d1ad8a3a3b3cd0795067920e)
    Signed-off-by: Jani Nikula <jani.nikula at intel.com>

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 15be8debae54..0a3ee4f9dc0a 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1579,9 +1579,9 @@ static inline const struct i915_rev_steppings *
 tgl_revids_get(struct drm_i915_private *dev_priv)
 {
 	if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv))
-		return tgl_uy_revids;
+		return &tgl_uy_revids[INTEL_REVID(dev_priv)];
 	else
-		return tgl_revids;
+		return &tgl_revids[INTEL_REVID(dev_priv)];
 }
 
 #define IS_TGL_DISP_REVID(p, since, until) \
@@ -1591,14 +1591,14 @@ tgl_revids_get(struct drm_i915_private *dev_priv)
 
 #define IS_TGL_UY_GT_REVID(p, since, until) \
 	((IS_TGL_U(p) || IS_TGL_Y(p)) && \
-	 tgl_uy_revids->gt_stepping >= (since) && \
-	 tgl_uy_revids->gt_stepping <= (until))
+	 tgl_uy_revids[INTEL_REVID(p)].gt_stepping >= (since) && \
+	 tgl_uy_revids[INTEL_REVID(p)].gt_stepping <= (until))
 
 #define IS_TGL_GT_REVID(p, since, until) \
 	(IS_TIGERLAKE(p) && \
 	 !(IS_TGL_U(p) || IS_TGL_Y(p)) && \
-	 tgl_revids->gt_stepping >= (since) && \
-	 tgl_revids->gt_stepping <= (until))
+	 tgl_revids[INTEL_REVID(p)].gt_stepping >= (since) && \
+	 tgl_revids[INTEL_REVID(p)].gt_stepping <= (until))
 
 #define RKL_REVID_A0		0x0
 #define RKL_REVID_B0		0x1
commit 0e53656ad8abc99e0a80c3de611e593ebbf55829
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Dec 16 09:29:51 2020 +0000

    drm/i915: Fix mismatch between misplaced vma check and vma insert
    
    When inserting a VMA, we restrict the placement to the low 4G unless the
    caller opts into using the full range. This was done to allow usersapce
    the opportunity to transition slowly from a 32b address space, and to
    avoid breaking inherent 32b assumptions of some commands.
    
    However, for insert we limited ourselves to 4G-4K, but on verification
    we allowed the full 4G. This causes some attempts to bind a new buffer
    to sporadically fail with -ENOSPC, but at other times be bound
    successfully.
    
    commit 48ea1e32c39d ("drm/i915/gen9: Set PIN_ZONE_4G end to 4GB - 1
    page") suggests that there is a genuine problem with stateless addressing
    that cannot utilize the last page in 4G and so we purposefully excluded
    it. This means that the quick pin pass may cause us to utilize a buggy
    placement.
    
    Reported-by: CQ Tang <cq.tang at intel.com>
    Testcase: igt/gem_exec_params/larger-than-life-batch
    Fixes: 48ea1e32c39d ("drm/i915/gen9: Set PIN_ZONE_4G end to 4GB - 1 page")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: CQ Tang <cq.tang at intel.com>
    Reviewed-by: CQ Tang <cq.tang at intel.com>
    Reviewed-by: Matthew Auld <matthew.auld at intel.com>
    Cc: <stable at vger.kernel.org> # v4.5+
    Link: https://patchwork.freedesktop.org/patch/msgid/20201216092951.7124-1-chris@chris-wilson.co.uk
    (cherry picked from commit 5f22cc0b134ab702d7f64b714e26018f7288ffee)
    Signed-off-by: Jani Nikula <jani.nikula at intel.com>

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index b07dc1156a0e..bcc80f428172 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -382,7 +382,7 @@ eb_vma_misplaced(const struct drm_i915_gem_exec_object2 *entry,
 		return true;
 
 	if (!(flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS) &&
-	    (vma->node.start + vma->node.size - 1) >> 32)
+	    (vma->node.start + vma->node.size + 4095) >> 32)
 		return true;
 
 	if (flags & __EXEC_OBJECT_NEEDS_MAP &&
commit dd0e2193b1e41efe611d265cea2719df4e59560f
Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Thu Nov 26 12:51:55 2020 +0200

    drm/i915/perf: also include Gen11 in OATAILPTR workaround
    
    CI shows this workaround is also needed on Gen11.
    
    Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
    Fixes: 059a0beb486344 ("drm/i915/perf: workaround register corruption in OATAILPTR")
    Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201126105155.540350-1-lionel.g.landwerlin@intel.com
    (cherry picked from commit fa5d598b8cbab0af92bac48fd60e74a893550923)
    Signed-off-by: Jani Nikula <jani.nikula at intel.com>

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 3b12c8ff7182..649c26518d26 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -914,7 +914,7 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
 		intel_uncore_rmw(uncore, oastatus_reg,
 				 GEN8_OASTATUS_COUNTER_OVERFLOW |
 				 GEN8_OASTATUS_REPORT_LOST,
-				 IS_GEN_RANGE(uncore->i915, 8, 10) ?
+				 IS_GEN_RANGE(uncore->i915, 8, 11) ?
 				 (GEN8_OASTATUS_HEAD_POINTER_WRAP |
 				  GEN8_OASTATUS_TAIL_POINTER_WRAP) : 0);
 	}
commit 2ccf2e03868455e508b4dc9fbd1bb1daebf2222e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 27 14:57:48 2020 +0000

    Revert "drm/i915: re-order if/else ladder for hpd_irq_setup"
    
    We now use ilk_hpd_irq_setup for all GMCH platforms that do not have
    hotplug. These are early gen3 and gen2 devices that now explode on boot
    as they try to access non-existent registers.
    
    Fixes: 794d61a19090 ("drm/i915: re-order if/else ladder for hpd_irq_setup")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Lucas De Marchi <lucas.demarchi at intel.com>
    Cc: José Roberto de Souza <jose.souza at intel.com>
    Cc: Jani Nikula <jani.nikula at linux.intel.com>
    Reviewed-by: Jani Nikula <jani.nikula at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127145748.29491-1-chris@chris-wilson.co.uk
    (cherry picked from commit e5346a1ff38a405c14ce8e595269e9b7dcfbb2e9)
    Signed-off-by: Jani Nikula <jani.nikula at intel.com>

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index dc6febc63f1c..c80eeac53952 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -4242,18 +4242,21 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
 	 */
 	dev_priv->hotplug.hpd_short_storm_enabled = !HAS_DP_MST(dev_priv);
 
-	if (HAS_PCH_DG1(dev_priv))
-		dev_priv->display.hpd_irq_setup = dg1_hpd_irq_setup;
-	else if (INTEL_GEN(dev_priv) >= 11)
-		dev_priv->display.hpd_irq_setup = gen11_hpd_irq_setup;
-	else if (IS_GEN9_LP(dev_priv))
-		dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup;
-	else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
-		dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup;
-	else if (HAS_GMCH(dev_priv) && I915_HAS_HOTPLUG(dev_priv))
-		dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
-	else
-		dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup;
+	if (HAS_GMCH(dev_priv)) {
+		if (I915_HAS_HOTPLUG(dev_priv))
+			dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
+	} else {
+		if (HAS_PCH_DG1(dev_priv))
+			dev_priv->display.hpd_irq_setup = dg1_hpd_irq_setup;
+		else if (INTEL_GEN(dev_priv) >= 11)
+			dev_priv->display.hpd_irq_setup = gen11_hpd_irq_setup;
+		else if (IS_GEN9_LP(dev_priv))
+			dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup;
+		else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
+			dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup;
+		else
+			dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup;
+	}
 }
 
 /**
commit efd3043790c6e92f0bbe1fe385db9b544131c59c
Merge: 02e66dd56422 6ae09fa49147
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Dec 16 23:25:51 2020 +0100

    Merge tag 'amd-drm-fixes-5.11-2020-12-16' of git://people.freedesktop.org/~agd5f/linux into drm-next
    
    amd-drm-fixes-5.11-2020-12-16:
    
    amdgpu:
    - Fix a eDP regression for DCE asics
    - SMU fixes for sienna cichlid
    - Misc W=1 fixes
    - SDMA 5.2 reset fix
    - Suspend/resume fix
    - Misc display fixes
    - Misc runtime PM fixes and cleanups
    - Dimgrey Cavefish fixes
    - printk cleanup
    - Documentation warning fixes
    
    amdkfd:
    - Error logging fix
    - Fix pipe offset calculation
    
    radeon:
    - printk cleanup
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    From: Alex Deucher <alexdeucher at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201216192421.18627-1-alexander.deucher@amd.com

commit 6ae09fa49147e557eb6aebbb5b2059b63706d454
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Tue Dec 15 12:07:55 2020 -0500

    drm/amdgpu/disply: fix documentation warnings in display manager
    
    Add documentation for crc window.
    
    Fixes: c920888c604d ("drm/amd/display: Expose new CRC window property")
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: Wayne Lin <Wayne.Lin at amd.com>
    Reported-by: Stephen Rothwell <sfr at canb.auug.org.au>
    Reviewed-by: Wayne Lin <Wayne.Lin at amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 0b31779a0485..2ee6edb3df93 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -337,10 +337,29 @@ struct amdgpu_display_manager {
 	const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
 
 #ifdef CONFIG_DEBUG_FS
-	/* set the crc calculation window*/
+	/**
+	 * @crc_win_x_start_property:
+	 *
+	 * X start of the crc calculation window
+	 */
 	struct drm_property *crc_win_x_start_property;
+	/**
+	 * @crc_win_y_start_property:
+	 *
+	 * Y start of the crc calculation window
+	 */
 	struct drm_property *crc_win_y_start_property;
+	/**
+	 * @crc_win_x_end_property:
+	 *
+	 * X end of the crc calculation window
+	 */
 	struct drm_property *crc_win_x_end_property;
+	/**
+	 * @crc_win_y_end_property:
+	 *
+	 * Y end of the crc calculation window
+	 */
 	struct drm_property *crc_win_y_end_property;
 #endif
 	/**
commit 05053c4b4f8733e53e5d81d1684a29404b27cefd
Author: Tao Zhou <tao.zhou1 at amd.com>
Date:   Wed Dec 16 11:29:43 2020 +0800

    drm/amdgpu: print mmhub client name for dimgrey_cavefish
    
    This makes it easier to debug what block is causing the fault, same as
    sienna_cichlid.
    
    Signed-off-by: Tao Zhou <tao.zhou1 at amd.com>
    Reviewed-by: Jiansong Chen <Jiansong.Chen at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c
index 092ff2c43658..f107385faba2 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c
@@ -136,6 +136,7 @@ mmhub_v2_0_print_l2_protection_fault_status(struct amdgpu_device *adev,
 		break;
 	case CHIP_SIENNA_CICHLID:
 	case CHIP_NAVY_FLOUNDER:
+	case CHIP_DIMGREY_CAVEFISH:
 		mmhub_cid = mmhub_client_ids_sienna_cichlid[cid][rw];
 		break;
 	default:
commit 15ed44c0e7129a0967157f7b349e1b3feb26a534
Author: Tao Zhou <tao.zhou1 at amd.com>
Date:   Tue Dec 15 18:04:04 2020 +0800

    drm/amdgpu: set mode1 reset as default for dimgrey_cavefish
    
    Use mode1 reset for dimgrey_cavefish by default.
    
    Signed-off-by: Tao Zhou <tao.zhou1 at amd.com>
    Reviewed-by: Jiansong Chen <Jiansong.Chen at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c
index ac02dd707c44..6bee3677394a 100644
--- a/drivers/gpu/drm/amd/amdgpu/nv.c
+++ b/drivers/gpu/drm/amd/amdgpu/nv.c
@@ -362,6 +362,7 @@ nv_asic_reset_method(struct amdgpu_device *adev)
 	switch (adev->asic_type) {
 	case CHIP_SIENNA_CICHLID:
 	case CHIP_NAVY_FLOUNDER:
+	case CHIP_DIMGREY_CAVEFISH:
 		return AMD_RESET_METHOD_MODE1;
 	default:
 		if (smu_baco_is_support(smu))
commit 6bdeff12a96c9a5da95c8d11fefd145eb165e32a
Author: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
Date:   Tue Dec 15 10:33:34 2020 -0500

    drm/amd/display: Add get_dig_frontend implementation for DCEx
    
    Some old ASICs might not implement/require get_dig_frontend helper; in
    this scenario, we can have a NULL pointer exception when we try to call
    it inside vbios disable operation. For example, this situation might
    happen when using Polaris12 with an eDP panel. This commit avoids this
    situation by adding a specific get_dig_frontend implementation for DCEx.
    
    Cc: Alex Deucher <alexander.deucher at amd.com>
    Cc: Borislav Petkov <bp at alien8.de>
    Cc: Harry Wentland <Harry.Wentland at amd.com>
    Cc: Nicholas Kazlauskas <Nicholas.Kazlauskas at amd.com>
    Cc: Chiawen Huang <chiawen.huang at amd.com>
    Reported-and-tested-by: Borislav Petkov <bp at suse.de>
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
index 4592ccdfa9b0..210466b2d863 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
@@ -120,6 +120,7 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
 	.is_dig_enabled = dce110_is_dig_enabled,
 	.destroy = dce110_link_encoder_destroy,
 	.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
+	.get_dig_frontend = dce110_get_dig_frontend,
 };
 
 static enum bp_result link_transmitter_control(
@@ -235,6 +236,44 @@ static void set_link_training_complete(
 
 }
 
+unsigned int dce110_get_dig_frontend(struct link_encoder *enc)
+{
+	struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
+	u32 value;
+	enum engine_id result;
+
+	REG_GET(DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, &value);
+
+	switch (value) {
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGA:
+		result = ENGINE_ID_DIGA;
+		break;
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGB:
+		result = ENGINE_ID_DIGB;
+		break;
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGC:
+		result = ENGINE_ID_DIGC;
+		break;
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGD:
+		result = ENGINE_ID_DIGD;
+		break;
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGE:
+		result = ENGINE_ID_DIGE;
+		break;
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGF:
+		result = ENGINE_ID_DIGF;
+		break;
+	case DCE110_DIG_FE_SOURCE_SELECT_DIGG:
+		result = ENGINE_ID_DIGG;
+		break;
+	default:
+		// invalid source select DIG
+		result = ENGINE_ID_UNKNOWN;
+	}
+
+	return result;
+}
+
 void dce110_link_encoder_set_dp_phy_pattern_training_pattern(
 	struct link_encoder *enc,
 	uint32_t index)
@@ -1665,7 +1704,8 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
 	.disable_hpd = dce110_link_encoder_disable_hpd,
 	.is_dig_enabled = dce110_is_dig_enabled,
 	.destroy = dce110_link_encoder_destroy,
-	.get_max_link_cap = dce110_link_encoder_get_max_link_cap
+	.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
+	.get_dig_frontend = dce110_get_dig_frontend
 };
 
 void dce60_link_encoder_construct(
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
index cb714a48b171..fc6ade824c23 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
@@ -295,6 +295,8 @@ void dce110_link_encoder_connect_dig_be_to_fe(
 	enum engine_id engine,
 	bool connect);
 
+unsigned int dce110_get_dig_frontend(struct link_encoder *enc);
+
 void dce110_link_encoder_set_dp_phy_pattern_training_pattern(
 	struct link_encoder *enc,
 	uint32_t index);
commit e607f6d268577986363e5838fea7a4f2b4927af4
Author: Tom Rix <trix at redhat.com>
Date:   Tue Dec 15 06:42:23 2020 -0800

    drm/radeon: remove h from printk format specifier
    
    See Documentation/core-api/printk-formats.rst.
    h should no longer be used in the format specifier for printk.
    
    Reviewed-by: Christian König <christian.koenig at amd.com>
    Signed-off-by: Tom Rix <trix at redhat.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 57fb3eb3a4b4..39c1c339be7b 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -155,7 +155,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
 			family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
 			version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
 			version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
-			DRM_INFO("Found UVD firmware Version: %hu.%hu Family ID: %hu\n",
+			DRM_INFO("Found UVD firmware Version: %u.%u Family ID: %u\n",
 				 version_major, version_minor, family_id);
 
 			/*
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
index 5e8006444704..a450497368b2 100644
--- a/drivers/gpu/drm/radeon/radeon_vce.c
+++ b/drivers/gpu/drm/radeon/radeon_vce.c
@@ -122,7 +122,7 @@ int radeon_vce_init(struct radeon_device *rdev)
 	if (sscanf(c, "%2u]", &rdev->vce.fb_version) != 1)
 		return -EINVAL;
 
-	DRM_INFO("Found VCE firmware/feedback version %hhd.%hhd.%hhd / %d!\n",
+	DRM_INFO("Found VCE firmware/feedback version %d.%d.%d / %d!\n",
 		 start, mid, end, rdev->vce.fb_version);
 
 	rdev->vce.fw_version = (start << 24) | (mid << 16) | (end << 8);
commit 0b437e64e0af749c302a7599c1a8f3e89aded559
Author: Tom Rix <trix at redhat.com>
Date:   Tue Dec 15 06:38:35 2020 -0800

    drm/amdgpu: remove h from printk format specifier
    
    See Documentation/core-api/printk-formats.rst.
    h should no longer be used in the format specifier for printk.
    
    Reviewed-by: Christian König <christian.koenig at amd.com>
    Signed-off-by: Tom Rix <trix at redhat.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index 7c5b60e53482..8b989670ed66 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -240,7 +240,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
 
 		version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
 		version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
-		DRM_INFO("Found UVD firmware Version: %hu.%hu Family ID: %hu\n",
+		DRM_INFO("Found UVD firmware Version: %u.%u Family ID: %u\n",
 			version_major, version_minor, family_id);
 
 		/*
@@ -267,7 +267,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
 		dec_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
 		enc_minor = (le32_to_cpu(hdr->ucode_version) >> 24) & 0x3f;
 		enc_major = (le32_to_cpu(hdr->ucode_version) >> 30) & 0x3;
-		DRM_INFO("Found UVD firmware ENC: %hu.%hu DEC: .%hu Family ID: %hu\n",
+		DRM_INFO("Found UVD firmware ENC: %u.%u DEC: .%u Family ID: %u\n",
 			enc_major, enc_minor, dec_minor, family_id);
 
 		adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 9791a4057e8b..0d5284b936e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -179,7 +179,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
 	version_major = (ucode_version >> 20) & 0xfff;
 	version_minor = (ucode_version >> 8) & 0xfff;
 	binary_id = ucode_version & 0xff;
-	DRM_INFO("Found VCE firmware Version: %hhd.%hhd Binary ID: %hhd\n",
+	DRM_INFO("Found VCE firmware Version: %d.%d Binary ID: %d\n",
 		version_major, version_minor, binary_id);
 	adev->vce.fw_version = ((version_major << 24) | (version_minor << 16) |
 				(binary_id << 8));
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 1c97244e0d74..4a77c7424dfc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -181,7 +181,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
 		enc_major = fw_check;
 		dec_ver = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xf;
 		vep = (le32_to_cpu(hdr->ucode_version) >> 28) & 0xf;
-		DRM_INFO("Found VCN firmware Version ENC: %hu.%hu DEC: %hu VEP: %hu Revision: %hu\n",
+		DRM_INFO("Found VCN firmware Version ENC: %u.%u DEC: %u VEP: %u Revision: %u\n",
 			enc_major, enc_minor, dec_ver, vep, fw_rev);
 	} else {
 		unsigned int version_major, version_minor, family_id;
@@ -189,7 +189,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
 		family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
 		version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
 		version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
-		DRM_INFO("Found VCN firmware Version: %hu.%hu Family ID: %hu\n",
+		DRM_INFO("Found VCN firmware Version: %u.%u Family ID: %u\n",
 			version_major, version_minor, family_id);
 	}
 
commit b4bc9d95e69368935a399b16ea26ca7573abafca
Author: Colin Ian King <colin.king at canonical.com>
Date:   Tue Dec 15 10:56:51 2020 +0000

    drm/amdgpu: Fix spelling mistake "Heterogenous" -> "Heterogeneous"
    
    There is a spelling mistake in a comment in the Kconfig. Fix it.
    
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdkfd/Kconfig b/drivers/gpu/drm/amd/amdkfd/Kconfig
index b3672d10ea54..e8fb10c41f16 100644
--- a/drivers/gpu/drm/amd/amdkfd/Kconfig
+++ b/drivers/gpu/drm/amd/amdkfd/Kconfig
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: MIT
 #
-# Heterogenous system architecture configuration
+# Heterogeneous system architecture configuration
 #
 
 config HSA_AMD
commit 7eded018bfeccb365963bb51be731a9f99aeea59
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Mon Dec 14 11:00:47 2020 -0500

    drm/amdgpu: fix regression in vbios reservation handling on headless
    
    We need to move the check under the non-headless case, otherwise
    we always reserve the VGA save size.
    
    Fixes: 157fe68d74c2ad ("drm/amdgpu: fix size calculation with stolen vga memory")
    Reviewed-by: Guchun Chen <guchun.chen at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index 02af47ddddbc..c2ced5be6d7b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -496,13 +496,14 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
 		break;
 	}
 
-	if (!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE))
+	if (!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE)) {
 		size = 0;
-	else
+	} else {
 		size = amdgpu_gmc_get_vbios_fb_size(adev);
 
-	if (adev->mman.keep_stolen_vga_memory)
-		size = max(size, (unsigned)AMDGPU_VBIOS_VGA_ALLOCATION);
+		if (adev->mman.keep_stolen_vga_memory)
+			size = max(size, (unsigned)AMDGPU_VBIOS_VGA_ALLOCATION);
+	}
 
 	/* set to 0 if the pre-OS buffer uses up most of vram */
 	if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
commit 3aa883ac8eea38281f97a7409d2922e6f343bf6c
Author: Jiange Zhao <Jiange.Zhao at amd.com>
Date:   Wed Nov 25 21:56:05 2020 +0800

    drm/amdgpu/SRIOV: Extend VF reset request wait period
    
    In Virtualization case, when one VF is sending too many
    FLR requests, hypervisor would stop responding to this
    VF's request for a long period of time. This is called
    event guard. During this period of cooling time, guest
    driver should wait instead of doing other things. After
    this period of time, guest driver would resume reset
    process and return to normal.
    
    Currently, guest driver would wait 12 seconds and return fail
    if it doesn't get response from host.
    
    Solution: extend this waiting time in guest driver and poll
    response periodically. Poll happens every 6 seconds and it will
    last for 60 seconds.
    
    v2: change the max repetition times from number to macro.
    
    Signed-off-by: Jiange Zhao <Jiange.Zhao at amd.com>
    Acked-by: Hawking Zhang <Hawking.Zhang at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
index f5ce9a9f4cf5..7767ccca526b 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
@@ -187,7 +187,16 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev,
 
 static int xgpu_ai_request_reset(struct amdgpu_device *adev)
 {
-	return xgpu_ai_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
+	int ret, i = 0;
+
+	while (i < AI_MAILBOX_POLL_MSG_REP_MAX) {
+		ret = xgpu_ai_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
+		if (!ret)
+			break;
+		i++;
+	}
+
+	return ret;
 }
 
 static int xgpu_ai_request_full_gpu_access(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h
index 83b453f5d717..50572635d0f8 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h
@@ -25,8 +25,9 @@
 #define __MXGPU_AI_H__
 
 #define AI_MAILBOX_POLL_ACK_TIMEDOUT	500
-#define AI_MAILBOX_POLL_MSG_TIMEDOUT	12000
+#define AI_MAILBOX_POLL_MSG_TIMEDOUT	6000
 #define AI_MAILBOX_POLL_FLR_TIMEDOUT	5000
+#define AI_MAILBOX_POLL_MSG_REP_MAX	11
 
 enum idh_request {
 	IDH_REQ_GPU_INIT_ACCESS = 1,
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
index 666ed99cc14b..dd5c1e6ce009 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
@@ -200,7 +200,16 @@ static int xgpu_nv_send_access_requests(struct amdgpu_device *adev,
 
 static int xgpu_nv_request_reset(struct amdgpu_device *adev)
 {
-	return xgpu_nv_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
+	int ret, i = 0;
+
+	while (i < NV_MAILBOX_POLL_MSG_REP_MAX) {
+		ret = xgpu_nv_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
+		if (!ret)
+			break;
+		i++;
+	}
+
+	return ret;
 }
 
 static int xgpu_nv_request_full_gpu_access(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h
index 52605e14a1a5..9f5808616174 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h
@@ -27,6 +27,7 @@
 #define NV_MAILBOX_POLL_ACK_TIMEDOUT	500
 #define NV_MAILBOX_POLL_MSG_TIMEDOUT	6000
 #define NV_MAILBOX_POLL_FLR_TIMEDOUT	5000
+#define NV_MAILBOX_POLL_MSG_REP_MAX	11
 
 enum idh_request {
 	IDH_REQ_GPU_INIT_ACCESS = 1,
commit 325f4b59f6361df0e20a39acd3b89c265d6ca2a8
Author: Yifan Zhang <yifan1.zhang at amd.com>
Date:   Mon Dec 14 17:45:20 2020 +0800

    drm/amdkfd: correct amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu log.
    
    it could also be insufficient vram that makes
    amdgpu_amdkfd_reserve_mem_limit fail.
    
    Signed-off-by: Yifan Zhang <yifan1.zhang at amd.com>
    Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 7791d074bd32..2d991da2cead 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -1213,7 +1213,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
 
 	ret = amdgpu_amdkfd_reserve_mem_limit(adev, size, alloc_domain, !!sg);
 	if (ret) {
-		pr_debug("Insufficient system memory\n");
+		pr_debug("Insufficient memory\n");
 		goto err_reserve_limit;
 	}
 
commit 8409e20e0785c0fc689446318c50eb11eb5ae0fe
Author: Souptick Joarder <jrdr.linux at gmail.com>
Date:   Sat Dec 12 20:26:24 2020 +0530

    drm/amd/display: Adding prototype for dccg21_update_dpp_dto()
    
    Kernel test robot throws below warning ->
    
    drivers/gpu/drm/amd/amdgpu/../display/dc/dcn21/dcn21_dccg.c:46:6:
    warning: no previous prototype for 'dccg21_update_dpp_dto'
    [-Wmissing-prototypes]
    
    Adding prototype for dccg21_update_dpp_dto().
    
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Souptick Joarder <jrdr.linux at gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_dccg.h b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_dccg.h
index b7efa777ec73..e44a37491c1e 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_dccg.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_dccg.h
@@ -32,5 +32,6 @@ struct dccg *dccg21_create(
 	const struct dccg_shift *dccg_shift,
 	const struct dccg_mask *dccg_mask);
 
+void dccg21_update_dpp_dto(struct dccg *dccg, int dpp_inst, int req_dppclk);
 
 #endif /* __DCN21_DCCG_H__ */
commit d00a88ab5870f16623df9380ab85dd732667d4c8
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 17:06:18 2020 -0500

    drm/amdgpu: print what method we are using for runtime pm
    
    So we know when it's enabled and what method we are using.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index af049041ea3f..b16b32797624 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -163,9 +163,11 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 	if (amdgpu_device_supports_atpx(dev) &&
 	    (amdgpu_runtime_pm != 0)) { /* enable runpm by default for atpx */
 		adev->runpm = true;
+		dev_info(adev->dev, "Using ATPX for runtime pm\n");
 	} else if (amdgpu_device_supports_boco(dev) &&
 		   (amdgpu_runtime_pm != 0)) { /* enable runpm by default for boco */
 		adev->runpm = true;
+		dev_info(adev->dev, "Using BOCO for runtime pm\n");
 	} else if (amdgpu_device_supports_baco(dev) &&
 		   (amdgpu_runtime_pm != 0)) {
 		switch (adev->asic_type) {
@@ -187,6 +189,8 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 			adev->runpm = true;
 			break;
 		}
+		if (adev->runpm)
+			dev_info(adev->dev, "Using BACO for runtime pm\n");
 	}
 
 	/* Call ACPI methods: require modeset init
commit 637bb036ce665cede8914c4dca540d8f9f38af65
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 13:21:36 2020 -0500

    drm/amdgpu: simplify logic in atpx resume handling
    
    Simplify the logic in the runtime resume handling for
    atpx
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 4f97d493eeda..cac2724e7615 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1382,16 +1382,14 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 		/* Only need to handle PCI state in the driver for ATPX
 		 * PCI core handles it for _PR3.
 		 */
-		if (amdgpu_is_atpx_hybrid()) {
-			pci_set_master(pdev);
-		} else {
+		if (!amdgpu_is_atpx_hybrid()) {
 			pci_set_power_state(pdev, PCI_D0);
 			amdgpu_device_load_pci_state(pdev);
 			ret = pci_enable_device(pdev);
 			if (ret)
 				return ret;
-			pci_set_master(pdev);
 		}
+		pci_set_master(pdev);
 	} else if (amdgpu_device_supports_boco(drm_dev)) {
 		/* Only need to handle PCI state in the driver for ATPX
 		 * PCI core handles it for _PR3.
commit ceb4de67c96051967c7c0095fc6036ef0d1e1248
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 13:20:03 2020 -0500

    drm/amdgpu: no need to call pci_ignore_hotplug for _PR3
    
    The platform knows it's doing d3cold.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 90b8ce762aee..4f97d493eeda 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1352,20 +1352,13 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 		/* Only need to handle PCI state in the driver for ATPX
 		 * PCI core handles it for _PR3.
 		 */
-		if (amdgpu_is_atpx_hybrid()) {
-			pci_ignore_hotplug(pdev);
-		} else {
+		if (!amdgpu_is_atpx_hybrid()) {
 			amdgpu_device_cache_pci_state(pdev);
 			pci_disable_device(pdev);
 			pci_ignore_hotplug(pdev);
 			pci_set_power_state(pdev, PCI_D3cold);
 		}
 		drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
-	} else if (amdgpu_device_supports_boco(drm_dev)) {
-		/* Only need to handle PCI state in the driver for ATPX
-		 * PCI core handles it for _PR3.
-		 */
-		pci_ignore_hotplug(pdev);
 	} else if (amdgpu_device_supports_baco(drm_dev)) {
 		amdgpu_device_baco_enter(drm_dev);
 	}
commit 157e8306038cf54e3c5149e72ad88ac0448ec7e2
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 13:12:50 2020 -0500

    drm/amdgpu: support runtime pm for GPUs that support BOCO
    
    Enable runtime pm on non HG/PX BOCO capable boards.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index ec8fff7839ef..af049041ea3f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -161,7 +161,10 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 	}
 
 	if (amdgpu_device_supports_atpx(dev) &&
-	    (amdgpu_runtime_pm != 0)) { /* enable runpm by default for boco */
+	    (amdgpu_runtime_pm != 0)) { /* enable runpm by default for atpx */
+		adev->runpm = true;
+	} else if (amdgpu_device_supports_boco(dev) &&
+		   (amdgpu_runtime_pm != 0)) { /* enable runpm by default for boco */
 		adev->runpm = true;
 	} else if (amdgpu_device_supports_baco(dev) &&
 		   (amdgpu_runtime_pm != 0)) {
commit 0330b8487842924351663878582b777002792acd
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 13:10:21 2020 -0500

    drm/amdgpu: update amdgpu_device_supports_boco()
    
    Change it to check if the device has ACPI power resources.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index a96150ab0774..7d2f7a2240b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -229,7 +229,7 @@ bool amdgpu_device_supports_atpx(struct drm_device *dev)
 }
 
 /**
- * amdgpu_device_supports_boco - Is the device a dGPU with HG/PX power control
+ * amdgpu_device_supports_boco - Is the device a dGPU with ACPI power resources
  *
  * @dev: drm_device pointer
  *
@@ -240,7 +240,7 @@ bool amdgpu_device_supports_boco(struct drm_device *dev)
 {
 	struct amdgpu_device *adev = drm_to_adev(dev);
 
-	if (adev->flags & AMD_IS_PX)
+	if (adev->has_pr3)
 		return true;
 	return false;
 }
commit b10c1c5b3a4e3f1f166ab48c3619d8348a4e9c5d
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 13:07:30 2020 -0500

    drm/amdgpu: add check for ACPI power resources
    
    Check if the device has ACPI power resources so we can
    enable runtime pm if so.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 859aae780056..e119185210de 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1024,6 +1024,7 @@ struct amdgpu_device {
 	/* enable runtime pm on the device */
 	bool                            runpm;
 	bool                            in_runpm;
+	bool                            has_pr3;
 
 	bool                            pm_sysfs_en;
 	bool                            ucode_sysfs_en;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 38fb903338a4..ec8fff7839ef 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -133,6 +133,7 @@ void amdgpu_register_gpu_instance(struct amdgpu_device *adev)
 int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 {
 	struct drm_device *dev;
+	struct pci_dev *parent;
 	int r, acpi_status;
 
 	dev = adev_to_drm(adev);
@@ -144,6 +145,9 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 	    !pci_is_thunderbolt_attached(dev->pdev))
 		flags |= AMD_IS_PX;
 
+	parent = pci_upstream_bridge(adev->pdev);
+	adev->has_pr3 = parent ? pci_pr3_present(parent) : false;
+
 	/* amdgpu_device_init should report only fatal error
 	 * like memory allocation failure or iomapping failure,
 	 * or memory manager initialization failure, it must
commit fd496ca892f52df6eb0a0bfcdef1378aed966624
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Wed Dec 9 12:45:23 2020 -0500

    drm/amdgpu: split BOCO and ATPX handling
    
    In preparation for systems that support d3cold on dGPUs
    independent of PX/HG.  No functional change intended.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index b24de64f4490..859aae780056 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1230,6 +1230,7 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
 					     const u32 *registers,
 					     const u32 array_size);
 
+bool amdgpu_device_supports_atpx(struct drm_device *dev);
 bool amdgpu_device_supports_boco(struct drm_device *dev);
 bool amdgpu_device_supports_baco(struct drm_device *dev);
 bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 0ec7c28c4d5a..a96150ab0774 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -211,6 +211,23 @@ static ssize_t amdgpu_device_get_serial_number(struct device *dev,
 static DEVICE_ATTR(serial_number, S_IRUGO,
 		amdgpu_device_get_serial_number, NULL);
 
+/**
+ * amdgpu_device_supports_atpx - Is the device a dGPU with HG/PX power control
+ *
+ * @dev: drm_device pointer
+ *
+ * Returns true if the device is a dGPU with HG/PX power control,
+ * otherwise return false.
+ */
+bool amdgpu_device_supports_atpx(struct drm_device *dev)
+{
+	struct amdgpu_device *adev = drm_to_adev(dev);
+
+	if (adev->flags & AMD_IS_PX)
+		return true;
+	return false;
+}
+
 /**
  * amdgpu_device_supports_boco - Is the device a dGPU with HG/PX power control
  *
@@ -1398,7 +1415,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,
 	struct drm_device *dev = pci_get_drvdata(pdev);
 	int r;
 
-	if (amdgpu_device_supports_boco(dev) && state == VGA_SWITCHEROO_OFF)
+	if (amdgpu_device_supports_atpx(dev) && state == VGA_SWITCHEROO_OFF)
 		return;
 
 	if (state == VGA_SWITCHEROO_ON) {
@@ -3177,7 +3194,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 	struct drm_device *ddev = adev_to_drm(adev);
 	struct pci_dev *pdev = adev->pdev;
 	int r, i;
-	bool boco = false;
+	bool atpx = false;
 	u32 max_MBps;
 
 	adev->shutdown = false;
@@ -3349,15 +3366,15 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
 		vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode);
 
-	if (amdgpu_device_supports_boco(ddev))
-		boco = true;
+	if (amdgpu_device_supports_atpx(ddev))
+		atpx = true;
 	if (amdgpu_has_atpx() &&
 	    (amdgpu_is_atpx_hybrid() ||
 	     amdgpu_has_atpx_dgpu_power_cntl()) &&
 	    !pci_is_thunderbolt_attached(adev->pdev))
 		vga_switcheroo_register_client(adev->pdev,
-					       &amdgpu_switcheroo_ops, boco);
-	if (boco)
+					       &amdgpu_switcheroo_ops, atpx);
+	if (atpx)
 		vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
 
 	if (amdgpu_emu_mode == 1) {
@@ -3540,7 +3557,7 @@ fence_driver_init:
 
 failed:
 	amdgpu_vf_error_trans_all(adev);
-	if (boco)
+	if (atpx)
 		vga_switcheroo_fini_domain_pm_ops(adev->dev);
 
 failed_unmap:
@@ -3604,7 +3621,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
 	     amdgpu_has_atpx_dgpu_power_cntl()) &&
 	    !pci_is_thunderbolt_attached(adev->pdev))
 		vga_switcheroo_unregister_client(adev->pdev);
-	if (amdgpu_device_supports_boco(adev_to_drm(adev)))
+	if (amdgpu_device_supports_atpx(adev_to_drm(adev)))
 		vga_switcheroo_fini_domain_pm_ops(adev->dev);
 	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
 		vga_client_register(adev->pdev, NULL, NULL, NULL);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index ebdab31f9de9..90b8ce762aee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1340,7 +1340,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 	}
 
 	adev->in_runpm = true;
-	if (amdgpu_device_supports_boco(drm_dev))
+	if (amdgpu_device_supports_atpx(drm_dev))
 		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 	drm_kms_helper_poll_disable(drm_dev);
 
@@ -1348,7 +1348,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 	if (ret)
 		return ret;
 
-	if (amdgpu_device_supports_boco(drm_dev)) {
+	if (amdgpu_device_supports_atpx(drm_dev)) {
 		/* Only need to handle PCI state in the driver for ATPX
 		 * PCI core handles it for _PR3.
 		 */
@@ -1361,6 +1361,11 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 			pci_set_power_state(pdev, PCI_D3cold);
 		}
 		drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
+	} else if (amdgpu_device_supports_boco(drm_dev)) {
+		/* Only need to handle PCI state in the driver for ATPX
+		 * PCI core handles it for _PR3.
+		 */
+		pci_ignore_hotplug(pdev);
 	} else if (amdgpu_device_supports_baco(drm_dev)) {
 		amdgpu_device_baco_enter(drm_dev);
 	}
@@ -1378,7 +1383,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 	if (!adev->runpm)
 		return -EINVAL;
 
-	if (amdgpu_device_supports_boco(drm_dev)) {
+	if (amdgpu_device_supports_atpx(drm_dev)) {
 		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 
 		/* Only need to handle PCI state in the driver for ATPX
@@ -1394,12 +1399,17 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 				return ret;
 			pci_set_master(pdev);
 		}
+	} else if (amdgpu_device_supports_boco(drm_dev)) {
+		/* Only need to handle PCI state in the driver for ATPX
+		 * PCI core handles it for _PR3.
+		 */
+		pci_set_master(pdev);
 	} else if (amdgpu_device_supports_baco(drm_dev)) {
 		amdgpu_device_baco_exit(drm_dev);
 	}
 	ret = amdgpu_device_resume(drm_dev, false);
 	drm_kms_helper_poll_enable(drm_dev);
-	if (amdgpu_device_supports_boco(drm_dev))
+	if (amdgpu_device_supports_atpx(drm_dev))
 		drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
 	adev->in_runpm = false;
 	return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index fc12fc72366f..38fb903338a4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -156,7 +156,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 		goto out;
 	}
 
-	if (amdgpu_device_supports_boco(dev) &&
+	if (amdgpu_device_supports_atpx(dev) &&
 	    (amdgpu_runtime_pm != 0)) { /* enable runpm by default for boco */
 		adev->runpm = true;
 	} else if (amdgpu_device_supports_baco(dev) &&
@@ -192,7 +192,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 
 	if (adev->runpm) {
 		/* only need to skip on ATPX */
-		if (amdgpu_device_supports_boco(dev) &&
+		if (amdgpu_device_supports_atpx(dev) &&
 		    !amdgpu_is_atpx_hybrid())
 			dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
 		pm_runtime_use_autosuspend(dev->dev);
commit 8ccbfdf0b9c334196cc45260c14081855d729bc8
Author: Souptick Joarder <jrdr.linux at gmail.com>
Date:   Sat Dec 12 01:02:36 2020 +0530

    drm/amd/display: Fixed kernel test robot warning
    
    Kernel test robot throws below warning ->
    
    drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:5349:5:
    warning: no previous prototype for 'amdgpu_dm_crtc_atomic_set_property'
    [-Wmissing-prototypes]
    drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:5349:5:
    warning: no previous prototype for function
    'amdgpu_dm_crtc_atomic_set_property' [-Wmissing-prototypes]
    drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:5373:5:
    warning: no previous prototype for 'amdgpu_dm_crtc_atomic_get_property'
    [-Wmissing-prototypes]
    drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:5373:5:
    warning: no previous prototype for function
    'amdgpu_dm_crtc_atomic_get_property' [-Wmissing-prototypes]
    
    As these functions are only used inside amdgpu_dm.c, these can be
    made static.
    
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Souptick Joarder <jrdr.linux at gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0a908cb8119c..2c4dbdeec46a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5342,7 +5342,7 @@ dm_crtc_duplicate_state(struct drm_crtc *crtc)
 }
 
 #ifdef CONFIG_DEBUG_FS
-int amdgpu_dm_crtc_atomic_set_property(struct drm_crtc *crtc,
+static int amdgpu_dm_crtc_atomic_set_property(struct drm_crtc *crtc,
 					    struct drm_crtc_state *crtc_state,
 					    struct drm_property *property,
 					    uint64_t val)
@@ -5366,7 +5366,7 @@ int amdgpu_dm_crtc_atomic_set_property(struct drm_crtc *crtc,
 	return 0;
 }
 
-int amdgpu_dm_crtc_atomic_get_property(struct drm_crtc *crtc,
+static int amdgpu_dm_crtc_atomic_get_property(struct drm_crtc *crtc,
 					    const struct drm_crtc_state *state,
 					    struct drm_property *property,
 					    uint64_t *val)
commit 487193856eafa0aea498aa3a5ec0701828e79743
Author: Aric Cyr <aric.cyr at amd.com>
Date:   Mon Dec 7 10:33:09 2020 -0500

    drm/amd/display: 3.2.116
    
    Signed-off-by: Aric Cyr <aric.cyr at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index b8f1e2d33423..3aedadb34548 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -42,7 +42,7 @@
 #include "inc/hw/dmcu.h"
 #include "dml/display_mode_lib.h"
 
-#define DC_VER "3.2.115"
+#define DC_VER "3.2.116"
 
 #define MAX_SURFACES 3
 #define MAX_PLANES 6
commit b6402afec1cfd2550a91e83745191376542688bc
Author: Anthony Koo <Anthony.Koo at amd.com>
Date:   Sun Dec 6 13:57:54 2020 -0500

    drm/amd/display: [FW Promotion] Release 0.0.46
    
    - Add new aux_channel_type
    - Changed port_index to instance in dmub_cmd_dp_aux_control_data
    - Change aux_return_code_type to sync up with driver
    - param for ramping abm based on backlight level
    
    Signed-off-by: Anthony Koo <Anthony.Koo at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
index b20a39f488ae..f512bda96917 100644
--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
+++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
@@ -47,10 +47,10 @@
 
 /* Firmware versioning. */
 #ifdef DMUB_EXPOSE_VERSION
-#define DMUB_FW_VERSION_GIT_HASH 0x931573111
+#define DMUB_FW_VERSION_GIT_HASH 0xa18e25995
 #define DMUB_FW_VERSION_MAJOR 0
 #define DMUB_FW_VERSION_MINOR 0
-#define DMUB_FW_VERSION_REVISION 45
+#define DMUB_FW_VERSION_REVISION 46
 #define DMUB_FW_VERSION_TEST 0
 #define DMUB_FW_VERSION_VBIOS 0
 #define DMUB_FW_VERSION_HOTFIX 0
@@ -514,12 +514,20 @@ enum dp_aux_request_action {
 
 enum aux_return_code_type {
 	AUX_RET_SUCCESS = 0,
+	AUX_RET_ERROR_UNKNOWN,
+	AUX_RET_ERROR_INVALID_REPLY,
 	AUX_RET_ERROR_TIMEOUT,
-	AUX_RET_ERROR_NO_DATA,
+	AUX_RET_ERROR_HPD_DISCON,
+	AUX_RET_ERROR_ENGINE_ACQUIRE,
 	AUX_RET_ERROR_INVALID_OPERATION,
 	AUX_RET_ERROR_PROTOCOL_ERROR,
 };
 
+enum aux_channel_type {
+	AUX_CHANNEL_LEGACY_DDC,
+	AUX_CHANNEL_DPIA
+};
+
 /* DP AUX command */
 struct aux_transaction_parameters {
 	uint8_t is_i2c_over_aux;
@@ -532,9 +540,10 @@ struct aux_transaction_parameters {
 
 struct dmub_cmd_dp_aux_control_data {
 	uint32_t handle;
-	uint8_t port_index;
+	uint8_t instance;
 	uint8_t sw_crc_enabled;
 	uint16_t timeout;
+	enum aux_channel_type type;
 	struct aux_transaction_parameters dpaux;
 };
 
@@ -558,7 +567,7 @@ struct aux_reply_data {
 
 struct aux_reply_control_data {
 	uint32_t handle;
-	uint8_t phy_port_index;
+	uint8_t instance;
 	uint8_t result;
 	uint16_t pad;
 };
@@ -581,7 +590,7 @@ enum dp_hpd_status {
 };
 
 struct dp_hpd_data {
-	uint8_t phy_port_index;
+	uint8_t instance;
 	uint8_t hpd_type;
 	uint8_t hpd_status;
 	uint8_t pad;
@@ -732,27 +741,30 @@ enum dmub_cmd_abm_type {
 struct abm_config_table {
 	/* Parameters for crgb conversion */
 	uint16_t crgb_thresh[NUM_POWER_FN_SEGS];                 // 0B
-	uint16_t crgb_offset[NUM_POWER_FN_SEGS];                 // 15B
-	uint16_t crgb_slope[NUM_POWER_FN_SEGS];                  // 31B
+	uint16_t crgb_offset[NUM_POWER_FN_SEGS];                 // 16B
+	uint16_t crgb_slope[NUM_POWER_FN_SEGS];                  // 32B
 
 	/* Parameters for custom curve */
-	uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS];        // 47B
-	uint16_t backlight_offsets[NUM_BL_CURVE_SEGS];           // 79B
-
-	uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL];         // 111B
-	uint16_t min_abm_backlight;                              // 121B
-
-	uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 123B
-	uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 143B
-	uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 163B
-	uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 183B
-	uint8_t hybrid_factor[NUM_AGGR_LEVEL];                   // 203B
-	uint8_t contrast_factor[NUM_AGGR_LEVEL];                 // 207B
-	uint8_t deviation_gain[NUM_AGGR_LEVEL];                  // 211B
-	uint8_t min_knee[NUM_AGGR_LEVEL];                        // 215B
-	uint8_t max_knee[NUM_AGGR_LEVEL];                        // 219B
-	uint8_t iir_curve[NUM_AMBI_LEVEL];                       // 223B
-	uint8_t pad3[3];                                         // 228B
+	uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS];        // 48B
+	uint16_t backlight_offsets[NUM_BL_CURVE_SEGS];           // 78B
+
+	uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL];         // 112B
+	uint16_t min_abm_backlight;                              // 122B
+
+	uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 124B
+	uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 144B
+	uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 164B
+	uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL];   // 184B
+	uint8_t hybrid_factor[NUM_AGGR_LEVEL];                   // 204B
+	uint8_t contrast_factor[NUM_AGGR_LEVEL];                 // 208B
+	uint8_t deviation_gain[NUM_AGGR_LEVEL];                  // 212B
+	uint8_t min_knee[NUM_AGGR_LEVEL];                        // 216B
+	uint8_t max_knee[NUM_AGGR_LEVEL];                        // 220B
+	uint8_t iir_curve[NUM_AMBI_LEVEL];                       // 224B
+	uint8_t pad3[3];                                         // 229B
+
+	uint16_t blRampReduction[NUM_AGGR_LEVEL];                // 232B
+	uint16_t blRampStart[NUM_AGGR_LEVEL];                    // 240B
 };
 
 struct dmub_cmd_abm_set_pipe_data {
commit 31c6b7a9d40ad2fc4e6180215b580b99ededae22
Author: Aric Cyr <aric.cyr at amd.com>
Date:   Tue Dec 1 18:24:09 2020 -0500

    drm/amd/display: Fix cleanup typo in MPCC visual confirm
    
    [Why]
    Typo in MPCC visual confirmation.
    
    [How]
    Fix to correct values.
    
    Signed-off-by: Aric Cyr <aric.cyr at amd.com>
    Reviewed-by: Jun Lei <Jun.Lei at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index cba3c8cd12a1..31a477194d3b 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -2243,11 +2243,11 @@ void dcn20_get_mpctree_visual_confirm_color(
 {
 	const struct tg_color pipe_colors[6] = {
 			{MAX_TG_COLOR_VALUE, 0, 0}, // red
-			{MAX_TG_COLOR_VALUE, 0, MAX_TG_COLOR_VALUE}, // yellow
-			{0, MAX_TG_COLOR_VALUE, 0}, // blue
+			{MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE / 4, 0}, // orange
+			{MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, 0}, // yellow
+			{0, MAX_TG_COLOR_VALUE, 0}, // green
+			{0, 0, MAX_TG_COLOR_VALUE}, // blue
 			{MAX_TG_COLOR_VALUE / 2, 0, MAX_TG_COLOR_VALUE / 2}, // purple
-			{0, 0, MAX_TG_COLOR_VALUE}, // green
-			{MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE * 2 / 3, 0}, // orange
 	};
 
 	struct pipe_ctx *top_pipe = pipe_ctx;
@@ -2272,14 +2272,11 @@ void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
 
 	// input to MPCC is always RGB, by default leave black_color at 0
 	if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) {
-		hws->funcs.get_hdr_visual_confirm_color(
-				pipe_ctx, &blnd_cfg.black_color);
+		hws->funcs.get_hdr_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color);
 	} else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) {
-		hws->funcs.get_surface_visual_confirm_color(
-				pipe_ctx, &blnd_cfg.black_color);
+		hws->funcs.get_surface_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color);
 	} else if (dc->debug.visual_confirm == VISUAL_CONFIRM_MPCTREE) {
-		dcn20_get_mpctree_visual_confirm_color(
-				pipe_ctx, &blnd_cfg.black_color);
+		dcn20_get_mpctree_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color);
 	}
 
 	if (per_pixel_alpha)
commit e10777a67963163055f9ca43292cb21ff52967d2
Author: Felipe <Felipe.Clark at amd.com>
Date:   Mon Nov 30 17:38:02 2020 -0500

    drm/amd/display: Fix OGAM LUT calculation precision
    
    [Why]
    The OGAM LUT precision was accumulating too much error
    in the higher end.
    
    [How]
    Instead of calculating all points of the LUT in relation
    to the previous ones, perform a full calculation in one
    of the intermediate segments to stop error propagation.
    
    Signed-off-by: Felipe Clark <Felipe.Clark at amd.com>
    Reviewed-by: Krunoslav Kovac <Krunoslav.Kovac at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
index eced40a2fce4..5c67e12b2e55 100644
--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
@@ -30,6 +30,14 @@
 #include "opp.h"
 #include "color_gamma.h"
 
+/* When calculating LUT values the first region and at least one subsequent
+ * region are calculated with full precision. These defines are a demarcation
+ * of where the second region starts and ends.
+ * These are hardcoded values to avoid recalculating them in loops.
+ */
+#define PRECISE_LUT_REGION_START 224
+#define PRECISE_LUT_REGION_END 239
+
 static struct hw_x_point coordinates_x[MAX_HW_POINTS + 2];
 
 // these are helpers for calculations to reduce stack usage
@@ -346,7 +354,13 @@ static struct fixed31_32 translate_from_linear_space(
 					dc_fixpt_recip(args->gamma));
 		}
 		scratch_1 = dc_fixpt_add(one, args->a3);
-		if (cal_buffer->buffer_index < 16)
+		/* In the first region (first 16 points) and in the
+		 * region delimited by START/END we calculate with
+		 * full precision to avoid error accumulation. 
+		 */
+		if ((cal_buffer->buffer_index >= PRECISE_LUT_REGION_START &&
+			cal_buffer->buffer_index <= PRECISE_LUT_REGION_END) ||
+			(cal_buffer->buffer_index < 16))
 			scratch_2 = dc_fixpt_pow(args->arg,
 					dc_fixpt_recip(args->gamma));
 		else
@@ -397,9 +411,7 @@ static struct fixed31_32 translate_from_linear_space_long(
 					dc_fixpt_recip(args->gamma))),
 					args->a2);
 	else
-		return dc_fixpt_mul(
-			args->arg,
-			args->a1);
+		return dc_fixpt_mul(args->arg, args->a1);
 }
 
 static struct fixed31_32 calculate_gamma22(struct fixed31_32 arg, bool use_eetf, struct calculate_buffer *cal_buffer)
@@ -717,7 +729,6 @@ static struct fixed31_32 calculate_mapped_value(
 		BREAK_TO_DEBUGGER();
 		result = dc_fixpt_zero;
 	} else {
-		BREAK_TO_DEBUGGER();
 		result = dc_fixpt_one;
 	}
 
@@ -976,6 +987,7 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
 		cal_buffer->buffer_index = 0; // see var definition for more info
 	rgb += 32; // first 32 points have problems with fixed point, too small
 	coord_x += 32;
+
 	for (i = 32; i <= hw_points_num; i++) {
 		if (!is_clipped) {
 			if (use_eetf) {
commit 610c4974ad172dad884244763125f8cd6585c503
Author: Aric Cyr <aric.cyr at amd.com>
Date:   Fri Dec 4 00:22:46 2020 -0500

    drm/amd/display: Only update FP2 for full updates
    
    [Why]
    FP2 is not double buffered and must wait for VACTIVE
    before programming.
    
    [How]
    Only update when there is a full update we should
    change FP2 to avoid delay every flip.
    
    Signed-off-by: Aric Cyr <aric.cyr at amd.com>
    Reviewed-by: Jun Lei <Jun.Lei at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 58eb0d69873a..7339d9855ec8 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -2625,6 +2625,26 @@ static void commit_planes_for_stream(struct dc *dc,
 		}
 	}
 
+	if (update_type != UPDATE_TYPE_FAST) {
+		// If changing VTG FP2: wait until back in vactive to program FP2
+		// Need to ensure that pipe unlock happens soon after to minimize race condition
+		for (i = 0; i < dc->res_pool->pipe_count; i++) {
+			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+
+			if (pipe_ctx->top_pipe || pipe_ctx->stream != stream)
+				continue;
+
+			if (!pipe_ctx->update_flags.bits.global_sync)
+				continue;
+
+			pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VBLANK);
+			pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VACTIVE);
+
+			pipe_ctx->stream_res.tg->funcs->set_vtg_params(
+					pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, true);
+		}
+	}
+
 	if ((update_type != UPDATE_TYPE_FAST) && dc->hwss.interdependent_update_lock)
 		dc->hwss.interdependent_update_lock(dc, context, false);
 	else
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index 52bdbf2d50f5..cba3c8cd12a1 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -1214,17 +1214,6 @@ void dcn20_pipe_control_lock(
 		!flip_immediate)
 	    dcn20_setup_gsl_group_as_lock(dc, pipe, false);
 
-
-	// If changing VTG FP2: wait until back in vactive to program FP2
-	// Need to ensure that pipe unlock happens soon after to minimize race condition
-	if (!lock && pipe->update_flags.bits.global_sync) {
-		pipe->stream_res.tg->funcs->wait_for_state(pipe->stream_res.tg, CRTC_STATE_VBLANK);
-		pipe->stream_res.tg->funcs->wait_for_state(pipe->stream_res.tg, CRTC_STATE_VACTIVE);
-
-		pipe->stream_res.tg->funcs->set_vtg_params(
-				pipe->stream_res.tg, &pipe->stream->timing, true);
-	}
-
 	if (pipe->stream && should_use_dmub_lock(pipe->stream->link)) {
 		union dmub_hw_lock_flags hw_locks = { 0 };
 		struct dmub_hw_lock_inst_flags inst_flags = { 0 };
commit 410066d24cfc1071be25e402510367aca9db5cb6
Author: Jake Wang <haonan.wang2 at amd.com>
Date:   Thu Dec 3 14:05:56 2020 -0500

    drm/amd/display: updated wm table for Renoir
    
    [Why]
    For certain timings, Renoir may underflow due to sr exit
    latency being too slow.
    
    [How]
    Updated wm table for renoir.
    
    Signed-off-by: Jake Wang <haonan.wang2 at amd.com>
    Reviewed-by: Yongqiang Sun <yongqiang.sun at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
index 6f4fe8fce6b7..d00b02553d62 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
@@ -746,24 +746,24 @@ static struct wm_table ddr4_wm_table_rn = {
 			.wm_inst = WM_B,
 			.wm_type = WM_TYPE_PSTATE_CHG,
 			.pstate_latency_us = 11.72,
-			.sr_exit_time_us = 10.12,
-			.sr_enter_plus_exit_time_us = 11.48,
+			.sr_exit_time_us = 11.12,
+			.sr_enter_plus_exit_time_us = 12.48,
 			.valid = true,
 		},
 		{
 			.wm_inst = WM_C,
 			.wm_type = WM_TYPE_PSTATE_CHG,
 			.pstate_latency_us = 11.72,
-			.sr_exit_time_us = 10.12,
-			.sr_enter_plus_exit_time_us = 11.48,
+			.sr_exit_time_us = 11.12,
+			.sr_enter_plus_exit_time_us = 12.48,
 			.valid = true,
 		},
 		{
 			.wm_inst = WM_D,
 			.wm_type = WM_TYPE_PSTATE_CHG,
 			.pstate_latency_us = 11.72,
-			.sr_exit_time_us = 10.12,
-			.sr_enter_plus_exit_time_us = 11.48,
+			.sr_exit_time_us = 11.12,
+			.sr_enter_plus_exit_time_us = 12.48,
 			.valid = true,
 		},
 	}
commit 5200c4017ef25f85634012a967c78ff64495dd85
Author: Martin Leung <martin.leung at amd.com>
Date:   Wed Dec 2 15:10:12 2020 -0500

    drm/amd/display: delay fp2 programming until vactive before lock
    
    [Why]
    race condition of programming FP2 wrt pipe locking
    and vactive state can cause underflow/black screen
    
    [How]
    Enforce the FP2 is only programmed during vactive,
    and unlock pipe soon afterwards.
    
    Signed-off-by: Martin Leung <martin.leung at amd.com>
    Reviewed-by: Jun Lei <Jun.Lei at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 9f7d6b087553..cfc130e2d6fd 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -2736,7 +2736,7 @@ static void dcn10_program_all_pipe_in_tree(
 				pipe_ctx->pipe_dlg_param.vupdate_width);
 
 		pipe_ctx->stream_res.tg->funcs->set_vtg_params(
-				pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
+				pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, true);
 
 		if (hws->funcs.setup_vupdate_interrupt)
 			hws->funcs.setup_vupdate_interrupt(dc, pipe_ctx);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
index 48ccdcc17ede..f033397a84e9 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
@@ -272,7 +272,7 @@ void optc1_program_timing(
 			vupdate_offset,
 			vupdate_width);
 
-	optc->funcs->set_vtg_params(optc, dc_crtc_timing);
+	optc->funcs->set_vtg_params(optc, dc_crtc_timing, true);
 
 	/* TODO
 	 * patched_crtc_timing.flags.HORZ_COUNT_BY_TWO == 1
@@ -312,7 +312,7 @@ void optc1_program_timing(
 }
 
 void optc1_set_vtg_params(struct timing_generator *optc,
-		const struct dc_crtc_timing *dc_crtc_timing)
+		const struct dc_crtc_timing *dc_crtc_timing, bool program_fp2)
 {
 	struct dc_crtc_timing patched_crtc_timing;
 	uint32_t asic_blank_end;
@@ -348,9 +348,12 @@ void optc1_set_vtg_params(struct timing_generator *optc,
 		}
 	}
 
-	REG_UPDATE_2(CONTROL,
-			VTG0_FP2, v_fp2,
-			VTG0_VCOUNT_INIT, v_init);
+	if (program_fp2)
+		REG_UPDATE_2(CONTROL,
+				VTG0_FP2, v_fp2,
+				VTG0_VCOUNT_INIT, v_init);
+	else
+		REG_UPDATE(CONTROL, VTG0_VCOUNT_INIT, v_init);
 }
 
 void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enable)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h
index 344eb487219e..b12bd9aae52f 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h
@@ -700,6 +700,6 @@ bool optc1_get_crc(struct timing_generator *optc,
 bool optc1_is_two_pixels_per_containter(const struct dc_crtc_timing *timing);
 
 void optc1_set_vtg_params(struct timing_generator *optc,
-		const struct dc_crtc_timing *dc_crtc_timing);
+		const struct dc_crtc_timing *dc_crtc_timing, bool program_fp2);
 
 #endif /* __DC_TIMING_GENERATOR_DCN10_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index abcb06044e6e..52bdbf2d50f5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -1214,6 +1214,17 @@ void dcn20_pipe_control_lock(
 		!flip_immediate)
 	    dcn20_setup_gsl_group_as_lock(dc, pipe, false);
 
+
+	// If changing VTG FP2: wait until back in vactive to program FP2
+	// Need to ensure that pipe unlock happens soon after to minimize race condition
+	if (!lock && pipe->update_flags.bits.global_sync) {
+		pipe->stream_res.tg->funcs->wait_for_state(pipe->stream_res.tg, CRTC_STATE_VBLANK);
+		pipe->stream_res.tg->funcs->wait_for_state(pipe->stream_res.tg, CRTC_STATE_VACTIVE);
+
+		pipe->stream_res.tg->funcs->set_vtg_params(
+				pipe->stream_res.tg, &pipe->stream->timing, true);
+	}
+
 	if (pipe->stream && should_use_dmub_lock(pipe->stream->link)) {
 		union dmub_hw_lock_flags hw_locks = { 0 };
 		struct dmub_hw_lock_inst_flags inst_flags = { 0 };
@@ -1595,7 +1606,7 @@ static void dcn20_program_pipe(
 				pipe_ctx->pipe_dlg_param.vupdate_width);
 
 		pipe_ctx->stream_res.tg->funcs->set_vtg_params(
-				pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
+				pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, false);
 
 		if (hws->funcs.setup_vupdate_interrupt)
 			hws->funcs.setup_vupdate_interrupt(dc, pipe_ctx);
@@ -1695,14 +1706,6 @@ void dcn20_program_front_end_for_ctx(
 				&& context->res_ctx.pipe_ctx[i].stream)
 			hws->funcs.blank_pixel_data(dc, &context->res_ctx.pipe_ctx[i], true);
 
-	/* wait for outstanding pending changes before adding or removing planes */
-	for (i = 0; i < dc->res_pool->pipe_count; i++) {
-		if (context->res_ctx.pipe_ctx[i].update_flags.bits.disable ||
-				context->res_ctx.pipe_ctx[i].update_flags.bits.enable) {
-			dc->hwss.wait_for_pending_cleared(dc, context);
-			break;
-		}
-	}
 
 	/* Disconnect mpcc */
 	for (i = 0; i < dc->res_pool->pipe_count; i++)
@@ -1856,7 +1859,7 @@ bool dcn20_update_bandwidth(
 					pipe_ctx->pipe_dlg_param.vupdate_width);
 
 			pipe_ctx->stream_res.tg->funcs->set_vtg_params(
-					pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
+					pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, false);
 
 			if (pipe_ctx->prev_odm_pipe == NULL)
 				hws->funcs.blank_pixel_data(dc, pipe_ctx, blank);
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h b/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h
index 12d5718caea8..f7632fe25976 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h
@@ -271,7 +271,7 @@ struct timing_generator_funcs {
 			struct dc_crtc_timing *hw_crtc_timing);
 
 	void (*set_vtg_params)(struct timing_generator *optc,
-			const struct dc_crtc_timing *dc_crtc_timing);
+			const struct dc_crtc_timing *dc_crtc_timing, bool program_fp2);
 
 	void (*set_dsc_config)(struct timing_generator *optc,
 			       enum optc_dsc_mode dsc_mode,
commit 09b07f7a188f3b52e7f7c778ab3b4e4aa4e9677a
Author: Leo (Hanghong) Ma <hanghong.ma at amd.com>
Date:   Wed Oct 28 11:57:17 2020 -0400

    drm/amd/display: Add DP info frame update for dcn30
    
    [Why]
    We are missing the DP info frame update on dcn30, and this will
    lead to DP SDPs not being sent;
    
    [How]
    Add the DP info frame update for dcn30;
    
    Signed-off-by: Leo (Hanghong) Ma <hanghong.ma at amd.com>
    Reviewed-by: Roman Li <Roman.Li at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
index 283995ab9eeb..3deb3fb1724d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
@@ -668,7 +668,7 @@ void dcn30_update_info_frame(struct pipe_ctx *pipe_ctx)
 	is_hdmi_tmds = dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal);
 	is_dp = dc_is_dp_signal(pipe_ctx->stream->signal);
 
-	if (!is_hdmi_tmds)
+	if (!is_hdmi_tmds && !is_dp)
 		return;
 
 	if (is_hdmi_tmds)
commit 3ae7a1378d70421de2161aa79209acb3564a73f4
Author: Eric Bernstein <eric.bernstein at amd.com>
Date:   Mon Nov 30 14:30:38 2020 -0500

    drm/amd/display: add dcn30_link_encoder_validate_output_with_stream to header
    
    [Why]
    dcn30_link_encoder_validate_output_with_stream was a static function.
    
    [How]
    remove the static define and include it in the header.
    
    Signed-off-by: Eric Bernstein <eric.bernstein at amd.com>
    Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
index b409f6b2bfd8..4592ccdfa9b0 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
@@ -119,7 +119,7 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
 	.disable_hpd = dce110_link_encoder_disable_hpd,
 	.is_dig_enabled = dce110_is_dig_enabled,
 	.destroy = dce110_link_encoder_destroy,
-	.get_max_link_cap = dce110_link_encoder_get_max_link_cap
+	.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
 };
 
 static enum bp_result link_transmitter_control(
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.c
index 2ae159e2dd6e..46ea39f5ef8d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.c
@@ -51,7 +51,7 @@
 	(enc10->link_regs->index)
 
 
-static bool dcn30_link_encoder_validate_output_with_stream(
+bool dcn30_link_encoder_validate_output_with_stream(
 	struct link_encoder *enc,
 	const struct dc_stream_state *stream)
 {
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h
index 2fbf879cd327..f2d90f2b8bf1 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h
@@ -78,4 +78,8 @@ void dcn30_link_encoder_construct(
 
 void enc3_hw_init(struct link_encoder *enc);
 
+bool dcn30_link_encoder_validate_output_with_stream(
+	struct link_encoder *enc,
+	const struct dc_stream_state *stream);
+
 #endif /* __DC_LINK_ENCODER__DCN30_H__ */
commit 02ce73b01e09e388614b22b7ebc71debf4a588f0
Author: Wayne Lin <Wayne.Lin at amd.com>
Date:   Tue Nov 24 19:57:03 2020 +0800

    drm/amd/display: Fix to be able to stop crc calculation
    
    [Why]
    Find out when we try to disable CRC calculation,
    crc generation is still enabled. Main reason is
    that dc_stream_configure_crc() will never get
    called when the source is AMDGPU_DM_PIPE_CRC_SOURCE_NONE.
    
    [How]
    Add checking condition that when source is
    AMDGPU_DM_PIPE_CRC_SOURCE_NONE, we should also call
    dc_stream_configure_crc() to disable crc calculation.
    Also, clean up crc window when disable crc calculation.
    
    Signed-off-by: Wayne Lin <Wayne.Lin at amd.com>
    Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
index ff6db26626ea..7b886a779a8c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
@@ -81,6 +81,14 @@ const char *const *amdgpu_dm_crtc_get_crc_sources(struct drm_crtc *crtc,
 	return pipe_crc_sources;
 }
 
+static void amdgpu_dm_set_crc_window_default(struct dm_crtc_state *dm_crtc_state)
+{
+	dm_crtc_state->crc_window.x_start = 0;
+	dm_crtc_state->crc_window.y_start = 0;
+	dm_crtc_state->crc_window.x_end = 0;
+	dm_crtc_state->crc_window.y_end = 0;
+}
+
 bool amdgpu_dm_crc_window_is_default(struct dm_crtc_state *dm_crtc_state)
 {
 	bool ret = true;
@@ -141,7 +149,10 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
 	mutex_lock(&adev->dm.dc_lock);
 
 	/* Enable CRTC CRC generation if necessary. */
-	if (dm_is_crc_source_crtc(source)) {
+	if (dm_is_crc_source_crtc(source) || source == AMDGPU_DM_PIPE_CRC_SOURCE_NONE) {
+		if (!enable)
+			amdgpu_dm_set_crc_window_default(dm_crtc_state);
+
 		if (!amdgpu_dm_crc_window_is_default(dm_crtc_state)) {
 			crc_window = &tmp_window;
 
commit 570b302ba1ce508dbfa3f1d6c6dc6e2531e45be5
Author: Aric Cyr <aric.cyr at amd.com>
Date:   Tue Dec 1 11:25:50 2020 -0500

    drm/amd/display: HP Reverb G2 VR fails to light up
    
    [Why]
    Many VR headsets require a HSYNC width of 4, but DCN
    has default minimum of 8.
    
    [How]
    Change the arbitrary minimum HSYNC width to 4 to match
    DCN20.
    
    Signed-off-by: Aric Cyr <aric.cyr at amd.com>
    Reviewed-by: Charlene Liu <Charlene.Liu at amd.com>
    Reviewed-by: Jun Lei <Jun.Lei at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c
index 82bc4e192bbf..915fbb8e8168 100644
--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c
+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c
@@ -1268,7 +1268,7 @@ void dce120_timing_generator_construct(
 	tg110->min_h_front_porch = 0;
 	tg110->min_h_back_porch = 0;
 
-	tg110->min_h_sync_width = 8;
+	tg110->min_h_sync_width = 4;
 	tg110->min_v_sync_width = 1;
 	tg110->min_v_blank = 3;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
index a125d3f05c81..48ccdcc17ede 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
@@ -1540,7 +1540,7 @@ void dcn10_timing_generator_init(struct optc *optc1)
 	optc1->min_h_blank = 32;
 	optc1->min_v_blank = 3;
 	optc1->min_v_blank_interlace = 5;
-	optc1->min_h_sync_width = 8;
+	optc1->min_h_sync_width = 4;
 	optc1->min_v_sync_width = 1;
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c
index b1f228fc119a..3ba3991ee612 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c
@@ -350,7 +350,7 @@ void dcn30_timing_generator_init(struct optc *optc1)
 	optc1->min_h_blank = 32;
 	optc1->min_v_blank = 3;
 	optc1->min_v_blank_interlace = 5;
-	optc1->min_h_sync_width = 8;
+	optc1->min_h_sync_width = 4;
 	optc1->min_v_sync_width = 1;
 }
 
commit 41aa4d3ded5cd7fa19cdc5f15fb60b85ed64f083
Author: Max Tseng <chuan-yu.tseng at amd.com>
Date:   Sat Nov 21 20:11:38 2020 +0800

    drm/amd/display: Add missing DP_SEC register definitions and masks
    
    [Why]
    some DP_SEC register defs and masks are missing.
    
    [How]
    add the missing defs and masks.
    
    Signed-off-by: Max Tseng <chuan-yu.tseng at amd.com>
    Reviewed-by: Anthony Koo <Anthony.Koo at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
index 9e38c37c1d73..76b334644f9e 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
@@ -81,7 +81,9 @@
 	SRI(DP_MSE_RATE_UPDATE, DP, id), \
 	SRI(DP_PIXEL_FORMAT, DP, id), \
 	SRI(DP_SEC_CNTL, DP, id), \
+	SRI(DP_SEC_CNTL1, DP, id), \
 	SRI(DP_SEC_CNTL2, DP, id), \
+	SRI(DP_SEC_CNTL5, DP, id), \
 	SRI(DP_SEC_CNTL6, DP, id), \
 	SRI(DP_STEER_FIFO, DP, id), \
 	SRI(DP_VID_M, DP, id), \
@@ -126,7 +128,9 @@ struct dcn10_stream_enc_registers {
 	uint32_t DP_MSE_RATE_UPDATE;
 	uint32_t DP_PIXEL_FORMAT;
 	uint32_t DP_SEC_CNTL;
+	uint32_t DP_SEC_CNTL1;
 	uint32_t DP_SEC_CNTL2;
+	uint32_t DP_SEC_CNTL5;
 	uint32_t DP_SEC_CNTL6;
 	uint32_t DP_STEER_FIFO;
 	uint32_t DP_VID_M;
@@ -411,6 +415,8 @@ struct dcn10_stream_enc_registers {
 	type DP_SEC_GSP3_ENABLE;\
 	type DP_SEC_GSP4_ENABLE;\
 	type DP_SEC_GSP5_ENABLE;\
+	type DP_SEC_GSP5_LINE_NUM;\
+	type DP_SEC_GSP5_LINE_REFERENCE;\
 	type DP_SEC_GSP6_ENABLE;\
 	type DP_SEC_GSP7_ENABLE;\
 	type DP_SEC_GSP7_PPS;\
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.h
index d2a805bd4573..9a881e639709 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.h
@@ -83,6 +83,8 @@
 	SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
 	SE_SF(DIG0_DIG_FE_CNTL, DOLBY_VISION_EN, mask_sh),\
 	SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_COMBINE, mask_sh),\
+	SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
+	SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
 	SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh)
 
 void dcn20_stream_encoder_construct(
commit 20172ff3f0b4eddcdd1cf4ca31a7d922e9b4c662
Author: Victor Lu <victorchengchi.lu at amd.com>
Date:   Tue Nov 24 10:06:04 2020 -0500

    drm/amd/display: Change pstate expected timeout warning to 180us on linux
    
    [Why]
    There is a warning that triggers when pstate takes too long.
    Pstate can take up to ~200us on Linux without hanging but
    it is currently set to 40us.
    
    [How]
    Change the timeout for the warning to be 180us on Linux.
    
    Signed-off-by: Victor Lu <victorchengchi.lu at amd.com>
    Reviewed-by: Roman Li <Roman.Li at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
index 75637c291e75..6f42d10dd772 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
@@ -124,11 +124,11 @@ bool hubbub1_verify_allow_pstate_change_high(
 	 * still not asserted, we are probably stuck and going to hang
 	 *
 	 * TODO: Figure out why it takes ~100us on linux
-	 * pstate takes around ~100us on linux. Unknown currently as to
-	 * why it takes that long on linux
+	 * pstate takes around ~100us (up to 200us) on linux. Unknown currently
+	 * as to why it takes that long on linux
 	 */
 	const unsigned int pstate_wait_timeout_us = 200;
-	const unsigned int pstate_wait_expected_timeout_us = 40;
+	const unsigned int pstate_wait_expected_timeout_us = 180;
 	static unsigned int max_sampled_pstate_wait_us; /* data collection */
 	static bool forced_pstate_allow; /* help with revert wa */
 
commit 86b6037f7608f9b726281252aa1b2a55dd696486
Author: Stanley.Yang <Stanley.Yang at amd.com>
Date:   Fri Dec 11 20:59:47 2020 +0800

    drm/amdgpu: skip load smu and sdma microcode on sriov for SIENNA_CICHLID
    
    skip load smu and sdma fw on sriov due to sos,
    ta and asd fw have been skipped for SIENNA_CICHLID.
    
    V2:
        move asic check into smu11
    
    Signed-off-by: Stanley.Yang <Stanley.Yang at amd.com>
    Reviewed-by: Kevin Wang <kevin1.wang at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 5c4ac176b7e4..f1ba36a094da 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -153,6 +153,9 @@ static int sdma_v5_2_init_microcode(struct amdgpu_device *adev)
 	struct amdgpu_firmware_info *info = NULL;
 	const struct common_firmware_header *header = NULL;
 
+	if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_SIENNA_CICHLID))
+		return 0;
+
 	DRM_DEBUG("\n");
 
 	switch (adev->asic_type) {
diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index cf999b7a2164..8b867a6d52b5 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -847,12 +847,10 @@ static int smu_sw_init(void *handle)
 	smu->smu_dpm.dpm_level = AMD_DPM_FORCED_LEVEL_AUTO;
 	smu->smu_dpm.requested_dpm_level = AMD_DPM_FORCED_LEVEL_AUTO;
 
-	if (!amdgpu_sriov_vf(adev) || (adev->asic_type != CHIP_NAVI12)) {
-		ret = smu_init_microcode(smu);
-		if (ret) {
-			dev_err(adev->dev, "Failed to load smu firmware!\n");
-			return ret;
-		}
+	ret = smu_init_microcode(smu);
+	if (ret) {
+		dev_err(adev->dev, "Failed to load smu firmware!\n");
+		return ret;
 	}
 
 	ret = smu_smc_table_sw_init(smu);
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
index 0372cb83cdd9..b279dbbbce6b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
@@ -91,6 +91,11 @@ int smu_v11_0_init_microcode(struct smu_context *smu)
 	const struct common_firmware_header *header;
 	struct amdgpu_firmware_info *ucode = NULL;
 
+	if (amdgpu_sriov_vf(adev) &&
+			((adev->asic_type == CHIP_NAVI12) ||
+			 (adev->asic_type == CHIP_SIENNA_CICHLID)))
+		return 0;
+
 	switch (adev->asic_type) {
 	case CHIP_ARCTURUS:
 		chip_name = "arcturus";
commit 79cc42697dbd17f19d8ad1d87945a47d2f73573e
Author: Flora Cui <flora.cui at amd.com>
Date:   Mon Dec 14 10:23:13 2020 +0800

    drm/amd/display: drop retired CONFIG_DRM_AMD_DC_DCN3_0
    
    CONFIG_DRM_AMD_DC_DCN3_0 is retired. drop it
    
    Signed-off-by: Flora Cui <flora.cui at amd.com>
    Reviewed-by: Guchun Chen <guchun.chen at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index a901baf2aaef..9e1071b2181f 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -3267,9 +3267,6 @@ void core_link_enable_stream(
 			}
 		}
 
-#if defined(CONFIG_DRM_AMD_DC_DCN3_0)
-#endif
-
 		/* turn off otg test pattern if enable */
 		if (pipe_ctx->stream_res.tg->funcs->set_test_pattern)
 			pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg,
commit 9ca5b8a170d180889bec0424c27fdd2ee84d2d99
Author: Likun Gao <Likun.Gao at amd.com>
Date:   Tue Dec 15 11:32:20 2020 -0500

    drm/amdgpu: add judgement for suspend/resume sequence
    
    S0ix only makes sense on APUs since they are part of the platform, so
    only when the ASIC is APU should set amdgpu_acpi_is_s0ix_supported flag
    to deal with the related situation.
    
    Signed-off-by: Likun Gao <Likun.Gao at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 6e2953233231..b24de64f4490 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1311,11 +1311,11 @@ int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev);
 
 void amdgpu_acpi_get_backlight_caps(struct amdgpu_device *adev,
 		struct amdgpu_dm_backlight_caps *caps);
-bool amdgpu_acpi_is_s0ix_supported(void);
+bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev);
 #else
 static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; }
 static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { }
-static inline bool amdgpu_acpi_is_s0ix_supported(void) { return false; }
+static inline bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev) { return false; }
 #endif
 
 int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index 4f4fda53c08a..8155c54392c8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -901,10 +901,12 @@ void amdgpu_acpi_fini(struct amdgpu_device *adev)
  *
  * returns true if supported, false if not.
  */
-bool amdgpu_acpi_is_s0ix_supported(void)
+bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev)
 {
-	if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)
-		return true;
+	if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) {
+		if (adev->flags & AMD_IS_APU)
+			return true;
+	}
 
 	return false;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 79dd85f71fab..0ec7c28c4d5a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2650,7 +2650,7 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)
 {
 	int i, r;
 
-	if (!amdgpu_acpi_is_s0ix_supported() || amdgpu_in_reset(adev)) {
+	if (!amdgpu_acpi_is_s0ix_supported(adev) || amdgpu_in_reset(adev)) {
 		amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
 		amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
 	}
@@ -3710,7 +3710,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
 
 	amdgpu_fence_driver_suspend(adev);
 
-	if (!amdgpu_acpi_is_s0ix_supported() || amdgpu_in_reset(adev))
+	if (!amdgpu_acpi_is_s0ix_supported(adev) || amdgpu_in_reset(adev))
 		r = amdgpu_device_ip_suspend_phase2(adev);
 	else
 		amdgpu_gfx_state_change_set(adev, sGpuChangeState_D3Entry);
@@ -3744,7 +3744,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
 	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
 		return 0;
 
-	if (amdgpu_acpi_is_s0ix_supported())
+	if (amdgpu_acpi_is_s0ix_supported(adev))
 		amdgpu_gfx_state_change_set(adev, sGpuChangeState_D0Entry);
 
 	/* post card */
commit a9c210c1e5fefd621954fca50c72780bf0198327
Author: Xiaomeng Hou <Xiaomeng.Hou at amd.com>
Date:   Thu Dec 10 20:18:23 2020 +0800

    drm/amdgpu/sdma5.2: soft reset sdma blocks before setup and start sdma
    
    Without doing the soft reset, register mmSDMA0_GFX_RB_WPTR's value could not be
    reset to 0 when sdma block resumes. That would cause the ring buffer's read and
    write pointers not equal and ring test fail. So add the soft reset step.
    
    Signed-off-by: Xiaomeng Hou <Xiaomeng.Hou at amd.com>
    Reviewed-by: Huang Rui <ray.huang at amd.com>
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 39e17aae655f..5c4ac176b7e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -807,6 +807,37 @@ static int sdma_v5_2_load_microcode(struct amdgpu_device *adev)
 	return 0;
 }
 
+static int sdma_v5_2_soft_reset(void *handle)
+{
+	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+	u32 grbm_soft_reset;
+	u32 tmp;
+	int i;
+
+	for (i = 0; i < adev->sdma.num_instances; i++) {
+		grbm_soft_reset = REG_SET_FIELD(0,
+						GRBM_SOFT_RESET, SOFT_RESET_SDMA0,
+						1);
+		grbm_soft_reset <<= i;
+
+		tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
+		tmp |= grbm_soft_reset;
+		DRM_DEBUG("GRBM_SOFT_RESET=0x%08X\n", tmp);
+		WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
+		tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
+
+		udelay(50);
+
+		tmp &= ~grbm_soft_reset;
+		WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
+		tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
+
+		udelay(50);
+	}
+
+	return 0;
+}
+
 /**
  * sdma_v5_2_start - setup and start the async dma engines
  *
@@ -838,6 +869,7 @@ static int sdma_v5_2_start(struct amdgpu_device *adev)
 			msleep(1000);
 	}
 
+	sdma_v5_2_soft_reset(adev);
 	/* unhalt the MEs */
 	sdma_v5_2_enable(adev, true);
 	/* enable sdma ring preemption */
@@ -1366,13 +1398,6 @@ static int sdma_v5_2_wait_for_idle(void *handle)
 	return -ETIMEDOUT;
 }
 
-static int sdma_v5_2_soft_reset(void *handle)
-{
-	/* todo */
-
-	return 0;
-}
-
 static int sdma_v5_2_ring_preempt_ib(struct amdgpu_ring *ring)
 {
 	int i, r = 0;
commit 78d907e2b8ba89c936b7f0c3344261c653668a62
Author: Evan Quan <evan.quan at amd.com>
Date:   Thu Dec 10 16:36:28 2020 +0800

    drm/amd/pm: add deep sleep control for uclk and fclk
    
    These are supported by Sienna Cichlid and should be
    taken into consideration during DS control.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
index 45ecd0386e9f..0372cb83cdd9 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
@@ -2087,6 +2087,22 @@ int smu_v11_0_deep_sleep_control(struct smu_context *smu,
 		}
 	}
 
+	if (smu_cmn_feature_is_supported(smu, SMU_FEATURE_DS_UCLK_BIT)) {
+		ret = smu_cmn_feature_set_enabled(smu, SMU_FEATURE_DS_UCLK_BIT, enablement);
+		if (ret) {
+			dev_err(adev->dev, "Failed to %s UCLK DS!\n", enablement ? "enable" : "disable");
+			return ret;
+		}
+	}
+
+	if (smu_cmn_feature_is_supported(smu, SMU_FEATURE_DS_FCLK_BIT)) {
+		ret = smu_cmn_feature_set_enabled(smu, SMU_FEATURE_DS_FCLK_BIT, enablement);
+		if (ret) {
+			dev_err(adev->dev, "Failed to %s FCLK DS!\n", enablement ? "enable" : "disable");
+			return ret;
+		}
+	}
+
 	if (smu_cmn_feature_is_supported(smu, SMU_FEATURE_DS_SOCCLK_BIT)) {
 		ret = smu_cmn_feature_set_enabled(smu, SMU_FEATURE_DS_SOCCLK_BIT, enablement);
 		if (ret) {
commit b4b0b79d8a376d3d830a93f8fafc815d01525fc9
Author: Evan Quan <evan.quan at amd.com>
Date:   Thu Dec 10 12:42:24 2020 +0800

    drm/amd/pm: update the data strucutre for SMU metrics exchange
    
    This is needed for Sienna Cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index 148fa3af33fc..9608745d732f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -382,7 +382,7 @@ static int sienna_cichlid_tables_init(struct smu_context *smu)
 		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
 	SMU_TABLE_INIT(tables, SMU_TABLE_WATERMARKS, sizeof(Watermarks_t),
 		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
-	SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(SmuMetrics_t),
+	SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(SmuMetricsExternal_t),
 		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
 	SMU_TABLE_INIT(tables, SMU_TABLE_I2C_COMMANDS, sizeof(SwI2cRequest_t),
 		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
@@ -394,7 +394,7 @@ static int sienna_cichlid_tables_init(struct smu_context *smu)
 		       sizeof(DpmActivityMonitorCoeffIntExternal_t), PAGE_SIZE,
 	               AMDGPU_GEM_DOMAIN_VRAM);
 
-	smu_table->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
+	smu_table->metrics_table = kzalloc(sizeof(SmuMetricsExternal_t), GFP_KERNEL);
 	if (!smu_table->metrics_table)
 		goto err0_out;
 	smu_table->metrics_time = 0;
@@ -423,7 +423,8 @@ static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
 					       uint32_t *value)
 {
 	struct smu_table_context *smu_table= &smu->smu_table;
-	SmuMetrics_t *metrics = (SmuMetrics_t *)smu_table->metrics_table;
+	SmuMetrics_t *metrics =
+		&(((SmuMetricsExternal_t *)(smu_table->metrics_table))->SmuMetrics);
 	int ret = 0;
 
 	mutex_lock(&smu->metrics_lock);
@@ -2598,52 +2599,54 @@ static ssize_t sienna_cichlid_get_gpu_metrics(struct smu_context *smu,
 	struct smu_table_context *smu_table = &smu->smu_table;
 	struct gpu_metrics_v1_0 *gpu_metrics =
 		(struct gpu_metrics_v1_0 *)smu_table->gpu_metrics_table;
-	SmuMetrics_t metrics;
+	SmuMetricsExternal_t metrics_external;
+	SmuMetrics_t *metrics =
+		&(metrics_external.SmuMetrics);
 	int ret = 0;
 
 	ret = smu_cmn_get_metrics_table(smu,
-					&metrics,
+					&metrics_external,
 					true);
 	if (ret)
 		return ret;
 
 	smu_v11_0_init_gpu_metrics_v1_0(gpu_metrics);
 
-	gpu_metrics->temperature_edge = metrics.TemperatureEdge;
-	gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot;
-	gpu_metrics->temperature_mem = metrics.TemperatureMem;
-	gpu_metrics->temperature_vrgfx = metrics.TemperatureVrGfx;
-	gpu_metrics->temperature_vrsoc = metrics.TemperatureVrSoc;
-	gpu_metrics->temperature_vrmem = metrics.TemperatureVrMem0;
+	gpu_metrics->temperature_edge = metrics->TemperatureEdge;
+	gpu_metrics->temperature_hotspot = metrics->TemperatureHotspot;
+	gpu_metrics->temperature_mem = metrics->TemperatureMem;
+	gpu_metrics->temperature_vrgfx = metrics->TemperatureVrGfx;
+	gpu_metrics->temperature_vrsoc = metrics->TemperatureVrSoc;
+	gpu_metrics->temperature_vrmem = metrics->TemperatureVrMem0;
 
-	gpu_metrics->average_gfx_activity = metrics.AverageGfxActivity;
-	gpu_metrics->average_umc_activity = metrics.AverageUclkActivity;
-	gpu_metrics->average_mm_activity = metrics.VcnActivityPercentage;
+	gpu_metrics->average_gfx_activity = metrics->AverageGfxActivity;
+	gpu_metrics->average_umc_activity = metrics->AverageUclkActivity;
+	gpu_metrics->average_mm_activity = metrics->VcnActivityPercentage;
 
-	gpu_metrics->average_socket_power = metrics.AverageSocketPower;
-	gpu_metrics->energy_accumulator = metrics.EnergyAccumulator;
+	gpu_metrics->average_socket_power = metrics->AverageSocketPower;
+	gpu_metrics->energy_accumulator = metrics->EnergyAccumulator;
 
-	if (metrics.AverageGfxActivity <= SMU_11_0_7_GFX_BUSY_THRESHOLD)
-		gpu_metrics->average_gfxclk_frequency = metrics.AverageGfxclkFrequencyPostDs;
+	if (metrics->AverageGfxActivity <= SMU_11_0_7_GFX_BUSY_THRESHOLD)
+		gpu_metrics->average_gfxclk_frequency = metrics->AverageGfxclkFrequencyPostDs;
 	else
-		gpu_metrics->average_gfxclk_frequency = metrics.AverageGfxclkFrequencyPreDs;
-	gpu_metrics->average_uclk_frequency = metrics.AverageUclkFrequencyPostDs;
-	gpu_metrics->average_vclk0_frequency = metrics.AverageVclk0Frequency;
-	gpu_metrics->average_dclk0_frequency = metrics.AverageDclk0Frequency;
-	gpu_metrics->average_vclk1_frequency = metrics.AverageVclk1Frequency;
-	gpu_metrics->average_dclk1_frequency = metrics.AverageDclk1Frequency;
-
-	gpu_metrics->current_gfxclk = metrics.CurrClock[PPCLK_GFXCLK];
-	gpu_metrics->current_socclk = metrics.CurrClock[PPCLK_SOCCLK];
-	gpu_metrics->current_uclk = metrics.CurrClock[PPCLK_UCLK];
-	gpu_metrics->current_vclk0 = metrics.CurrClock[PPCLK_VCLK_0];
-	gpu_metrics->current_dclk0 = metrics.CurrClock[PPCLK_DCLK_0];
-	gpu_metrics->current_vclk1 = metrics.CurrClock[PPCLK_VCLK_1];
-	gpu_metrics->current_dclk1 = metrics.CurrClock[PPCLK_DCLK_1];
-
-	gpu_metrics->throttle_status = metrics.ThrottlerStatus;
-
-	gpu_metrics->current_fan_speed = metrics.CurrFanSpeed;
+		gpu_metrics->average_gfxclk_frequency = metrics->AverageGfxclkFrequencyPreDs;
+	gpu_metrics->average_uclk_frequency = metrics->AverageUclkFrequencyPostDs;
+	gpu_metrics->average_vclk0_frequency = metrics->AverageVclk0Frequency;
+	gpu_metrics->average_dclk0_frequency = metrics->AverageDclk0Frequency;
+	gpu_metrics->average_vclk1_frequency = metrics->AverageVclk1Frequency;
+	gpu_metrics->average_dclk1_frequency = metrics->AverageDclk1Frequency;
+
+	gpu_metrics->current_gfxclk = metrics->CurrClock[PPCLK_GFXCLK];
+	gpu_metrics->current_socclk = metrics->CurrClock[PPCLK_SOCCLK];
+	gpu_metrics->current_uclk = metrics->CurrClock[PPCLK_UCLK];
+	gpu_metrics->current_vclk0 = metrics->CurrClock[PPCLK_VCLK_0];
+	gpu_metrics->current_dclk0 = metrics->CurrClock[PPCLK_DCLK_0];
+	gpu_metrics->current_vclk1 = metrics->CurrClock[PPCLK_VCLK_1];
+	gpu_metrics->current_dclk1 = metrics->CurrClock[PPCLK_DCLK_1];
+
+	gpu_metrics->throttle_status = metrics->ThrottlerStatus;
+
+	gpu_metrics->current_fan_speed = metrics->CurrFanSpeed;
 
 	gpu_metrics->pcie_link_width =
 			smu_v11_0_get_current_pcie_link_width(smu);
commit f9e3fe46202a18dea8c54af392be2b361b0194e7
Author: Evan Quan <evan.quan at amd.com>
Date:   Thu Dec 10 12:03:50 2020 +0800

    drm/amd/pm: correct the data structure for activity monitor coeff exchange
    
    This is needed for Sienna Cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index 0fbc9cfd76ff..148fa3af33fc 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -391,7 +391,7 @@ static int sienna_cichlid_tables_init(struct smu_context *smu)
 	SMU_TABLE_INIT(tables, SMU_TABLE_PMSTATUSLOG, SMU11_TOOL_SIZE,
 		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
 	SMU_TABLE_INIT(tables, SMU_TABLE_ACTIVITY_MONITOR_COEFF,
-		       sizeof(DpmActivityMonitorCoeffInt_t), PAGE_SIZE,
+		       sizeof(DpmActivityMonitorCoeffIntExternal_t), PAGE_SIZE,
 	               AMDGPU_GEM_DOMAIN_VRAM);
 
 	smu_table->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
@@ -1167,7 +1167,9 @@ static int sienna_cichlid_get_fan_parameters(struct smu_context *smu)
 
 static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *buf)
 {
-	DpmActivityMonitorCoeffInt_t activity_monitor;
+	DpmActivityMonitorCoeffIntExternal_t activity_monitor_external;
+	DpmActivityMonitorCoeffInt_t *activity_monitor =
+		&(activity_monitor_external.DpmActivityMonitorCoeffInt);
 	uint32_t i, size = 0;
 	int16_t workload_type = 0;
 	static const char *profile_name[] = {
@@ -1209,7 +1211,7 @@ static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *
 
 		result = smu_cmn_update_table(smu,
 					  SMU_TABLE_ACTIVITY_MONITOR_COEFF, workload_type,
-					  (void *)(&activity_monitor), false);
+					  (void *)(&activity_monitor_external), false);
 		if (result) {
 			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__);
 			return result;
@@ -1222,43 +1224,43 @@ static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *
 			" ",
 			0,
 			"GFXCLK",
-			activity_monitor.Gfx_FPS,
-			activity_monitor.Gfx_MinFreqStep,
-			activity_monitor.Gfx_MinActiveFreqType,
-			activity_monitor.Gfx_MinActiveFreq,
-			activity_monitor.Gfx_BoosterFreqType,
-			activity_monitor.Gfx_BoosterFreq,
-			activity_monitor.Gfx_PD_Data_limit_c,
-			activity_monitor.Gfx_PD_Data_error_coeff,
-			activity_monitor.Gfx_PD_Data_error_rate_coeff);
+			activity_monitor->Gfx_FPS,
+			activity_monitor->Gfx_MinFreqStep,
+			activity_monitor->Gfx_MinActiveFreqType,
+			activity_monitor->Gfx_MinActiveFreq,
+			activity_monitor->Gfx_BoosterFreqType,
+			activity_monitor->Gfx_BoosterFreq,
+			activity_monitor->Gfx_PD_Data_limit_c,
+			activity_monitor->Gfx_PD_Data_error_coeff,
+			activity_monitor->Gfx_PD_Data_error_rate_coeff);
 
 		size += sprintf(buf + size, "%19s %d(%13s) %7d %7d %7d %7d %7d %7d %7d %7d %7d\n",
 			" ",
 			1,
 			"SOCCLK",
-			activity_monitor.Fclk_FPS,
-			activity_monitor.Fclk_MinFreqStep,
-			activity_monitor.Fclk_MinActiveFreqType,
-			activity_monitor.Fclk_MinActiveFreq,
-			activity_monitor.Fclk_BoosterFreqType,
-			activity_monitor.Fclk_BoosterFreq,
-			activity_monitor.Fclk_PD_Data_limit_c,
-			activity_monitor.Fclk_PD_Data_error_coeff,
-			activity_monitor.Fclk_PD_Data_error_rate_coeff);
+			activity_monitor->Fclk_FPS,
+			activity_monitor->Fclk_MinFreqStep,
+			activity_monitor->Fclk_MinActiveFreqType,
+			activity_monitor->Fclk_MinActiveFreq,
+			activity_monitor->Fclk_BoosterFreqType,
+			activity_monitor->Fclk_BoosterFreq,
+			activity_monitor->Fclk_PD_Data_limit_c,
+			activity_monitor->Fclk_PD_Data_error_coeff,
+			activity_monitor->Fclk_PD_Data_error_rate_coeff);
 
 		size += sprintf(buf + size, "%19s %d(%13s) %7d %7d %7d %7d %7d %7d %7d %7d %7d\n",
 			" ",
 			2,
 			"MEMLK",
-			activity_monitor.Mem_FPS,
-			activity_monitor.Mem_MinFreqStep,
-			activity_monitor.Mem_MinActiveFreqType,
-			activity_monitor.Mem_MinActiveFreq,
-			activity_monitor.Mem_BoosterFreqType,
-			activity_monitor.Mem_BoosterFreq,
-			activity_monitor.Mem_PD_Data_limit_c,
-			activity_monitor.Mem_PD_Data_error_coeff,
-			activity_monitor.Mem_PD_Data_error_rate_coeff);
+			activity_monitor->Mem_FPS,
+			activity_monitor->Mem_MinFreqStep,
+			activity_monitor->Mem_MinActiveFreqType,
+			activity_monitor->Mem_MinActiveFreq,
+			activity_monitor->Mem_BoosterFreqType,
+			activity_monitor->Mem_BoosterFreq,
+			activity_monitor->Mem_PD_Data_limit_c,
+			activity_monitor->Mem_PD_Data_error_coeff,
+			activity_monitor->Mem_PD_Data_error_rate_coeff);
 	}
 
 	return size;
@@ -1266,7 +1268,10 @@ static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *
 
 static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size)
 {
-	DpmActivityMonitorCoeffInt_t activity_monitor;
+
+	DpmActivityMonitorCoeffIntExternal_t activity_monitor_external;
+	DpmActivityMonitorCoeffInt_t *activity_monitor =
+		&(activity_monitor_external.DpmActivityMonitorCoeffInt);
 	int workload_type, ret = 0;
 
 	smu->power_profile_mode = input[size];
@@ -1280,7 +1285,7 @@ static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *
 
 		ret = smu_cmn_update_table(smu,
 				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
-				       (void *)(&activity_monitor), false);
+				       (void *)(&activity_monitor_external), false);
 		if (ret) {
 			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__);
 			return ret;
@@ -1288,43 +1293,43 @@ static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *
 
 		switch (input[0]) {
 		case 0: /* Gfxclk */
-			activity_monitor.Gfx_FPS = input[1];
-			activity_monitor.Gfx_MinFreqStep = input[2];
-			activity_monitor.Gfx_MinActiveFreqType = input[3];
-			activity_monitor.Gfx_MinActiveFreq = input[4];
-			activity_monitor.Gfx_BoosterFreqType = input[5];
-			activity_monitor.Gfx_BoosterFreq = input[6];
-			activity_monitor.Gfx_PD_Data_limit_c = input[7];
-			activity_monitor.Gfx_PD_Data_error_coeff = input[8];
-			activity_monitor.Gfx_PD_Data_error_rate_coeff = input[9];
+			activity_monitor->Gfx_FPS = input[1];
+			activity_monitor->Gfx_MinFreqStep = input[2];
+			activity_monitor->Gfx_MinActiveFreqType = input[3];
+			activity_monitor->Gfx_MinActiveFreq = input[4];
+			activity_monitor->Gfx_BoosterFreqType = input[5];
+			activity_monitor->Gfx_BoosterFreq = input[6];
+			activity_monitor->Gfx_PD_Data_limit_c = input[7];
+			activity_monitor->Gfx_PD_Data_error_coeff = input[8];
+			activity_monitor->Gfx_PD_Data_error_rate_coeff = input[9];
 			break;
 		case 1: /* Socclk */
-			activity_monitor.Fclk_FPS = input[1];
-			activity_monitor.Fclk_MinFreqStep = input[2];
-			activity_monitor.Fclk_MinActiveFreqType = input[3];
-			activity_monitor.Fclk_MinActiveFreq = input[4];
-			activity_monitor.Fclk_BoosterFreqType = input[5];
-			activity_monitor.Fclk_BoosterFreq = input[6];
-			activity_monitor.Fclk_PD_Data_limit_c = input[7];
-			activity_monitor.Fclk_PD_Data_error_coeff = input[8];
-			activity_monitor.Fclk_PD_Data_error_rate_coeff = input[9];
+			activity_monitor->Fclk_FPS = input[1];
+			activity_monitor->Fclk_MinFreqStep = input[2];
+			activity_monitor->Fclk_MinActiveFreqType = input[3];
+			activity_monitor->Fclk_MinActiveFreq = input[4];
+			activity_monitor->Fclk_BoosterFreqType = input[5];
+			activity_monitor->Fclk_BoosterFreq = input[6];
+			activity_monitor->Fclk_PD_Data_limit_c = input[7];
+			activity_monitor->Fclk_PD_Data_error_coeff = input[8];
+			activity_monitor->Fclk_PD_Data_error_rate_coeff = input[9];
 			break;
 		case 2: /* Memlk */
-			activity_monitor.Mem_FPS = input[1];
-			activity_monitor.Mem_MinFreqStep = input[2];
-			activity_monitor.Mem_MinActiveFreqType = input[3];
-			activity_monitor.Mem_MinActiveFreq = input[4];
-			activity_monitor.Mem_BoosterFreqType = input[5];
-			activity_monitor.Mem_BoosterFreq = input[6];
-			activity_monitor.Mem_PD_Data_limit_c = input[7];
-			activity_monitor.Mem_PD_Data_error_coeff = input[8];
-			activity_monitor.Mem_PD_Data_error_rate_coeff = input[9];
+			activity_monitor->Mem_FPS = input[1];
+			activity_monitor->Mem_MinFreqStep = input[2];
+			activity_monitor->Mem_MinActiveFreqType = input[3];
+			activity_monitor->Mem_MinActiveFreq = input[4];
+			activity_monitor->Mem_BoosterFreqType = input[5];
+			activity_monitor->Mem_BoosterFreq = input[6];
+			activity_monitor->Mem_PD_Data_limit_c = input[7];
+			activity_monitor->Mem_PD_Data_error_coeff = input[8];
+			activity_monitor->Mem_PD_Data_error_rate_coeff = input[9];
 			break;
 		}
 
 		ret = smu_cmn_update_table(smu,
 				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
-				       (void *)(&activity_monitor), true);
+				       (void *)(&activity_monitor_external), true);
 		if (ret) {
 			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__);
 			return ret;
commit 0dc994fb61a9b859bf4bde936a4c6de652116a23
Author: Evan Quan <evan.quan at amd.com>
Date:   Wed Dec 9 14:30:29 2020 +0800

    drm/amd/pm: fulfill the sienna cichlid UMD PSTATE profiling clocks
    
    Fulfill the UMD PSTATE profiling clocks of sienna cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index b8127be43320..0fbc9cfd76ff 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -1070,12 +1070,18 @@ static int sienna_cichlid_populate_umd_state_clk(struct smu_context *smu)
 
 	pstate_table->gfxclk_pstate.min = gfx_table->min;
 	pstate_table->gfxclk_pstate.peak = gfx_table->max;
+	if (gfx_table->max >= SIENNA_CICHLID_UMD_PSTATE_PROFILING_GFXCLK)
+		pstate_table->gfxclk_pstate.standard = SIENNA_CICHLID_UMD_PSTATE_PROFILING_GFXCLK;
 
 	pstate_table->uclk_pstate.min = mem_table->min;
 	pstate_table->uclk_pstate.peak = mem_table->max;
+	if (mem_table->max >= SIENNA_CICHLID_UMD_PSTATE_PROFILING_MEMCLK)
+		pstate_table->uclk_pstate.standard = SIENNA_CICHLID_UMD_PSTATE_PROFILING_MEMCLK;
 
 	pstate_table->socclk_pstate.min = soc_table->min;
 	pstate_table->socclk_pstate.peak = soc_table->max;
+	if (soc_table->max >= SIENNA_CICHLID_UMD_PSTATE_PROFILING_SOCCLK)
+		pstate_table->socclk_pstate.standard = SIENNA_CICHLID_UMD_PSTATE_PROFILING_SOCCLK;
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.h b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.h
index 57e120c440ea..38cd0ece24f6 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.h
@@ -29,6 +29,10 @@ typedef enum {
   POWER_SOURCE_COUNT,
 } POWER_SOURCE_e;
 
+#define SIENNA_CICHLID_UMD_PSTATE_PROFILING_GFXCLK    1825
+#define SIENNA_CICHLID_UMD_PSTATE_PROFILING_SOCCLK    960
+#define SIENNA_CICHLID_UMD_PSTATE_PROFILING_MEMCLK    1000
+
 extern void sienna_cichlid_set_ppt_funcs(struct smu_context *smu);
 
 #endif
commit 02e66dd564229043c094ea951ed24df932d44644
Merge: 5fbd41d3bf12 ee46d16d2e40
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Dec 15 17:25:55 2020 +0100

    Merge tag 'drm-misc-next-fixes-2020-12-15' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
    
    Short summary of fixes pull (less than what git shortlog provides):
    
     * dma-buf: Fix docs
     * mxsfb: Silence invalid error message
     * radeon: Fix TTM multihop
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    From: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/X9i0X9mjHN9AZGD3@linux-uq9g

commit ee46d16d2e40bebc2aa790fd7b6a056466ff895c
Author: Guido Günther <agx at sigxcpu.org>
Date:   Tue Dec 15 09:23:38 2020 +0100

    drm: mxsfb: Silence -EPROBE_DEFER while waiting for bridge
    
    It can take multiple iterations until all components for an attached DSI
    bridge are up leading to several:
    
    [    3.796425] mxsfb 30320000.lcd-controller: Cannot connect bridge: -517
    [    3.816952] mxsfb 30320000.lcd-controller: [drm:mxsfb_probe [mxsfb]] *ERROR* failed to attach bridge: -517
    
    Silence this by checking for -EPROBE_DEFER and using dev_err_probe() so
    we set a deferred reason in case a dependency fails to probe (which
    quickly happens on small config/DT changes due to the rather long probe
    chain which can include bridges, phys, panels, backights, leds, etc.).
    
    This also removes the only DRM_DEV_ERROR() usage, the rest of the driver
    uses dev_err().
    
    Signed-off-by: Guido Günther <agx at sigxcpu.org>
    Fixes: c42001e357f7 ("drm: mxsfb: Use drm_panel_bridge")
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/d5761eb871adde5464ba112b89d966568bc2ff6c.1608020391.git.agx@sigxcpu.org

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
index 6faf17b6408d..6da93551e2e5 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
@@ -134,11 +134,8 @@ static int mxsfb_attach_bridge(struct mxsfb_drm_private *mxsfb)
 		return -ENODEV;
 
 	ret = drm_bridge_attach(&mxsfb->encoder, bridge, NULL, 0);
-	if (ret) {
-		DRM_DEV_ERROR(drm->dev,
-			      "failed to attach bridge: %d\n", ret);
-		return ret;
-	}
+	if (ret)
+		return dev_err_probe(drm->dev, ret, "Failed to attach bridge\n");
 
 	mxsfb->bridge = bridge;
 
@@ -212,7 +209,8 @@ static int mxsfb_load(struct drm_device *drm,
 
 	ret = mxsfb_attach_bridge(mxsfb);
 	if (ret) {
-		dev_err(drm->dev, "Cannot connect bridge: %d\n", ret);
+		if (ret != -EPROBE_DEFER)
+			dev_err(drm->dev, "Cannot connect bridge: %d\n", ret);
 		goto err_vblank;
 	}
 
commit be98e05a67f05ff4c8349a51fcec993a28be718c
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Fri Dec 4 21:02:42 2020 +0100

    dma-buf: Fix kerneldoc formatting
    
    I wanted to look up something and noticed the hyperlink doesn't work.
    While fixing that also noticed a trivial kerneldoc comment typo in the
    same section, fix that too.
    
    Reviewed-by: Michael J. Ruhl <michael.j.ruhl at intel.com>
    Reviewed-by: Simon Ser <contact at emersion.fr>
    Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201204200242.2671481-1-daniel.vetter@ffwll.ch

diff --git a/Documentation/driver-api/dma-buf.rst b/Documentation/driver-api/dma-buf.rst
index d6b2a195dbed..a2133d69872c 100644
--- a/Documentation/driver-api/dma-buf.rst
+++ b/Documentation/driver-api/dma-buf.rst
@@ -190,7 +190,7 @@ DMA Fence uABI/Sync File
 Indefinite DMA Fences
 ~~~~~~~~~~~~~~~~~~~~~
 
-At various times &dma_fence with an indefinite time until dma_fence_wait()
+At various times struct dma_fence with an indefinite time until dma_fence_wait()
 finishes have been proposed. Examples include:
 
 * Future fences, used in HWC1 to signal when a buffer isn't used by the display
diff --git a/include/linux/dma-buf-map.h b/include/linux/dma-buf-map.h
index 583a3a1f9447..278d489e4bdd 100644
--- a/include/linux/dma-buf-map.h
+++ b/include/linux/dma-buf-map.h
@@ -122,7 +122,7 @@ struct dma_buf_map {
 
 /**
  * DMA_BUF_MAP_INIT_VADDR - Initializes struct dma_buf_map to an address in system memory
- * @vaddr:	A system-memory address
+ * @vaddr_:	A system-memory address
  */
 #define DMA_BUF_MAP_INIT_VADDR(vaddr_) \
 	{ \
commit 5fbd41d3bf123af6a135bdea564087ec0f563eb0
Merge: 1d36dffa5d88 05faf1559de5
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Dec 15 10:21:47 2020 +0100

    Merge tag 'drm-misc-next-2020-11-27-1' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
    
    drm-misc-next for 5.11:
    
    UAPI Changes:
    
    Cross-subsystem Changes:
    
     * char/agp: Disable frontend without CONFIG_DRM_LEGACY
     * mm: Fix fput in mmap error path; Introduce vma_set_file() to change
       vma->vm_file
    
    Core Changes:
    
     * dma-buf: Use sgtables in system heap; Move heap helpers to CMA-heap code;
       Skip sync for unmapped buffers; Alloc higher order pages is available;
       Respect num_fences when initializing shared fence list
     * doc: Improvements around DRM modes and SCALING_FILTER
     * Pass full state to connector atomic functions + callee updates
     * Cleanups
     * shmem: Map pages with caching by default; Cleanups
     * ttm: Fix DMA32 for global page pool
     * fbdev: Cleanups
     * fb-helper: Update framebuffer after userspace writes; Unmap console buffer
       during shutdown; Rework damage handling of shadow framebuffer
    
    Driver Changes:
    
     * amdgpu: Multi-hop fixes, Clenaups
     * imx: Fix rotation for Vivante tiled formats; Support nearest-neighour
       skaling; Cleanups
     * mcde: Fix RGB formats; Support DPI output; Cleanups
     * meson: HDMI clock fixes
     * panel: Add driver and bindings for Innolux N125HCE-GN1
     * panel/s6e63m0: More backlight levels; Fix init; Cleanups
     * via: Clenunps
     * virtio: Use fence ID for handling fences; Cleanups
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    From: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127083055.GA29139@linux-uq9g

diff --cc drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index b848f9e97613,c438d290a6db..4d8f19ab1014
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@@ -639,17 -635,14 +635,14 @@@ static int amdgpu_bo_move(struct ttm_bu
  		abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
  	}
  
+ out:
  	/* update statistics */
  	atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &adev->num_bytes_moved);
+ 	amdgpu_bo_move_notify(bo, evict, new_mem);
  	return 0;
- fail:
- 	swap(*new_mem, bo->mem);
- 	amdgpu_bo_move_notify(bo, false, new_mem);
- 	swap(*new_mem, bo->mem);
- 	return r;
  }
  
 -/**
 +/*
   * amdgpu_ttm_io_mem_reserve - Reserve a block of memory during a fault
   *
   * Called by ttm_mem_io_reserve() ultimately via ttm_bo_vm_fault()
commit 95e3d610d35c9c5b51e12c5c8ac18061ae08cf97
Author: Christian König <christian.koenig at amd.com>
Date:   Wed Nov 25 15:32:23 2020 +0100

    drm/radeon: fix check order in radeon_bo_move
    
    Reorder the code to fix checking if blitting is available.
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Fixes: 28a68f828266 ("drm/radeon/ttm: use multihop")
    Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Reviewed-by: Dave Airlie <airlied at redhat.com>
    Link: https://patchwork.freedesktop.org/patch/403847/

diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 0ca381b95d3d..2b598141225f 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -216,27 +216,15 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
 	struct ttm_resource *old_mem = &bo->mem;
 	int r;
 
-	if ((old_mem->mem_type == TTM_PL_SYSTEM &&
-	     new_mem->mem_type == TTM_PL_VRAM) ||
-	    (old_mem->mem_type == TTM_PL_VRAM &&
-	     new_mem->mem_type == TTM_PL_SYSTEM)) {
-		hop->fpfn = 0;
-		hop->lpfn = 0;
-		hop->mem_type = TTM_PL_TT;
-		hop->flags = 0;
-		return -EMULTIHOP;
-	}
-
 	if (new_mem->mem_type == TTM_PL_TT) {
 		r = radeon_ttm_tt_bind(bo->bdev, bo->ttm, new_mem);
 		if (r)
 			return r;
 	}
-	radeon_bo_move_notify(bo, evict, new_mem);
 
 	r = ttm_bo_wait_ctx(bo, ctx);
 	if (r)
-		goto fail;
+		return r;
 
 	/* Can't move a pinned BO */
 	rbo = container_of(bo, struct radeon_bo, tbo);
@@ -246,12 +234,12 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
 	rdev = radeon_get_rdev(bo->bdev);
 	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
 		ttm_bo_move_null(bo, new_mem);
-		return 0;
+		goto out;
 	}
 	if (old_mem->mem_type == TTM_PL_SYSTEM &&
 	    new_mem->mem_type == TTM_PL_TT) {
 		ttm_bo_move_null(bo, new_mem);
-		return 0;
+		goto out;
 	}
 
 	if (old_mem->mem_type == TTM_PL_TT &&
@@ -259,31 +247,37 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
 		radeon_ttm_tt_unbind(bo->bdev, bo->ttm);
 		ttm_resource_free(bo, &bo->mem);
 		ttm_bo_assign_mem(bo, new_mem);
-		return 0;
+		goto out;
 	}
-	if (!rdev->ring[radeon_copy_ring_index(rdev)].ready ||
-	    rdev->asic->copy.copy == NULL) {
-		/* use memcpy */
-		goto memcpy;
+	if (rdev->ring[radeon_copy_ring_index(rdev)].ready &&
+	    rdev->asic->copy.copy != NULL) {
+		if ((old_mem->mem_type == TTM_PL_SYSTEM &&
+		     new_mem->mem_type == TTM_PL_VRAM) ||
+		    (old_mem->mem_type == TTM_PL_VRAM &&
+		     new_mem->mem_type == TTM_PL_SYSTEM)) {
+			hop->fpfn = 0;
+			hop->lpfn = 0;
+			hop->mem_type = TTM_PL_TT;
+			hop->flags = 0;
+			return -EMULTIHOP;
+		}
+
+		r = radeon_move_blit(bo, evict, new_mem, old_mem);
+	} else {
+		r = -ENODEV;
 	}
 
-	r = radeon_move_blit(bo, evict, new_mem, old_mem);
 	if (r) {
-memcpy:
 		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
-		if (r) {
-			goto fail;
-		}
+		if (r)
+			return r;
 	}
 
+out:
 	/* update statistics */
 	atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &rdev->num_bytes_moved);
+	radeon_bo_move_notify(bo, evict, new_mem);
 	return 0;
-fail:
-	swap(*new_mem, bo->mem);
-	radeon_bo_move_notify(bo, false, new_mem);
-	swap(*new_mem, bo->mem);
-	return r;
 }
 
 static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)
commit 1d36dffa5d887715dacca0f717f4519b7be5e498
Merge: 2c85ebc57b3e b10733527bfd
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Dec 14 11:07:56 2020 -0800

    Merge tag 'drm-next-2020-12-11' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm updates from Dave Airlie:
     "Not a huge amount of big things here, AMD has support for a few new HW
      variants (vangogh, green sardine, dimgrey cavefish), Intel has some
      more DG1 enablement. We have a few big reworks of the TTM layers and
      interfaces, GEM and atomic internal API reworks cross tree. fbdev is
      marked orphaned in here as well to reflect the current reality.
    
      core:
       - documentation updates
       - deprecate DRM_FORMAT_MOD_NONE
       - atomic crtc enable/disable rework
       - GEM convert drivers to gem object functions
       - remove SCATTER_LIST_MAX_SEGMENT
    
      sched:
       - avoid infinite waits
    
      ttm:
       - remove AGP support
       - don't modify caching for swapout
       - ttm pinning rework
       - major TTM reworks
       - new backend allocator
       - multihop support
    
      vram-helper:
       - top down BO placement fix
       - TTM changes
       - GEM object support
    
      displayport:
       - DP 2.0 DPCD prep work
       - DP MST extended DPCD caps
    
      fbdev:
       - mark as orphaned
    
      amdgpu:
       - Initial Vangogh support
       - Green Sardine support
       - Dimgrey Cavefish support
       - SG display support for renoir
       - SMU7 improvements
       - gfx9+ modiifier support
       - CI BACO fixes
    
      radeon:
       - expose voltage via hwmon on SUMO
    
      amdkfd:
       - fix unique id handling
    
      i915:
       - more DG1 enablement
       - bigjoiner support
       - integer scaling filter support
       - async flip support
       - ICL+ DSI command mode
       - Improve display shutdown
       - Display refactoring
       - eLLC machine fbdev loading fix
       - dma scatterlist fixes
       - TGL hang fixes
       - eLLC display buffer caching on SKL+
       - MOCS PTE seeting for gen9+
    
      msm:
       - Shutdown hook
       - GPU cooling device support
       - DSI 7nm and 10nm phy/pll updates
       - sm8150/sm2850 DPU support
       - GEM locking re-work
       - LLCC system cache support
    
      aspeed:
       - sysfs output config support
    
      ast:
       - LUT fix
       - new display mode
    
      gma500:
       - remove 2d framebuffer accel
    
      panfrost:
       - move gpu reset to a worker
    
      exynos:
       - new HDMI mode support
    
      mediatek:
       - MT8167 support
       - yaml bindings
       - MIPI DSI phy code moved
    
      etnaviv:
       - new perf counter
       - more lockdep annotation
    
      hibmc:
       - i2c DDC support
    
      ingenic:
       - pixel clock reset fix
       - reserved memory support
       - allow both DMA channels at once
       - different pixel format support
       - 30/24/8-bit palette modes
    
      tilcdc:
       - don't keep vblank irq enabled
    
      vc4:
       - new maintainer added
       - DSI registration fix
    
      virtio:
       - blob resource support
       - host visible and cross-device support
       - uuid api support"
    
    * tag 'drm-next-2020-12-11' of git://anongit.freedesktop.org/drm/drm: (1754 commits)
      drm/amdgpu: Initialise drm_gem_object_funcs for imported BOs
      drm/amdgpu: fix size calculation with stolen vga memory
      drm/amdgpu: remove amdgpu_ttm_late_init  and amdgpu_bo_late_init
      drm/amdgpu: free the pre-OS console framebuffer after the first modeset
      drm/amdgpu: enable runtime pm using BACO on CI dGPUs
      drm/amdgpu/cik: enable BACO reset on Bonaire
      drm/amd/pm: update smu10.h WORKLOAD_PPLIB setting for raven
      drm/amd/pm: remove one unsupported smu function for vangogh
      drm/amd/display: setup system context for APUs
      drm/amd/display: add S/G support for Vangogh
      drm/amdkfd: Fix leak in dmabuf import
      drm/amdgpu: use AMDGPU_NUM_VMID when possible
      drm/amdgpu: fix sdma instance fw version and feature version init
      drm/amd/pm: update driver if version for dimgrey_cavefish
      drm/amd/display: 3.2.115
      drm/amd/display: [FW Promotion] Release 0.0.45
      drm/amd/display: Revert DCN2.1 dram_clock_change_latency update
      drm/amd/display: Enable gpu_vm_support for dcn3.01
      drm/amd/display: Fixed the audio noise during mode switching with HDCP mode on
      drm/amd/display: Add wm table for Renoir
      ...

diff --cc drivers/gpu/drm/i915/gt/intel_mocs.c
index 413dadfac2d1,254873e1646e..ab6870242e18
--- a/drivers/gpu/drm/i915/gt/intel_mocs.c
+++ b/drivers/gpu/drm/i915/gt/intel_mocs.c
@@@ -324,10 -346,14 +357,14 @@@ static unsigned int get_mocs_settings(c
  {
  	unsigned int flags;
  
- 	if (INTEL_GEN(i915) >= 12) {
+ 	if (IS_DG1(i915)) {
+ 		table->size = ARRAY_SIZE(dg1_mocs_table);
+ 		table->table = dg1_mocs_table;
 -		table->n_entries = GEN11_NUM_MOCS_ENTRIES;
++		table->n_entries = GEN9_NUM_MOCS_ENTRIES;
+ 	} else if (INTEL_GEN(i915) >= 12) {
  		table->size  = ARRAY_SIZE(tgl_mocs_table);
  		table->table = tgl_mocs_table;
 -		table->n_entries = GEN11_NUM_MOCS_ENTRIES;
 +		table->n_entries = GEN9_NUM_MOCS_ENTRIES;
  	} else if (IS_GEN(i915, 11)) {
  		table->size  = ARRAY_SIZE(icl_mocs_table);
  		table->table = icl_mocs_table;
diff --cc tools/testing/scatterlist/main.c
index f561aed7c657,d264bf853034..8a577c95496e
--- a/tools/testing/scatterlist/main.c
+++ b/tools/testing/scatterlist/main.c
@@@ -50,11 -50,11 +50,11 @@@ static void fail(struct test *test, str
  
  int main(void)
  {
- 	const unsigned int sgmax = SCATTERLIST_MAX_SEGMENT;
+ 	const unsigned int sgmax = UINT_MAX;
  	struct test *test, tests[] = {
 -		{ -EINVAL, 1, pfn(0), PAGE_SIZE, PAGE_SIZE + 1, 1 },
  		{ -EINVAL, 1, pfn(0), PAGE_SIZE, 0, 1 },
 -		{ -EINVAL, 1, pfn(0), PAGE_SIZE, sgmax + 1, 1 },
 +		{ 0, 1, pfn(0), PAGE_SIZE, PAGE_SIZE + 1, 1 },
 +		{ 0, 1, pfn(0), PAGE_SIZE, sgmax + 1, 1 },
  		{ 0, 1, pfn(0), PAGE_SIZE, sgmax, 1 },
  		{ 0, 1, pfn(0), 1, sgmax, 1 },
  		{ 0, 2, pfn(0, 1), 2 * PAGE_SIZE, sgmax, 1 },
commit 2c85ebc57b3e1817b6ce1a6b703928e113a90442
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 13 14:41:30 2020 -0800

    Linux 5.10

diff --git a/Makefile b/Makefile
index 9ec53d947628..e30cf02da8b8 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 10
 SUBLEVEL = 0
-EXTRAVERSION = -rc7
+EXTRAVERSION =
 NAME = Kleptomaniac Octopus
 
 # *DOCUMENTATION*
commit ec6f5e0e5ca0764b4bc522c9f9d5abf876a0e3e3
Merge: d2360a398f0b 0d07c0ec4381
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 13 11:31:19 2020 -0800

    Merge tag 'x86-urgent-2020-12-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull x86 fixes from Thomas Gleixner:
     "A set of x86 and membarrier fixes:
    
       - Correct a few problems in the x86 and the generic membarrier
         implementation. Small corrections for assumptions about visibility
         which have turned out not to be true.
    
       - Make the PAT bits for memory encryption correct vs 4K and 2M/1G
         page table entries as they are at a different location.
    
       - Fix a concurrency issue in the the local bandwidth readout of
         resource control leading to incorrect values
    
       - Fix the ordering of allocating a vector for an interrupt. The order
         missed to respect the provided cpumask when the first attempt of
         allocating node local in the mask fails. It then tries the node
         instead of trying the full provided mask first. This leads to
         erroneous error messages and breaking the (user) supplied affinity
         request. Reorder it.
    
       - Make the INT3 padding detection in optprobe work correctly"
    
    * tag 'x86-urgent-2020-12-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      x86/kprobes: Fix optprobe to detect INT3 padding correctly
      x86/apic/vector: Fix ordering in vector assignment
      x86/resctrl: Fix incorrect local bandwidth when mba_sc is enabled
      x86/mm/mem_encrypt: Fix definition of PMD_FLAGS_DEC_WP
      membarrier: Execute SYNC_CORE on the calling thread
      membarrier: Explicitly sync remote cores when SYNC_CORE is requested
      membarrier: Add an actual barrier before rseq_preempt()
      x86/membarrier: Get rid of a dubious optimization

commit d2360a398f0b68722641c59aeb2623e79bd03e34
Merge: 6bff9bb8a292 6ffeb1c3f822
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 13 10:36:23 2020 -0800

    Merge tag 'block-5.10-2020-12-12' of git://git.kernel.dk/linux-block
    
    Pull block fixes from Jens Axboe:
     "This should be it for 5.10.
    
      Mike and Song looked into the warning case, and thankfully it appears
      the fix was pretty trivial - we can just change the md device chunk
      type to unsigned int to get rid of it. They cannot currently be < 0,
      and nobody is checking for that either.
    
      We're reverting the discard changes as the corruption reports came in
      very late, and there's just no time to attempt to deal with it at this
      point. Reverting the changes in question is the right call for 5.10"
    
    * tag 'block-5.10-2020-12-12' of git://git.kernel.dk/linux-block:
      md: change mddev 'chunk_sectors' from int to unsigned
      Revert "md: add md_submit_discard_bio() for submitting discard bio"
      Revert "md/raid10: extend r10bio devs to raid disks"
      Revert "md/raid10: pull codes that wait for blocked dev into one function"
      Revert "md/raid10: improve raid10 discard request"
      Revert "md/raid10: improve discard request for far layout"
      Revert "dm raid: remove unnecessary discard limits for raid10"

commit 6bff9bb8a292668e7da3e740394b061e5201f683
Merge: 5ee595d9079b 4da3a54f5a02
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 12:57:12 2020 -0800

    Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
    
    Pull SCSI fixes from James Bottomley:
     "Five small fixes.  Four in drivers:
    
       - hisi_sas: fix internal queue timeout
    
       - be2iscsi: revert a prior fix causing problems
    
       - bnx2i: add missing dependency
    
       - storvsc: late arriving revert of a problem fix
    
      and one in the core.
    
      The core one is a minor change to stop paying attention to the busy
      count when returning out of resources because there's a race window
      where the queue might not restart due to missing returning I/O"
    
    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
      Revert "scsi: storvsc: Validate length of incoming packet in storvsc_on_channel_callback()"
      scsi: hisi_sas: Select a suitable queue for internal I/Os
      scsi: core: Fix race between handling STS_RESOURCE and completion
      scsi: be2iscsi: Revert "Fix a theoretical leak in beiscsi_create_eqs()"
      scsi: bnx2i: Requires MMU

commit 5ee595d9079b94ee931287ce004d34886b7d3c24
Merge: 7b1b868e1d91 e977aaf899a6
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 12:47:46 2020 -0800

    Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
    
    Pull i2c fix from Wolfram Sang:
     "Bugfix for the AT24 EEPROM driver"
    
    * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
      misc: eeprom: at24: fix NVMEM name with custom AT24 device name

commit 7b1b868e1d9156484ccce9bf11122c053de82617
Merge: b53966ffd4c0 111d0bda8eeb
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 10:08:16 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
    
    Pull kvm fixes from Paolo Bonzini:
     "Bugfixes for ARM, x86 and tools"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
      tools/kvm_stat: Exempt time-based counters
      KVM: mmu: Fix SPTE encoding of MMIO generation upper half
      kvm: x86/mmu: Use cpuid to determine max gfn
      kvm: svm: de-allocate svm_cpu_data for all cpus in svm_cpu_uninit()
      selftests: kvm/set_memory_region_test: Fix race in move region test
      KVM: arm64: Add usage of stage 2 fault lookup level in user_mem_abort()
      KVM: arm64: Fix handling of merging tables into a block entry
      KVM: arm64: Fix memory leak on stage2 update of a valid PTE

commit b53966ffd4c0676c02987d4fc33b99bdfc548cf0
Merge: b01deddb8d3c ee32f32335e8
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 10:02:03 2020 -0800

    Merge tag 'for-linus-5.10c-rc8-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
    
    Pull xen fixes from Juergen Gross:
     "A short series fixing a regression introduced in 5.9 for running as
      Xen dom0 on a system with NVMe backed storage"
    
    * tag 'for-linus-5.10c-rc8-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
      xen: don't use page->lru for ZONE_DEVICE memory
      xen: add helpers for caching grant mapping pages

commit b01deddb8d3cb779ac250978afd200931fd91dcd
Merge: 31d00f6eb1f2 ccbbfd1cbf36
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 09:50:26 2020 -0800

    Merge tag 'riscv-for-linus-5.10-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux
    
    Pull RISC-V fix from Palmer Dabbelt:
     "Just one fix. It's nothing critical, just a randconfig that wasn't
      building. That said, it does seem pretty safe and is technically a
      regression so I'm sending it along for 5.10:
    
       - define get_cycles64() all the time, as it's used by most
         configurations"
    
    * tag 'riscv-for-linus-5.10-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
      RISC-V: Define get_cycles64() regardless of M-mode

commit 31d00f6eb1f2b498a1d7af62cffeba3fbea8cf75
Merge: 643e69aff89a f26c08b444df
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 09:45:01 2020 -0800

    Merge tag 'io_uring-5.10-2020-12-11' of git://git.kernel.dk/linux-block
    
    Pull io_uring fixes from Jens Axboe:
     "Two fixes in here, fixing issues introduced in this merge window"
    
    * tag 'io_uring-5.10-2020-12-11' of git://git.kernel.dk/linux-block:
      io_uring: fix file leak on error path of io ctx creation
      io_uring: fix mis-seting personality's creds

commit 643e69aff89a2d0abc53979acc441b68ce86139b
Merge: 7f376f1917d7 cffdd6d90482
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 12 09:41:33 2020 -0800

    Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
    
    Pull input fixes from Dmitry Torokhov:
    
     - a fix for cm109 stomping on its own control URB if it tries to toggle
       buzzer immediately after userspace opens input device (found by
       syzcaller)
    
     - another fix for Raydium touchscreens that do not like splitting
       command transfers
    
     - quirks for i8042, soc_button_array, and goodix drivers to make them
       work better with certain hardware.
    
    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
      Input: goodix - add upside-down quirk for Teclast X98 Pro tablet
      Input: cm109 - do not stomp on control URB
      Input: i8042 - add Acer laptops to the i8042 reset list
      Input: cros_ec_keyb - send 'scancodes' in addition to key events
      Input: soc_button_array - add Lenovo Yoga Tablet2 1051L to the dmi_use_low_level_irq list
      Input: raydium_ts_i2c - do not split tx transactions

commit 6ffeb1c3f8226244c08105bcdbeecc04bad6b89a
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Sat Dec 12 11:55:37 2020 -0500

    md: change mddev 'chunk_sectors' from int to unsigned
    
    Commit e2782f560c29 ("Revert "dm raid: remove unnecessary discard
    limits for raid10"") exposed compiler warnings introduced by commit
    e0910c8e4f87 ("dm raid: fix discard limits for raid1 and raid10"):
    
    In file included from ./include/linux/kernel.h:14,
                     from ./include/asm-generic/bug.h:20,
                     from ./arch/x86/include/asm/bug.h:93,
                     from ./include/linux/bug.h:5,
                     from ./include/linux/mmdebug.h:5,
                     from ./include/linux/gfp.h:5,
                     from ./include/linux/slab.h:15,
                     from drivers/md/dm-raid.c:8:
    drivers/md/dm-raid.c: In function ‘raid_io_hints’:
    ./include/linux/minmax.h:18:28: warning: comparison of distinct pointer types lacks a cast
      (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
                                ^~
    ./include/linux/minmax.h:32:4: note: in expansion of macro ‘__typecheck’
       (__typecheck(x, y) && __no_side_effects(x, y))
        ^~~~~~~~~~~
    ./include/linux/minmax.h:42:24: note: in expansion of macro ‘__safe_cmp’
      __builtin_choose_expr(__safe_cmp(x, y), \
                            ^~~~~~~~~~
    ./include/linux/minmax.h:51:19: note: in expansion of macro ‘__careful_cmp’
     #define min(x, y) __careful_cmp(x, y, <)
                       ^~~~~~~~~~~~~
    ./include/linux/minmax.h:84:39: note: in expansion of macro ‘min’
      __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
                                           ^~~
    drivers/md/dm-raid.c:3739:33: note: in expansion of macro ‘min_not_zero’
       limits->max_discard_sectors = min_not_zero(rs->md.chunk_sectors,
                                     ^~~~~~~~~~~~
    
    Fix this by changing the chunk_sectors member of 'struct mddev' from
    int to 'unsigned int' to match the type used for the 'chunk_sectors'
    member of 'struct queue_limits'.  Various MD code still uses 'int' but
    none of it appears to ever make use of signed int; and storing
    positive signed int in unsigned is perfectly safe.
    
    Reported-by: Song Liu <songliubraving at fb.com>
    Fixes: e2782f560c29 ("Revert "dm raid: remove unnecessary discard limits for raid10"")
    Fixes: e0910c8e4f87 ("dm raid: fix discard limits for raid1 and raid10")
    Cc: stable at vger,kernel.org # e0910c8e4f87 was marked for stable@
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>
    Reviewed-by: Song Liu <song at kernel.org>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/drivers/md/md.h b/drivers/md/md.h
index 2175a5ac4f7c..bb645bc3ba6d 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -311,7 +311,7 @@ struct mddev {
 	int				external;	/* metadata is
 							 * managed externally */
 	char				metadata_type[17]; /* externally set*/
-	int				chunk_sectors;
+	unsigned int			chunk_sectors;
 	time64_t			ctime, utime;
 	int				level, layout;
 	char				clevel[16];
@@ -339,7 +339,7 @@ struct mddev {
 	 */
 	sector_t			reshape_position;
 	int				delta_disks, new_level, new_layout;
-	int				new_chunk_sectors;
+	unsigned int			new_chunk_sectors;
 	int				reshape_backwards;
 
 	struct md_thread		*thread;	/* management thread */
commit 0d07c0ec4381f630c801539c79ad8dcc627f6e4a
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Dec 11 16:04:17 2020 +0900

    x86/kprobes: Fix optprobe to detect INT3 padding correctly
    
    Commit
    
      7705dc855797 ("x86/vmlinux: Use INT3 instead of NOP for linker fill bytes")
    
    changed the padding bytes between functions from NOP to INT3. However,
    when optprobe decodes a target function it finds INT3 and gives up the
    jump optimization.
    
    Instead of giving up any INT3 detection, check whether the rest of the
    bytes to the end of the function are INT3. If all of them are INT3,
    those come from the linker. In that case, continue the optprobe jump
    optimization.
    
     [ bp: Massage commit message. ]
    
    Fixes: 7705dc855797 ("x86/vmlinux: Use INT3 instead of NOP for linker fill bytes")
    Reported-by: Adam Zabrocki <pi3 at pi3.com.pl>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Steven Rostedt (VMware) <rostedt at goodmis.org>
    Reviewed-by: Kees Cook <keescook at chromium.org>
    Cc: stable at vger.kernel.org
    Link: https://lkml.kernel.org/r/160767025681.3880685.16021570341428835411.stgit@devnote2

diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c
index 041f0b50bc27..08eb23074f92 100644
--- a/arch/x86/kernel/kprobes/opt.c
+++ b/arch/x86/kernel/kprobes/opt.c
@@ -272,6 +272,19 @@ static int insn_is_indirect_jump(struct insn *insn)
 	return ret;
 }
 
+static bool is_padding_int3(unsigned long addr, unsigned long eaddr)
+{
+	unsigned char ops;
+
+	for (; addr < eaddr; addr++) {
+		if (get_kernel_nofault(ops, (void *)addr) < 0 ||
+		    ops != INT3_INSN_OPCODE)
+			return false;
+	}
+
+	return true;
+}
+
 /* Decode whole function to ensure any instructions don't jump into target */
 static int can_optimize(unsigned long paddr)
 {
@@ -310,9 +323,14 @@ static int can_optimize(unsigned long paddr)
 			return 0;
 		kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE);
 		insn_get_length(&insn);
-		/* Another subsystem puts a breakpoint */
+		/*
+		 * In the case of detecting unknown breakpoint, this could be
+		 * a padding INT3 between functions. Let's check that all the
+		 * rest of the bytes are also INT3.
+		 */
 		if (insn.opcode.bytes[0] == INT3_INSN_OPCODE)
-			return 0;
+			return is_padding_int3(addr, paddr - offset + size) ? 1 : 0;
+
 		/* Recover address */
 		insn.kaddr = (void *)addr;
 		insn.next_byte = (void *)(addr + insn.length);
commit cffdd6d90482316e18d686060a4397902ea04bd2
Author: Simon Beginn <linux at simonmicro.de>
Date:   Fri Dec 11 16:17:32 2020 -0800

    Input: goodix - add upside-down quirk for Teclast X98 Pro tablet
    
    The touchscreen on the Teclast x98 Pro is also mounted upside-down in
    relation to the display orientation.
    
    Signed-off-by: Simon Beginn <linux at simonmicro.de>
    Signed-off-by: Bastien Nocera <hadess at hadess.net>
    Link: https://lore.kernel.org/r/20201117004253.27A5A27EFD@localhost
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 02c75ea385e0..6612f9e2d7e8 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -192,6 +192,18 @@ static const struct dmi_system_id rotated_screen[] = {
 			DMI_MATCH(DMI_BIOS_DATE, "12/19/2014"),
 		},
 	},
+	{
+		.ident = "Teclast X98 Pro",
+		.matches = {
+			/*
+			 * Only match BIOS date, because the manufacturers
+			 * BIOS does not report the board name at all
+			 * (sometimes)...
+			 */
+			DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"),
+			DMI_MATCH(DMI_BIOS_DATE, "10/28/2015"),
+		},
+	},
 	{
 		.ident = "WinBook TW100",
 		.matches = {
commit 111d0bda8eeb4b54e0c63897b071effbf9fd9251
Author: Stefan Raspl <raspl at de.ibm.com>
Date:   Tue Dec 8 22:08:29 2020 +0100

    tools/kvm_stat: Exempt time-based counters
    
    The new counters halt_poll_success_ns and halt_poll_fail_ns do not count
    events. Instead they provide a time, and mess up our statistics. Therefore,
    we should exclude them.
    Removal is currently implemented with an exempt list. If more counters like
    these appear, we can think about a more general rule like excluding all
    fields name "*_ns", in case that's a standing convention.
    
    Signed-off-by: Stefan Raspl <raspl at linux.ibm.com>
    Tested-and-reported-by: Christian Borntraeger <borntraeger at de.ibm.com>
    Message-Id: <20201208210829.101324-1-raspl at linux.ibm.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
index d199a3694be8..b0bf56c5f120 100755
--- a/tools/kvm/kvm_stat/kvm_stat
+++ b/tools/kvm/kvm_stat/kvm_stat
@@ -742,7 +742,11 @@ class DebugfsProvider(Provider):
         The fields are all available KVM debugfs files
 
         """
-        return self.walkdir(PATH_DEBUGFS_KVM)[2]
+        exempt_list = ['halt_poll_fail_ns', 'halt_poll_success_ns']
+        fields = [field for field in self.walkdir(PATH_DEBUGFS_KVM)[2]
+                  if field not in exempt_list]
+
+        return fields
 
     def update_fields(self, fields_filter):
         """Refresh fields, applying fields_filter"""
commit 34c0f6f2695a2db81e09a3ab7bdb2853f45d4d3d
Author: Maciej S. Szmigiero <maciej.szmigiero at oracle.com>
Date:   Sat Dec 5 01:48:08 2020 +0100

    KVM: mmu: Fix SPTE encoding of MMIO generation upper half
    
    Commit cae7ed3c2cb0 ("KVM: x86: Refactor the MMIO SPTE generation handling")
    cleaned up the computation of MMIO generation SPTE masks, however it
    introduced a bug how the upper part was encoded:
    SPTE bits 52-61 were supposed to contain bits 10-19 of the current
    generation number, however a missing shift encoded bits 1-10 there instead
    (mostly duplicating the lower part of the encoded generation number that
    then consisted of bits 1-9).
    
    In the meantime, the upper part was shrunk by one bit and moved by
    subsequent commits to become an upper half of the encoded generation number
    (bits 9-17 of bits 0-17 encoded in a SPTE).
    
    In addition to the above, commit 56871d444bc4 ("KVM: x86: fix overlap between SPTE_MMIO_MASK and generation")
    has changed the SPTE bit range assigned to encode the generation number and
    the total number of bits encoded but did not update them in the comment
    attached to their defines, nor in the KVM MMU doc.
    Let's do it here, too, since it is too trivial thing to warrant a separate
    commit.
    
    Fixes: cae7ed3c2cb0 ("KVM: x86: Refactor the MMIO SPTE generation handling")
    Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero at oracle.com>
    Message-Id: <156700708db2a5296c5ed7a8b9ac71f1e9765c85.1607129096.git.maciej.szmigiero at oracle.com>
    Cc: stable at vger.kernel.org
    [Reorganize macros so that everything is computed from the bit ranges. - Paolo]
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/Documentation/virt/kvm/mmu.rst b/Documentation/virt/kvm/mmu.rst
index 1c030dbac7c4..5bfe28b0728e 100644
--- a/Documentation/virt/kvm/mmu.rst
+++ b/Documentation/virt/kvm/mmu.rst
@@ -455,7 +455,7 @@ If the generation number of the spte does not equal the global generation
 number, it will ignore the cached MMIO information and handle the page
 fault through the slow path.
 
-Since only 19 bits are used to store generation-number on mmio spte, all
+Since only 18 bits are used to store generation-number on mmio spte, all
 pages are zapped when there is an overflow.
 
 Unfortunately, a single memory access might access kvm_memslots(kvm) multiple
diff --git a/arch/x86/kvm/mmu/spte.c b/arch/x86/kvm/mmu/spte.c
index fcac2cac78fe..c51ad544f25b 100644
--- a/arch/x86/kvm/mmu/spte.c
+++ b/arch/x86/kvm/mmu/spte.c
@@ -40,8 +40,8 @@ static u64 generation_mmio_spte_mask(u64 gen)
 	WARN_ON(gen & ~MMIO_SPTE_GEN_MASK);
 	BUILD_BUG_ON((MMIO_SPTE_GEN_HIGH_MASK | MMIO_SPTE_GEN_LOW_MASK) & SPTE_SPECIAL_MASK);
 
-	mask = (gen << MMIO_SPTE_GEN_LOW_START) & MMIO_SPTE_GEN_LOW_MASK;
-	mask |= (gen << MMIO_SPTE_GEN_HIGH_START) & MMIO_SPTE_GEN_HIGH_MASK;
+	mask = (gen << MMIO_SPTE_GEN_LOW_SHIFT) & MMIO_SPTE_GEN_LOW_MASK;
+	mask |= (gen << MMIO_SPTE_GEN_HIGH_SHIFT) & MMIO_SPTE_GEN_HIGH_MASK;
 	return mask;
 }
 
diff --git a/arch/x86/kvm/mmu/spte.h b/arch/x86/kvm/mmu/spte.h
index 5c75a451c000..2b3a30bd38b0 100644
--- a/arch/x86/kvm/mmu/spte.h
+++ b/arch/x86/kvm/mmu/spte.h
@@ -56,11 +56,11 @@
 #define SPTE_MMU_WRITEABLE	(1ULL << (PT_FIRST_AVAIL_BITS_SHIFT + 1))
 
 /*
- * Due to limited space in PTEs, the MMIO generation is a 19 bit subset of
+ * Due to limited space in PTEs, the MMIO generation is a 18 bit subset of
  * the memslots generation and is derived as follows:
  *
  * Bits 0-8 of the MMIO generation are propagated to spte bits 3-11
- * Bits 9-18 of the MMIO generation are propagated to spte bits 52-61
+ * Bits 9-17 of the MMIO generation are propagated to spte bits 54-62
  *
  * The KVM_MEMSLOT_GEN_UPDATE_IN_PROGRESS flag is intentionally not included in
  * the MMIO generation number, as doing so would require stealing a bit from
@@ -69,18 +69,29 @@
  * requires a full MMU zap).  The flag is instead explicitly queried when
  * checking for MMIO spte cache hits.
  */
-#define MMIO_SPTE_GEN_MASK		GENMASK_ULL(17, 0)
 
 #define MMIO_SPTE_GEN_LOW_START		3
 #define MMIO_SPTE_GEN_LOW_END		11
-#define MMIO_SPTE_GEN_LOW_MASK		GENMASK_ULL(MMIO_SPTE_GEN_LOW_END, \
-						    MMIO_SPTE_GEN_LOW_START)
 
 #define MMIO_SPTE_GEN_HIGH_START	PT64_SECOND_AVAIL_BITS_SHIFT
 #define MMIO_SPTE_GEN_HIGH_END		62
+
+#define MMIO_SPTE_GEN_LOW_MASK		GENMASK_ULL(MMIO_SPTE_GEN_LOW_END, \
+						    MMIO_SPTE_GEN_LOW_START)
 #define MMIO_SPTE_GEN_HIGH_MASK		GENMASK_ULL(MMIO_SPTE_GEN_HIGH_END, \
 						    MMIO_SPTE_GEN_HIGH_START)
 
+#define MMIO_SPTE_GEN_LOW_BITS		(MMIO_SPTE_GEN_LOW_END - MMIO_SPTE_GEN_LOW_START + 1)
+#define MMIO_SPTE_GEN_HIGH_BITS		(MMIO_SPTE_GEN_HIGH_END - MMIO_SPTE_GEN_HIGH_START + 1)
+
+/* remember to adjust the comment above as well if you change these */
+static_assert(MMIO_SPTE_GEN_LOW_BITS == 9 && MMIO_SPTE_GEN_HIGH_BITS == 9);
+
+#define MMIO_SPTE_GEN_LOW_SHIFT		(MMIO_SPTE_GEN_LOW_START - 0)
+#define MMIO_SPTE_GEN_HIGH_SHIFT	(MMIO_SPTE_GEN_HIGH_START - MMIO_SPTE_GEN_LOW_BITS)
+
+#define MMIO_SPTE_GEN_MASK		GENMASK_ULL(MMIO_SPTE_GEN_LOW_BITS + MMIO_SPTE_GEN_HIGH_BITS - 1, 0)
+
 extern u64 __read_mostly shadow_nx_mask;
 extern u64 __read_mostly shadow_x_mask; /* mutual exclusive with nx_mask */
 extern u64 __read_mostly shadow_user_mask;
@@ -228,8 +239,8 @@ static inline u64 get_mmio_spte_generation(u64 spte)
 {
 	u64 gen;
 
-	gen = (spte & MMIO_SPTE_GEN_LOW_MASK) >> MMIO_SPTE_GEN_LOW_START;
-	gen |= (spte & MMIO_SPTE_GEN_HIGH_MASK) >> MMIO_SPTE_GEN_HIGH_START;
+	gen = (spte & MMIO_SPTE_GEN_LOW_MASK) >> MMIO_SPTE_GEN_LOW_SHIFT;
+	gen |= (spte & MMIO_SPTE_GEN_HIGH_MASK) >> MMIO_SPTE_GEN_HIGH_SHIFT;
 	return gen;
 }
 
commit 7f376f1917d7461e05b648983e8d2aea9d0712b2
Merge: 1de5d12b7690 33d974e76e21
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 14:29:46 2020 -0800

    Merge tag 'mtd/fixes-for-5.10-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
    
    Pull mtd fixes from Miquel Raynal:
     "Second series of fixes for raw NAND drivers initiated because of a
      rework of the ECC engine subsystem.
    
      The location of the DT parsing logic got moved, breaking several
      drivers which in fact were not doing the ECC engine initialization at
      the right place.
    
      These drivers have been fixed by enforcing a particular ECC engine
      type and algorithm, software Hamming, while the algorithm may be
      overwritten by a DT property. This merge request fixes this in the
      xway, socrates, plat_nand, pasemi, orion, mpc5121, gpio, au1550 and
      ams-delta controller drivers"
    
    * tag 'mtd/fixes-for-5.10-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux:
      mtd: rawnand: xway: Do not force a particular software ECC engine
      mtd: rawnand: socrates: Do not force a particular software ECC engine
      mtd: rawnand: plat_nand: Do not force a particular software ECC engine
      mtd: rawnand: pasemi: Do not force a particular software ECC engine
      mtd: rawnand: orion: Do not force a particular software ECC engine
      mtd: rawnand: mpc5121: Do not force a particular software ECC engine
      mtd: rawnand: gpio: Do not force a particular software ECC engine
      mtd: rawnand: au1550: Do not force a particular software ECC engine
      mtd: rawnand: ams-delta: Do not force a particular software ECC engine

commit 1de5d12b769017f7354e7151ce1c26eb1d9ba2e4
Merge: 782598ecea73 c0d638a03bc5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 14:26:17 2020 -0800

    Merge tag 'mmc-v5.10-rc4-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
    
    Pull MMC fixes from Ulf Hansson:
     "A couple of MMC fixes:
    
      MMC core:
       - Fixup condition for CMD13 polling for RPMB requests
    
      MMC host:
       - mtk-sd: Fix system suspend/resume support for CQHCI
       - mtd-sd: Extend SDIO IRQ fix to more variants
       - sdhci-of-arasan: Fix clock registration error for Keem Bay SOC
       - tmio: Bring HW to a sane state after a power off"
    
    * tag 'mmc-v5.10-rc4-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
      mmc: mediatek: mark PM functions as __maybe_unused
      mmc: block: Fixup condition for CMD13 polling for RPMB requests
      mmc: tmio: improve bringing HW to a sane state with MMC_POWER_OFF
      mmc: sdhci-of-arasan: Fix clock registration error for Keem Bay SOC
      mmc: mediatek: Extend recheck_sdio_irq fix to more variants
      mmc: mediatek: Fix system suspend/resume support for CQHCI

commit e977aaf899a6d3b3d6658da66e262b6e307ae3a2
Merge: 0477e9288185 4e302c3b568e
Author: Wolfram Sang <wsa at kernel.org>
Date:   Fri Dec 11 23:23:30 2020 +0100

    Merge tag 'at24-fixes-for-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into i2c/for-current
    
    at24 fixes for v5.10
    
    - fix NVMEM name with custom AT24 device name

commit 782598ecea73a4aecdd25cb0ceb0b19e8674cf30
Merge: b7906b70a233 6bea0225a4bf
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 14:22:42 2020 -0800

    Merge tag 'zonefs-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs
    
    Pull zonefs fix from Damien Le Moal:
     "A single patch in this pull request to fix a BIO and page reference
      leak when writing sequential zone files"
    
    * tag 'zonefs-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs:
      zonefs: fix page reference and BIO leak

commit b7906b70a2337e445b8dca3ce7ba8976b6ebd07d
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Fri Dec 11 22:36:25 2020 +0100

    bpf: Fix enum names for bpf_this_cpu_ptr() and bpf_per_cpu_ptr() helpers
    
    Remove bpf_ prefix, which causes these helpers to be reported in verifier
    dump as bpf_bpf_this_cpu_ptr() and bpf_bpf_per_cpu_ptr(), respectively. Lets
    fix it as long as it is still possible before UAPI freezes on these helpers.
    
    Fixes: eaa6bcb71ef6 ("bpf: Introduce bpf_per_cpu_ptr()")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index e6ceac3f7d62..556216dc9703 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -3897,8 +3897,8 @@ union bpf_attr {
 	FN(seq_printf_btf),		\
 	FN(skb_cgroup_classid),		\
 	FN(redirect_neigh),		\
-	FN(bpf_per_cpu_ptr),            \
-	FN(bpf_this_cpu_ptr),		\
+	FN(per_cpu_ptr),		\
+	FN(this_cpu_ptr),		\
 	FN(redirect_peer),		\
 	/* */
 
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index 25520f5eeaf6..deda1185237b 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -717,9 +717,9 @@ bpf_base_func_proto(enum bpf_func_id func_id)
 		return &bpf_snprintf_btf_proto;
 	case BPF_FUNC_jiffies64:
 		return &bpf_jiffies64_proto;
-	case BPF_FUNC_bpf_per_cpu_ptr:
+	case BPF_FUNC_per_cpu_ptr:
 		return &bpf_per_cpu_ptr_proto;
-	case BPF_FUNC_bpf_this_cpu_ptr:
+	case BPF_FUNC_this_cpu_ptr:
 		return &bpf_this_cpu_ptr_proto;
 	default:
 		break;
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 048c655315f1..a125ea5e04cd 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -1337,9 +1337,9 @@ bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
 		return prog->aux->sleepable ? &bpf_copy_from_user_proto : NULL;
 	case BPF_FUNC_snprintf_btf:
 		return &bpf_snprintf_btf_proto;
-	case BPF_FUNC_bpf_per_cpu_ptr:
+	case BPF_FUNC_per_cpu_ptr:
 		return &bpf_per_cpu_ptr_proto;
-	case BPF_FUNC_bpf_this_cpu_ptr:
+	case BPF_FUNC_this_cpu_ptr:
 		return &bpf_this_cpu_ptr_proto;
 	default:
 		return NULL;
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index e6ceac3f7d62..556216dc9703 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -3897,8 +3897,8 @@ union bpf_attr {
 	FN(seq_printf_btf),		\
 	FN(skb_cgroup_classid),		\
 	FN(redirect_neigh),		\
-	FN(bpf_per_cpu_ptr),            \
-	FN(bpf_this_cpu_ptr),		\
+	FN(per_cpu_ptr),		\
+	FN(this_cpu_ptr),		\
 	FN(redirect_peer),		\
 	/* */
 
commit a06caa4a68ce7d134b342966e65e7bd2dfa2eead
Merge: 94801e5c6d46 ba9c1201beaa
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 14:10:51 2020 -0800

    Merge branch 'akpm' (patches from Andrew)
    
    Merge misc fixes from Andrew Morton:
     "8 patches.
    
      Subsystems affected by this patch series: proc, selftests, kbuild, and
      mm (pagecache, kasan, hugetlb)"
    
    * emailed patches from Andrew Morton <akpm at linux-foundation.org>:
      mm/hugetlb: clear compound_nr before freeing gigantic pages
      kasan: fix object remaining in offline per-cpu quarantine
      elfcore: fix building with clang
      initramfs: fix clang build failure
      kbuild: avoid static_assert for genksyms
      selftest/fpu: avoid clang warning
      proc: use untagged_addr() for pagemap_read addresses
      revert "mm/filemap: add static for function __add_to_page_cache_locked"

commit ba9c1201beaa86a773e83be5654602a0667e4a4d
Author: Gerald Schaefer <gerald.schaefer at linux.ibm.com>
Date:   Fri Dec 11 13:36:53 2020 -0800

    mm/hugetlb: clear compound_nr before freeing gigantic pages
    
    Commit 1378a5ee451a ("mm: store compound_nr as well as compound_order")
    added compound_nr counter to first tail struct page, overlaying with
    page->mapping.  The overlay itself is fine, but while freeing gigantic
    hugepages via free_contig_range(), a "bad page" check will trigger for
    non-NULL page->mapping on the first tail page:
    
      BUG: Bad page state in process bash  pfn:380001
      page:00000000c35f0856 refcount:0 mapcount:0 mapping:00000000126b68aa index:0x0 pfn:0x380001
      aops:0x0
      flags: 0x3ffff00000000000()
      raw: 3ffff00000000000 0000000000000100 0000000000000122 0000000100000000
      raw: 0000000000000000 0000000000000000 ffffffff00000000 0000000000000000
      page dumped because: non-NULL mapping
      Modules linked in:
      CPU: 6 PID: 616 Comm: bash Not tainted 5.10.0-rc7-next-20201208 #1
      Hardware name: IBM 3906 M03 703 (LPAR)
      Call Trace:
        show_stack+0x6e/0xe8
        dump_stack+0x90/0xc8
        bad_page+0xd6/0x130
        free_pcppages_bulk+0x26a/0x800
        free_unref_page+0x6e/0x90
        free_contig_range+0x94/0xe8
        update_and_free_page+0x1c4/0x2c8
        free_pool_huge_page+0x11e/0x138
        set_max_huge_pages+0x228/0x300
        nr_hugepages_store_common+0xb8/0x130
        kernfs_fop_write+0xd2/0x218
        vfs_write+0xb0/0x2b8
        ksys_write+0xac/0xe0
        system_call+0xe6/0x288
      Disabling lock debugging due to kernel taint
    
    This is because only the compound_order is cleared in
    destroy_compound_gigantic_page(), and compound_nr is set to
    1U << order == 1 for order 0 in set_compound_order(page, 0).
    
    Fix this by explicitly clearing compound_nr for first tail page after
    calling set_compound_order(page, 0).
    
    Link: https://lkml.kernel.org/r/20201208182813.66391-2-gerald.schaefer@linux.ibm.com
    Fixes: 1378a5ee451a ("mm: store compound_nr as well as compound_order")
    Signed-off-by: Gerald Schaefer <gerald.schaefer at linux.ibm.com>
    Reviewed-by: Matthew Wilcox (Oracle) <willy at infradead.org>
    Cc: Heiko Carstens <hca at linux.ibm.com>
    Cc: Mike Kravetz <mike.kravetz at oracle.com>
    Cc: Christian Borntraeger <borntraeger at de.ibm.com>
    Cc: <stable at vger.kernel.org>    [5.9+]
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 37f15c3c24dc..d029d938d26d 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1216,6 +1216,7 @@ static void destroy_compound_gigantic_page(struct page *page,
 	}
 
 	set_compound_order(page, 0);
+	page[1].compound_nr = 0;
 	__ClearPageHead(page);
 }
 
commit 6c82d45c7f0348b44e00bd7dcccfc47dec7577d1
Author: Kuan-Ying Lee <Kuan-Ying.Lee at mediatek.com>
Date:   Fri Dec 11 13:36:49 2020 -0800

    kasan: fix object remaining in offline per-cpu quarantine
    
    We hit this issue in our internal test.  When enabling generic kasan, a
    kfree()'d object is put into per-cpu quarantine first.  If the cpu goes
    offline, object still remains in the per-cpu quarantine.  If we call
    kmem_cache_destroy() now, slub will report "Objects remaining" error.
    
      =============================================================================
      BUG test_module_slab (Not tainted): Objects remaining in test_module_slab on __kmem_cache_shutdown()
      -----------------------------------------------------------------------------
    
      Disabling lock debugging due to kernel taint
      INFO: Slab 0x(____ptrval____) objects=34 used=1 fp=0x(____ptrval____) flags=0x2ffff00000010200
      CPU: 3 PID: 176 Comm: cat Tainted: G    B             5.10.0-rc1-00007-g4525c8781ec0-dirty #10
      Hardware name: linux,dummy-virt (DT)
      Call trace:
         dump_backtrace+0x0/0x2b0
         show_stack+0x18/0x68
         dump_stack+0xfc/0x168
         slab_err+0xac/0xd4
         __kmem_cache_shutdown+0x1e4/0x3c8
         kmem_cache_destroy+0x68/0x130
         test_version_show+0x84/0xf0
         module_attr_show+0x40/0x60
         sysfs_kf_seq_show+0x128/0x1c0
         kernfs_seq_show+0xa0/0xb8
         seq_read+0x1f0/0x7e8
         kernfs_fop_read+0x70/0x338
         vfs_read+0xe4/0x250
         ksys_read+0xc8/0x180
         __arm64_sys_read+0x44/0x58
         el0_svc_common.constprop.0+0xac/0x228
         do_el0_svc+0x38/0xa0
         el0_sync_handler+0x170/0x178
         el0_sync+0x174/0x180
      INFO: Object 0x(____ptrval____) @offset=15848
      INFO: Allocated in test_version_show+0x98/0xf0 age=8188 cpu=6 pid=172
         stack_trace_save+0x9c/0xd0
         set_track+0x64/0xf0
         alloc_debug_processing+0x104/0x1a0
         ___slab_alloc+0x628/0x648
         __slab_alloc.isra.0+0x2c/0x58
         kmem_cache_alloc+0x560/0x588
         test_version_show+0x98/0xf0
         module_attr_show+0x40/0x60
         sysfs_kf_seq_show+0x128/0x1c0
         kernfs_seq_show+0xa0/0xb8
         seq_read+0x1f0/0x7e8
         kernfs_fop_read+0x70/0x338
         vfs_read+0xe4/0x250
         ksys_read+0xc8/0x180
         __arm64_sys_read+0x44/0x58
         el0_svc_common.constprop.0+0xac/0x228
      kmem_cache_destroy test_module_slab: Slab cache still has objects
    
    Register a cpu hotplug function to remove all objects in the offline
    per-cpu quarantine when cpu is going offline.  Set a per-cpu variable to
    indicate this cpu is offline.
    
    [qiang.zhang at windriver.com: fix slab double free when cpu-hotplug]
      Link: https://lkml.kernel.org/r/20201204102206.20237-1-qiang.zhang@windriver.com
    
    Link: https://lkml.kernel.org/r/1606895585-17382-2-git-send-email-Kuan-Ying.Lee@mediatek.com
    Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee at mediatek.com>
    Signed-off-by: Zqiang <qiang.zhang at windriver.com>
    Suggested-by: Dmitry Vyukov <dvyukov at google.com>
    Reported-by: Guangye Yang <guangye.yang at mediatek.com>
    Reviewed-by: Dmitry Vyukov <dvyukov at google.com>
    Cc: Andrey Ryabinin <aryabinin at virtuozzo.com>
    Cc: Alexander Potapenko <glider at google.com>
    Cc: Matthias Brugger <matthias.bgg at gmail.com>
    Cc: Nicholas Tang <nicholas.tang at mediatek.com>
    Cc: Miles Chen <miles.chen at mediatek.com>
    Cc: Qian Cai <qcai at redhat.com>
    Cc: Stephen Rothwell <sfr at canb.auug.org.au>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/kasan/quarantine.c b/mm/kasan/quarantine.c
index 4c5375810449..0e3f8494628f 100644
--- a/mm/kasan/quarantine.c
+++ b/mm/kasan/quarantine.c
@@ -29,6 +29,7 @@
 #include <linux/srcu.h>
 #include <linux/string.h>
 #include <linux/types.h>
+#include <linux/cpuhotplug.h>
 
 #include "../slab.h"
 #include "kasan.h"
@@ -43,6 +44,7 @@ struct qlist_head {
 	struct qlist_node *head;
 	struct qlist_node *tail;
 	size_t bytes;
+	bool offline;
 };
 
 #define QLIST_INIT { NULL, NULL, 0 }
@@ -188,6 +190,10 @@ void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache)
 	local_irq_save(flags);
 
 	q = this_cpu_ptr(&cpu_quarantine);
+	if (q->offline) {
+		local_irq_restore(flags);
+		return;
+	}
 	qlist_put(q, &info->quarantine_link, cache->size);
 	if (unlikely(q->bytes > QUARANTINE_PERCPU_SIZE)) {
 		qlist_move_all(q, &temp);
@@ -328,3 +334,36 @@ void quarantine_remove_cache(struct kmem_cache *cache)
 
 	synchronize_srcu(&remove_cache_srcu);
 }
+
+static int kasan_cpu_online(unsigned int cpu)
+{
+	this_cpu_ptr(&cpu_quarantine)->offline = false;
+	return 0;
+}
+
+static int kasan_cpu_offline(unsigned int cpu)
+{
+	struct qlist_head *q;
+
+	q = this_cpu_ptr(&cpu_quarantine);
+	/* Ensure the ordering between the writing to q->offline and
+	 * qlist_free_all. Otherwise, cpu_quarantine may be corrupted
+	 * by interrupt.
+	 */
+	WRITE_ONCE(q->offline, true);
+	barrier();
+	qlist_free_all(q, NULL);
+	return 0;
+}
+
+static int __init kasan_cpu_quarantine_init(void)
+{
+	int ret = 0;
+
+	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "mm/kasan:online",
+				kasan_cpu_online, kasan_cpu_offline);
+	if (ret < 0)
+		pr_err("kasan cpu quarantine register failed [%d]\n", ret);
+	return ret;
+}
+late_initcall(kasan_cpu_quarantine_init);
commit 6e7b64b9dd6d96537d816ea07ec26b7dedd397b9
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 11 13:36:46 2020 -0800

    elfcore: fix building with clang
    
    kernel/elfcore.c only contains weak symbols, which triggers a bug with
    clang in combination with recordmcount:
    
      Cannot find symbol for section 2: .text.
      kernel/elfcore.o: failed
    
    Move the empty stubs into linux/elfcore.h as inline functions.  As only
    two architectures use these, just use the architecture specific Kconfig
    symbols to key off the declaration.
    
    Link: https://lkml.kernel.org/r/20201204165742.3815221-2-arnd@kernel.org
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Cc: Nathan Chancellor <natechancellor at gmail.com>
    Cc: Nick Desaulniers <ndesaulniers at google.com>
    Cc: Barret Rhoden <brho at google.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h
index 46c3d691f677..de51c1bef27d 100644
--- a/include/linux/elfcore.h
+++ b/include/linux/elfcore.h
@@ -104,6 +104,7 @@ static inline int elf_core_copy_task_fpregs(struct task_struct *t, struct pt_reg
 #endif
 }
 
+#if defined(CONFIG_UM) || defined(CONFIG_IA64)
 /*
  * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out
  * extra segments containing the gate DSO contents.  Dumping its
@@ -118,5 +119,26 @@ elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset);
 extern int
 elf_core_write_extra_data(struct coredump_params *cprm);
 extern size_t elf_core_extra_data_size(void);
+#else
+static inline Elf_Half elf_core_extra_phdrs(void)
+{
+	return 0;
+}
+
+static inline int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
+{
+	return 1;
+}
+
+static inline int elf_core_write_extra_data(struct coredump_params *cprm)
+{
+	return 1;
+}
+
+static inline size_t elf_core_extra_data_size(void)
+{
+	return 0;
+}
+#endif
 
 #endif /* _LINUX_ELFCORE_H */
diff --git a/kernel/Makefile b/kernel/Makefile
index af601b9bda0e..6c9f19911be0 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -97,7 +97,6 @@ obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
 obj-$(CONFIG_TRACEPOINTS) += tracepoint.o
 obj-$(CONFIG_LATENCYTOP) += latencytop.o
-obj-$(CONFIG_ELFCORE) += elfcore.o
 obj-$(CONFIG_FUNCTION_TRACER) += trace/
 obj-$(CONFIG_TRACING) += trace/
 obj-$(CONFIG_TRACE_CLOCK) += trace/
diff --git a/kernel/elfcore.c b/kernel/elfcore.c
deleted file mode 100644
index 57fb4dcff434..000000000000
--- a/kernel/elfcore.c
+++ /dev/null
@@ -1,26 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/elf.h>
-#include <linux/fs.h>
-#include <linux/mm.h>
-#include <linux/binfmts.h>
-#include <linux/elfcore.h>
-
-Elf_Half __weak elf_core_extra_phdrs(void)
-{
-	return 0;
-}
-
-int __weak elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
-{
-	return 1;
-}
-
-int __weak elf_core_write_extra_data(struct coredump_params *cprm)
-{
-	return 1;
-}
-
-size_t __weak elf_core_extra_data_size(void)
-{
-	return 0;
-}
commit 55d5b7dd6451b58489ce384282ca5a4a289eb8d5
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 11 13:36:42 2020 -0800

    initramfs: fix clang build failure
    
    There is only one function in init/initramfs.c that is in the .text
    section, and it is marked __weak.  When building with clang-12 and the
    integrated assembler, this leads to a bug with recordmcount:
    
      ./scripts/recordmcount  "init/initramfs.o"
      Cannot find symbol for section 2: .text.
      init/initramfs.o: failed
    
    I'm not quite sure what exactly goes wrong, but I notice that this
    function is only ever called from an __init function, and normally
    inlined.  Marking it __init as well is clearly correct and it leads to
    recordmcount no longer complaining.
    
    Link: https://lkml.kernel.org/r/20201204165742.3815221-1-arnd@kernel.org
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Cc: Nathan Chancellor <natechancellor at gmail.com>
    Cc: Nick Desaulniers <ndesaulniers at google.com>
    Cc: Barret Rhoden <brho at google.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/init/initramfs.c b/init/initramfs.c
index 1f97c0328a7a..55b74d7e5260 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -535,7 +535,7 @@ extern unsigned long __initramfs_size;
 #include <linux/initrd.h>
 #include <linux/kexec.h>
 
-void __weak free_initrd_mem(unsigned long start, unsigned long end)
+void __weak __init free_initrd_mem(unsigned long start, unsigned long end)
 {
 #ifdef CONFIG_ARCH_KEEP_MEMBLOCK
 	unsigned long aligned_start = ALIGN_DOWN(start, PAGE_SIZE);
commit 14dc3983b5dff513a90bd5a8cc90acaf7867c3d0
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 11 13:36:38 2020 -0800

    kbuild: avoid static_assert for genksyms
    
    genksyms does not know or care about the _Static_assert() built-in, and
    sometimes falls back to ignoring the later symbols, which causes
    undefined behavior such as
    
      WARNING: modpost: EXPORT symbol "ethtool_set_ethtool_phy_ops" [vmlinux] version generation failed, symbol will not be versioned.
      ld: net/ethtool/common.o: relocation R_AARCH64_ABS32 against `__crc_ethtool_set_ethtool_phy_ops' can not be used when making a shared object
      net/ethtool/common.o:(_ftrace_annotated_branch+0x0): dangerous relocation: unsupported relocation
    
    Redefine static_assert for genksyms to avoid that.
    
    Link: https://lkml.kernel.org/r/20201203230955.1482058-1-arnd@kernel.org
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Suggested-by: Ard Biesheuvel <ardb at kernel.org>
    Cc: Masahiro Yamada <masahiroy at kernel.org>
    Cc: Michal Marek <michal.lkml at markovi.net>
    Cc: Kees Cook <keescook at chromium.org>
    Cc: Rikard Falkeborn <rikard.falkeborn at gmail.com>
    Cc: Marco Elver <elver at google.com>
    Cc: <stable at vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/linux/build_bug.h b/include/linux/build_bug.h
index e3a0be2c90ad..7bb66e15b481 100644
--- a/include/linux/build_bug.h
+++ b/include/linux/build_bug.h
@@ -77,4 +77,9 @@
 #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
 #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
 
+#ifdef __GENKSYMS__
+/* genksyms gets confused by _Static_assert */
+#define _Static_assert(expr, ...)
+#endif
+
 #endif	/* _LINUX_BUILD_BUG_H */
commit 84edc2eff82730d45ab513ecec49cb63beb973c9
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 11 13:36:35 2020 -0800

    selftest/fpu: avoid clang warning
    
    With extra warnings enabled, clang complains about the redundant
    -mhard-float argument:
    
      clang: error: argument unused during compilation: '-mhard-float' [-Werror,-Wunused-command-line-argument]
    
    Move this into the gcc-only part of the Makefile.
    
    Link: https://lkml.kernel.org/r/20201203223652.1320700-1-arnd@kernel.org
    Fixes: 4185b3b92792 ("selftests/fpu: Add an FPU selftest")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Cc: Nathan Chancellor <natechancellor at gmail.com>
    Cc: Nick Desaulniers <ndesaulniers at google.com>
    Cc: Petteri Aimonen <jpa at git.mail.kapsi.fi>
    Cc: Borislav Petkov <bp at suse.de>
    Cc: Arnd Bergmann <arnd at arndb.de>
    Cc: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/lib/Makefile b/lib/Makefile
index ce45af50983a..d415fc7067c5 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -107,7 +107,7 @@ obj-$(CONFIG_TEST_FREE_PAGES) += test_free_pages.o
 # off the generation of FPU/SSE* instructions for kernel proper but FPU_FLAGS
 # get appended last to CFLAGS and thus override those previous compiler options.
 #
-FPU_CFLAGS := -mhard-float -msse -msse2
+FPU_CFLAGS := -msse -msse2
 ifdef CONFIG_CC_IS_GCC
 # Stack alignment mismatch, proceed with caution.
 # GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
@@ -120,6 +120,7 @@ ifdef CONFIG_CC_IS_GCC
 #  -mpreferred-stack-boundary=3 is not between 4 and 12
 #
 # can be triggered. Otherwise gcc doesn't complain.
+FPU_CFLAGS += -mhard-float
 FPU_CFLAGS += $(call cc-option,-msse -mpreferred-stack-boundary=3,-mpreferred-stack-boundary=4)
 endif
 
commit 40d6366e9d86d9a67b5642040e76082fdb5bdcf9
Author: Miles Chen <miles.chen at mediatek.com>
Date:   Fri Dec 11 13:36:31 2020 -0800

    proc: use untagged_addr() for pagemap_read addresses
    
    When we try to visit the pagemap of a tagged userspace pointer, we find
    that the start_vaddr is not correct because of the tag.
    To fix it, we should untag the userspace pointers in pagemap_read().
    
    I tested with 5.10-rc4 and the issue remains.
    
    Explanation from Catalin in [1]:
    
     "Arguably, that's a user-space bug since tagged file offsets were never
      supported. In this case it's not even a tag at bit 56 as per the arm64
      tagged address ABI but rather down to bit 47. You could say that the
      problem is caused by the C library (malloc()) or whoever created the
      tagged vaddr and passed it to this function. It's not a kernel
      regression as we've never supported it.
    
      Now, pagemap is a special case where the offset is usually not
      generated as a classic file offset but rather derived by shifting a
      user virtual address. I guess we can make a concession for pagemap
      (only) and allow such offset with the tag at bit (56 - PAGE_SHIFT + 3)"
    
    My test code is based on [2]:
    
    A userspace pointer which has been tagged by 0xb4: 0xb400007662f541c8
    
    userspace program:
    
      uint64 OsLayer::VirtualToPhysical(void *vaddr) {
            uint64 frame, paddr, pfnmask, pagemask;
            int pagesize = sysconf(_SC_PAGESIZE);
            off64_t off = ((uintptr_t)vaddr) / pagesize * 8; // off = 0xb400007662f541c8 / pagesize * 8 = 0x5a00003b317aa0
            int fd = open(kPagemapPath, O_RDONLY);
            ...
    
            if (lseek64(fd, off, SEEK_SET) != off || read(fd, &frame, 8) != 8) {
                    int err = errno;
                    string errtxt = ErrorString(err);
                    if (fd >= 0)
                            close(fd);
                    return 0;
            }
      ...
      }
    
    kernel fs/proc/task_mmu.c:
    
      static ssize_t pagemap_read(struct file *file, char __user *buf,
                    size_t count, loff_t *ppos)
      {
            ...
            src = *ppos;
            svpfn = src / PM_ENTRY_BYTES; // svpfn == 0xb400007662f54
            start_vaddr = svpfn << PAGE_SHIFT; // start_vaddr == 0xb400007662f54000
            end_vaddr = mm->task_size;
    
            /* watch out for wraparound */
            // svpfn == 0xb400007662f54
            // (mm->task_size >> PAGE) == 0x8000000
            if (svpfn > mm->task_size >> PAGE_SHIFT) // the condition is true because of the tag 0xb4
                    start_vaddr = end_vaddr;
    
            ret = 0;
            while (count && (start_vaddr < end_vaddr)) { // we cannot visit correct entry because start_vaddr is set to end_vaddr
                    int len;
                    unsigned long end;
                    ...
            }
            ...
      }
    
    [1] https://lore.kernel.org/patchwork/patch/1343258/
    [2] https://github.com/stressapptest/stressapptest/blob/master/src/os.cc#L158
    
    Link: https://lkml.kernel.org/r/20201204024347.8295-1-miles.chen@mediatek.com
    Signed-off-by: Miles Chen <miles.chen at mediatek.com>
    Reviewed-by: Vincenzo Frascino <vincenzo.frascino at arm.com>
    Reviewed-by: Catalin Marinas <catalin.marinas at arm.com>
    Cc: Alexey Dobriyan <adobriyan at gmail.com>
    Cc: Andrey Konovalov <andreyknvl at google.com>
    Cc: Alexander Potapenko <glider at google.com>
    Cc: Vincenzo Frascino <vincenzo.frascino at arm.com>
    Cc: Andrey Ryabinin <aryabinin at virtuozzo.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: Dmitry Vyukov <dvyukov at google.com>
    Cc: Marco Elver <elver at google.com>
    Cc: Will Deacon <will at kernel.org>
    Cc: Eric W. Biederman <ebiederm at xmission.com>
    Cc: Song Bao Hua (Barry Song) <song.bao.hua at hisilicon.com>
    Cc: <stable at vger.kernel.org>    [5.4-]
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 217aa2705d5d..ee5a235b3056 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -1599,11 +1599,15 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
 
 	src = *ppos;
 	svpfn = src / PM_ENTRY_BYTES;
-	start_vaddr = svpfn << PAGE_SHIFT;
 	end_vaddr = mm->task_size;
 
 	/* watch out for wraparound */
-	if (svpfn > mm->task_size >> PAGE_SHIFT)
+	start_vaddr = end_vaddr;
+	if (svpfn <= (ULONG_MAX >> PAGE_SHIFT))
+		start_vaddr = untagged_addr(svpfn << PAGE_SHIFT);
+
+	/* Ensure the address is inside the task */
+	if (start_vaddr > mm->task_size)
 		start_vaddr = end_vaddr;
 
 	/*
commit 16c0cc0ce3059e315a0aab6538061d95a6612589
Author: Andrew Morton <akpm at linux-foundation.org>
Date:   Fri Dec 11 13:36:27 2020 -0800

    revert "mm/filemap: add static for function __add_to_page_cache_locked"
    
    Revert commit 3351b16af494 ("mm/filemap: add static for function
    __add_to_page_cache_locked") due to incompatibility with
    ALLOW_ERROR_INJECTION which result in build errors.
    
    Link: https://lkml.kernel.org/r/CAADnVQJ6tmzBXvtroBuEH6QA0H+q7yaSKxrVvVxhqr3KBZdEXg@mail.gmail.com
    Tested-by: Justin Forbes <jmforbes at linuxtx.org>
    Tested-by: Greg Thelen <gthelen at google.com>
    Acked-by: Alexei Starovoitov <ast at kernel.org>
    Cc: Michal Kubecek <mkubecek at suse.cz>
    Cc: Alex Shi <alex.shi at linux.alibaba.com>
    Cc: Souptick Joarder <jrdr.linux at gmail.com>
    Cc: Daniel Borkmann <daniel at iogearbox.net>
    Cc: Josef Bacik <josef at toxicpanda.com>
    Cc: Tony Luck <tony.luck at gmail.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/filemap.c b/mm/filemap.c
index 331f4261d723..0b2067b3c328 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -827,7 +827,7 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
 }
 EXPORT_SYMBOL_GPL(replace_page_cache_page);
 
-static noinline int __add_to_page_cache_locked(struct page *page,
+noinline int __add_to_page_cache_locked(struct page *page,
 					struct address_space *mapping,
 					pgoff_t offset, gfp_t gfp,
 					void **shadowp)
commit 82e06090473289ce63e23fdeb8737aad59b10645
Author: Dmitry Torokhov <dmitry.torokhov at gmail.com>
Date:   Wed Dec 9 20:13:24 2020 -0800

    Input: cm109 - do not stomp on control URB
    
    We need to make sure we are not stomping on the control URB that was
    issued when opening the device when attempting to toggle buzzer.
    To do that we need to mark it as pending in cm109_open().
    
    Reported-and-tested-by: syzbot+150f793ac5bc18eee150 at syzkaller.appspotmail.com
    Cc: stable at vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c
index e413801f0491..f515fae465c3 100644
--- a/drivers/input/misc/cm109.c
+++ b/drivers/input/misc/cm109.c
@@ -568,12 +568,15 @@ static int cm109_input_open(struct input_dev *idev)
 	dev->ctl_data->byte[HID_OR2] = dev->keybit;
 	dev->ctl_data->byte[HID_OR3] = 0x00;
 
+	dev->ctl_urb_pending = 1;
 	error = usb_submit_urb(dev->urb_ctl, GFP_KERNEL);
-	if (error)
+	if (error) {
+		dev->ctl_urb_pending = 0;
 		dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_ctl) failed %d\n",
 			__func__, error);
-	else
+	} else {
 		dev->open = 1;
+	}
 
 	mutex_unlock(&dev->pm_mutex);
 
commit 33d974e76e21e9da8a36b14d2dce6394c36c3e30
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:40 2020 +0100

    mtd: rawnand: xway: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: d525914b5bd8 ("mtd: rawnand: xway: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-10-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/xway_nand.c b/drivers/mtd/nand/raw/xway_nand.c
index efc5bf5434e0..26751976e502 100644
--- a/drivers/mtd/nand/raw/xway_nand.c
+++ b/drivers/mtd/nand/raw/xway_nand.c
@@ -149,7 +149,9 @@ static void xway_write_buf(struct nand_chip *chip, const u_char *buf, int len)
 static int xway_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit cf75f00fc8026040f6ff8f054cfec99e820b62e7
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:39 2020 +0100

    mtd: rawnand: socrates: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: b36bf0a0fe5d ("mtd: rawnand: socrates: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-9-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/socrates_nand.c b/drivers/mtd/nand/raw/socrates_nand.c
index 107208311987..70f8305c9b6e 100644
--- a/drivers/mtd/nand/raw/socrates_nand.c
+++ b/drivers/mtd/nand/raw/socrates_nand.c
@@ -120,7 +120,9 @@ static int socrates_nand_device_ready(struct nand_chip *nand_chip)
 static int socrates_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit 148b4f16159f49c6d05da8189e0941880ad10a46
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:38 2020 +0100

    mtd: rawnand: plat_nand: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: 612e048e6aab ("mtd: rawnand: plat_nand: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-8-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/plat_nand.c b/drivers/mtd/nand/raw/plat_nand.c
index 93d9f1694dc1..7711e1020c21 100644
--- a/drivers/mtd/nand/raw/plat_nand.c
+++ b/drivers/mtd/nand/raw/plat_nand.c
@@ -22,7 +22,9 @@ struct plat_nand_data {
 static int plat_nand_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit 9506ab943db438d316386d45eb8a8b60bfeee27c
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:37 2020 +0100

    mtd: rawnand: pasemi: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: 8fc6f1f042b2 ("mtd: rawnand: pasemi: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-7-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/pasemi_nand.c b/drivers/mtd/nand/raw/pasemi_nand.c
index 4dfff34800f4..68c08772d7c2 100644
--- a/drivers/mtd/nand/raw/pasemi_nand.c
+++ b/drivers/mtd/nand/raw/pasemi_nand.c
@@ -77,7 +77,9 @@ static int pasemi_device_ready(struct nand_chip *chip)
 static int pasemi_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit f87b720a21641d5c5ccd4f5ccc06d96251b7f282
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:36 2020 +0100

    mtd: rawnand: orion: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Reported-by: Chris Packham <chris.packham at alliedtelesis.co.nz>
    Fixes: 553508cec2e8 ("mtd: rawnand: orion: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Tested-by: Chris Packham <chris.packham at alliedtelesis.co.nz>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-6-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/orion_nand.c b/drivers/mtd/nand/raw/orion_nand.c
index e3bb65fd3ab2..66211c9311d2 100644
--- a/drivers/mtd/nand/raw/orion_nand.c
+++ b/drivers/mtd/nand/raw/orion_nand.c
@@ -86,7 +86,9 @@ static void orion_nand_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
 static int orion_nand_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit f49bde9fe25cf4cd02440a7ec68f278957ddea37
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:35 2020 +0100

    mtd: rawnand: mpc5121: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: 6dd09f775b72 ("mtd: rawnand: mpc5121: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-5-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/mpc5121_nfc.c b/drivers/mtd/nand/raw/mpc5121_nfc.c
index fb4c0b11689f..bcd4a556c959 100644
--- a/drivers/mtd/nand/raw/mpc5121_nfc.c
+++ b/drivers/mtd/nand/raw/mpc5121_nfc.c
@@ -606,7 +606,9 @@ static void mpc5121_nfc_free(struct device *dev, struct mtd_info *mtd)
 static int mpc5121_nfc_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit bd47fa451315684424d2b39aa95f2ed235fee37a
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:34 2020 +0100

    mtd: rawnand: gpio: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: f6341f6448e0 ("mtd: rawnand: gpio: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-4-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/gpio.c b/drivers/mtd/nand/raw/gpio.c
index eb03b8cea1cb..fb7a086de35e 100644
--- a/drivers/mtd/nand/raw/gpio.c
+++ b/drivers/mtd/nand/raw/gpio.c
@@ -164,7 +164,9 @@ static int gpio_nand_exec_op(struct nand_chip *chip,
 static int gpio_nand_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit 52277269c4060ced7e7d1a83c77377590d106f44
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:33 2020 +0100

    mtd: rawnand: au1550: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: dbffc8ccdf3a ("mtd: rawnand: au1550: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-3-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 7892022bd6dd..7b6b354f2d39 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -239,7 +239,9 @@ static int au1550nd_exec_op(struct nand_chip *this,
 static int au1550nd_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit 249a9599c9123a4af655dd5800c2506602ffa055
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Thu Dec 3 20:03:32 2020 +0100

    mtd: rawnand: ams-delta: Do not force a particular software ECC engine
    
    Originally, commit d7157ff49a5b ("mtd: rawnand: Use the ECC framework
    user input parsing bits") kind of broke the logic around the
    initialization of several ECC engines.
    
    Unfortunately, the fix (which indeed moved the ECC initialization to
    the right place) did not take into account the fact that a different
    ECC algorithm could have been used thanks to a DT property,
    considering the "Hamming" algorithm entry a configuration while it was
    only a default.
    
    Add the necessary logic to be sure Hamming keeps being only a default.
    
    Fixes: 59d93473323a ("mtd: rawnand: ams-delta: Move the ECC initialization to ->attach_chip()")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201203190340.15522-2-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 0c352b39ad4b..ff1697f899ba 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -218,7 +218,9 @@ static int gpio_nand_setup_interface(struct nand_chip *this, int csline,
 static int gpio_nand_attach_chip(struct nand_chip *chip)
 {
 	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN)
+		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	return 0;
 }
commit 94801e5c6d461045726e1563ba2369ef7ce21dbf
Merge: 6d47cdecaa45 e8873c0afd34
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 10:25:04 2020 -0800

    Merge tag 'pinctrl-v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
    
    Pull pin control fixes from Linus Walleij:
     "Here is a late set of pin control fixes for v5.10, most concern some
      minor and major issues found in the Intel drivers. Some are so hairy
      that I have no idea what is going on there, but luckily the maintainer
      knows what's up.
    
      We also have an interesting fix for AMD, which makes AMD-based laptops
      more stable IIUC.
    
      Summary:
    
       - Fix up some SPI group and a register offset on Intel Jasperlake
    
       - Set default bias on Intel Merrifield
    
       - Preserve debouncing on Intel Baytrail
    
       - Stop .set_type() irqchip callback in the AMD driver from fiddling
         with the debounce filter
    
       - Fix access to GPIO banks that are pass-thru on the Aspeed
    
       - Fix a fix for the Intel pin control driver to disable Rx/Tx when
         requesting a UART line as GPIO"
    
    * tag 'pinctrl-v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl:
      pinctrl: intel: Actually disable Tx and Rx buffers on GPIO request
      pinctrl: aspeed: Fix GPIO requests on pass-through banks
      pinctrl: amd: remove debounce filter setting in IRQ type setting
      pinctrl: baytrail: Avoid clearing debounce value when turning it off
      pinctrl: merrifield: Set default bias in case no particular value given
      pinctrl: jasperlake: Fix HOSTSW_OWN offset
      pinctrl: jasperlake: Unhide SPI group of pins

commit 6d47cdecaa45c88ba3858323aa54ec9aa1de1a9b
Merge: c1cea11227cb 263ade7166a2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 10:22:17 2020 -0800

    Merge tag 'v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
    
    Pull GPIO fixes from Linus Walleij:
     "These are hopefully the last GPIO fixes for this cycle.
    
      All are driver fixes except a small resource leak for pin ranges in
      the gpiolib. Two are PM related, which is nice because when developers
      start to find PM bugs it is usually because they have smoked out the
      bugs of more severe nature.
    
      Summary:
    
       - Fix runtime PM balancing on the errorpath of the Arizona driver
    
       - Fix a suspend NULL pointer reference in the dwapb driver
    
       - Balance free:ing in gpiochip_generic_free()
    
       - Fix runtime PM balancing on the errorpath of the zynq driver
    
       - Fix irqdomain use-after-free in the mvebu driver
    
       - Break an eternal loop in the spreadtrum EIC driver"
    
    * tag 'v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
      gpio: eic-sprd: break loop when getting NULL device resource
      gpio: mvebu: fix potential user-after-free on probe
      gpio: zynq: fix reference leak in zynq_gpio functions
      gpiolib: Don't free if pin ranges are not defined
      gpio: dwapb: fix NULL pointer dereference at dwapb_gpio_suspend()
      gpio: arizona: disable pm_runtime in case of failure

commit c1cea11227cb57f1ab0f111b3f6e8a250b85cfdb
Merge: 059fe8296e0f ceabbf94c317
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 11 10:10:13 2020 -0800

    Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
    
    Pull clk fixes from Stephen Boyd:
     "Two small clk driver build fixes
    
       - Remove __packed from a Renesas struct to improve portability
    
       - Fix a linking problem with i.MX when config options don't agree"
    
    * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
      clk: renesas: r9a06g032: Drop __packed for portability
      clk: imx: scu: fix MXC_CLK_SCU module build break

commit 4da3a54f5a025846f9930354cfb80f075b9952e0
Author: Andrea Parri (Microsoft) <parri.andrea at gmail.com>
Date:   Fri Dec 11 14:14:04 2020 +0100

    Revert "scsi: storvsc: Validate length of incoming packet in storvsc_on_channel_callback()"
    
    This reverts commit 3b8c72d076c42bf27284cda7b2b2b522810686f8.
    
    Dexuan reported a regression where StorVSC fails to probe a device (and
    where, consequently, the VM may fail to boot).  The root-cause analysis led
    to a long-standing race condition that is exposed by the validation /commit
    in question.  Let's put the new validation aside until a proper solution
    for that race condition is in place.
    
    Link: https://lore.kernel.org/r/20201211131404.21359-1-parri.andrea@gmail.com
    Fixes: 3b8c72d076c4 ("scsi: storvsc: Validate length of incoming packet in storvsc_on_channel_callback()")
    Cc: Dexuan Cui <decui at microsoft.com>
    Cc: "James E.J. Bottomley" <jejb at linux.ibm.com>
    Cc: "Martin K. Petersen" <martin.petersen at oracle.com>
    Cc: linux-scsi at vger.kernel.org
    Signed-off-by: Andrea Parri (Microsoft) <parri.andrea at gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 99c8ff81de74..ded00a89bfc4 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1246,11 +1246,6 @@ static void storvsc_on_channel_callback(void *context)
 		request = (struct storvsc_cmd_request *)
 			((unsigned long)desc->trans_id);
 
-		if (hv_pkt_datalen(desc) < sizeof(struct vstor_packet) - vmscsi_size_delta) {
-			dev_err(&device->device, "Invalid packet len\n");
-			continue;
-		}
-
 		if (request == &stor_device->init_request ||
 		    request == &stor_device->reset_request) {
 			memcpy(&request->vstor_packet, packet,
commit 059fe8296e0fb4b89d997ea0aa75996911b8f3aa
Merge: 33dc9614dc20 b1f195fc4981
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 17:52:13 2020 -0800

    Merge tag 'drm-fixes-2020-12-11' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm fixes from Dave Airlie:
     "Last week of fixes, just amdgpu and i915 collections. We had a i915
      regression reported by HJ Lu reported this morning, and this contains
      a fix for that he has tested.
    
      There are a fair few other fixes, but they are spread across the two
      drivers, and all fairly self contained.
    
      amdgpu:
       - Fan fix for CI asics
       - Fix a warning in possible_crtcs
       - Build fix for when debugfs is disabled
       - Display overflow fix
       - Display watermark fixes for Renoir
       - SDMA 5.2 fix
       - Stolen vga memory regression fix
       - Power profile fixes
       - Fix a regression from removal of GEM and PRIME callbacks
    
      amdkfd:
       - Fix a memory leak in dmabuf import
    
      i915:
       - rc7 regression fix for modesetting
       - vdsc/dp slice fixes
       - gen9 mocs entries fix
       - preemption timeout fix
       - unsigned compare against 0 fix
       - selftest fix
       - submission error propogatig fix
       - request flow suspend fix"
    
    * tag 'drm-fixes-2020-12-11' of git://anongit.freedesktop.org/drm/drm:
      drm/i915/display: Go softly softly on initial modeset failure
      drm/amd/pm: typo fix (CUSTOM -> COMPUTE)
      drm/amdgpu: Initialise drm_gem_object_funcs for imported BOs
      drm/amdgpu: fix size calculation with stolen vga memory
      drm/amd/pm: update smu10.h WORKLOAD_PPLIB setting for raven
      drm/amdkfd: Fix leak in dmabuf import
      drm/amdgpu: fix sdma instance fw version and feature version init
      drm/amd/display: Add wm table for Renoir
      drm/amd/display: Prevent bandwidth overflow
      drm/amdgpu: fix debugfs creation/removal, again
      drm/amdgpu/disply: set num_crtc earlier
      drm/amdgpu/powerplay: parse fan table for CI asics
      drm/i915/gt: Declare gen9 has 64 mocs entries!
      drm/i915/display/dp: Compute the correct slice count for VDSC on DP
      drm/i915: fix size_t greater or equal to zero comparison
      drm/i915/gt: Cancel the preemption timeout on responding to it
      drm/i915/gt: Ignore repeated attempts to suspend request flow across reset
      drm/i915/gem: Propagate error from cancelled submit due to context closure
      drm/i915/gem: Check the correct variable in selftest

commit ccbbfd1cbf365b38d014351d1482fedd26282041
Author: Palmer Dabbelt <palmerdabbelt at google.com>
Date:   Wed Nov 25 11:57:03 2020 -0800

    RISC-V: Define get_cycles64() regardless of M-mode
    
    The timer driver uses get_cycles64() unconditionally to obtain the current
    time.  A recent refactoring lost the common definition for some configs, which
    is now the only one we need.
    
    Fixes: d5be89a8d118 ("RISC-V: Resurrect the MMIO timer implementation for M-mode systems")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt at google.com>

diff --git a/arch/riscv/include/asm/timex.h b/arch/riscv/include/asm/timex.h
index ab104905d4db..81de51e6aa32 100644
--- a/arch/riscv/include/asm/timex.h
+++ b/arch/riscv/include/asm/timex.h
@@ -60,6 +60,8 @@ static inline u32 get_cycles_hi(void)
 }
 #define get_cycles_hi get_cycles_hi
 
+#endif /* !CONFIG_RISCV_M_MODE */
+
 #ifdef CONFIG_64BIT
 static inline u64 get_cycles64(void)
 {
@@ -79,8 +81,6 @@ static inline u64 get_cycles64(void)
 }
 #endif /* CONFIG_64BIT */
 
-#endif /* !CONFIG_RISCV_M_MODE */
-
 #define ARCH_HAS_READ_CURRENT_TIMER
 static inline int read_current_timer(unsigned long *timer_val)
 {
commit 33dc9614dc208291d0c4bcdeb5d30d481dcd2c4c
Merge: 47003b9971cc 271e0c9dce1b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 16:51:27 2020 -0800

    Merge tag 'ktest-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest
    
    Pull ktest fix from Steven Rostedt:
     "Fix issues with grub2bls in ktest.pl
    
      ktest.pl did not know about grub2bls that was introduced in Fedora 30,
      and now it does"
    
    * tag 'ktest-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
      ktest.pl: Fix incorrect reboot for grub2bls

commit 47003b9971cc7c38737f21e07034502ca35ab7af
Merge: 197c61cb176a 5eedf9fe8db2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 16:36:30 2020 -0800

    Merge tag 'powerpc-5.10-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
    
    Pull powerpc fix from Michael Ellerman:
     "One commit to implement copy_from_kernel_nofault_allowed(), otherwise
      copy_from_kernel_nofault() can trigger warnings when accessing bad
      addresses in some configurations.
    
      Thanks to Christophe Leroy and Qian Cai"
    
    * tag 'powerpc-5.10-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
      powerpc/mm: Fix KUAP warning by providing copy_from_kernel_nofault_allowed()

commit 197c61cb176a40f5877c3caf8249722e77b7d989
Merge: 6840a3dcc244 ed9b25d1970a
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 16:01:47 2020 -0800

    Merge tag 'fixes-v5.10a' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
    
    Pull namespaced fscaps fix from James Morris:
     "Fix namespaced fscaps when !CONFIG_SECURITY (Serge Hallyn)"
    
    * tag 'fixes-v5.10a' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
      [SECURITY] fix namespaced fscaps when !CONFIG_SECURITY

commit b1f195fc49812359296a901e26cc7c0b761d8a70
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 10 23:07:41 2020 +0000

    drm/i915/display: Go softly softly on initial modeset failure
    
    Reduce the module/device probe error into a mere debug to hide issues
    where the initial modeset is failing (after lies told by hw probe) and
    the system hangs with a livelock in cleaning up the failed commit.
    
    Reported-by: H.J. Lu <hjl.tools at gmail.com>
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=210619
    Fixes: b3bf99daaee9 ("drm/i915/display: Defer initial modeset until after GGTT is initialised")
    Fixes: ccc9e67ab26f ("drm/i915/display: Defer initial modeset until after GGTT is initialised")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: "Ville Syrjälä" <ville.syrjala at linux.intel.com>
    Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Cc: H.J. Lu <hjl.tools at gmail.com>
    Cc: Dave Airlie <airlied at redhat.com>
    Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201210230741.17140-1-chris@chris-wilson.co.uk

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 3bfe6ed67da1..aabf09f89cad 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -18040,7 +18040,7 @@ int intel_modeset_init(struct drm_i915_private *i915)
 	 */
 	ret = intel_initial_commit(&i915->drm);
 	if (ret)
-		return ret;
+		drm_dbg_kms(&i915->drm, "Initial modeset failed, %d\n", ret);
 
 	intel_overlay_setup(i915);
 
commit de2df164e3f905ddcf978358cb6e69958b5d3bcc
Merge: a81ac2995a49 7c5c15dffe1e
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 11 09:47:38 2020 +1000

    Merge tag 'drm-intel-fixes-2020-12-09' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
    
    Fixes for VDSC/DP, selftests, shmem_utils, preemption, submission, and gt reset:
    
    - Check the correct variable in selftest (Dan)
    - Propagate error from canceled submit due to context closure (Chris)
    - Ignore repeated attempts to suspend request flow across reset (Chris)
    - Cancel the preemption timeout on responding to it (Chris)
    - Fix unsigned compared against 0 (Colin)
    - Compute the correct slice count for VDSC on DP (Manasi)
    - Declar gen9 has 64 mocs entries (Chris)
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201209235010.GA10554@intel.com

commit a81ac2995a49e3474037847e3362f5ac58dc0269
Merge: 0477e9288185 c5b58c8c860d
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 11 09:42:14 2020 +1000

    Merge tag 'amd-drm-fixes-5.10-2020-12-09' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
    
    amd-drm-fixes-5.10-2020-12-09:
    
    amdgpu:
    - Fan fix for CI asics
    - Fix a warning in possible_crtcs
    - Build fix for when debugfs is disabled
    - Display overflow fix
    - Display watermark fixes for Renoir
    - SDMA 5.2 fix
    - Stolen vga memory regression fix
    - Power profile fixes
    - Fix a regression from removal of GEM and PRIME callbacks
    
    amdkfd:
    - Fix a memory leak in dmabuf import
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    From: Alex Deucher <alexdeucher at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201210034848.18108-1-alexander.deucher@amd.com

commit 6840a3dcc2447188e7bb8464b31a7620bc4423ee
Merge: 4d31058b823c 21e31401fc45
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 15:36:09 2020 -0800

    Merge tag 'nfs-for-5.10-3' of git://git.linux-nfs.org/projects/anna/linux-nfs
    
    Pull NFS client fixes from Anna Schumaker:
     "Here are a handful more bugfixes for 5.10.
    
      Unfortunately, we found some problems with the new READ_PLUS operation
      that aren't easy to fix. We've decided to disable this codepath
      through a Kconfig option for now, but a series of patches going into
      5.11 will clean up the code and fix the issues at the same time. This
      seemed like the best way to go about it.
    
      Summary:
    
       - Fix array overflow when flexfiles mirroring is enabled
    
       - Fix rpcrdma_inline_fixup() crash with new LISTXATTRS
    
       - Fix 5 second delay when doing inter-server copy
    
       - Disable READ_PLUS by default"
    
    * tag 'nfs-for-5.10-3' of git://git.linux-nfs.org/projects/anna/linux-nfs:
      NFS: Disable READ_PLUS by default
      NFSv4.2: Fix 5 seconds delay when doing inter server copy
      NFS: Fix rpcrdma_inline_fixup() crash with new LISTXATTRS operation
      pNFS/flexfiles: Fix array overflow when flexfiles mirroring is enabled

commit 4d31058b823cb338f5218043ac09fb7795b9d908
Merge: 9fca90cf2892 d9838b1d3928
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 15:30:13 2020 -0800

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
    
    Pull networking fixes from David Miller:
    
     1) IPsec compat fixes, from Dmitry Safonov.
    
     2) Fix memory leak in xfrm_user_policy(). Fix from Yu Kuai.
    
     3) Fix polling in xsk sockets by using sk_poll_wait() instead of
        datagram_poll() which keys off of sk_wmem_alloc and such which xsk
        sockets do not update. From Xuan Zhuo.
    
     4) Missing init of rekey_data in cfgh80211, from Sara Sharon.
    
     5) Fix destroy of timer before init, from Davide Caratti.
    
     6) Missing CRYPTO_CRC32 selects in ethernet driver Kconfigs, from Arnd
        Bergmann.
    
     7) Missing error return in rtm_to_fib_config() switch case, from Zhang
        Changzhong.
    
     8) Fix some src/dest address handling in vrf and add a testcase. From
        Stephen Suryaputra.
    
     9) Fix multicast handling in Seville switches driven by mscc-ocelot
        driver. From Vladimir Oltean.
    
    10) Fix proto value passed to skb delivery demux in udp, from Xin Long.
    
    11) HW pkt counters not reported correctly in enetc driver, from Claudiu
        Manoil.
    
    12) Fix deadlock in bridge, from Joseph Huang.
    
    13) Missing of_node_pur() in dpaa2 driver, fromn Christophe JAILLET.
    
    14) Fix pid fetching in bpftool when there are a lot of results, from
        Andrii Nakryiko.
    
    15) Fix long timeouts in nft_dynset, from Pablo Neira Ayuso.
    
    16) Various stymmac fixes, from Fugang Duan.
    
    17) Fix null deref in tipc, from Cengiz Can.
    
    18) When mss is biog, coose more resonable rcvq_space in tcp, fromn Eric
        Dumazet.
    
    19) Revert a geneve change that likely isnt necessary, from Jakub
        Kicinski.
    
    20) Avoid premature rx buffer reuse in various Intel driversm from Björn
        Töpel.
    
    21) retain EcT bits during TIS reflection in tcp, from Wei Wang.
    
    22) Fix Tso deferral wrt. cwnd limiting in tcp, from Neal Cardwell.
    
    23) MPLS_OPT_LSE_LABEL attribute is 342 ot 8 bits, from Guillaume Nault
    
    24) Fix propagation of 32-bit signed bounds in bpf verifier and add test
        cases, from Alexei Starovoitov.
    
    * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (81 commits)
      selftests: fix poll error in udpgro.sh
      selftests/bpf: Fix "dubious pointer arithmetic" test
      selftests/bpf: Fix array access with signed variable test
      selftests/bpf: Add test for signed 32-bit bound check bug
      bpf: Fix propagation of 32-bit signed bounds from 64-bit bounds.
      MAINTAINERS: Add entry for Marvell Prestera Ethernet Switch driver
      net: sched: Fix dump of MPLS_OPT_LSE_LABEL attribute in cls_flower
      net/mlx4_en: Handle TX error CQE
      net/mlx4_en: Avoid scheduling restart task if it is already running
      tcp: fix cwnd-limited bug for TSO deferral where we send nothing
      net: flow_offload: Fix memory leak for indirect flow block
      tcp: Retain ECT bits for tos reflection
      ethtool: fix stack overflow in ethnl_parse_bitset()
      e1000e: fix S0ix flow to allow S0i3.2 subset entry
      ice: avoid premature Rx buffer reuse
      ixgbe: avoid premature Rx buffer reuse
      i40e: avoid premature Rx buffer reuse
      igb: avoid transmit queue timeout in xdp path
      igb: use xdp_do_flush
      igb: skb add metasize for xdp
      ...

commit d9838b1d39283c1200c13f9076474c7624b8ec34
Merge: 38bf8cd821be 3615bdf6d9b1
Author: David S. Miller <davem at davemloft.net>
Date:   Thu Dec 10 14:29:30 2020 -0800

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
    
    Alexei Starovoitov says:
    
    ====================
    pull-request: bpf 2020-12-10
    
    The following pull-request contains BPF updates for your *net* tree.
    
    We've added 21 non-merge commits during the last 12 day(s) which contain
    a total of 21 files changed, 163 insertions(+), 88 deletions(-).
    
    The main changes are:
    
    1) Fix propagation of 32-bit signed bounds from 64-bit bounds, from Alexei.
    
    2) Fix ring_buffer__poll() return value, from Andrii.
    
    3) Fix race in lwt_bpf, from Cong.
    
    4) Fix test_offload, from Toke.
    
    5) Various xsk fixes.
    
    Please consider pulling these changes from:
    
      git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
    
    Thanks a lot!
    
    Also thanks to reporters, reviewers and testers of commits in this pull-request:
    
    Cong Wang, Hulk Robot, Jakub Kicinski, Jean-Philippe Brucker, John
    Fastabend, Magnus Karlsson, Maxim Mikityanskiy, Yonghong Song
    ====================
    
    Signed-off-by: David S. Miller <davem at davemloft.net>

commit 190113b4c6531c8e09b31d5235f9b5175cbb0f72
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Thu Dec 10 21:18:22 2020 +0100

    x86/apic/vector: Fix ordering in vector assignment
    
    Prarit reported that depending on the affinity setting the
    
     ' irq $N: Affinity broken due to vector space exhaustion.'
    
    message is showing up in dmesg, but the vector space on the CPUs in the
    affinity mask is definitely not exhausted.
    
    Shung-Hsi provided traces and analysis which pinpoints the problem:
    
    The ordering of trying to assign an interrupt vector in
    assign_irq_vector_any_locked() is simply wrong if the interrupt data has a
    valid node assigned. It does:
    
     1) Try the intersection of affinity mask and node mask
     2) Try the node mask
     3) Try the full affinity mask
     4) Try the full online mask
    
    Obviously #2 and #3 are in the wrong order as the requested affinity
    mask has to take precedence.
    
    In the observed cases #1 failed because the affinity mask did not contain
    CPUs from node 0. That made it allocate a vector from node 0, thereby
    breaking affinity and emitting the misleading message.
    
    Revert the order of #2 and #3 so the full affinity mask without the node
    intersection is tried before actually affinity is broken.
    
    If no node is assigned then only the full affinity mask and if that fails
    the full online mask is tried.
    
    Fixes: d6ffc6ac83b1 ("x86/vector: Respect affinity mask in irq descriptor")
    Reported-by: Prarit Bhargava <prarit at redhat.com>
    Reported-by: Shung-Hsi Yu <shung-hsi.yu at suse.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Tested-by: Shung-Hsi Yu <shung-hsi.yu at suse.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/87ft4djtyp.fsf@nanos.tec.linutronix.de

diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 1eac53632786..758bbf25ef74 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -273,20 +273,24 @@ static int assign_irq_vector_any_locked(struct irq_data *irqd)
 	const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd);
 	int node = irq_data_get_node(irqd);
 
-	if (node == NUMA_NO_NODE)
-		goto all;
-	/* Try the intersection of @affmsk and node mask */
-	cpumask_and(vector_searchmask, cpumask_of_node(node), affmsk);
-	if (!assign_vector_locked(irqd, vector_searchmask))
-		return 0;
-	/* Try the node mask */
-	if (!assign_vector_locked(irqd, cpumask_of_node(node)))
-		return 0;
-all:
+	if (node != NUMA_NO_NODE) {
+		/* Try the intersection of @affmsk and node mask */
+		cpumask_and(vector_searchmask, cpumask_of_node(node), affmsk);
+		if (!assign_vector_locked(irqd, vector_searchmask))
+			return 0;
+	}
+
 	/* Try the full affinity mask */
 	cpumask_and(vector_searchmask, affmsk, cpu_online_mask);
 	if (!assign_vector_locked(irqd, vector_searchmask))
 		return 0;
+
+	if (node != NUMA_NO_NODE) {
+		/* Try the node mask */
+		if (!assign_vector_locked(irqd, cpumask_of_node(node)))
+			return 0;
+	}
+
 	/* Try the full online mask */
 	return assign_vector_locked(irqd, cpu_online_mask);
 }
commit 21e31401fc4595aeefa224cd36ab8175ec867b87
Author: Anna Schumaker <Anna.Schumaker at Netapp.com>
Date:   Thu Dec 3 15:18:39 2020 -0500

    NFS: Disable READ_PLUS by default
    
    We've been seeing failures with xfstests generic/091 and generic/263
    when using READ_PLUS. I've made some progress on these issues, and the
    tests fail later on but still don't pass. Let's disable READ_PLUS by
    default until we can work out what is going on.
    
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
index 88e1763e02f3..e2a488d403a6 100644
--- a/fs/nfs/Kconfig
+++ b/fs/nfs/Kconfig
@@ -205,3 +205,12 @@ config NFS_DISABLE_UDP_SUPPORT
 	 Choose Y here to disable the use of NFS over UDP. NFS over UDP
 	 on modern networks (1Gb+) can lead to data corruption caused by
 	 fragmentation during high loads.
+
+config NFS_V4_2_READ_PLUS
+	bool "NFS: Enable support for the NFSv4.2 READ_PLUS operation"
+	depends on NFS_V4_2
+	default n
+	help
+	 This is intended for developers only. The READ_PLUS operation has
+	 been shown to have issues under specific conditions and should not
+	 be used in production.
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 9e0ca9b2b210..e89468678ae1 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -5309,7 +5309,7 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
 				    nfs4_read_done_cb(task, hdr);
 }
 
-#ifdef CONFIG_NFS_V4_2
+#if defined CONFIG_NFS_V4_2 && defined CONFIG_NFS_V4_2_READ_PLUS
 static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg)
 {
 	if (server->caps & NFS_CAP_READ_PLUS)
commit fe8eb820e388ca81643443b6208001ab516d1cf6
Author: Dai Ngo <dai.ngo at oracle.com>
Date:   Mon Nov 23 22:15:17 2020 -0500

    NFSv4.2: Fix 5 seconds delay when doing inter server copy
    
    Since commit b4868b44c5628 ("NFSv4: Wait for stateid updates after
    CLOSE/OPEN_DOWNGRADE"), every inter server copy operation suffers 5
    seconds delay regardless of the size of the copy. The delay is from
    nfs_set_open_stateid_locked when the check by nfs_stateid_is_sequential
    fails because the seqid in both nfs4_state and nfs4_stateid are 0.
    
    Fix __nfs42_ssc_open to delay setting of NFS_OPEN_STATE in nfs4_state,
    until after the call to update_open_stateid, to indicate this is the 1st
    open. This fix is part of a 2 patches, the other patch is the fix in the
    source server to return the stateid for COPY_NOTIFY request with seqid 1
    instead of 0.
    
    Fixes: ce0887ac96d3 ("NFSD add nfs4 inter ssc to nfsd4_copy")
    Signed-off-by: Dai Ngo <dai.ngo at oracle.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c
index 9d354de613da..57b3821d975a 100644
--- a/fs/nfs/nfs4file.c
+++ b/fs/nfs/nfs4file.c
@@ -377,10 +377,10 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt,
 		goto out_stateowner;
 
 	set_bit(NFS_SRV_SSC_COPY_STATE, &ctx->state->flags);
-	set_bit(NFS_OPEN_STATE, &ctx->state->flags);
 	memcpy(&ctx->state->open_stateid.other, &stateid->other,
 	       NFS4_STATEID_OTHER_SIZE);
 	update_open_stateid(ctx->state, stateid, NULL, filep->f_mode);
+	set_bit(NFS_OPEN_STATE, &ctx->state->flags);
 
 	nfs_file_set_open_context(filep, ctx);
 	put_nfs_open_context(ctx);
commit 1c87b85162975627d684a234d7347ef630f0e3aa
Author: Chuck Lever <chuck.lever at oracle.com>
Date:   Tue Nov 24 19:15:18 2020 -0500

    NFS: Fix rpcrdma_inline_fixup() crash with new LISTXATTRS operation
    
    By switching to an XFS-backed export, I am able to reproduce the
    ibcomp worker crash on my client with xfstests generic/013.
    
    For the failing LISTXATTRS operation, xdr_inline_pages() is called
    with page_len=12 and buflen=128.
    
    - When ->send_request() is called, rpcrdma_marshal_req() does not
      set up a Reply chunk because buflen is smaller than the inline
      threshold. Thus rpcrdma_convert_iovs() does not get invoked at
      all and the transport's XDRBUF_SPARSE_PAGES logic is not invoked
      on the receive buffer.
    
    - During reply processing, rpcrdma_inline_fixup() tries to copy
      received data into rq_rcv_buf->pages because page_len is positive.
      But there are no receive pages because rpcrdma_marshal_req() never
      allocated them.
    
    The result is that the ibcomp worker faults and dies. Sometimes that
    causes a visible crash, and sometimes it results in a transport hang
    without other symptoms.
    
    RPC/RDMA's XDRBUF_SPARSE_PAGES support is not entirely correct, and
    should eventually be fixed or replaced. However, my preference is
    that upper-layer operations should explicitly allocate their receive
    buffers (using GFP_KERNEL) when possible, rather than relying on
    XDRBUF_SPARSE_PAGES.
    
    Reported-by: Olga kornievskaia <kolga at netapp.com>
    Suggested-by: Olga kornievskaia <kolga at netapp.com>
    Fixes: c10a75145feb ("NFSv4.2: add the extended attribute proc functions.")
    Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
    Reviewed-by: Olga kornievskaia <kolga at netapp.com>
    Reviewed-by: Frank van der Linden <fllinden at amazon.com>
    Tested-by: Olga kornievskaia <kolga at netapp.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index 2b2211d1234e..4fc61e3d098d 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -1241,12 +1241,13 @@ static ssize_t _nfs42_proc_listxattrs(struct inode *inode, void *buf,
 		.rpc_resp	= &res,
 	};
 	u32 xdrlen;
-	int ret, np;
+	int ret, np, i;
 
 
+	ret = -ENOMEM;
 	res.scratch = alloc_page(GFP_KERNEL);
 	if (!res.scratch)
-		return -ENOMEM;
+		goto out;
 
 	xdrlen = nfs42_listxattr_xdrsize(buflen);
 	if (xdrlen > server->lxasize)
@@ -1254,9 +1255,12 @@ static ssize_t _nfs42_proc_listxattrs(struct inode *inode, void *buf,
 	np = xdrlen / PAGE_SIZE + 1;
 
 	pages = kcalloc(np, sizeof(struct page *), GFP_KERNEL);
-	if (pages == NULL) {
-		__free_page(res.scratch);
-		return -ENOMEM;
+	if (!pages)
+		goto out_free_scratch;
+	for (i = 0; i < np; i++) {
+		pages[i] = alloc_page(GFP_KERNEL);
+		if (!pages[i])
+			goto out_free_pages;
 	}
 
 	arg.xattr_pages = pages;
@@ -1271,14 +1275,15 @@ static ssize_t _nfs42_proc_listxattrs(struct inode *inode, void *buf,
 		*eofp = res.eof;
 	}
 
+out_free_pages:
 	while (--np >= 0) {
 		if (pages[np])
 			__free_page(pages[np]);
 	}
-
-	__free_page(res.scratch);
 	kfree(pages);
-
+out_free_scratch:
+	__free_page(res.scratch);
+out:
 	return ret;
 
 }
diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c
index 6e060a88f98c..8432bd6b95f0 100644
--- a/fs/nfs/nfs42xdr.c
+++ b/fs/nfs/nfs42xdr.c
@@ -1528,7 +1528,6 @@ static void nfs4_xdr_enc_listxattrs(struct rpc_rqst *req,
 
 	rpc_prepare_reply_pages(req, args->xattr_pages, 0, args->count,
 	    hdr.replen);
-	req->rq_rcv_buf.flags |= XDRBUF_SPARSE_PAGES;
 
 	encode_nops(&hdr);
 }
commit a0f55287b50c3e4d2fae6e3a09d2c8ea81140897
Author: Xiaomeng Hou <Xiaomeng.Hou at amd.com>
Date:   Tue Dec 1 18:33:33 2020 +0800

    drm/amd/pm: inform SMU RLC status thus enable/disable DPM feature for vangogh
    
    RLC is halted when system suspend/shutdown. However, due to DPM enabled, PMFW is
    unaware of RLC being halted and will continue sending messages, which would
    eventually cause an ACPI hang. Use the system_feature_control interface to
    notify SMU the status of RLC (Normal/OFF) thus enable/disable DPM feature.
    
    Signed-off-by: Xiaomeng Hou <Xiaomeng.Hou at amd.com>
    Reviewed-by: Huang Rui <ray.huang at amd.com>
    Reviewed-by: Lazar Lijo <Lijo.Lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
index a81e5c823211..9bccf2ad038c 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
@@ -64,7 +64,7 @@ static struct cmn2asic_msg_mapping vangogh_message_map[SMU_MSG_MAX_COUNT] = {
 	MSG_MAP(PowerUpIspByTile,               PPSMC_MSG_PowerUpIspByTile,		0),
 	MSG_MAP(PowerDownVcn,                   PPSMC_MSG_PowerDownVcn,			0),
 	MSG_MAP(PowerUpVcn,                     PPSMC_MSG_PowerUpVcn,			0),
-	MSG_MAP(Spare,                          PPSMC_MSG_spare,				0),
+	MSG_MAP(RlcPowerNotify,                 PPSMC_MSG_RlcPowerNotify,		0),
 	MSG_MAP(SetHardMinVcn,                  PPSMC_MSG_SetHardMinVcn,		0),
 	MSG_MAP(SetSoftMinGfxclk,               PPSMC_MSG_SetSoftMinGfxclk,		0),
 	MSG_MAP(ActiveProcessNotify,            PPSMC_MSG_ActiveProcessNotify,		0),
@@ -722,6 +722,12 @@ static int vangogh_set_fine_grain_gfx_freq_parameters(struct smu_context *smu)
 	return 0;
 }
 
+static int vangogh_system_features_control(struct smu_context *smu, bool en)
+{
+	return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_RlcPowerNotify,
+					en ? RLC_STATUS_NORMAL : RLC_STATUS_OFF, NULL);
+}
+
 static const struct pptable_funcs vangogh_ppt_funcs = {
 
 	.check_fw_status = smu_v11_0_check_fw_status,
@@ -749,6 +755,7 @@ static const struct pptable_funcs vangogh_ppt_funcs = {
 	.print_clk_levels = vangogh_print_fine_grain_clk,
 	.set_default_dpm_table = vangogh_set_default_dpm_tables,
 	.set_fine_grain_gfx_freq_parameters = vangogh_set_fine_grain_gfx_freq_parameters,
+	.system_features_control = vangogh_system_features_control,
 };
 
 void vangogh_set_ppt_funcs(struct smu_context *smu)
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
index 8756766296cd..eab455493076 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
@@ -32,4 +32,8 @@ extern void vangogh_set_ppt_funcs(struct smu_context *smu);
 #define VANGOGH_UMD_PSTATE_SOCCLK       678
 #define VANGOGH_UMD_PSTATE_FCLK         800
 
+/* RLC Power Status */
+#define RLC_STATUS_OFF          0
+#define RLC_STATUS_NORMAL       1
+
 #endif
commit fe96eb197e98efa32c129c4af3b44813c42bb93f
Author: Xiaomeng Hou <Xiaomeng.Hou at amd.com>
Date:   Tue Dec 1 17:49:50 2020 +0800

    drm/amd/pm: update the smu v11.5 smc header for vangogh
    
    Add new PMFW message to notify RLC engine status.
    
    Signed-off-by: Xiaomeng Hou <Xiaomeng.Hou at amd.com>
    Reviewed-by: Huang Rui <ray.huang at amd.com>
    Reviewed-by: Lazar Lijo <Lijo.Lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_types.h b/drivers/gpu/drm/amd/pm/inc/smu_types.h
index 1787ae8a9fd9..720d15612fe1 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_types.h
@@ -178,7 +178,7 @@
 	__SMU_DUMMY_MAP(SET_DRIVER_DUMMY_TABLE_DRAM_ADDR_LOW), \
 	__SMU_DUMMY_MAP(GET_UMC_FW_WA), \
 	__SMU_DUMMY_MAP(Mode1Reset), \
-	__SMU_DUMMY_MAP(Spare),                          \
+	__SMU_DUMMY_MAP(RlcPowerNotify),                 \
 	__SMU_DUMMY_MAP(SetHardMinIspiclkByFreq),        \
 	__SMU_DUMMY_MAP(SetHardMinIspxclkByFreq),        \
 	__SMU_DUMMY_MAP(SetSoftMinSocclkByFreq),         \
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
index 7e69b3bd311b..55d7892e4e0e 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
@@ -41,7 +41,7 @@
 #define PPSMC_MSG_PowerUpIspByTile                     0x7
 #define PPSMC_MSG_PowerDownVcn                         0x8 // VCN is power gated by default
 #define PPSMC_MSG_PowerUpVcn                           0x9
-#define PPSMC_MSG_spare                                0xA
+#define PPSMC_MSG_RlcPowerNotify                       0xA
 #define PPSMC_MSG_SetHardMinVcn                        0xB // For wireless display
 #define PPSMC_MSG_SetSoftMinGfxclk                     0xC //Sets SoftMin for GFXCLK. Arg is in MHz
 #define PPSMC_MSG_ActiveProcessNotify                  0xD
commit 7c431455cdd6add04f0d4a1a671095623d18622d
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Mon Nov 30 18:57:50 2020 -0500

    drm/amdgpu/display: move link_bandwidth_kbps under CONFIG_DRM_AMD_DC_DCN
    
    It's only used when CONFIG_DRM_AMD_DC_DCN is set.  Fixes and set but
    not used warning.
    
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 562d874f81fb..0a908cb8119c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5120,9 +5120,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
 	int preferred_refresh = 0;
 #if defined(CONFIG_DRM_AMD_DC_DCN)
 	struct dsc_dec_dpcd_caps dsc_caps;
-#endif
 	uint32_t link_bandwidth_kbps;
-
+#endif
 	struct dc_sink *sink = NULL;
 	if (aconnector == NULL) {
 		DRM_ERROR("aconnector is NULL!\n");
@@ -5204,11 +5203,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
 				      aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,
 				      aconnector->dc_link->dpcd_caps.dsc_caps.dsc_branch_decoder_caps.raw,
 				      &dsc_caps);
-#endif
 		link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
 							     dc_link_get_link_cap(aconnector->dc_link));
 
-#if defined(CONFIG_DRM_AMD_DC_DCN)
 		if (aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE && dsc_caps.is_dsc_supported) {
 			/* Set DSC policy according to dsc_clock_en */
 			dc_dsc_policy_set_enable_dsc_when_not_needed(
commit 4c4d5a49c6347e27e1c80fb4275f8ad160bcf4f3
Author: Evan Quan <evan.quan at amd.com>
Date:   Wed Dec 9 16:34:22 2020 +0800

    drm/amd/pm: typo fix (CUSTOM -> COMPUTE)
    
    The "COMPUTE" was wrongly spelled as "CUSTOM".
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index 3163de39472a..b8127be43320 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -220,7 +220,7 @@ static struct cmn2asic_mapping sienna_cichlid_workload_map[PP_SMC_POWER_PROFILE_
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_POWERSAVING,		WORKLOAD_PPLIB_POWER_SAVING_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VIDEO,		WORKLOAD_PPLIB_VIDEO_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VR,			WORKLOAD_PPLIB_VR_BIT),
-	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_CUSTOM_BIT),
+	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_COMPUTE_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_CUSTOM,		WORKLOAD_PPLIB_CUSTOM_BIT),
 };
 
commit d7f52e2930015d6104ed6eb4c987d1b396dc548c
Author: Evan Quan <evan.quan at amd.com>
Date:   Wed Dec 9 11:43:22 2020 +0800

    drm/amd/pm: fulfill sienna cichlid 2nd usb2.0 port workaround
    
    Fulfill the 2nd usb2.0 port workaround for sienna cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index b1b038f24cce..3163de39472a 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -2693,6 +2693,44 @@ static int sienna_cichlid_gpo_control(struct smu_context *smu,
 
 	return ret;
 }
+
+static int sienna_cichlid_notify_2nd_usb20_port(struct smu_context *smu)
+{
+	uint32_t smu_version;
+	int ret = 0;
+
+	ret = smu_cmn_get_smc_version(smu, NULL, &smu_version);
+	if (ret)
+		return ret;
+
+	/*
+	 * Message SMU_MSG_Enable2ndUSB20Port is supported by 58.45
+	 * onwards PMFWs.
+	 */
+	if (smu_version < 0x003A2D00)
+		return 0;
+
+	return smu_cmn_send_smc_msg_with_param(smu,
+					       SMU_MSG_Enable2ndUSB20Port,
+					       smu->smu_table.boot_values.firmware_caps & ATOM_FIRMWARE_CAP_ENABLE_2ND_USB20PORT ?
+					       1 : 0,
+					       NULL);
+}
+
+static int sienna_cichlid_system_features_control(struct smu_context *smu,
+						  bool en)
+{
+	int ret = 0;
+
+	if (en) {
+		ret = sienna_cichlid_notify_2nd_usb20_port(smu);
+		if (ret)
+			return ret;
+	}
+
+	return smu_v11_0_system_features_control(smu, en);
+}
+
 static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
 	.get_allowed_feature_mask = sienna_cichlid_get_allowed_feature_mask,
 	.set_default_dpm_table = sienna_cichlid_set_default_dpm_table,
@@ -2733,7 +2771,7 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
 	.set_driver_table_location = smu_v11_0_set_driver_table_location,
 	.set_tool_table_location = smu_v11_0_set_tool_table_location,
 	.notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
-	.system_features_control = smu_v11_0_system_features_control,
+	.system_features_control = sienna_cichlid_system_features_control,
 	.send_smc_msg_with_param = smu_cmn_send_smc_msg_with_param,
 	.send_smc_msg = smu_cmn_send_smc_msg,
 	.init_display_count = NULL,
commit 88dfd5d5c8cb973c141a674000d40573daea58a2
Author: Evan Quan <evan.quan at amd.com>
Date:   Tue Dec 8 13:07:24 2020 +0800

    drm/amd/pm: new SMC message for 2nd usb2.0 port workaround
    
    The workaround is needed by sienna cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_types.h b/drivers/gpu/drm/amd/pm/inc/smu_types.h
index 1251dd411516..1787ae8a9fd9 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_types.h
@@ -210,6 +210,7 @@
        __SMU_DUMMY_MAP(SetSoftMaxCclk),                     \
 	__SMU_DUMMY_MAP(SetGpoFeaturePMask),             \
 	__SMU_DUMMY_MAP(DisallowGpo),                    \
+	__SMU_DUMMY_MAP(Enable2ndUSB20Port),             \
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)	SMU_MSG_##type
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h b/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h
index dad2832ff3b1..d2e10a724560 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h
@@ -136,6 +136,8 @@
 
 #define PPSMC_MSG_DisallowGpo                    0x56
 
+#define PPSMC_MSG_Enable2ndUSB20Port             0x57
+
 #define PPSMC_Message_Count                      0x58
 
 #endif
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index d88361554d94..b1b038f24cce 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -129,6 +129,7 @@ static struct cmn2asic_msg_mapping sienna_cichlid_message_map[SMU_MSG_MAX_COUNT]
 	MSG_MAP(SetMGpuFanBoostLimitRpm,	PPSMC_MSG_SetMGpuFanBoostLimitRpm,     0),
 	MSG_MAP(SetGpoFeaturePMask,		PPSMC_MSG_SetGpoFeaturePMask,          0),
 	MSG_MAP(DisallowGpo,			PPSMC_MSG_DisallowGpo,                 0),
+	MSG_MAP(Enable2ndUSB20Port,		PPSMC_MSG_Enable2ndUSB20Port,          0),
 };
 
 static struct cmn2asic_mapping sienna_cichlid_clk_map[SMU_CLK_COUNT] = {
commit ad26bd11261c8b07cb88aa4e81e2d3f8e1452d77
Author: Evan Quan <evan.quan at amd.com>
Date:   Tue Dec 8 12:30:09 2020 +0800

    drm/amdgpu: new macro for determining 2ND_USB20PORT support
    
    Used for determining 2ND_USB20PORT support from firmware_capability.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h
index c38635992101..3cb8d4c5c1a3 100644
--- a/drivers/gpu/drm/amd/include/atomfirmware.h
+++ b/drivers/gpu/drm/amd/include/atomfirmware.h
@@ -499,6 +499,7 @@ enum atombios_firmware_capability
 	ATOM_FIRMWARE_CAP_HWEMU_UMC_CFG = 0x00000100,
 	ATOM_FIRMWARE_CAP_SRAM_ECC      = 0x00000200,
 	ATOM_FIRMWARE_CAP_ENABLE_2STAGE_BIST_TRAINING  = 0x00000400,
+	ATOM_FIRMWARE_CAP_ENABLE_2ND_USB20PORT = 0x0008000,
 };
 
 enum atom_cooling_solution_id{
commit a7e660e526c9936cad3871d8cd1e3360b0b87469
Author: Evan Quan <evan.quan at amd.com>
Date:   Tue Dec 8 12:26:09 2020 +0800

    drm/amd/pm: expose the firmware_capability from firmware_info table
    
    That will help to determine whether 2ND_USB20_PORT workaround is
    needed for Sienna Cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
index 89be49a43500..4bdbcce7092d 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
@@ -227,6 +227,7 @@ struct smu_bios_boot_up_values
 	uint32_t			content_revision;
 	uint32_t			fclk;
 	uint32_t			lclk;
+	uint32_t			firmware_caps;
 };
 
 enum smu_table_id
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
index f2565eed469f..45ecd0386e9f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
@@ -554,6 +554,7 @@ int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu)
 		smu->smu_table.boot_values.vdd_gfx = v_3_1->bootup_vddgfx_mv;
 		smu->smu_table.boot_values.cooling_id = v_3_1->coolingsolution_id;
 		smu->smu_table.boot_values.pp_table_id = 0;
+		smu->smu_table.boot_values.firmware_caps = v_3_1->firmware_capability;
 		break;
 	case 3:
 	default:
@@ -569,6 +570,7 @@ int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu)
 		smu->smu_table.boot_values.vdd_gfx = v_3_3->bootup_vddgfx_mv;
 		smu->smu_table.boot_values.cooling_id = v_3_3->coolingsolution_id;
 		smu->smu_table.boot_values.pp_table_id = v_3_3->pplib_pptable_id;
+		smu->smu_table.boot_values.firmware_caps = v_3_3->firmware_capability;
 	}
 
 	smu->smu_table.boot_values.format_revision = header->format_revision;
commit ac7804bb9908b972c1aa02eb79a5688c051a5668
Author: Evan Quan <evan.quan at amd.com>
Date:   Tue Dec 8 11:59:52 2020 +0800

    drm/amd/pm: correct the gpo control for sienna cichlid
    
    New SMC message was introduced for gpo control on sienna cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_types.h b/drivers/gpu/drm/amd/pm/inc/smu_types.h
index 4a6d1381df16..1251dd411516 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_types.h
@@ -209,6 +209,7 @@
        __SMU_DUMMY_MAP(SetSoftMinCclk),                     \
        __SMU_DUMMY_MAP(SetSoftMaxCclk),                     \
 	__SMU_DUMMY_MAP(SetGpoFeaturePMask),             \
+	__SMU_DUMMY_MAP(DisallowGpo),                    \
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)	SMU_MSG_##type
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h b/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h
index 35dd6072cc45..dad2832ff3b1 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_0_7_ppsmc.h
@@ -134,6 +134,8 @@
 #define PPSMC_MSG_SetGpoFeaturePMask             0x45
 #define PPSMC_MSG_SetSMBUSInterrupt              0x46
 
-#define PPSMC_Message_Count                      0x47
+#define PPSMC_MSG_DisallowGpo                    0x56
+
+#define PPSMC_Message_Count                      0x58
 
 #endif
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index 1ce13944721b..d88361554d94 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -128,6 +128,7 @@ static struct cmn2asic_msg_mapping sienna_cichlid_message_map[SMU_MSG_MAX_COUNT]
 	MSG_MAP(Mode1Reset,                     PPSMC_MSG_Mode1Reset,		       0),
 	MSG_MAP(SetMGpuFanBoostLimitRpm,	PPSMC_MSG_SetMGpuFanBoostLimitRpm,     0),
 	MSG_MAP(SetGpoFeaturePMask,		PPSMC_MSG_SetGpoFeaturePMask,          0),
+	MSG_MAP(DisallowGpo,			PPSMC_MSG_DisallowGpo,                 0),
 };
 
 static struct cmn2asic_mapping sienna_cichlid_clk_map[SMU_CLK_COUNT] = {
@@ -2653,19 +2654,40 @@ static int sienna_cichlid_enable_mgpu_fan_boost(struct smu_context *smu)
 static int sienna_cichlid_gpo_control(struct smu_context *smu,
 				      bool enablement)
 {
+	uint32_t smu_version;
 	int ret = 0;
 
+
 	if (smu_cmn_feature_is_supported(smu, SMU_FEATURE_DPM_GFX_GPO_BIT)) {
-		if (enablement)
-			ret = smu_cmn_send_smc_msg_with_param(smu,
-							SMU_MSG_SetGpoFeaturePMask,
-							GFX_GPO_PACE_MASK | GFX_GPO_DEM_MASK,
-							NULL);
-		else
-			ret = smu_cmn_send_smc_msg_with_param(smu,
-							SMU_MSG_SetGpoFeaturePMask,
-							0,
-							NULL);
+		ret = smu_cmn_get_smc_version(smu, NULL, &smu_version);
+		if (ret)
+			return ret;
+
+		if (enablement) {
+			if (smu_version < 0x003a2500) {
+				ret = smu_cmn_send_smc_msg_with_param(smu,
+								      SMU_MSG_SetGpoFeaturePMask,
+								      GFX_GPO_PACE_MASK | GFX_GPO_DEM_MASK,
+								      NULL);
+			} else {
+				ret = smu_cmn_send_smc_msg_with_param(smu,
+								      SMU_MSG_DisallowGpo,
+								      0,
+								      NULL);
+			}
+		} else {
+			if (smu_version < 0x003a2500) {
+				ret = smu_cmn_send_smc_msg_with_param(smu,
+								      SMU_MSG_SetGpoFeaturePMask,
+								      0,
+								      NULL);
+			} else {
+				ret = smu_cmn_send_smc_msg_with_param(smu,
+								      SMU_MSG_DisallowGpo,
+								      1,
+								      NULL);
+			}
+		}
 	}
 
 	return ret;
commit 0cb4c62125a904259e24016b5e85408c27dc412a
Author: Evan Quan <evan.quan at amd.com>
Date:   Mon Dec 7 16:53:25 2020 +0800

    drm/amd/pm: correct power limit setting for SMU V11
    
    Correct the power limit setting for SMU V11 asics.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
index 624065d3c079..f2565eed469f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
@@ -929,9 +929,13 @@ int smu_v11_0_get_current_power_limit(struct smu_context *smu,
 	if (power_src < 0)
 		return -EINVAL;
 
+	/*
+	 * BIT 24-31: ControllerId (only PPT0 is supported for now)
+	 * BIT 16-23: PowerSource
+	 */
 	ret = smu_cmn_send_smc_msg_with_param(smu,
 					  SMU_MSG_GetPptLimit,
-					  power_src << 16,
+					  (0 << 24) | (power_src << 16),
 					  power_limit);
 	if (ret)
 		dev_err(smu->adev->dev, "[%s] get PPT limit failed!", __func__);
@@ -941,6 +945,7 @@ int smu_v11_0_get_current_power_limit(struct smu_context *smu,
 
 int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n)
 {
+	int power_src;
 	int ret = 0;
 
 	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT)) {
@@ -948,6 +953,22 @@ int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n)
 		return -EOPNOTSUPP;
 	}
 
+	power_src = smu_cmn_to_asic_specific_index(smu,
+					CMN2ASIC_MAPPING_PWR,
+					smu->adev->pm.ac_power ?
+					SMU_POWER_SOURCE_AC :
+					SMU_POWER_SOURCE_DC);
+	if (power_src < 0)
+		return -EINVAL;
+
+	/*
+	 * BIT 24-31: ControllerId (only PPT0 is supported for now)
+	 * BIT 16-23: PowerSource
+	 * BIT 0-15: PowerLimit
+	 */
+	n &= 0xFFFF;
+	n |= 0 << 24;
+	n |= (power_src) << 16;
 	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, n, NULL);
 	if (ret) {
 		dev_err(smu->adev->dev, "[%s] Set power limit Failed!\n", __func__);
commit 18a4b3de5fc1c63c80e3be0673886431a56e4307
Author: Evan Quan <evan.quan at amd.com>
Date:   Mon Dec 7 16:21:03 2020 +0800

    drm/amd/pm: support power source switch on Sienna Cichlid
    
    Enable power source switch on Sienna Cichlid.
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index db0f2a476c23..1ce13944721b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -302,6 +302,9 @@ static int sienna_cichlid_check_powerplay_table(struct smu_context *smu)
 		table_context->power_play_table;
 	struct smu_baco_context *smu_baco = &smu->smu_baco;
 
+	if (powerplay_table->platform_caps & SMU_11_0_7_PP_PLATFORM_CAP_HARDWAREDC)
+		smu->dc_controlled_by_gpio = true;
+
 	if (powerplay_table->platform_caps & SMU_11_0_7_PP_PLATFORM_CAP_BACO ||
 	    powerplay_table->platform_caps & SMU_11_0_7_PP_PLATFORM_CAP_MACO)
 		smu_baco->platform_support = true;
@@ -2740,6 +2743,7 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
 	.get_dpm_ultimate_freq = sienna_cichlid_get_dpm_ultimate_freq,
 	.set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
 	.run_btc = sienna_cichlid_run_btc,
+	.set_power_source = smu_v11_0_set_power_source,
 	.get_pp_feature_mask = smu_cmn_get_pp_feature_mask,
 	.set_pp_feature_mask = smu_cmn_set_pp_feature_mask,
 	.get_gpu_metrics = sienna_cichlid_get_gpu_metrics,
commit 0d801007f90ec023aefc1da19529bf9985050227
Author: Jiansong Chen <Jiansong.Chen at amd.com>
Date:   Wed Dec 9 19:43:44 2020 +0800

    drm/amdkfd: correct pipe offset calculation
    
    Correct pipe offset calculation in is_pipe_enabled function,
    it should be done in queues.
    
    Signed-off-by: Jiansong Chen <Jiansong.Chen at amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index f0a6f6665c81..e686ce2bf3b3 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -72,8 +72,8 @@ enum KFD_MQD_TYPE get_mqd_type_from_queue_type(enum kfd_queue_type type)
 static bool is_pipe_enabled(struct device_queue_manager *dqm, int mec, int pipe)
 {
 	int i;
-	int pipe_offset = mec * dqm->dev->shared_resources.num_pipe_per_mec
-		+ pipe * dqm->dev->shared_resources.num_queue_per_pipe;
+	int pipe_offset = (mec * dqm->dev->shared_resources.num_pipe_per_mec
+		+ pipe) * dqm->dev->shared_resources.num_queue_per_pipe;
 
 	/* queue is available for KFD usage if bit is 1 */
 	for (i = 0; i <  dqm->dev->shared_resources.num_queue_per_pipe; ++i)
commit 0269764a731bba0b5b1afb134abab702fbde1f04
Author: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
Date:   Mon Dec 7 17:20:27 2020 -0500

    drm/amd/display: Drop unnecessary function call
    
    After refactor our amdgpu_dm_atomic_commit, this function only invoke
    drm_atomic_helper_commit. For this reason, this commit drops
    amdgpu_dm_atomic_commit and add drm_atomic_helper_commit directly in the
    atomic_commit hook.
    
    v2: squash in warning fix (Alex)
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index c23896207e9d..562d874f81fb 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -196,10 +196,6 @@ static int amdgpu_dm_encoder_init(struct drm_device *dev,
 
 static int amdgpu_dm_connector_get_modes(struct drm_connector *connector);
 
-static int amdgpu_dm_atomic_commit(struct drm_device *dev,
-				   struct drm_atomic_state *state,
-				   bool nonblock);
-
 static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state);
 
 static int amdgpu_dm_atomic_check(struct drm_device *dev,
@@ -2212,7 +2208,7 @@ static const struct drm_mode_config_funcs amdgpu_dm_mode_funcs = {
 	.get_format_info = amd_get_format_info,
 	.output_poll_changed = drm_fb_helper_output_poll_changed,
 	.atomic_check = amdgpu_dm_atomic_check,
-	.atomic_commit = amdgpu_dm_atomic_commit,
+	.atomic_commit = drm_atomic_helper_commit,
 };
 
 static struct drm_mode_config_helper_funcs amdgpu_dm_mode_config_helperfuncs = {
@@ -8070,20 +8066,6 @@ static void amdgpu_dm_crtc_copy_transient_flags(struct drm_crtc_state *crtc_stat
 	stream_state->mode_changed = drm_atomic_crtc_needs_modeset(crtc_state);
 }
 
-static int amdgpu_dm_atomic_commit(struct drm_device *dev,
-				   struct drm_atomic_state *state,
-				   bool nonblock)
-{
-	/*
-	 * Add check here for SoC's that support hardware cursor plane, to
-	 * unset legacy_cursor_update
-	 */
-
-	return drm_atomic_helper_commit(dev, state, nonblock);
-
-	/*TODO Handle EINTR, reenable IRQ*/
-}
-
 /**
  * amdgpu_dm_atomic_commit_tail() - AMDgpu DM's commit tail implementation.
  * @state: The atomic state to commit
commit 4932d37055e7a459a92424c4d21ebf8c2c0fb19a
Author: Christian König <christian.koenig at amd.com>
Date:   Tue Dec 8 16:19:42 2020 +0100

    drm/amdgpu: limit the amdgpu_vm_update_ptes trace point
    
    The text output should not be more than a page, so only print the first
    32 page table entries.
    
    If we need all of them we can still look into the binary trace.
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Reviewed-by: Shashank Sharma <shashank.sharma at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index 324d5e3f3579..6752d8b13118 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -358,10 +358,11 @@ TRACE_EVENT(amdgpu_vm_update_ptes,
 			}
 	),
 	TP_printk("pid:%u vm_ctx:0x%llx start:0x%010llx end:0x%010llx,"
-		  " flags:0x%llx, incr:%llu, dst:\n%s", __entry->pid,
+		  " flags:0x%llx, incr:%llu, dst:\n%s%s", __entry->pid,
 		  __entry->vm_ctx, __entry->start, __entry->end,
 		  __entry->flags, __entry->incr,  __print_array(
-		  __get_dynamic_array(dst), __entry->nptes, 8))
+		  __get_dynamic_array(dst), min(__entry->nptes, 32u), 8),
+		  __entry->nptes > 32 ? "..." : "")
 );
 
 TRACE_EVENT(amdgpu_vm_set_ptes,
commit 38bf8cd821be292e7d8e6f6283d67c5d9708f887
Author: Paolo Abeni <pabeni at redhat.com>
Date:   Wed Dec 9 12:21:13 2020 +0100

    selftests: fix poll error in udpgro.sh
    
    The test program udpgso_bench_rx always invokes the poll()
    syscall with a timeout of 10ms. If a larger timeout is specified
    via the command line, udpgso_bench_rx is supposed to do multiple
    poll() calls till the timeout is expired or an event is received.
    
    Currently the poll() loop errors out after the first invocation with
    no events, and may causes self-tests failure alike:
    
    failed
     GRO with custom segment size            ./udpgso_bench_rx: poll: 0x0 expected 0x1
    
    This change addresses the issue allowing the poll() loop to consume
    all the configured timeout.
    
    Fixes: ada641ff6ed3 ("selftests: fixes for UDP GRO")
    Signed-off-by: Paolo Abeni <pabeni at redhat.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/tools/testing/selftests/net/udpgso_bench_rx.c b/tools/testing/selftests/net/udpgso_bench_rx.c
index db3d4a8b5a4c..76a24052f4b4 100644
--- a/tools/testing/selftests/net/udpgso_bench_rx.c
+++ b/tools/testing/selftests/net/udpgso_bench_rx.c
@@ -113,6 +113,9 @@ static void do_poll(int fd, int timeout_ms)
 				interrupted = true;
 				break;
 			}
+
+			/* no events and more time to wait, do poll again */
+			continue;
 		}
 		if (pfd.revents != POLLIN)
 			error(1, errno, "poll: 0x%x expected 0x%x\n",
commit 3615bdf6d9b19db12b1589861609b4f1c6a8d303
Author: Jean-Philippe Brucker <jean-philippe at linaro.org>
Date:   Tue Dec 8 19:01:54 2020 +0100

    selftests/bpf: Fix "dubious pointer arithmetic" test
    
    The verifier trace changed following a bugfix. After checking the 64-bit
    sign, only the upper bit mask is known, not bit 31. Update the test
    accordingly.
    
    Signed-off-by: Jean-Philippe Brucker <jean-philippe at linaro.org>
    Acked-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>

diff --git a/tools/testing/selftests/bpf/prog_tests/align.c b/tools/testing/selftests/bpf/prog_tests/align.c
index 52414058a627..5861446d0777 100644
--- a/tools/testing/selftests/bpf/prog_tests/align.c
+++ b/tools/testing/selftests/bpf/prog_tests/align.c
@@ -456,10 +456,10 @@ static struct bpf_align_test tests[] = {
 			 */
 			{7, "R5_w=inv(id=0,smin_value=-9223372036854775806,smax_value=9223372036854775806,umin_value=2,umax_value=18446744073709551614,var_off=(0x2; 0xfffffffffffffffc)"},
 			/* Checked s>=0 */
-			{9, "R5=inv(id=0,umin_value=2,umax_value=9223372034707292158,var_off=(0x2; 0x7fffffff7ffffffc)"},
+			{9, "R5=inv(id=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"},
 			/* packet pointer + nonnegative (4n+2) */
-			{11, "R6_w=pkt(id=1,off=0,r=0,umin_value=2,umax_value=9223372034707292158,var_off=(0x2; 0x7fffffff7ffffffc)"},
-			{13, "R4_w=pkt(id=1,off=4,r=0,umin_value=2,umax_value=9223372034707292158,var_off=(0x2; 0x7fffffff7ffffffc)"},
+			{11, "R6_w=pkt(id=1,off=0,r=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"},
+			{13, "R4_w=pkt(id=1,off=4,r=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"},
 			/* NET_IP_ALIGN + (4n+2) == (4n), alignment is fine.
 			 * We checked the bounds, but it might have been able
 			 * to overflow if the packet pointer started in the
@@ -467,7 +467,7 @@ static struct bpf_align_test tests[] = {
 			 * So we did not get a 'range' on R6, and the access
 			 * attempt will fail.
 			 */
-			{15, "R6_w=pkt(id=1,off=0,r=0,umin_value=2,umax_value=9223372034707292158,var_off=(0x2; 0x7fffffff7ffffffc)"},
+			{15, "R6_w=pkt(id=1,off=0,r=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc)"},
 		}
 	},
 	{
commit 77ce220c0549dcc3db8226c61c60e83fc59dfafc
Author: Jean-Philippe Brucker <jean-philippe at linaro.org>
Date:   Tue Dec 8 19:01:53 2020 +0100

    selftests/bpf: Fix array access with signed variable test
    
    The test fails because of a recent fix to the verifier, even though this
    program is valid. In details what happens is:
    
        7: (61) r1 = *(u32 *)(r0 +0)
    
    Load a 32-bit value, with signed bounds [S32_MIN, S32_MAX]. The bounds
    of the 64-bit value are [0, U32_MAX]...
    
        8: (65) if r1 s> 0xffffffff goto pc+1
    
    ... therefore this is always true (the operand is sign-extended).
    
        10: (b4) w2 = 11
        11: (6d) if r2 s> r1 goto pc+1
    
    When true, the 64-bit bounds become [0, 10]. The 32-bit bounds are still
    [S32_MIN, 10].
    
        13: (64) w1 <<= 2
    
    Because this is a 32-bit operation, the verifier propagates the new
    32-bit bounds to the 64-bit ones, and the knowledge gained from insn 11
    is lost.
    
        14: (0f) r0 += r1
        15: (7a) *(u64 *)(r0 +0) = 4
    
    Then the verifier considers r0 unbounded here, rejecting the test. To
    make the test work, change insn 8 to check the sign of the 32-bit value.
    
    Signed-off-by: Jean-Philippe Brucker <jean-philippe at linaro.org>
    Acked-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>

diff --git a/tools/testing/selftests/bpf/verifier/array_access.c b/tools/testing/selftests/bpf/verifier/array_access.c
index 1c4b1939f5a8..bed53b561e04 100644
--- a/tools/testing/selftests/bpf/verifier/array_access.c
+++ b/tools/testing/selftests/bpf/verifier/array_access.c
@@ -68,7 +68,7 @@
 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
 	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
-	BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1),
+	BPF_JMP32_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1),
 	BPF_MOV32_IMM(BPF_REG_1, 0),
 	BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
 	BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
commit 511a76bcb0ce242a19153658b25437906cc6070e
Author: Jean-Philippe Brucker <jean-philippe at linaro.org>
Date:   Tue Dec 8 19:01:52 2020 +0100

    selftests/bpf: Add test for signed 32-bit bound check bug
    
    After a 32-bit load followed by a branch, the verifier would reduce the
    maximum bound of the register to 0x7fffffff, allowing a user to bypass
    bound checks. Ensure such a program is rejected.
    
    In the second test, the 64-bit compare should not sufficient to
    determine whether the signed 32-bit lower bound is 0, so the verifier
    should reject the second branch.
    
    Signed-off-by: Jean-Philippe Brucker <jean-philippe at linaro.org>
    Acked-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>

diff --git a/tools/testing/selftests/bpf/verifier/bounds.c b/tools/testing/selftests/bpf/verifier/bounds.c
index dac40de3f868..57ed67b86074 100644
--- a/tools/testing/selftests/bpf/verifier/bounds.c
+++ b/tools/testing/selftests/bpf/verifier/bounds.c
@@ -703,3 +703,44 @@
 	.fixup_map_hash_8b = { 3 },
 	.result = ACCEPT,
 },
+{
+	"bounds checks after 32-bit truncation. test 1",
+	.insns = {
+	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+	BPF_LD_MAP_FD(BPF_REG_1, 0),
+	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
+	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
+	/* This used to reduce the max bound to 0x7fffffff */
+	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
+	BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0x7fffffff, 1),
+	BPF_MOV64_IMM(BPF_REG_0, 0),
+	BPF_EXIT_INSN(),
+	},
+	.fixup_map_hash_8b = { 3 },
+	.errstr_unpriv = "R0 leaks addr",
+	.result_unpriv = REJECT,
+	.result = ACCEPT,
+},
+{
+	"bounds checks after 32-bit truncation. test 2",
+	.insns = {
+	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+	BPF_LD_MAP_FD(BPF_REG_1, 0),
+	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
+	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
+	BPF_JMP_IMM(BPF_JSLT, BPF_REG_1, 1, 1),
+	BPF_JMP32_IMM(BPF_JSLT, BPF_REG_1, 0, 1),
+	BPF_MOV64_IMM(BPF_REG_0, 0),
+	BPF_EXIT_INSN(),
+	},
+	.fixup_map_hash_8b = { 3 },
+	.errstr_unpriv = "R0 leaks addr",
+	.result_unpriv = REJECT,
+	.result = ACCEPT,
+},
commit b02709587ea3d699a608568ee8157d8db4fd8cae
Author: Alexei Starovoitov <ast at kernel.org>
Date:   Tue Dec 8 19:01:51 2020 +0100

    bpf: Fix propagation of 32-bit signed bounds from 64-bit bounds.
    
    The 64-bit signed bounds should not affect 32-bit signed bounds unless the
    verifier knows that upper 32-bits are either all 1s or all 0s. For example the
    register with smin_value==1 doesn't mean that s32_min_value is also equal to 1,
    since smax_value could be larger than 32-bit subregister can hold.
    The verifier refines the smax/s32_max return value from certain helpers in
    do_refine_retval_range(). Teach the verifier to recognize that smin/s32_min
    value is also bounded. When both smin and smax bounds fit into 32-bit
    subregister the verifier can propagate those bounds.
    
    Fixes: 3f50f132d840 ("bpf: Verifier, do explicit ALU32 bounds tracking")
    Reported-by: Jean-Philippe Brucker <jean-philippe at linaro.org>
    Acked-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 1388bf733071..53fe6ef6d931 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1298,9 +1298,7 @@ static void __reg_combine_32_into_64(struct bpf_reg_state *reg)
 
 static bool __reg64_bound_s32(s64 a)
 {
-	if (a > S32_MIN && a < S32_MAX)
-		return true;
-	return false;
+	return a > S32_MIN && a < S32_MAX;
 }
 
 static bool __reg64_bound_u32(u64 a)
@@ -1314,10 +1312,10 @@ static void __reg_combine_64_into_32(struct bpf_reg_state *reg)
 {
 	__mark_reg32_unbounded(reg);
 
-	if (__reg64_bound_s32(reg->smin_value))
+	if (__reg64_bound_s32(reg->smin_value) && __reg64_bound_s32(reg->smax_value)) {
 		reg->s32_min_value = (s32)reg->smin_value;
-	if (__reg64_bound_s32(reg->smax_value))
 		reg->s32_max_value = (s32)reg->smax_value;
+	}
 	if (__reg64_bound_u32(reg->umin_value))
 		reg->u32_min_value = (u32)reg->umin_value;
 	if (__reg64_bound_u32(reg->umax_value))
@@ -4895,6 +4893,8 @@ static void do_refine_retval_range(struct bpf_reg_state *regs, int ret_type,
 
 	ret_reg->smax_value = meta->msize_max_value;
 	ret_reg->s32_max_value = meta->msize_max_value;
+	ret_reg->smin_value = -MAX_ERRNO;
+	ret_reg->s32_min_value = -MAX_ERRNO;
 	__reg_deduce_bounds(ret_reg);
 	__reg_bound_offset(ret_reg);
 	__update_reg_bounds(ret_reg);
commit 9fca90cf28920c6d0723d7efd1eae0b0fb90309c
Merge: 40201575b731 340b940ea0ed
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 11:00:27 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
    
    Pull rdma fixes from Jason Gunthorpe:
     "Two user triggerable crashers and a some EFA related regressions:
    
       - Syzkaller found a bug in CM
    
       - Restore access to the GID table and fix modify_qp for EFA
    
       - Crasher in qedr"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
      RDMA/cm: Fix an attempt to use non-valid pointer when cleaning timewait
      RDMA/core: Fix empty gid table for non IB/RoCE devices
      RDMA/efa: Use the correct current and new states in modify QP
      RDMA/qedr: iWARP invalid(zero) doorbell address fix

commit 40201575b731db6bde55c2f0daa930bbd9cfcb13
Merge: a2f5ea9e314b 3d1387b3b8f6
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 10 10:48:49 2020 -0800

    Merge tag 'media/v5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
    
    Pull media fixes from Mauro Carvalho Chehab:
     "A couple of fixes:
    
       - videobuf2: fix a DMABUF bug, preventing it to properly handle cache
         sync/flush
    
       - vidtv: an usage after free and a few sparse/smatch warning fixes
    
       - pulse8-cec: a duplicate free and a bug related to new firmware
         usage
    
       - mtk-cir: fix a regression on a clock setting"
    
    * tag 'media/v5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
      media: vidtv: fix some warnings
      media: vidtv: fix kernel-doc markups
      media: [next] media: vidtv: fix a read from an object after it has been freed
      media: vb2: set cache sync hints when init buffers
      media: pulse8-cec: add support for FW v10 and up
      media: pulse8-cec: fix duplicate free at disconnect or probe error
      media: mtk-cir: fix calculation of chk period

commit 06c5fe9b12dde1b62821f302f177c972bb1c81f9
Author: Xiaochen Shen <xiaochen.shen at intel.com>
Date:   Fri Dec 4 14:27:59 2020 +0800

    x86/resctrl: Fix incorrect local bandwidth when mba_sc is enabled
    
    The MBA software controller (mba_sc) is a feedback loop which
    periodically reads MBM counters and tries to restrict the bandwidth
    below a user-specified value. It tags along the MBM counter overflow
    handler to do the updates with 1s interval in mbm_update() and
    update_mba_bw().
    
    The purpose of mbm_update() is to periodically read the MBM counters to
    make sure that the hardware counter doesn't wrap around more than once
    between user samplings. mbm_update() calls __mon_event_count() for local
    bandwidth updating when mba_sc is not enabled, but calls mbm_bw_count()
    instead when mba_sc is enabled. __mon_event_count() will not be called
    for local bandwidth updating in MBM counter overflow handler, but it is
    still called when reading MBM local bandwidth counter file
    'mbm_local_bytes', the call path is as below:
    
      rdtgroup_mondata_show()
        mon_event_read()
          mon_event_count()
            __mon_event_count()
    
    In __mon_event_count(), m->chunks is updated by delta chunks which is
    calculated from previous MSR value (m->prev_msr) and current MSR value.
    When mba_sc is enabled, m->chunks is also updated in mbm_update() by
    mistake by the delta chunks which is calculated from m->prev_bw_msr
    instead of m->prev_msr. But m->chunks is not used in update_mba_bw() in
    the mba_sc feedback loop.
    
    When reading MBM local bandwidth counter file, m->chunks was changed
    unexpectedly by mbm_bw_count(). As a result, the incorrect local
    bandwidth counter which calculated from incorrect m->chunks is shown to
    the user.
    
    Fix this by removing incorrect m->chunks updating in mbm_bw_count() in
    MBM counter overflow handler, and always calling __mon_event_count() in
    mbm_update() to make sure that the hardware local bandwidth counter
    doesn't wrap around.
    
    Test steps:
      # Run workload with aggressive memory bandwidth (e.g., 10 GB/s)
      git clone https://github.com/intel/intel-cmt-cat && cd intel-cmt-cat
      && make
      ./tools/membw/membw -c 0 -b 10000 --read
    
      # Enable MBA software controller
      mount -t resctrl resctrl -o mba_MBps /sys/fs/resctrl
    
      # Create control group c1
      mkdir /sys/fs/resctrl/c1
    
      # Set MB throttle to 6 GB/s
      echo "MB:0=6000;1=6000" > /sys/fs/resctrl/c1/schemata
    
      # Write PID of the workload to tasks file
      echo `pidof membw` > /sys/fs/resctrl/c1/tasks
    
      # Read local bytes counters twice with 1s interval, the calculated
      # local bandwidth is not as expected (approaching to 6 GB/s):
      local_1=`cat /sys/fs/resctrl/c1/mon_data/mon_L3_00/mbm_local_bytes`
      sleep 1
      local_2=`cat /sys/fs/resctrl/c1/mon_data/mon_L3_00/mbm_local_bytes`
      echo "local b/w (bytes/s):" `expr $local_2 - $local_1`
    
    Before fix:
      local b/w (bytes/s): 11076796416
    
    After fix:
      local b/w (bytes/s): 5465014272
    
    Fixes: ba0f26d8529c (x86/intel_rdt/mba_sc: Prepare for feedback loop)
    Signed-off-by: Xiaochen Shen <xiaochen.shen at intel.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Tony Luck <tony.luck at intel.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/1607063279-19437-1-git-send-email-xiaochen.shen@intel.com

diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
index 54dffe574e67..a98519a3a2e6 100644
--- a/arch/x86/kernel/cpu/resctrl/monitor.c
+++ b/arch/x86/kernel/cpu/resctrl/monitor.c
@@ -279,7 +279,6 @@ static void mbm_bw_count(u32 rmid, struct rmid_read *rr)
 		return;
 
 	chunks = mbm_overflow_count(m->prev_bw_msr, tval, rr->r->mbm_width);
-	m->chunks += chunks;
 	cur_bw = (chunks * r->mon_scale) >> 20;
 
 	if (m->delta_comp)
@@ -450,15 +449,14 @@ static void mbm_update(struct rdt_resource *r, struct rdt_domain *d, int rmid)
 	}
 	if (is_mbm_local_enabled()) {
 		rr.evtid = QOS_L3_MBM_LOCAL_EVENT_ID;
+		__mon_event_count(rmid, &rr);
 
 		/*
 		 * Call the MBA software controller only for the
 		 * control groups and when user has enabled
 		 * the software controller explicitly.
 		 */
-		if (!is_mba_sc(NULL))
-			__mon_event_count(rmid, &rr);
-		else
+		if (is_mba_sc(NULL))
 			mbm_bw_count(rmid, &rr);
 	}
 }
commit 83bbb8ffb4629ece5d6c0b093b9f66297a9e27e0
Merge: 339f5a7fb2d6 7d894834a305
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Thu Dec 10 11:34:24 2020 -0500

    Merge tag 'kvmarm-fixes-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD
    
    kvm/arm64 fixes for 5.10, take #5
    
    - Don't leak page tables on PTE update
    - Correctly invalidate TLBs on table to block transition
    - Only update permissions if the fault level matches the
      expected mapping size

commit 4223a5be80b8998d717c6b0e1000070e0e336bf3
Merge: 7e7986f9d3ba 57a0f3a81ef2
Author: Jens Axboe <axboe at kernel.dk>
Date:   Thu Dec 10 07:08:22 2020 -0700

    Merge branch 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md into block-5.10
    
    Pull MD fixes from Song:
    
    "This is to fix raid10 data corruption [1] in 5.10-rc7."
    
    * 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md:
      Revert "md: add md_submit_discard_bio() for submitting discard bio"
      Revert "md/raid10: extend r10bio devs to raid disks"
      Revert "md/raid10: pull codes that wait for blocked dev into one function"
      Revert "md/raid10: improve raid10 discard request"
      Revert "md/raid10: improve discard request for far layout"
      Revert "dm raid: remove unnecessary discard limits for raid10"

commit 29ac40cbed2bc06fa218ca25d7f5e280d3d08a25
Author: Arvind Sankar <nivedita at alum.mit.edu>
Date:   Wed Nov 11 11:09:45 2020 -0500

    x86/mm/mem_encrypt: Fix definition of PMD_FLAGS_DEC_WP
    
    The PAT bit is in different locations for 4k and 2M/1G page table
    entries.
    
    Add a definition for _PAGE_LARGE_CACHE_MASK to represent the three
    caching bits (PWT, PCD, PAT), similar to _PAGE_CACHE_MASK for 4k pages,
    and use it in the definition of PMD_FLAGS_DEC_WP to get the correct PAT
    index for write-protected pages.
    
    Fixes: 6ebcb060713f ("x86/mm: Add support to encrypt the kernel in-place")
    Signed-off-by: Arvind Sankar <nivedita at alum.mit.edu>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Tested-by: Tom Lendacky <thomas.lendacky at amd.com>
    Cc: stable at vger.kernel.org
    Link: https://lkml.kernel.org/r/20201111160946.147341-1-nivedita@alum.mit.edu

diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
index 816b31c68550..394757ee030a 100644
--- a/arch/x86/include/asm/pgtable_types.h
+++ b/arch/x86/include/asm/pgtable_types.h
@@ -155,6 +155,7 @@ enum page_cache_mode {
 #define _PAGE_ENC		(_AT(pteval_t, sme_me_mask))
 
 #define _PAGE_CACHE_MASK	(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)
+#define _PAGE_LARGE_CACHE_MASK	(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT_LARGE)
 
 #define _PAGE_NOCACHE		(cachemode2protval(_PAGE_CACHE_MODE_UC))
 #define _PAGE_CACHE_WP		(cachemode2protval(_PAGE_CACHE_MODE_WP))
diff --git a/arch/x86/mm/mem_encrypt_identity.c b/arch/x86/mm/mem_encrypt_identity.c
index 733b983f3a89..6c5eb6f3f14f 100644
--- a/arch/x86/mm/mem_encrypt_identity.c
+++ b/arch/x86/mm/mem_encrypt_identity.c
@@ -45,8 +45,8 @@
 #define PMD_FLAGS_LARGE		(__PAGE_KERNEL_LARGE_EXEC & ~_PAGE_GLOBAL)
 
 #define PMD_FLAGS_DEC		PMD_FLAGS_LARGE
-#define PMD_FLAGS_DEC_WP	((PMD_FLAGS_DEC & ~_PAGE_CACHE_MASK) | \
-				 (_PAGE_PAT | _PAGE_PWT))
+#define PMD_FLAGS_DEC_WP	((PMD_FLAGS_DEC & ~_PAGE_LARGE_CACHE_MASK) | \
+				 (_PAGE_PAT_LARGE | _PAGE_PWT))
 
 #define PMD_FLAGS_ENC		(PMD_FLAGS_LARGE | _PAGE_ENC)
 
commit 6bea0225a4bf14a58af71cb9677a756921469e46
Author: Damien Le Moal <damien.lemoal at wdc.com>
Date:   Wed Dec 9 20:16:10 2020 +0900

    zonefs: fix page reference and BIO leak
    
    In zonefs_file_dio_append(), the pages obtained using
    bio_iov_iter_get_pages() are not released on completion of the
    REQ_OP_APPEND BIO, nor when bio_iov_iter_get_pages() fails.
    Furthermore, a call to bio_put() is missing when
    bio_iov_iter_get_pages() fails.
    
    Fix these resource leaks by adding BIO resource release code (bio_put()i
    and bio_release_pages()) at the end of the function after the BIO
    execution and add a jump to this resource cleanup code in case of
    bio_iov_iter_get_pages() failure.
    
    While at it, also fix the call to task_io_account_write() to be passed
    the correct BIO size instead of bio_iov_iter_get_pages() return value.
    
    Reported-by: Christoph Hellwig <hch at lst.de>
    Fixes: 02ef12a663c7 ("zonefs: use REQ_OP_ZONE_APPEND for sync DIO")
    Cc: stable at vger.kernel.org
    Signed-off-by: Damien Le Moal <damien.lemoal at wdc.com>
    Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni at wdc.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index ff5930be096c..bec47f2d074b 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -691,21 +691,23 @@ static ssize_t zonefs_file_dio_append(struct kiocb *iocb, struct iov_iter *from)
 		bio->bi_opf |= REQ_FUA;
 
 	ret = bio_iov_iter_get_pages(bio, from);
-	if (unlikely(ret)) {
-		bio_io_error(bio);
-		return ret;
-	}
+	if (unlikely(ret))
+		goto out_release;
+
 	size = bio->bi_iter.bi_size;
-	task_io_account_write(ret);
+	task_io_account_write(size);
 
 	if (iocb->ki_flags & IOCB_HIPRI)
 		bio_set_polled(bio, iocb);
 
 	ret = submit_bio_wait(bio);
 
+	zonefs_file_write_dio_end_io(iocb, size, ret, 0);
+
+out_release:
+	bio_release_pages(bio, false);
 	bio_put(bio);
 
-	zonefs_file_write_dio_end_io(iocb, size, ret, 0);
 	if (ret >= 0) {
 		iocb->ki_pos += size;
 		return size;
commit ce6520b0eafad5962ffc21dc47cd7bd3250e9045
Author: Chris Chiu <chiu at endlessos.org>
Date:   Wed Dec 9 20:24:47 2020 -0800

    Input: i8042 - add Acer laptops to the i8042 reset list
    
    The touchpad operates in Basic Mode by default in the Acer BIOS
    setup, but some Aspire/TravelMate models require the i8042 to be
    reset in order to be correctly detected.
    
    Signed-off-by: Chris Chiu <chiu at endlessos.org>
    Link: https://lore.kernel.org/r/20201207071250.15021-1-chiu@endlessos.org
    Cc: stable at vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index 7ecb65176c1a..3a2dcf0805f1 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -611,6 +611,48 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
 		},
 	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"),
+		},
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"),
+		},
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"),
+		},
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"),
+		},
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"),
+		},
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"),
+		},
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"),
+		},
+	},
 	{
 		/* Advent 4211 */
 		.matches = {
commit 57a0f3a81ef21fe51d6223aa78a1a890098d4ada
Author: Song Liu <songliubraving at fb.com>
Date:   Wed Dec 9 11:44:42 2020 -0800

    Revert "md: add md_submit_discard_bio() for submitting discard bio"
    
    This reverts commit 2628089b74d5a64bd0bcb5d247a18f78d7b6f4d0.
    
    Matthew Ruffell reported data corruption in raid10 due to the changes
    in discard handling [1]. Revert these changes before we find a proper fix.
    
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
    Cc: Matthew Ruffell <matthew.ruffell at canonical.com>
    Cc: Xiao Ni <xni at redhat.com>
    Signed-off-by: Song Liu <songliubraving at fb.com>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 98bac4f304ae..0037c6ecab65 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8582,26 +8582,6 @@ void md_write_end(struct mddev *mddev)
 
 EXPORT_SYMBOL(md_write_end);
 
-/* This is used by raid0 and raid10 */
-void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
-			struct bio *bio, sector_t start, sector_t size)
-{
-	struct bio *discard_bio = NULL;
-
-	if (__blkdev_issue_discard(rdev->bdev, start, size,
-		GFP_NOIO, 0, &discard_bio) || !discard_bio)
-		return;
-
-	bio_chain(discard_bio, bio);
-	bio_clone_blkg_association(discard_bio, bio);
-	if (mddev->gendisk)
-		trace_block_bio_remap(bdev_get_queue(rdev->bdev),
-			discard_bio, disk_devt(mddev->gendisk),
-			bio->bi_iter.bi_sector);
-	submit_bio_noacct(discard_bio);
-}
-EXPORT_SYMBOL(md_submit_discard_bio);
-
 /* md_allow_write(mddev)
  * Calling this ensures that the array is marked 'active' so that writes
  * may proceed without blocking.  It is important to call this before
diff --git a/drivers/md/md.h b/drivers/md/md.h
index ccfb69868c2e..2175a5ac4f7c 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -713,8 +713,6 @@ extern void md_write_end(struct mddev *mddev);
 extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
 extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
 extern void md_finish_reshape(struct mddev *mddev);
-extern void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
-			struct bio *bio, sector_t start, sector_t size);
 
 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
 extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 6f44177593a5..35843df15b5e 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -477,6 +477,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
 
 	for (disk = 0; disk < zone->nb_dev; disk++) {
 		sector_t dev_start, dev_end;
+		struct bio *discard_bio = NULL;
 		struct md_rdev *rdev;
 
 		if (disk < start_disk_index)
@@ -499,9 +500,18 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
 
 		rdev = conf->devlist[(zone - conf->strip_zone) *
 			conf->strip_zone[0].nb_dev + disk];
-		md_submit_discard_bio(mddev, rdev, bio,
+		if (__blkdev_issue_discard(rdev->bdev,
 			dev_start + zone->dev_start + rdev->data_offset,
-			dev_end - dev_start);
+			dev_end - dev_start, GFP_NOIO, 0, &discard_bio) ||
+		    !discard_bio)
+			continue;
+		bio_chain(discard_bio, bio);
+		bio_clone_blkg_association(discard_bio, bio);
+		if (mddev->gendisk)
+			trace_block_bio_remap(bdev_get_queue(rdev->bdev),
+				discard_bio, disk_devt(mddev->gendisk),
+				bio->bi_iter.bi_sector);
+		submit_bio_noacct(discard_bio);
 	}
 	bio_endio(bio);
 }
commit 17c28c2a068730e9d065a0e4ed03beed074d8997
Author: Song Liu <songliubraving at fb.com>
Date:   Wed Dec 9 11:44:20 2020 -0800

    Revert "md/raid10: extend r10bio devs to raid disks"
    
    This reverts commit 8650a889017cb1f6ea6813ccf83a2e9f6fa49dd3.
    
    Matthew Ruffell reported data corruption in raid10 due to the changes
    in discard handling [1]. Revert these changes before we find a proper fix.
    
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
    Cc: Matthew Ruffell <matthew.ruffell at canonical.com>
    Cc: Xiao Ni <xni at redhat.com>
    Signed-off-by: Song Liu <songliubraving at fb.com>

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index f2ec44fda1a0..3b598a3cb462 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -91,7 +91,7 @@ static inline struct r10bio *get_resync_r10bio(struct bio *bio)
 static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
 {
 	struct r10conf *conf = data;
-	int size = offsetof(struct r10bio, devs[conf->geo.raid_disks]);
+	int size = offsetof(struct r10bio, devs[conf->copies]);
 
 	/* allocate a r10bio with room for raid_disks entries in the
 	 * bios array */
@@ -238,7 +238,7 @@ static void put_all_bios(struct r10conf *conf, struct r10bio *r10_bio)
 {
 	int i;
 
-	for (i = 0; i < conf->geo.raid_disks; i++) {
+	for (i = 0; i < conf->copies; i++) {
 		struct bio **bio = & r10_bio->devs[i].bio;
 		if (!BIO_SPECIAL(*bio))
 			bio_put(*bio);
@@ -327,7 +327,7 @@ static int find_bio_disk(struct r10conf *conf, struct r10bio *r10_bio,
 	int slot;
 	int repl = 0;
 
-	for (slot = 0; slot < conf->geo.raid_disks; slot++) {
+	for (slot = 0; slot < conf->copies; slot++) {
 		if (r10_bio->devs[slot].bio == bio)
 			break;
 		if (r10_bio->devs[slot].repl_bio == bio) {
@@ -336,6 +336,7 @@ static int find_bio_disk(struct r10conf *conf, struct r10bio *r10_bio,
 		}
 	}
 
+	BUG_ON(slot == conf->copies);
 	update_head_pos(slot, r10_bio);
 
 	if (slotp)
@@ -1492,7 +1493,7 @@ static void __make_request(struct mddev *mddev, struct bio *bio, int sectors)
 	r10_bio->mddev = mddev;
 	r10_bio->sector = bio->bi_iter.bi_sector;
 	r10_bio->state = 0;
-	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * conf->geo.raid_disks);
+	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * conf->copies);
 
 	if (bio_data_dir(bio) == READ)
 		raid10_read_request(mddev, bio, r10_bio);
commit 4e2c6567efdd6f252e1874c41c8db4abfb0a9bf3
Author: Song Liu <songliubraving at fb.com>
Date:   Wed Dec 9 11:43:43 2020 -0800

    Revert "md/raid10: pull codes that wait for blocked dev into one function"
    
    This reverts commit f046f5d0d79cdb968f219ce249e497fd1accf484.
    
    Matthew Ruffell reported data corruption in raid10 due to the changes
    in discard handling [1]. Revert these changes before we find a proper fix.
    
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
    Cc: Matthew Ruffell <matthew.ruffell at canonical.com>
    Cc: Xiao Ni <xni at redhat.com>
    Signed-off-by: Song Liu <songliubraving at fb.com>

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 4ad8447fa868..f2ec44fda1a0 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1275,75 +1275,12 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
 	}
 }
 
-static void wait_blocked_dev(struct mddev *mddev, struct r10bio *r10_bio)
-{
-	int i;
-	struct r10conf *conf = mddev->private;
-	struct md_rdev *blocked_rdev;
-
-retry_wait:
-	blocked_rdev = NULL;
-	rcu_read_lock();
-	for (i = 0; i < conf->copies; i++) {
-		struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
-		struct md_rdev *rrdev = rcu_dereference(
-			conf->mirrors[i].replacement);
-		if (rdev == rrdev)
-			rrdev = NULL;
-		if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
-			atomic_inc(&rdev->nr_pending);
-			blocked_rdev = rdev;
-			break;
-		}
-		if (rrdev && unlikely(test_bit(Blocked, &rrdev->flags))) {
-			atomic_inc(&rrdev->nr_pending);
-			blocked_rdev = rrdev;
-			break;
-		}
-
-		if (rdev && test_bit(WriteErrorSeen, &rdev->flags)) {
-			sector_t first_bad;
-			sector_t dev_sector = r10_bio->devs[i].addr;
-			int bad_sectors;
-			int is_bad;
-
-			/* Discard request doesn't care the write result
-			 * so it doesn't need to wait blocked disk here.
-			 */
-			if (!r10_bio->sectors)
-				continue;
-
-			is_bad = is_badblock(rdev, dev_sector, r10_bio->sectors,
-					     &first_bad, &bad_sectors);
-			if (is_bad < 0) {
-				/* Mustn't write here until the bad block
-				 * is acknowledged
-				 */
-				atomic_inc(&rdev->nr_pending);
-				set_bit(BlockedBadBlocks, &rdev->flags);
-				blocked_rdev = rdev;
-				break;
-			}
-		}
-	}
-	rcu_read_unlock();
-
-	if (unlikely(blocked_rdev)) {
-		/* Have to wait for this device to get unblocked, then retry */
-		allow_barrier(conf);
-		raid10_log(conf->mddev, "%s wait rdev %d blocked",
-				__func__, blocked_rdev->raid_disk);
-		md_wait_for_blocked_rdev(blocked_rdev, mddev);
-		wait_barrier(conf);
-		goto retry_wait;
-	}
-}
-
 static void raid10_write_request(struct mddev *mddev, struct bio *bio,
 				 struct r10bio *r10_bio)
 {
 	struct r10conf *conf = mddev->private;
 	int i;
+	struct md_rdev *blocked_rdev;
 	sector_t sectors;
 	int max_sectors;
 
@@ -1401,9 +1338,8 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
 
 	r10_bio->read_slot = -1; /* make sure repl_bio gets freed */
 	raid10_find_phys(conf, r10_bio);
-
-	wait_blocked_dev(mddev, r10_bio);
-
+retry_write:
+	blocked_rdev = NULL;
 	rcu_read_lock();
 	max_sectors = r10_bio->sectors;
 
@@ -1414,6 +1350,16 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
 			conf->mirrors[d].replacement);
 		if (rdev == rrdev)
 			rrdev = NULL;
+		if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
+			atomic_inc(&rdev->nr_pending);
+			blocked_rdev = rdev;
+			break;
+		}
+		if (rrdev && unlikely(test_bit(Blocked, &rrdev->flags))) {
+			atomic_inc(&rrdev->nr_pending);
+			blocked_rdev = rrdev;
+			break;
+		}
 		if (rdev && (test_bit(Faulty, &rdev->flags)))
 			rdev = NULL;
 		if (rrdev && (test_bit(Faulty, &rrdev->flags)))
@@ -1434,6 +1380,15 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
 
 			is_bad = is_badblock(rdev, dev_sector, max_sectors,
 					     &first_bad, &bad_sectors);
+			if (is_bad < 0) {
+				/* Mustn't write here until the bad block
+				 * is acknowledged
+				 */
+				atomic_inc(&rdev->nr_pending);
+				set_bit(BlockedBadBlocks, &rdev->flags);
+				blocked_rdev = rdev;
+				break;
+			}
 			if (is_bad && first_bad <= dev_sector) {
 				/* Cannot write here at all */
 				bad_sectors -= (dev_sector - first_bad);
@@ -1469,6 +1424,35 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
 	}
 	rcu_read_unlock();
 
+	if (unlikely(blocked_rdev)) {
+		/* Have to wait for this device to get unblocked, then retry */
+		int j;
+		int d;
+
+		for (j = 0; j < i; j++) {
+			if (r10_bio->devs[j].bio) {
+				d = r10_bio->devs[j].devnum;
+				rdev_dec_pending(conf->mirrors[d].rdev, mddev);
+			}
+			if (r10_bio->devs[j].repl_bio) {
+				struct md_rdev *rdev;
+				d = r10_bio->devs[j].devnum;
+				rdev = conf->mirrors[d].replacement;
+				if (!rdev) {
+					/* Race with remove_disk */
+					smp_mb();
+					rdev = conf->mirrors[d].rdev;
+				}
+				rdev_dec_pending(rdev, mddev);
+			}
+		}
+		allow_barrier(conf);
+		raid10_log(conf->mddev, "wait rdev %d blocked", blocked_rdev->raid_disk);
+		md_wait_for_blocked_rdev(blocked_rdev, mddev);
+		wait_barrier(conf);
+		goto retry_write;
+	}
+
 	if (max_sectors < r10_bio->sectors)
 		r10_bio->sectors = max_sectors;
 
commit d7cb6be0d0cdced2a7a96bd80a8f835e77ec5204
Author: Song Liu <songliubraving at fb.com>
Date:   Wed Dec 9 11:43:08 2020 -0800

    Revert "md/raid10: improve raid10 discard request"
    
    This reverts commit bcc90d280465ebd51ab8688be86e1f00c62dccf9.
    
    Matthew Ruffell reported data corruption in raid10 due to the changes
    in discard handling [1]. Revert these changes before we find a proper fix.
    
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
    Cc: Matthew Ruffell <matthew.ruffell at canonical.com>
    Cc: Xiao Ni <xni at redhat.com>
    Signed-off-by: Song Liu <songliubraving at fb.com>

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 05773ee1b5ba..4ad8447fa868 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1516,256 +1516,6 @@ static void __make_request(struct mddev *mddev, struct bio *bio, int sectors)
 		raid10_write_request(mddev, bio, r10_bio);
 }
 
-static struct bio *raid10_split_bio(struct r10conf *conf,
-			struct bio *bio, sector_t sectors, bool want_first)
-{
-	struct bio *split;
-
-	split = bio_split(bio, sectors,	GFP_NOIO, &conf->bio_split);
-	bio_chain(split, bio);
-	allow_barrier(conf);
-	if (want_first) {
-		submit_bio_noacct(bio);
-		bio = split;
-	} else
-		submit_bio_noacct(split);
-	wait_barrier(conf);
-
-	return bio;
-}
-
-static void raid10_end_discard_request(struct bio *bio)
-{
-	struct r10bio *r10_bio = bio->bi_private;
-	struct r10conf *conf = r10_bio->mddev->private;
-	struct md_rdev *rdev = NULL;
-	int dev;
-	int slot, repl;
-
-	/*
-	 * We don't care the return value of discard bio
-	 */
-	if (!test_bit(R10BIO_Uptodate, &r10_bio->state))
-		set_bit(R10BIO_Uptodate, &r10_bio->state);
-
-	dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl);
-	if (repl)
-		rdev = conf->mirrors[dev].replacement;
-	if (!rdev) {
-		/* raid10_remove_disk uses smp_mb to make sure rdev is set to
-		 * replacement before setting replacement to NULL. It can read
-		 * rdev first without barrier protect even replacment is NULL
-		 */
-		smp_rmb();
-		rdev = conf->mirrors[dev].rdev;
-	}
-
-	if (atomic_dec_and_test(&r10_bio->remaining)) {
-		md_write_end(r10_bio->mddev);
-		raid_end_bio_io(r10_bio);
-	}
-
-	rdev_dec_pending(rdev, conf->mddev);
-}
-
-/* There are some limitations to handle discard bio
- * 1st, the discard size is bigger than stripe_size*2.
- * 2st, if the discard bio spans reshape progress, we use the old way to
- * handle discard bio
- */
-static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
-{
-	struct r10conf *conf = mddev->private;
-	struct geom *geo = &conf->geo;
-	struct r10bio *r10_bio;
-
-	int disk;
-	sector_t chunk;
-	unsigned int stripe_size;
-	sector_t split_size;
-
-	sector_t bio_start, bio_end;
-	sector_t first_stripe_index, last_stripe_index;
-	sector_t start_disk_offset;
-	unsigned int start_disk_index;
-	sector_t end_disk_offset;
-	unsigned int end_disk_index;
-	unsigned int remainder;
-
-	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
-		return -EAGAIN;
-
-	wait_barrier(conf);
-
-	/* Check reshape again to avoid reshape happens after checking
-	 * MD_RECOVERY_RESHAPE and before wait_barrier
-	 */
-	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
-		goto out;
-
-	stripe_size = geo->raid_disks << geo->chunk_shift;
-	bio_start = bio->bi_iter.bi_sector;
-	bio_end = bio_end_sector(bio);
-
-	/* Maybe one discard bio is smaller than strip size or across one stripe
-	 * and discard region is larger than one stripe size. For far offset layout,
-	 * if the discard region is not aligned with stripe size, there is hole
-	 * when we submit discard bio to member disk. For simplicity, we only
-	 * handle discard bio which discard region is bigger than stripe_size*2
-	 */
-	if (bio_sectors(bio) < stripe_size*2)
-		goto out;
-
-	/* For far offset layout, if bio is not aligned with stripe size, it splits
-	 * the part that is not aligned with strip size.
-	 */
-	div_u64_rem(bio_start, stripe_size, &remainder);
-	if (geo->far_offset && remainder) {
-		split_size = stripe_size - remainder;
-		bio = raid10_split_bio(conf, bio, split_size, false);
-	}
-	div_u64_rem(bio_end, stripe_size, &remainder);
-	if (geo->far_offset && remainder) {
-		split_size = bio_sectors(bio) - remainder;
-		bio = raid10_split_bio(conf, bio, split_size, true);
-	}
-
-	r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
-	r10_bio->mddev = mddev;
-	r10_bio->state = 0;
-	r10_bio->sectors = 0;
-	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks);
-
-	wait_blocked_dev(mddev, r10_bio);
-
-	r10_bio->master_bio = bio;
-
-	bio_start = bio->bi_iter.bi_sector;
-	bio_end = bio_end_sector(bio);
-
-	/* raid10 uses chunk as the unit to store data. It's similar like raid0.
-	 * One stripe contains the chunks from all member disk (one chunk from
-	 * one disk at the same HBA address). For layout detail, see 'man md 4'
-	 */
-	chunk = bio_start >> geo->chunk_shift;
-	chunk *= geo->near_copies;
-	first_stripe_index = chunk;
-	start_disk_index = sector_div(first_stripe_index, geo->raid_disks);
-	if (geo->far_offset)
-		first_stripe_index *= geo->far_copies;
-	start_disk_offset = (bio_start & geo->chunk_mask) +
-				(first_stripe_index << geo->chunk_shift);
-
-	chunk = bio_end >> geo->chunk_shift;
-	chunk *= geo->near_copies;
-	last_stripe_index = chunk;
-	end_disk_index = sector_div(last_stripe_index, geo->raid_disks);
-	if (geo->far_offset)
-		last_stripe_index *= geo->far_copies;
-	end_disk_offset = (bio_end & geo->chunk_mask) +
-				(last_stripe_index << geo->chunk_shift);
-
-	rcu_read_lock();
-	for (disk = 0; disk < geo->raid_disks; disk++) {
-		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
-		struct md_rdev *rrdev = rcu_dereference(
-			conf->mirrors[disk].replacement);
-
-		r10_bio->devs[disk].bio = NULL;
-		r10_bio->devs[disk].repl_bio = NULL;
-
-		if (rdev && (test_bit(Faulty, &rdev->flags)))
-			rdev = NULL;
-		if (rrdev && (test_bit(Faulty, &rrdev->flags)))
-			rrdev = NULL;
-		if (!rdev && !rrdev)
-			continue;
-
-		if (rdev) {
-			r10_bio->devs[disk].bio = bio;
-			atomic_inc(&rdev->nr_pending);
-		}
-		if (rrdev) {
-			r10_bio->devs[disk].repl_bio = bio;
-			atomic_inc(&rrdev->nr_pending);
-		}
-	}
-	rcu_read_unlock();
-
-	atomic_set(&r10_bio->remaining, 1);
-	for (disk = 0; disk < geo->raid_disks; disk++) {
-		sector_t dev_start, dev_end;
-		struct bio *mbio, *rbio = NULL;
-		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
-		struct md_rdev *rrdev = rcu_dereference(
-			conf->mirrors[disk].replacement);
-
-		/*
-		 * Now start to calculate the start and end address for each disk.
-		 * The space between dev_start and dev_end is the discard region.
-		 *
-		 * For dev_start, it needs to consider three conditions:
-		 * 1st, the disk is before start_disk, you can imagine the disk in
-		 * the next stripe. So the dev_start is the start address of next
-		 * stripe.
-		 * 2st, the disk is after start_disk, it means the disk is at the
-		 * same stripe of first disk
-		 * 3st, the first disk itself, we can use start_disk_offset directly
-		 */
-		if (disk < start_disk_index)
-			dev_start = (first_stripe_index + 1) * mddev->chunk_sectors;
-		else if (disk > start_disk_index)
-			dev_start = first_stripe_index * mddev->chunk_sectors;
-		else
-			dev_start = start_disk_offset;
-
-		if (disk < end_disk_index)
-			dev_end = (last_stripe_index + 1) * mddev->chunk_sectors;
-		else if (disk > end_disk_index)
-			dev_end = last_stripe_index * mddev->chunk_sectors;
-		else
-			dev_end = end_disk_offset;
-
-		/* It only handles discard bio which size is >= stripe size, so
-		 * dev_end > dev_start all the time
-		 */
-		if (r10_bio->devs[disk].bio) {
-			mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
-			mbio->bi_end_io = raid10_end_discard_request;
-			mbio->bi_private = r10_bio;
-			r10_bio->devs[disk].bio = mbio;
-			r10_bio->devs[disk].devnum = disk;
-			atomic_inc(&r10_bio->remaining);
-			md_submit_discard_bio(mddev, rdev, mbio,
-					dev_start + choose_data_offset(r10_bio, rdev),
-					dev_end - dev_start);
-			bio_endio(mbio);
-		}
-		if (r10_bio->devs[disk].repl_bio) {
-			rbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
-			rbio->bi_end_io = raid10_end_discard_request;
-			rbio->bi_private = r10_bio;
-			r10_bio->devs[disk].repl_bio = rbio;
-			r10_bio->devs[disk].devnum = disk;
-			atomic_inc(&r10_bio->remaining);
-			md_submit_discard_bio(mddev, rrdev, rbio,
-					dev_start + choose_data_offset(r10_bio, rrdev),
-					dev_end - dev_start);
-			bio_endio(rbio);
-		}
-	}
-
-	if (atomic_dec_and_test(&r10_bio->remaining)) {
-		md_write_end(r10_bio->mddev);
-		raid_end_bio_io(r10_bio);
-	}
-
-	return 0;
-out:
-	allow_barrier(conf);
-	return -EAGAIN;
-}
-
 static bool raid10_make_request(struct mddev *mddev, struct bio *bio)
 {
 	struct r10conf *conf = mddev->private;
@@ -1780,10 +1530,6 @@ static bool raid10_make_request(struct mddev *mddev, struct bio *bio)
 	if (!md_write_start(mddev, bio))
 		return false;
 
-	if (unlikely(bio_op(bio) == REQ_OP_DISCARD))
-		if (!raid10_handle_discard(mddev, bio))
-			return true;
-
 	/*
 	 * If this request crosses a chunk boundary, we need to split
 	 * it.
@@ -4023,7 +3769,7 @@ static int raid10_run(struct mddev *mddev)
 
 	if (mddev->queue) {
 		blk_queue_max_discard_sectors(mddev->queue,
-					      UINT_MAX);
+					      mddev->chunk_sectors);
 		blk_queue_max_write_same_sectors(mddev->queue, 0);
 		blk_queue_max_write_zeroes_sectors(mddev->queue, 0);
 		blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9);
commit 82fe9af77cd11ea7bdc133ceed1f7f5fc08f7d25
Author: Song Liu <songliubraving at fb.com>
Date:   Wed Dec 9 11:38:11 2020 -0800

    Revert "md/raid10: improve discard request for far layout"
    
    This reverts commit d3ee2d8415a6256c1c41e1be36e80e640c3e6359.
    
    Matthew Ruffell reported data corruption in raid10 due to the changes
    in discard handling [1]. Revert these changes before we find a proper fix.
    
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
    Cc: Matthew Ruffell <matthew.ruffell at canonical.com>
    Cc: Xiao Ni <xni at redhat.com>
    Signed-off-by: Song Liu <songliubraving at fb.com>

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index b7bca6703df8..05773ee1b5ba 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1534,28 +1534,6 @@ static struct bio *raid10_split_bio(struct r10conf *conf,
 	return bio;
 }
 
-static void raid_end_discard_bio(struct r10bio *r10bio)
-{
-	struct r10conf *conf = r10bio->mddev->private;
-	struct r10bio *first_r10bio;
-
-	while (atomic_dec_and_test(&r10bio->remaining)) {
-
-		allow_barrier(conf);
-
-		if (!test_bit(R10BIO_Discard, &r10bio->state)) {
-			first_r10bio = (struct r10bio *)r10bio->master_bio;
-			free_r10bio(r10bio);
-			r10bio = first_r10bio;
-		} else {
-			md_write_end(r10bio->mddev);
-			bio_endio(r10bio->master_bio);
-			free_r10bio(r10bio);
-			break;
-		}
-	}
-}
-
 static void raid10_end_discard_request(struct bio *bio)
 {
 	struct r10bio *r10_bio = bio->bi_private;
@@ -1582,7 +1560,11 @@ static void raid10_end_discard_request(struct bio *bio)
 		rdev = conf->mirrors[dev].rdev;
 	}
 
-	raid_end_discard_bio(r10_bio);
+	if (atomic_dec_and_test(&r10_bio->remaining)) {
+		md_write_end(r10_bio->mddev);
+		raid_end_bio_io(r10_bio);
+	}
+
 	rdev_dec_pending(rdev, conf->mddev);
 }
 
@@ -1595,9 +1577,7 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
 {
 	struct r10conf *conf = mddev->private;
 	struct geom *geo = &conf->geo;
-	struct r10bio *r10_bio, *first_r10bio;
-	int far_copies = geo->far_copies;
-	bool first_copy = true;
+	struct r10bio *r10_bio;
 
 	int disk;
 	sector_t chunk;
@@ -1636,20 +1616,30 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
 	if (bio_sectors(bio) < stripe_size*2)
 		goto out;
 
-	/* For far and far offset layout, if bio is not aligned with stripe size,
-	 * it splits the part that is not aligned with strip size.
+	/* For far offset layout, if bio is not aligned with stripe size, it splits
+	 * the part that is not aligned with strip size.
 	 */
 	div_u64_rem(bio_start, stripe_size, &remainder);
-	if ((far_copies > 1) && remainder) {
+	if (geo->far_offset && remainder) {
 		split_size = stripe_size - remainder;
 		bio = raid10_split_bio(conf, bio, split_size, false);
 	}
 	div_u64_rem(bio_end, stripe_size, &remainder);
-	if ((far_copies > 1) && remainder) {
+	if (geo->far_offset && remainder) {
 		split_size = bio_sectors(bio) - remainder;
 		bio = raid10_split_bio(conf, bio, split_size, true);
 	}
 
+	r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
+	r10_bio->mddev = mddev;
+	r10_bio->state = 0;
+	r10_bio->sectors = 0;
+	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks);
+
+	wait_blocked_dev(mddev, r10_bio);
+
+	r10_bio->master_bio = bio;
+
 	bio_start = bio->bi_iter.bi_sector;
 	bio_end = bio_end_sector(bio);
 
@@ -1675,28 +1665,6 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
 	end_disk_offset = (bio_end & geo->chunk_mask) +
 				(last_stripe_index << geo->chunk_shift);
 
-retry_discard:
-	r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
-	r10_bio->mddev = mddev;
-	r10_bio->state = 0;
-	r10_bio->sectors = 0;
-	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks);
-	wait_blocked_dev(mddev, r10_bio);
-
-	/* For far layout it needs more than one r10bio to cover all regions.
-	 * Inspired by raid10_sync_request, we can use the first r10bio->master_bio
-	 * to record the discard bio. Other r10bio->master_bio record the first
-	 * r10bio. The first r10bio only release after all other r10bios finish.
-	 * The discard bio returns only first r10bio finishes
-	 */
-	if (first_copy) {
-		r10_bio->master_bio = bio;
-		set_bit(R10BIO_Discard, &r10_bio->state);
-		first_copy = false;
-		first_r10bio = r10_bio;
-	} else
-		r10_bio->master_bio = (struct bio *)first_r10bio;
-
 	rcu_read_lock();
 	for (disk = 0; disk < geo->raid_disks; disk++) {
 		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
@@ -1787,19 +1755,11 @@ retry_discard:
 		}
 	}
 
-	if (!geo->far_offset && --far_copies) {
-		first_stripe_index += geo->stride >> geo->chunk_shift;
-		start_disk_offset += geo->stride;
-		last_stripe_index += geo->stride >> geo->chunk_shift;
-		end_disk_offset += geo->stride;
-		atomic_inc(&first_r10bio->remaining);
-		raid_end_discard_bio(r10_bio);
-		wait_barrier(conf);
-		goto retry_discard;
+	if (atomic_dec_and_test(&r10_bio->remaining)) {
+		md_write_end(r10_bio->mddev);
+		raid_end_bio_io(r10_bio);
 	}
 
-	raid_end_discard_bio(r10_bio);
-
 	return 0;
 out:
 	allow_barrier(conf);
diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h
index 1461fd55311b..79cd2b7d3128 100644
--- a/drivers/md/raid10.h
+++ b/drivers/md/raid10.h
@@ -179,6 +179,5 @@ enum r10bio_state {
 	R10BIO_Previous,
 /* failfast devices did receive failfast requests. */
 	R10BIO_FailFast,
-	R10BIO_Discard,
 };
 #endif
commit e2782f560c298efc2e23c7e54b3acf54e8a6ba72
Author: Song Liu <songliubraving at fb.com>
Date:   Wed Dec 9 13:53:31 2020 -0800

    Revert "dm raid: remove unnecessary discard limits for raid10"
    
    This reverts commit f0e90b6c663a7e3b4736cb318c6c7c589f152c28.
    
    Matthew Ruffell reported data corruption in raid10 due to the changes
    in discard handling [1]. Revert these changes before we find a proper fix.
    
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262/
    Cc: Matthew Ruffell <matthew.ruffell at canonical.com>
    Cc: Xiao Ni <xni at redhat.com>
    Cc: Mike Snitzer <snitzer at redhat.com>
    Acked-by: Mike Snitzer <snitzer at redhat.com>
    Signed-off-by: Song Liu <songliubraving at fb.com>

diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index 9c1f7c4de65b..dc8568ab96f2 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -3728,6 +3728,17 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits)
 
 	blk_limits_io_min(limits, chunk_size_bytes);
 	blk_limits_io_opt(limits, chunk_size_bytes * mddev_data_stripes(rs));
+
+	/*
+	 * RAID10 personality requires bio splitting,
+	 * RAID0/1/4/5/6 don't and process large discard bios properly.
+	 */
+	if (rs_is_raid10(rs)) {
+		limits->discard_granularity = max(chunk_size_bytes,
+						  limits->discard_granularity);
+		limits->max_discard_sectors = min_not_zero(rs->md.chunk_sectors,
+							   limits->max_discard_sectors);
+	}
 }
 
 static void raid_postsuspend(struct dm_target *ti)
commit 177745beebe39773004921d6bffd6c94c77dca32
Author: Mickey Rachamim <mickeyr at marvell.com>
Date:   Wed Dec 9 15:47:39 2020 +0200

    MAINTAINERS: Add entry for Marvell Prestera Ethernet Switch driver
    
    Add maintainers info for new Marvell Prestera Ethernet switch driver.
    
    Signed-off-by: Mickey Rachamim <mickeyr at marvell.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/MAINTAINERS b/MAINTAINERS
index ebe4829cdd4d..0381eb273944 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10555,6 +10555,13 @@ S:	Supported
 F:	Documentation/networking/device_drivers/ethernet/marvell/octeontx2.rst
 F:	drivers/net/ethernet/marvell/octeontx2/af/
 
+MARVELL PRESTERA ETHERNET SWITCH DRIVER
+M:	Vadym Kochan <vkochan at marvell.com>
+M:	Taras Chornyi <tchornyi at marvell.com>
+S:	Supported
+W:	https://github.com/Marvell-switching/switchdev-prestera
+F:	drivers/net/ethernet/marvell/prestera/
+
 MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER
 M:	Nicolas Pitre <nico at fluxnic.net>
 S:	Odd Fixes
commit 7fdd375e383097a785bb65c66802e468f398bf82
Author: Guillaume Nault <gnault at redhat.com>
Date:   Wed Dec 9 16:48:41 2020 +0100

    net: sched: Fix dump of MPLS_OPT_LSE_LABEL attribute in cls_flower
    
    TCA_FLOWER_KEY_MPLS_OPT_LSE_LABEL is a u32 attribute (MPLS label is
    20 bits long).
    
    Fixes the following bug:
    
     $ tc filter add dev ethX ingress protocol mpls_uc \
         flower mpls lse depth 2 label 256             \
         action drop
    
     $ tc filter show dev ethX ingress
       filter protocol mpls_uc pref 49152 flower chain 0
       filter protocol mpls_uc pref 49152 flower chain 0 handle 0x1
         eth_type 8847
         mpls
           lse depth 2 label 0  <-- invalid label 0, should be 256
       ...
    
    Fixes: 61aec25a6db5 ("cls_flower: Support filtering on multiple MPLS Label Stack Entries")
    Signed-off-by: Guillaume Nault <gnault at redhat.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index fed18fd2c50b..1319986693fc 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -2424,8 +2424,8 @@ static int fl_dump_key_mpls_opt_lse(struct sk_buff *skb,
 			return err;
 	}
 	if (lse_mask->mpls_label) {
-		err = nla_put_u8(skb, TCA_FLOWER_KEY_MPLS_OPT_LSE_LABEL,
-				 lse_key->mpls_label);
+		err = nla_put_u32(skb, TCA_FLOWER_KEY_MPLS_OPT_LSE_LABEL,
+				  lse_key->mpls_label);
 		if (err)
 			return err;
 	}
commit c5b58c8c860db330c0b8b891b69014ee9d470dab
Author: Evan Quan <evan.quan at amd.com>
Date:   Wed Dec 9 16:34:22 2020 +0800

    drm/amd/pm: typo fix (CUSTOM -> COMPUTE)
    
    The "COMPUTE" was wrongly spelled as "CUSTOM".
    
    Signed-off-by: Evan Quan <evan.quan at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org # 5.9.x

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index 895d89bea7fa..cf7c4f0e0a0b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -217,7 +217,7 @@ static struct cmn2asic_mapping sienna_cichlid_workload_map[PP_SMC_POWER_PROFILE_
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_POWERSAVING,		WORKLOAD_PPLIB_POWER_SAVING_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VIDEO,		WORKLOAD_PPLIB_VIDEO_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VR,			WORKLOAD_PPLIB_VR_BIT),
-	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_CUSTOM_BIT),
+	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_COMPUTE_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_CUSTOM,		WORKLOAD_PPLIB_CUSTOM_BIT),
 };
 
commit b7e4ba9a91dffd298d940b4d3f173121ff829a32
Merge: 88287773ff6f 2d94b20b95b0
Author: David S. Miller <davem at davemloft.net>
Date:   Wed Dec 9 18:55:46 2020 -0800

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
    
    Pablo Neira Ayuso says:
    
    ====================
    Netfilter fixes for net
    
    The following patchset contains Netfilter fixes for net:
    
    1) Switch to RCU in x_tables to fix possible NULL pointer dereference,
       from Subash Abhinov Kasiviswanathan.
    
    2) Fix netlink dump of dynset timeouts later than 23 days.
    
    3) Add comment for the indirect serialization of the nft commit mutex
       with rtnl_mutex.
    
    4) Remove bogus check for confirmed conntrack when matching on the
       conntrack ID, from Brett Mastbergen.
    ====================
    
    Signed-off-by: David S. Miller <davem at davemloft.net>

commit 88287773ff6f53c47e1902ae3ae19084ef5c69aa
Merge: 9a25a30ee54c 1beb7830d3b2
Author: David S. Miller <davem at davemloft.net>
Date:   Wed Dec 9 18:48:29 2020 -0800

    Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
    
    Tony Nguyen says:
    
    ====================
    Intel Wired LAN Driver Updates 2020-12-09
    
    This series contains updates to igb, ixgbe, i40e, and ice drivers.
    
    Sven Auhagen fixes issues with igb XDP: return correct error value in XDP
    xmit back, increase header padding to include space for double VLAN, add
    an extack error when Rx buffer is too small for frame size, set metasize if
    it is set in xdp, change xdp_do_flush_map to xdp_do_flush, and update
    trans_start to avoid possible Tx timeout.
    
    Björn fixes an issue where an Rx buffer can be reused prematurely with
    XDP redirect for ixgbe, i40e, and ice drivers.
    
    The following are changes since commit 323a391a220c4a234cb1e678689d7f4c3b73f863:
      can: isotp: isotp_setsockopt(): block setsockopt on bound sockets
    and are available in the git repository at:
      git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue 1GbE
    ====================
    
    Signed-off-by: David S. Miller <davem at davemloft.net>

commit 80db2a087f425b63f0163bc95217abd01c637cb5
Author: Dmitry Torokhov <dmitry.torokhov at gmail.com>
Date:   Wed Dec 9 17:59:53 2020 -0800

    Input: cros_ec_keyb - send 'scancodes' in addition to key events
    
    To let userspace know what 'scancodes' should be used in EVIOCGKEYCODE
    and EVIOCSKEYCODE ioctls, we should send EV_MSC/MSC_SCAN events in
    addition to EV_KEY/KEY_* events. The driver already declared MSC_SCAN
    capability, so it is only matter of actually sending the events.
    
    Link: https://lore.kernel.org/r/X87aOaSptPTvZ3nZ@google.com
    Acked-by: Rajat Jain <rajatja at google.com>
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c
index fc1793ca2f17..0a748aed0265 100644
--- a/drivers/input/keyboard/cros_ec_keyb.c
+++ b/drivers/input/keyboard/cros_ec_keyb.c
@@ -183,6 +183,7 @@ static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev,
 					"changed: [r%d c%d]: byte %02x\n",
 					row, col, new_state);
 
+				input_event(idev, EV_MSC, MSC_SCAN, pos);
 				input_report_key(idev, keycodes[pos],
 						 new_state);
 			}
commit 9a25a30ee54c61a186f3f00d9797f1cc43886167
Merge: 299bcb55ecd1 ba603d9d7b12
Author: David S. Miller <davem at davemloft.net>
Date:   Wed Dec 9 16:44:35 2020 -0800

    Merge branch 'mlx4_en-fixes'
    
    Tariq Toukan says:
    
    ====================
    mlx4_en fixes
    
    This patchset by Moshe contains fixes to the mlx4 Eth driver,
    addressing issues in restart flow.
    
    Patch 1 protects the restart task from being rescheduled while active.
      Please queue for -stable >= v2.6.
    Patch 2 reconstructs SQs stuck in error state, and adds prints for improved
      debuggability.
      Please queue for -stable >= v3.12.
    ====================
    
    Signed-off-by: David S. Miller <davem at davemloft.net>

commit ba603d9d7b1215c72513d7c7aa02b6775fd4891b
Author: Moshe Shemesh <moshe at mellanox.com>
Date:   Wed Dec 9 15:03:39 2020 +0200

    net/mlx4_en: Handle TX error CQE
    
    In case error CQE was found while polling TX CQ, the QP is in error
    state and all posted WQEs will generate error CQEs without any data
    transmitted. Fix it by reopening the channels, via same method used for
    TX timeout handling.
    
    In addition add some more info on error CQE and WQE for debug.
    
    Fixes: bd2f631d7c60 ("net/mlx4_en: Notify user when TX ring in error state")
    Signed-off-by: Moshe Shemesh <moshe at mellanox.com>
    Signed-off-by: Tariq Toukan <tariqt at nvidia.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 1a2b0bd64aa9..6f290319b617 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1735,6 +1735,7 @@ int mlx4_en_start_port(struct net_device *dev)
 				mlx4_en_deactivate_cq(priv, cq);
 				goto tx_err;
 			}
+			clear_bit(MLX4_EN_TX_RING_STATE_RECOVERING, &tx_ring->state);
 			if (t != TX_XDP) {
 				tx_ring->tx_queue = netdev_get_tx_queue(dev, i);
 				tx_ring->recycle_ring = NULL;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 3ddb7268e415..59b097cda327 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -392,6 +392,35 @@ int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring)
 	return cnt;
 }
 
+static void mlx4_en_handle_err_cqe(struct mlx4_en_priv *priv, struct mlx4_err_cqe *err_cqe,
+				   u16 cqe_index, struct mlx4_en_tx_ring *ring)
+{
+	struct mlx4_en_dev *mdev = priv->mdev;
+	struct mlx4_en_tx_info *tx_info;
+	struct mlx4_en_tx_desc *tx_desc;
+	u16 wqe_index;
+	int desc_size;
+
+	en_err(priv, "CQE error - cqn 0x%x, ci 0x%x, vendor syndrome: 0x%x syndrome: 0x%x\n",
+	       ring->sp_cqn, cqe_index, err_cqe->vendor_err_syndrome, err_cqe->syndrome);
+	print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1, err_cqe, sizeof(*err_cqe),
+		       false);
+
+	wqe_index = be16_to_cpu(err_cqe->wqe_index) & ring->size_mask;
+	tx_info = &ring->tx_info[wqe_index];
+	desc_size = tx_info->nr_txbb << LOG_TXBB_SIZE;
+	en_err(priv, "Related WQE - qpn 0x%x, wqe index 0x%x, wqe size 0x%x\n", ring->qpn,
+	       wqe_index, desc_size);
+	tx_desc = ring->buf + (wqe_index << LOG_TXBB_SIZE);
+	print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1, tx_desc, desc_size, false);
+
+	if (test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state))
+		return;
+
+	en_err(priv, "Scheduling port restart\n");
+	queue_work(mdev->workqueue, &priv->restart_task);
+}
+
 int mlx4_en_process_tx_cq(struct net_device *dev,
 			  struct mlx4_en_cq *cq, int napi_budget)
 {
@@ -438,13 +467,10 @@ int mlx4_en_process_tx_cq(struct net_device *dev,
 		dma_rmb();
 
 		if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) ==
-			     MLX4_CQE_OPCODE_ERROR)) {
-			struct mlx4_err_cqe *cqe_err = (struct mlx4_err_cqe *)cqe;
-
-			en_err(priv, "CQE error - vendor syndrome: 0x%x syndrome: 0x%x\n",
-			       cqe_err->vendor_err_syndrome,
-			       cqe_err->syndrome);
-		}
+			     MLX4_CQE_OPCODE_ERROR))
+			if (!test_and_set_bit(MLX4_EN_TX_RING_STATE_RECOVERING, &ring->state))
+				mlx4_en_handle_err_cqe(priv, (struct mlx4_err_cqe *)cqe, index,
+						       ring);
 
 		/* Skip over last polled CQE */
 		new_index = be16_to_cpu(cqe->wqe_index) & size_mask;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index fd9535bde1b8..30378e4c90b5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -271,6 +271,10 @@ struct mlx4_en_page_cache {
 	} buf[MLX4_EN_CACHE_SIZE];
 };
 
+enum {
+	MLX4_EN_TX_RING_STATE_RECOVERING,
+};
+
 struct mlx4_en_priv;
 
 struct mlx4_en_tx_ring {
@@ -317,6 +321,7 @@ struct mlx4_en_tx_ring {
 	 * Only queue_stopped might be used if BQL is not properly working.
 	 */
 	unsigned long		queue_stopped;
+	unsigned long		state;
 	struct mlx4_hwq_resources sp_wqres;
 	struct mlx4_qp		sp_qp;
 	struct mlx4_qp_context	sp_context;
commit fed91613c9dd455dd154b22fa8e11b8526466082
Author: Moshe Shemesh <moshe at mellanox.com>
Date:   Wed Dec 9 15:03:38 2020 +0200

    net/mlx4_en: Avoid scheduling restart task if it is already running
    
    Add restarting state flag to avoid scheduling another restart task while
    such task is already running. Change task name from watchdog_task to
    restart_task to better fit the task role.
    
    Fixes: 1e338db56e5a ("mlx4_en: Fix a race at restart task")
    Signed-off-by: Moshe Shemesh <moshe at mellanox.com>
    Signed-off-by: Tariq Toukan <tariqt at nvidia.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 106513f772c3..1a2b0bd64aa9 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1378,8 +1378,10 @@ static void mlx4_en_tx_timeout(struct net_device *dev, unsigned int txqueue)
 		tx_ring->cons, tx_ring->prod);
 
 	priv->port_stats.tx_timeout++;
-	en_dbg(DRV, priv, "Scheduling watchdog\n");
-	queue_work(mdev->workqueue, &priv->watchdog_task);
+	if (!test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state)) {
+		en_dbg(DRV, priv, "Scheduling port restart\n");
+		queue_work(mdev->workqueue, &priv->restart_task);
+	}
 }
 
 
@@ -1829,6 +1831,7 @@ int mlx4_en_start_port(struct net_device *dev)
 		local_bh_enable();
 	}
 
+	clear_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state);
 	netif_tx_start_all_queues(dev);
 	netif_device_attach(dev);
 
@@ -1999,7 +2002,7 @@ void mlx4_en_stop_port(struct net_device *dev, int detach)
 static void mlx4_en_restart(struct work_struct *work)
 {
 	struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
-						 watchdog_task);
+						 restart_task);
 	struct mlx4_en_dev *mdev = priv->mdev;
 	struct net_device *dev = priv->dev;
 
@@ -2377,7 +2380,7 @@ static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
 	if (netif_running(dev)) {
 		mutex_lock(&mdev->state_lock);
 		if (!mdev->device_up) {
-			/* NIC is probably restarting - let watchdog task reset
+			/* NIC is probably restarting - let restart task reset
 			 * the port */
 			en_dbg(DRV, priv, "Change MTU called with card down!?\n");
 		} else {
@@ -2386,7 +2389,9 @@ static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
 			if (err) {
 				en_err(priv, "Failed restarting port:%d\n",
 					 priv->port);
-				queue_work(mdev->workqueue, &priv->watchdog_task);
+				if (!test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING,
+						      &priv->state))
+					queue_work(mdev->workqueue, &priv->restart_task);
 			}
 		}
 		mutex_unlock(&mdev->state_lock);
@@ -2792,7 +2797,8 @@ static int mlx4_xdp_set(struct net_device *dev, struct bpf_prog *prog)
 		if (err) {
 			en_err(priv, "Failed starting port %d for XDP change\n",
 			       priv->port);
-			queue_work(mdev->workqueue, &priv->watchdog_task);
+			if (!test_and_set_bit(MLX4_EN_STATE_FLAG_RESTARTING, &priv->state))
+				queue_work(mdev->workqueue, &priv->restart_task);
 		}
 	}
 
@@ -3165,7 +3171,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
 	priv->counter_index = MLX4_SINK_COUNTER_INDEX(mdev->dev);
 	spin_lock_init(&priv->stats_lock);
 	INIT_WORK(&priv->rx_mode_task, mlx4_en_do_set_rx_mode);
-	INIT_WORK(&priv->watchdog_task, mlx4_en_restart);
+	INIT_WORK(&priv->restart_task, mlx4_en_restart);
 	INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate);
 	INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats);
 	INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task);
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index a46efe37cfa9..fd9535bde1b8 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -530,6 +530,10 @@ struct mlx4_en_stats_bitmap {
 	struct mutex mutex; /* for mutual access to stats bitmap */
 };
 
+enum {
+	MLX4_EN_STATE_FLAG_RESTARTING,
+};
+
 struct mlx4_en_priv {
 	struct mlx4_en_dev *mdev;
 	struct mlx4_en_port_profile *prof;
@@ -595,7 +599,7 @@ struct mlx4_en_priv {
 	struct mlx4_en_cq *rx_cq[MAX_RX_RINGS];
 	struct mlx4_qp drop_qp;
 	struct work_struct rx_mode_task;
-	struct work_struct watchdog_task;
+	struct work_struct restart_task;
 	struct work_struct linkstate_task;
 	struct delayed_work stats_task;
 	struct delayed_work service_task;
@@ -641,6 +645,7 @@ struct mlx4_en_priv {
 	u32 pflags;
 	u8 rss_key[MLX4_EN_RSS_KEY_SIZE];
 	u8 rss_hash_fn;
+	unsigned long state;
 };
 
 enum mlx4_en_wol {
commit 299bcb55ecd1412f6df606e9dc0912d55610029e
Author: Neal Cardwell <ncardwell at google.com>
Date:   Tue Dec 8 22:57:59 2020 -0500

    tcp: fix cwnd-limited bug for TSO deferral where we send nothing
    
    When cwnd is not a multiple of the TSO skb size of N*MSS, we can get
    into persistent scenarios where we have the following sequence:
    
    (1) ACK for full-sized skb of N*MSS arrives
      -> tcp_write_xmit() transmit full-sized skb with N*MSS
      -> move pacing release time forward
      -> exit tcp_write_xmit() because pacing time is in the future
    
    (2) TSQ callback or TCP internal pacing timer fires
      -> try to transmit next skb, but TSO deferral finds remainder of
         available cwnd is not big enough to trigger an immediate send
         now, so we defer sending until the next ACK.
    
    (3) repeat...
    
    So we can get into a case where we never mark ourselves as
    cwnd-limited for many seconds at a time, even with
    bulk/infinite-backlog senders, because:
    
    o In case (1) above, every time in tcp_write_xmit() we have enough
    cwnd to send a full-sized skb, we are not fully using the cwnd
    (because cwnd is not a multiple of the TSO skb size). So every time we
    send data, we are not cwnd limited, and so in the cwnd-limited
    tracking code in tcp_cwnd_validate() we mark ourselves as not
    cwnd-limited.
    
    o In case (2) above, every time in tcp_write_xmit() that we try to
    transmit the "remainder" of the cwnd but defer, we set the local
    variable is_cwnd_limited to true, but we do not send any packets, so
    sent_pkts is zero, so we don't call the cwnd-limited logic to update
    tp->is_cwnd_limited.
    
    Fixes: ca8a22634381 ("tcp: make cwnd-limited checks measurement-based, and gentler")
    Reported-by: Ingemar Johansson <ingemar.s.johansson at ericsson.com>
    Signed-off-by: Neal Cardwell <ncardwell at google.com>
    Signed-off-by: Yuchung Cheng <ycheng at google.com>
    Acked-by: Soheil Hassas Yeganeh <soheil at google.com>
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Link: https://lore.kernel.org/r/20201209035759.1225145-1-ncardwell.kernel@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index bf48cd73e967..99011768c264 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1880,7 +1880,8 @@ static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited)
 	 * window, and remember whether we were cwnd-limited then.
 	 */
 	if (!before(tp->snd_una, tp->max_packets_seq) ||
-	    tp->packets_out > tp->max_packets_out) {
+	    tp->packets_out > tp->max_packets_out ||
+	    is_cwnd_limited) {
 		tp->max_packets_out = tp->packets_out;
 		tp->max_packets_seq = tp->snd_nxt;
 		tp->is_cwnd_limited = is_cwnd_limited;
@@ -2702,6 +2703,10 @@ repair:
 	else
 		tcp_chrono_stop(sk, TCP_CHRONO_RWND_LIMITED);
 
+	is_cwnd_limited |= (tcp_packets_in_flight(tp) >= tp->snd_cwnd);
+	if (likely(sent_pkts || is_cwnd_limited))
+		tcp_cwnd_validate(sk, is_cwnd_limited);
+
 	if (likely(sent_pkts)) {
 		if (tcp_in_cwnd_reduction(sk))
 			tp->prr_out += sent_pkts;
@@ -2709,8 +2714,6 @@ repair:
 		/* Send one loss probe per tail loss episode. */
 		if (push_one != 2)
 			tcp_schedule_loss_probe(sk, false);
-		is_cwnd_limited |= (tcp_packets_in_flight(tp) >= tp->snd_cwnd);
-		tcp_cwnd_validate(sk, is_cwnd_limited);
 		return false;
 	}
 	return !tp->packets_out && !tcp_write_queue_empty(sk);
commit 5137d303659d8c324e67814b1cc2e1bc0c0d9836
Author: Chris Mi <cmi at nvidia.com>
Date:   Tue Dec 8 10:48:35 2020 +0800

    net: flow_offload: Fix memory leak for indirect flow block
    
    The offending commit introduces a cleanup callback that is invoked
    when the driver module is removed to clean up the tunnel device
    flow block. But it returns on the first iteration of the for loop.
    The remaining indirect flow blocks will never be freed.
    
    Fixes: 1fac52da5942 ("net: flow_offload: consolidate indirect flow_block infrastructure")
    CC: Pablo Neira Ayuso <pablo at netfilter.org>
    Signed-off-by: Chris Mi <cmi at nvidia.com>
    Reviewed-by: Roi Dayan <roid at nvidia.com>

diff --git a/net/core/flow_offload.c b/net/core/flow_offload.c
index d4474c812b64..715b67f6c62f 100644
--- a/net/core/flow_offload.c
+++ b/net/core/flow_offload.c
@@ -381,10 +381,8 @@ static void __flow_block_indr_cleanup(void (*release)(void *cb_priv),
 
 	list_for_each_entry_safe(this, next, &flow_block_indr_list, indr.list) {
 		if (this->release == release &&
-		    this->indr.cb_priv == cb_priv) {
+		    this->indr.cb_priv == cb_priv)
 			list_move(&this->indr.list, cleanup_list);
-			return;
-		}
 	}
 }
 
commit 8ef44b6fe49d2b8d03ba9aa69063612b474f963b
Author: Wei Wang <weiwan at google.com>
Date:   Tue Dec 8 09:55:08 2020 -0800

    tcp: Retain ECT bits for tos reflection
    
    For DCTCP, we have to retain the ECT bits set by the congestion control
    algorithm on the socket when reflecting syn TOS in syn-ack, in order to
    make ECN work properly.
    
    Fixes: ac8f1710c12b ("tcp: reflect tos value received in SYN to the socket")
    Reported-by: Alexander Duyck <alexanderduyck at fb.com>
    Signed-off-by: Wei Wang <weiwan at google.com>
    Reviewed-by: Eric Dumazet <edumazet at google.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 8391aa29e7a4..595dcc3afac5 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -984,7 +984,8 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,
 		__tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr);
 
 		tos = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
-				tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
+				(tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
+				(inet_sk(sk)->tos & INET_ECN_MASK) :
 				inet_sk(sk)->tos;
 
 		if (!INET_ECN_is_capable(tos) &&
@@ -1541,7 +1542,9 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
 		inet_csk(newsk)->icsk_ext_hdr_len = inet_opt->opt.optlen;
 	newinet->inet_id = prandom_u32();
 
-	/* Set ToS of the new socket based upon the value of incoming SYN. */
+	/* Set ToS of the new socket based upon the value of incoming SYN.
+	 * ECT bits are set later in tcp_init_transfer().
+	 */
 	if (sock_net(sk)->ipv4.sysctl_tcp_reflect_tos)
 		newinet->tos = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
 
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 992cbf3eb9e3..991dc36f95ff 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -528,7 +528,8 @@ static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
 			fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts));
 
 		tclass = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
-				tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
+				(tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
+				(np->tclass & INET_ECN_MASK) :
 				np->tclass;
 
 		if (!INET_ECN_is_capable(tclass) &&
@@ -1320,7 +1321,9 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
 	if (np->repflow)
 		newnp->flow_label = ip6_flowlabel(ipv6_hdr(skb));
 
-	/* Set ToS of the new socket based upon the value of incoming SYN. */
+	/* Set ToS of the new socket based upon the value of incoming SYN.
+	 * ECT bits are set later in tcp_init_transfer().
+	 */
 	if (sock_net(sk)->ipv4.sysctl_tcp_reflect_tos)
 		newnp->tclass = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
 
commit a770bf515613c6e12ae904c3593e26016de99448
Author: Michal Kubecek <mkubecek at suse.cz>
Date:   Tue Dec 8 23:13:51 2020 +0100

    ethtool: fix stack overflow in ethnl_parse_bitset()
    
    Syzbot reported a stack overflow in bitmap_from_arr32() called from
    ethnl_parse_bitset() when bitset from netlink message is longer than
    target bitmap length. While ethnl_compact_sanity_checks() makes sure that
    trailing part is all zeros (i.e. the request does not try to touch bits
    kernel does not recognize), we also need to cap change_bits to nbits so
    that we don't try to write past the prepared bitmaps.
    
    Fixes: 88db6d1e4f62 ("ethtool: add ethnl_parse_bitset() helper")
    Reported-by: syzbot+9d39fa49d4df294aab93 at syzkaller.appspotmail.com
    Signed-off-by: Michal Kubecek <mkubecek at suse.cz>
    Link: https://lore.kernel.org/r/3487ee3a98e14cd526f55b6caaa959d2dcbcad9f.1607465316.git.mkubecek@suse.cz
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ethtool/bitset.c b/net/ethtool/bitset.c
index 1fb3603d92ad..0515d6604b3b 100644
--- a/net/ethtool/bitset.c
+++ b/net/ethtool/bitset.c
@@ -628,6 +628,8 @@ int ethnl_parse_bitset(unsigned long *val, unsigned long *mask,
 			return ret;
 
 		change_bits = nla_get_u32(tb[ETHTOOL_A_BITSET_SIZE]);
+		if (change_bits > nbits)
+			change_bits = nbits;
 		bitmap_from_arr32(val, nla_data(tb[ETHTOOL_A_BITSET_VALUE]),
 				  change_bits);
 		if (change_bits < nbits)
commit a379b01cd4b2aa3f12786b281a714871574e5ccb
Author: Vitaly Lifshits <vitaly.lifshits at intel.com>
Date:   Tue Dec 8 12:56:32 2020 -0600

    e1000e: fix S0ix flow to allow S0i3.2 subset entry
    
    Changed a configuration in the flows to align with
    architecture requirements to achieve S0i3.2 substate.
    
    This helps both i219V and i219LM configurations.
    
    Also fixed a typo in the previous commit 632fbd5eb5b0
    ("e1000e: fix S0ix flows for cable connected case").
    
    Fixes: 632fbd5eb5b0 ("e1000e: fix S0ix flows for cable connected case").
    Signed-off-by: Vitaly Lifshits <vitaly.lifshits at intel.com>
    Tested-by: Aaron Brown <aaron.f.brown at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>
    Reviewed-by: Alexander Duyck <alexanderduyck at fb.com>
    Signed-off-by: Mario Limonciello <mario.limonciello at dell.com>
    Link: https://lore.kernel.org/r/20201208185632.151052-1-mario.limonciello@dell.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index b30f00891c03..128ab6898070 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -6475,13 +6475,13 @@ static void e1000e_s0ix_entry_flow(struct e1000_adapter *adapter)
 
 	/* Ungate PGCB clock */
 	mac_data = er32(FEXTNVM9);
-	mac_data |= BIT(28);
+	mac_data &= ~BIT(28);
 	ew32(FEXTNVM9, mac_data);
 
 	/* Enable K1 off to enable mPHY Power Gating */
 	mac_data = er32(FEXTNVM6);
 	mac_data |= BIT(31);
-	ew32(FEXTNVM12, mac_data);
+	ew32(FEXTNVM6, mac_data);
 
 	/* Enable mPHY power gating for any link and speed */
 	mac_data = er32(FEXTNVM8);
@@ -6525,11 +6525,11 @@ static void e1000e_s0ix_exit_flow(struct e1000_adapter *adapter)
 	/* Disable K1 off */
 	mac_data = er32(FEXTNVM6);
 	mac_data &= ~BIT(31);
-	ew32(FEXTNVM12, mac_data);
+	ew32(FEXTNVM6, mac_data);
 
 	/* Disable Ungate PGCB clock */
 	mac_data = er32(FEXTNVM9);
-	mac_data &= ~BIT(28);
+	mac_data |= BIT(28);
 	ew32(FEXTNVM9, mac_data);
 
 	/* Cancel not waking from dynamic
commit 1beb7830d3b285b28f7cde3644d59d2590a47e51
Author: Björn Töpel <bjorn.topel at intel.com>
Date:   Tue Aug 25 19:27:36 2020 +0200

    ice: avoid premature Rx buffer reuse
    
    The page recycle code, incorrectly, relied on that a page fragment
    could not be freed inside xdp_do_redirect(). This assumption leads to
    that page fragments that are used by the stack/XDP redirect can be
    reused and overwritten.
    
    To avoid this, store the page count prior invoking xdp_do_redirect().
    
    Fixes: efc2214b6047 ("ice: Add support for XDP")
    Reported-and-analyzed-by: Li RongQing <lirongqing at baidu.com>
    Signed-off-by: Björn Töpel <bjorn.topel at intel.com>
    Tested-by: George Kuruvinakunnel <george.kuruvinakunnel at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
index eae75260fe20..23eca2f0a03b 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
@@ -762,13 +762,15 @@ ice_rx_buf_adjust_pg_offset(struct ice_rx_buf *rx_buf, unsigned int size)
 /**
  * ice_can_reuse_rx_page - Determine if page can be reused for another Rx
  * @rx_buf: buffer containing the page
+ * @rx_buf_pgcnt: rx_buf page refcount pre xdp_do_redirect() call
  *
  * If page is reusable, we have a green light for calling ice_reuse_rx_page,
  * which will assign the current buffer to the buffer that next_to_alloc is
  * pointing to; otherwise, the DMA mapping needs to be destroyed and
  * page freed
  */
-static bool ice_can_reuse_rx_page(struct ice_rx_buf *rx_buf)
+static bool
+ice_can_reuse_rx_page(struct ice_rx_buf *rx_buf, int rx_buf_pgcnt)
 {
 	unsigned int pagecnt_bias = rx_buf->pagecnt_bias;
 	struct page *page = rx_buf->page;
@@ -779,7 +781,7 @@ static bool ice_can_reuse_rx_page(struct ice_rx_buf *rx_buf)
 
 #if (PAGE_SIZE < 8192)
 	/* if we are only owner of page we can reuse it */
-	if (unlikely((page_count(page) - pagecnt_bias) > 1))
+	if (unlikely((rx_buf_pgcnt - pagecnt_bias) > 1))
 		return false;
 #else
 #define ICE_LAST_OFFSET \
@@ -864,17 +866,24 @@ ice_reuse_rx_page(struct ice_ring *rx_ring, struct ice_rx_buf *old_buf)
  * @rx_ring: Rx descriptor ring to transact packets on
  * @skb: skb to be used
  * @size: size of buffer to add to skb
+ * @rx_buf_pgcnt: rx_buf page refcount
  *
  * This function will pull an Rx buffer from the ring and synchronize it
  * for use by the CPU.
  */
 static struct ice_rx_buf *
 ice_get_rx_buf(struct ice_ring *rx_ring, struct sk_buff **skb,
-	       const unsigned int size)
+	       const unsigned int size, int *rx_buf_pgcnt)
 {
 	struct ice_rx_buf *rx_buf;
 
 	rx_buf = &rx_ring->rx_buf[rx_ring->next_to_clean];
+	*rx_buf_pgcnt =
+#if (PAGE_SIZE < 8192)
+		page_count(rx_buf->page);
+#else
+		0;
+#endif
 	prefetchw(rx_buf->page);
 	*skb = rx_buf->skb;
 
@@ -1006,12 +1015,15 @@ ice_construct_skb(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf,
  * ice_put_rx_buf - Clean up used buffer and either recycle or free
  * @rx_ring: Rx descriptor ring to transact packets on
  * @rx_buf: Rx buffer to pull data from
+ * @rx_buf_pgcnt: Rx buffer page count pre xdp_do_redirect()
  *
  * This function will update next_to_clean and then clean up the contents
  * of the rx_buf. It will either recycle the buffer or unmap it and free
  * the associated resources.
  */
-static void ice_put_rx_buf(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf)
+static void
+ice_put_rx_buf(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf,
+	       int rx_buf_pgcnt)
 {
 	u16 ntc = rx_ring->next_to_clean + 1;
 
@@ -1022,7 +1034,7 @@ static void ice_put_rx_buf(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf)
 	if (!rx_buf)
 		return;
 
-	if (ice_can_reuse_rx_page(rx_buf)) {
+	if (ice_can_reuse_rx_page(rx_buf, rx_buf_pgcnt)) {
 		/* hand second half of page back to the ring */
 		ice_reuse_rx_page(rx_ring, rx_buf);
 	} else {
@@ -1097,6 +1109,7 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
 		struct sk_buff *skb;
 		unsigned int size;
 		u16 stat_err_bits;
+		int rx_buf_pgcnt;
 		u16 vlan_tag = 0;
 		u8 rx_ptype;
 
@@ -1119,7 +1132,7 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
 		dma_rmb();
 
 		if (rx_desc->wb.rxdid == FDIR_DESC_RXDID || !rx_ring->netdev) {
-			ice_put_rx_buf(rx_ring, NULL);
+			ice_put_rx_buf(rx_ring, NULL, 0);
 			cleaned_count++;
 			continue;
 		}
@@ -1128,7 +1141,7 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
 			ICE_RX_FLX_DESC_PKT_LEN_M;
 
 		/* retrieve a buffer from the ring */
-		rx_buf = ice_get_rx_buf(rx_ring, &skb, size);
+		rx_buf = ice_get_rx_buf(rx_ring, &skb, size, &rx_buf_pgcnt);
 
 		if (!size) {
 			xdp.data = NULL;
@@ -1168,7 +1181,7 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
 		total_rx_pkts++;
 
 		cleaned_count++;
-		ice_put_rx_buf(rx_ring, rx_buf);
+		ice_put_rx_buf(rx_ring, rx_buf, rx_buf_pgcnt);
 		continue;
 construct_skb:
 		if (skb) {
@@ -1187,7 +1200,7 @@ construct_skb:
 			break;
 		}
 
-		ice_put_rx_buf(rx_ring, rx_buf);
+		ice_put_rx_buf(rx_ring, rx_buf, rx_buf_pgcnt);
 		cleaned_count++;
 
 		/* skip if it is NOP desc */
commit a06316dc87bdc000f7f39a315476957af2ba0f05
Author: Björn Töpel <bjorn.topel at intel.com>
Date:   Tue Aug 25 19:27:35 2020 +0200

    ixgbe: avoid premature Rx buffer reuse
    
    The page recycle code, incorrectly, relied on that a page fragment
    could not be freed inside xdp_do_redirect(). This assumption leads to
    that page fragments that are used by the stack/XDP redirect can be
    reused and overwritten.
    
    To avoid this, store the page count prior invoking xdp_do_redirect().
    
    Fixes: 6453073987ba ("ixgbe: add initial support for xdp redirect")
    Reported-and-analyzed-by: Li RongQing <lirongqing at baidu.com>
    Signed-off-by: Björn Töpel <bjorn.topel at intel.com>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 45ae33e15303..f3f449f53920 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -1945,7 +1945,8 @@ static inline bool ixgbe_page_is_reserved(struct page *page)
 	return (page_to_nid(page) != numa_mem_id()) || page_is_pfmemalloc(page);
 }
 
-static bool ixgbe_can_reuse_rx_page(struct ixgbe_rx_buffer *rx_buffer)
+static bool ixgbe_can_reuse_rx_page(struct ixgbe_rx_buffer *rx_buffer,
+				    int rx_buffer_pgcnt)
 {
 	unsigned int pagecnt_bias = rx_buffer->pagecnt_bias;
 	struct page *page = rx_buffer->page;
@@ -1956,7 +1957,7 @@ static bool ixgbe_can_reuse_rx_page(struct ixgbe_rx_buffer *rx_buffer)
 
 #if (PAGE_SIZE < 8192)
 	/* if we are only owner of page we can reuse it */
-	if (unlikely((page_ref_count(page) - pagecnt_bias) > 1))
+	if (unlikely((rx_buffer_pgcnt - pagecnt_bias) > 1))
 		return false;
 #else
 	/* The last offset is a bit aggressive in that we assume the
@@ -2021,11 +2022,18 @@ static void ixgbe_add_rx_frag(struct ixgbe_ring *rx_ring,
 static struct ixgbe_rx_buffer *ixgbe_get_rx_buffer(struct ixgbe_ring *rx_ring,
 						   union ixgbe_adv_rx_desc *rx_desc,
 						   struct sk_buff **skb,
-						   const unsigned int size)
+						   const unsigned int size,
+						   int *rx_buffer_pgcnt)
 {
 	struct ixgbe_rx_buffer *rx_buffer;
 
 	rx_buffer = &rx_ring->rx_buffer_info[rx_ring->next_to_clean];
+	*rx_buffer_pgcnt =
+#if (PAGE_SIZE < 8192)
+		page_count(rx_buffer->page);
+#else
+		0;
+#endif
 	prefetchw(rx_buffer->page);
 	*skb = rx_buffer->skb;
 
@@ -2055,9 +2063,10 @@ skip_sync:
 
 static void ixgbe_put_rx_buffer(struct ixgbe_ring *rx_ring,
 				struct ixgbe_rx_buffer *rx_buffer,
-				struct sk_buff *skb)
+				struct sk_buff *skb,
+				int rx_buffer_pgcnt)
 {
-	if (ixgbe_can_reuse_rx_page(rx_buffer)) {
+	if (ixgbe_can_reuse_rx_page(rx_buffer, rx_buffer_pgcnt)) {
 		/* hand second half of page back to the ring */
 		ixgbe_reuse_rx_page(rx_ring, rx_buffer);
 	} else {
@@ -2303,6 +2312,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 		union ixgbe_adv_rx_desc *rx_desc;
 		struct ixgbe_rx_buffer *rx_buffer;
 		struct sk_buff *skb;
+		int rx_buffer_pgcnt;
 		unsigned int size;
 
 		/* return some buffers to hardware, one at a time is too slow */
@@ -2322,7 +2332,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 		 */
 		dma_rmb();
 
-		rx_buffer = ixgbe_get_rx_buffer(rx_ring, rx_desc, &skb, size);
+		rx_buffer = ixgbe_get_rx_buffer(rx_ring, rx_desc, &skb, size, &rx_buffer_pgcnt);
 
 		/* retrieve a buffer from the ring */
 		if (!skb) {
@@ -2367,7 +2377,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 			break;
 		}
 
-		ixgbe_put_rx_buffer(rx_ring, rx_buffer, skb);
+		ixgbe_put_rx_buffer(rx_ring, rx_buffer, skb, rx_buffer_pgcnt);
 		cleaned_count++;
 
 		/* place incomplete frames back on ring for completion */
commit 75aab4e10ae6a4593a60f66d13de755d4e91f400
Author: Björn Töpel <bjorn.topel at intel.com>
Date:   Tue Aug 25 19:27:34 2020 +0200

    i40e: avoid premature Rx buffer reuse
    
    The page recycle code, incorrectly, relied on that a page fragment
    could not be freed inside xdp_do_redirect(). This assumption leads to
    that page fragments that are used by the stack/XDP redirect can be
    reused and overwritten.
    
    To avoid this, store the page count prior invoking xdp_do_redirect().
    
    Longer explanation:
    
    Intel NICs have a recycle mechanism. The main idea is that a page is
    split into two parts. One part is owned by the driver, one part might
    be owned by someone else, such as the stack.
    
    t0: Page is allocated, and put on the Rx ring
                  +---------------
    used by NIC ->| upper buffer
    (rx_buffer)   +---------------
                  | lower buffer
                  +---------------
      page count  == USHRT_MAX
      rx_buffer->pagecnt_bias == USHRT_MAX
    
    t1: Buffer is received, and passed to the stack (e.g.)
                  +---------------
                  | upper buff (skb)
                  +---------------
    used by NIC ->| lower buffer
    (rx_buffer)   +---------------
      page count  == USHRT_MAX
      rx_buffer->pagecnt_bias == USHRT_MAX - 1
    
    t2: Buffer is received, and redirected
                  +---------------
                  | upper buff (skb)
                  +---------------
    used by NIC ->| lower buffer
    (rx_buffer)   +---------------
    
    Now, prior calling xdp_do_redirect():
      page count  == USHRT_MAX
      rx_buffer->pagecnt_bias == USHRT_MAX - 2
    
    This means that buffer *cannot* be flipped/reused, because the skb is
    still using it.
    
    The problem arises when xdp_do_redirect() actually frees the
    segment. Then we get:
      page count  == USHRT_MAX - 1
      rx_buffer->pagecnt_bias == USHRT_MAX - 2
    
    From a recycle perspective, the buffer can be flipped and reused,
    which means that the skb data area is passed to the Rx HW ring!
    
    To work around this, the page count is stored prior calling
    xdp_do_redirect().
    
    Note that this is not optimal, since the NIC could actually reuse the
    "lower buffer" again. However, then we need to track whether
    XDP_REDIRECT consumed the buffer or not.
    
    Fixes: d9314c474d4f ("i40e: add support for XDP_REDIRECT")
    Reported-and-analyzed-by: Li RongQing <lirongqing at baidu.com>
    Signed-off-by: Björn Töpel <bjorn.topel at intel.com>
    Tested-by: George Kuruvinakunnel <george.kuruvinakunnel at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index d43ce13a93c9..3f5825fa67c9 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -1850,6 +1850,7 @@ static inline bool i40e_page_is_reusable(struct page *page)
  * the adapter for another receive
  *
  * @rx_buffer: buffer containing the page
+ * @rx_buffer_pgcnt: buffer page refcount pre xdp_do_redirect() call
  *
  * If page is reusable, rx_buffer->page_offset is adjusted to point to
  * an unused region in the page.
@@ -1872,7 +1873,8 @@ static inline bool i40e_page_is_reusable(struct page *page)
  *
  * In either case, if the page is reusable its refcount is increased.
  **/
-static bool i40e_can_reuse_rx_page(struct i40e_rx_buffer *rx_buffer)
+static bool i40e_can_reuse_rx_page(struct i40e_rx_buffer *rx_buffer,
+				   int rx_buffer_pgcnt)
 {
 	unsigned int pagecnt_bias = rx_buffer->pagecnt_bias;
 	struct page *page = rx_buffer->page;
@@ -1883,7 +1885,7 @@ static bool i40e_can_reuse_rx_page(struct i40e_rx_buffer *rx_buffer)
 
 #if (PAGE_SIZE < 8192)
 	/* if we are only owner of page we can reuse it */
-	if (unlikely((page_count(page) - pagecnt_bias) > 1))
+	if (unlikely((rx_buffer_pgcnt - pagecnt_bias) > 1))
 		return false;
 #else
 #define I40E_LAST_OFFSET \
@@ -1942,16 +1944,24 @@ static void i40e_add_rx_frag(struct i40e_ring *rx_ring,
  * i40e_get_rx_buffer - Fetch Rx buffer and synchronize data for use
  * @rx_ring: rx descriptor ring to transact packets on
  * @size: size of buffer to add to skb
+ * @rx_buffer_pgcnt: buffer page refcount
  *
  * This function will pull an Rx buffer from the ring and synchronize it
  * for use by the CPU.
  */
 static struct i40e_rx_buffer *i40e_get_rx_buffer(struct i40e_ring *rx_ring,
-						 const unsigned int size)
+						 const unsigned int size,
+						 int *rx_buffer_pgcnt)
 {
 	struct i40e_rx_buffer *rx_buffer;
 
 	rx_buffer = i40e_rx_bi(rx_ring, rx_ring->next_to_clean);
+	*rx_buffer_pgcnt =
+#if (PAGE_SIZE < 8192)
+		page_count(rx_buffer->page);
+#else
+		0;
+#endif
 	prefetch_page_address(rx_buffer->page);
 
 	/* we are reusing so sync this buffer for CPU use */
@@ -2102,14 +2112,16 @@ static struct sk_buff *i40e_build_skb(struct i40e_ring *rx_ring,
  * i40e_put_rx_buffer - Clean up used buffer and either recycle or free
  * @rx_ring: rx descriptor ring to transact packets on
  * @rx_buffer: rx buffer to pull data from
+ * @rx_buffer_pgcnt: rx buffer page refcount pre xdp_do_redirect() call
  *
  * This function will clean up the contents of the rx_buffer.  It will
  * either recycle the buffer or unmap it and free the associated resources.
  */
 static void i40e_put_rx_buffer(struct i40e_ring *rx_ring,
-			       struct i40e_rx_buffer *rx_buffer)
+			       struct i40e_rx_buffer *rx_buffer,
+			       int rx_buffer_pgcnt)
 {
-	if (i40e_can_reuse_rx_page(rx_buffer)) {
+	if (i40e_can_reuse_rx_page(rx_buffer, rx_buffer_pgcnt)) {
 		/* hand second half of page back to the ring */
 		i40e_reuse_rx_page(rx_ring, rx_buffer);
 	} else {
@@ -2336,6 +2348,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
 	while (likely(total_rx_packets < (unsigned int)budget)) {
 		struct i40e_rx_buffer *rx_buffer;
 		union i40e_rx_desc *rx_desc;
+		int rx_buffer_pgcnt;
 		unsigned int size;
 		u64 qword;
 
@@ -2378,7 +2391,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
 			break;
 
 		i40e_trace(clean_rx_irq, rx_ring, rx_desc, skb);
-		rx_buffer = i40e_get_rx_buffer(rx_ring, size);
+		rx_buffer = i40e_get_rx_buffer(rx_ring, size, &rx_buffer_pgcnt);
 
 		/* retrieve a buffer from the ring */
 		if (!skb) {
@@ -2421,7 +2434,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
 			break;
 		}
 
-		i40e_put_rx_buffer(rx_ring, rx_buffer);
+		i40e_put_rx_buffer(rx_ring, rx_buffer, rx_buffer_pgcnt);
 		cleaned_count++;
 
 		if (i40e_is_non_eop(rx_ring, rx_desc, skb))
commit ec107e775d84392b35db46f6c3baa441e074042e
Author: Sven Auhagen <sven.auhagen at voleatech.de>
Date:   Wed Nov 11 18:04:53 2020 +0100

    igb: avoid transmit queue timeout in xdp path
    
    Since we share the transmit queue with the network stack,
    it is possible that we run into a transmit queue timeout.
    This will reset the queue.
    This happens under high load when XDP is using the
    transmit queue pretty much exclusively.
    
    netdev_start_xmit() sets the trans_start variable of the
    transmit queue to jiffies which is later utilized by dev_watchdog(),
    so to avoid timeout, let stack know that XDP xmit happened by
    bumping the trans_start within XDP Tx routines to jiffies.
    
    Fixes: 9cbc948b5a20 ("igb: add XDP support")
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Signed-off-by: Sven Auhagen <sven.auhagen at voleatech.de>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index af6ace6c0f87..0d343d050973 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2919,6 +2919,8 @@ static int igb_xdp_xmit_back(struct igb_adapter *adapter, struct xdp_buff *xdp)
 
 	nq = txring_txq(tx_ring);
 	__netif_tx_lock(nq, cpu);
+	/* Avoid transmit queue timeout since we share it with the slow path */
+	nq->trans_start = jiffies;
 	ret = igb_xmit_xdp_ring(adapter, tx_ring, xdpf);
 	__netif_tx_unlock(nq);
 
@@ -2951,6 +2953,9 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
 	nq = txring_txq(tx_ring);
 	__netif_tx_lock(nq, cpu);
 
+	/* Avoid transmit queue timeout since we share it with the slow path */
+	nq->trans_start = jiffies;
+
 	for (i = 0; i < n; i++) {
 		struct xdp_frame *xdpf = frames[i];
 		int err;
commit 3eca859008a75a4ad363db65b0fe83be1a3d5ad1
Author: Sven Auhagen <sven.auhagen at voleatech.de>
Date:   Wed Nov 11 18:04:52 2020 +0100

    igb: use xdp_do_flush
    
    Since it is a new XDP implementation change xdp_do_flush_map
    to xdp_do_flush.
    
    Fixes: 9cbc948b5a20 ("igb: add XDP support")
    Suggested-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Signed-off-by: Sven Auhagen <sven.auhagen at voleatech.de>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 8e412aaba0e3..af6ace6c0f87 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -8781,7 +8781,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
 	rx_ring->skb = skb;
 
 	if (xdp_xmit & IGB_XDP_REDIR)
-		xdp_do_flush_map();
+		xdp_do_flush();
 
 	if (xdp_xmit & IGB_XDP_TX) {
 		struct igb_ring *tx_ring = igb_xdp_tx_queue_mapping(adapter);
commit 681429dba99249546dda160e266e56035a2d750b
Author: Sven Auhagen <sven.auhagen at voleatech.de>
Date:   Wed Nov 11 18:04:51 2020 +0100

    igb: skb add metasize for xdp
    
    add metasize if it is set in xdp
    
    Fixes: 9cbc948b5a20 ("igb: add XDP support")
    Suggested-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Signed-off-by: Sven Auhagen <sven.auhagen at voleatech.de>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index a0a310a75cc5..8e412aaba0e3 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -8357,6 +8357,7 @@ static struct sk_buff *igb_build_skb(struct igb_ring *rx_ring,
 				SKB_DATA_ALIGN(xdp->data_end -
 					       xdp->data_hard_start);
 #endif
+	unsigned int metasize = xdp->data - xdp->data_meta;
 	struct sk_buff *skb;
 
 	/* prefetch first cache line of first page */
@@ -8371,6 +8372,9 @@ static struct sk_buff *igb_build_skb(struct igb_ring *rx_ring,
 	skb_reserve(skb, xdp->data - xdp->data_hard_start);
 	__skb_put(skb, xdp->data_end - xdp->data);
 
+	if (metasize)
+		skb_metadata_set(skb, metasize);
+
 	/* pull timestamp out of packet data */
 	if (igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP)) {
 		igb_ptp_rx_pktstamp(rx_ring->q_vector, skb->data, skb);
commit 2e2bb5594ca0a5885dc93055ab0f9b5fbcdaa403
Author: Sven Auhagen <sven.auhagen at voleatech.de>
Date:   Wed Nov 11 18:04:50 2020 +0100

    igb: XDP extack message on error
    
    Add an extack error message when the RX buffer size is too small
    for the frame size.
    
    Fixes: 9cbc948b5a20 ("igb: add XDP support")
    Suggested-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Signed-off-by: Sven Auhagen <sven.auhagen at voleatech.de>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 0a9198037b98..a0a310a75cc5 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2824,20 +2824,25 @@ static int igb_setup_tc(struct net_device *dev, enum tc_setup_type type,
 	}
 }
 
-static int igb_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
+static int igb_xdp_setup(struct net_device *dev, struct netdev_bpf *bpf)
 {
 	int i, frame_size = dev->mtu + IGB_ETH_PKT_HDR_PAD;
 	struct igb_adapter *adapter = netdev_priv(dev);
+	struct bpf_prog *prog = bpf->prog, *old_prog;
 	bool running = netif_running(dev);
-	struct bpf_prog *old_prog;
 	bool need_reset;
 
 	/* verify igb ring attributes are sufficient for XDP */
 	for (i = 0; i < adapter->num_rx_queues; i++) {
 		struct igb_ring *ring = adapter->rx_ring[i];
 
-		if (frame_size > igb_rx_bufsz(ring))
+		if (frame_size > igb_rx_bufsz(ring)) {
+			NL_SET_ERR_MSG_MOD(bpf->extack,
+					   "The RX buffer size is too small for the frame size");
+			netdev_warn(dev, "XDP RX buffer size %d is too small for the frame size %d\n",
+				    igb_rx_bufsz(ring), frame_size);
 			return -EINVAL;
+		}
 	}
 
 	old_prog = xchg(&adapter->xdp_prog, prog);
@@ -2869,7 +2874,7 @@ static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp)
 {
 	switch (xdp->command) {
 	case XDP_SETUP_PROG:
-		return igb_xdp_setup(dev, xdp->prog);
+		return igb_xdp_setup(dev, xdp);
 	default:
 		return -EINVAL;
 	}
@@ -6499,7 +6504,9 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)
 			struct igb_ring *ring = adapter->rx_ring[i];
 
 			if (max_frame > igb_rx_bufsz(ring)) {
-				netdev_warn(adapter->netdev, "Requested MTU size is not supported with XDP\n");
+				netdev_warn(adapter->netdev,
+					    "Requested MTU size is not supported with XDP. Max frame size is %d\n",
+					    max_frame);
 				return -EINVAL;
 			}
 		}
commit b829ec1a66bc3dda4b01ab4c57d41ad1a1f82fed
Author: Sven Auhagen <sven.auhagen at voleatech.de>
Date:   Wed Nov 11 18:04:49 2020 +0100

    igb: take VLAN double header into account
    
    Increase the packet header padding to include double VLAN tagging.
    This patch uses a macro for this.
    
    Fixes: 9cbc948b5a20 ("igb: add XDP support")
    Suggested-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Signed-off-by: Sven Auhagen <sven.auhagen at voleatech.de>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
index 0286d2fceee4..aaa954aae574 100644
--- a/drivers/net/ethernet/intel/igb/igb.h
+++ b/drivers/net/ethernet/intel/igb/igb.h
@@ -138,6 +138,8 @@ struct vf_mac_filter {
 /* this is the size past which hardware will drop packets when setting LPE=0 */
 #define MAXIMUM_ETHERNET_VLAN_SIZE 1522
 
+#define IGB_ETH_PKT_HDR_PAD	(ETH_HLEN + ETH_FCS_LEN + (VLAN_HLEN * 2))
+
 /* Supported Rx Buffer Sizes */
 #define IGB_RXBUFFER_256	256
 #define IGB_RXBUFFER_1536	1536
@@ -247,6 +249,9 @@ enum igb_tx_flags {
 #define IGB_SFF_ADDRESSING_MODE		0x4
 #define IGB_SFF_8472_UNSUP		0x00
 
+/* TX resources are shared between XDP and netstack
+ * and we need to tag the buffer type to distinguish them
+ */
 enum igb_tx_buf_type {
 	IGB_TYPE_SKB = 0,
 	IGB_TYPE_XDP,
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 08cc6f59aa2e..0a9198037b98 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2826,7 +2826,7 @@ static int igb_setup_tc(struct net_device *dev, enum tc_setup_type type,
 
 static int igb_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
 {
-	int i, frame_size = dev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
+	int i, frame_size = dev->mtu + IGB_ETH_PKT_HDR_PAD;
 	struct igb_adapter *adapter = netdev_priv(dev);
 	bool running = netif_running(dev);
 	struct bpf_prog *old_prog;
@@ -3950,8 +3950,7 @@ static int igb_sw_init(struct igb_adapter *adapter)
 	/* set default work limits */
 	adapter->tx_work_limit = IGB_DEFAULT_TX_WORK;
 
-	adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN +
-				  VLAN_HLEN;
+	adapter->max_frame_size = netdev->mtu + IGB_ETH_PKT_HDR_PAD;
 	adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
 
 	spin_lock_init(&adapter->nfc_lock);
@@ -6491,7 +6490,7 @@ static void igb_get_stats64(struct net_device *netdev,
 static int igb_change_mtu(struct net_device *netdev, int new_mtu)
 {
 	struct igb_adapter *adapter = netdev_priv(netdev);
-	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
+	int max_frame = new_mtu + IGB_ETH_PKT_HDR_PAD;
 
 	if (adapter->xdp_prog) {
 		int i;
commit cfb33e174fa25d9d830683a1e1b22850546103b5
Author: Sven Auhagen <sven.auhagen at voleatech.de>
Date:   Wed Nov 11 18:04:48 2020 +0100

    igb: XDP xmit back fix error code
    
    The igb XDP xmit back function should only return
    defined error codes.
    
    Fixes: 9cbc948b5a20 ("igb: add XDP support")
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
    Signed-off-by: Sven Auhagen <sven.auhagen at voleatech.de>
    Tested-by: Sandeep Penigalapati <sandeep.penigalapati at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 5fc2c381da55..08cc6f59aa2e 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2910,7 +2910,7 @@ static int igb_xdp_xmit_back(struct igb_adapter *adapter, struct xdp_buff *xdp)
 	 */
 	tx_ring = adapter->xdp_prog ? igb_xdp_tx_queue_mapping(adapter) : NULL;
 	if (unlikely(!tx_ring))
-		return -ENXIO;
+		return IGB_XDP_CONSUMED;
 
 	nq = txring_txq(tx_ring);
 	__netif_tx_lock(nq, cpu);
commit a2f5ea9e314ba6778f885c805c921e9362ec0420
Merge: ca4bbdaf1716 69fe24d1d80f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 9 14:49:48 2020 -0800

    Merge tag 'arm-soc-fixes-v5.10-4b' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
    
    Pull ARM SoC fixes from Arnd Bergmann:
     "There are a few more PHY mode changes for allwinner SoC based boards
      with a Realtek PHY after the driver changed its behavior, I assume
      there will be more of these in the future. Also on for Allwinner, the
      Banana Pi M2 board had a regression that led to some devices not
      working because of a slightly incorrect voltage being applied.
    
      By popular demand, I picked up a change from Krzysztof Kozlowski to
      actually list the SoC tree in the MAINTAINERS file. We don't want to
      get Cc'd on normal patches that are picked up by platform maintainers,
      but the lack of an entry has led to confusion in the past.
    
      All the other changes are fairly benign, fixing boot-time or
      compile-time warning messages in various places:
    
       - A dtc warning on the OLPC XO-1.75
    
       - A boot-time warning on i.MX6 wandboard
    
       - A harmless compile-time warning
    
       - A regression causing one of the i.MX6 SoCs to be identified as
         another
    
       - Missing SoC identification of Allwinner V3 and S3"
    
    * tag 'arm-soc-fixes-v5.10-4b' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc:
      firmware: xilinx: Mark pm_api_features_map with static keyword
      ARM: dts: mmp2-olpc-xo-1-75: clear the warnings when make dtbs
      MAINTAINERS: add a limited ARM and ARM64 SoC entry
      MAINTAINERS: correct SoC Git address (formerly: arm-soc)
      ARM: keystone: remove SECTION_SIZE_BITS/MAX_PHYSMEM_BITS
      arm64: dts: allwinner: H5: NanoPi Neo Plus2: phy-mode rgmii-id
      arm64: dts: allwinner: A64 Sopine: phy-mode rgmii-id
      ARM: dts: imx6qdl-kontron-samx6i: fix I2C_PM scl pin
      ARM: dts: imx6qdl-wandboard-revd1: Remove PAD_GPIO_6 from enetgrp
      ARM: imx: Use correct SRC base address
      ARM: dts: sun7i: pcduino3-nano: enable RGMII RX/TX delay on PHY
      ARM: dts: sun8i: v3s: fix GIC node memory range
      ARM: dts: sun8i: v40: bananapi-m2-berry: Fix ethernet node
      ARM: dts: sun8i: r40: bananapi-m2-berry: Fix dcdc1 regulator
      ARM: dts: sun7i: bananapi: Enable RGMII RX/TX delay on Ethernet PHY
      ARM: dts: s3: pinecube: align compatible property to other S3 boards
      ARM: sunxi: Add machine match for the Allwinner V3 SoC
      arm64: dts: allwinner: h6: orangepi-one-plus: Fix ethernet

commit c02bd115b1d25931159f89c7d9bf47a30f5d4b41
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Wed Dec 9 14:39:56 2020 -0800

    Revert "geneve: pull IP header before ECN decapsulation"
    
    This reverts commit 4179b00c04d1 ("geneve: pull IP header before ECN decapsulation").
    
    Eric says: "network header should have been pulled already before
    hitting geneve_rx()". Let's revert the syzbot fix since it's causing
    more harm than good, and revisit.
    
    Suggested-by: Eric Dumazet <edumazet at google.com>
    Reported-by: Jianlin Shi <jishi at redhat.com>
    Fixes: 4179b00c04d1 ("geneve: pull IP header before ECN decapsulation")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=210569
    Link: https://lore.kernel.org/netdev/CANn89iJVWfb=2i7oU1=D55rOyQnBbbikf+Mc6XHMkY7YX-yGEw@mail.gmail.com/
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index 8ae9ce2014a4..1426bfc009bc 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -257,21 +257,11 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
 		skb_dst_set(skb, &tun_dst->dst);
 
 	/* Ignore packet loops (and multicast echo) */
-	if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr))
-		goto rx_error;
-
-	switch (skb_protocol(skb, true)) {
-	case htons(ETH_P_IP):
-		if (pskb_may_pull(skb, sizeof(struct iphdr)))
-			goto rx_error;
-		break;
-	case htons(ETH_P_IPV6):
-		if (pskb_may_pull(skb, sizeof(struct ipv6hdr)))
-			goto rx_error;
-		break;
-	default:
-		goto rx_error;
+	if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr)) {
+		geneve->dev->stats.rx_errors++;
+		goto drop;
 	}
+
 	oiph = skb_network_header(skb);
 	skb_reset_network_header(skb);
 
@@ -308,8 +298,6 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
 		dev_sw_netstats_rx_add(geneve->dev, len);
 
 	return;
-rx_error:
-	geneve->dev->stats.rx_errors++;
 drop:
 	/* Consume bad packet */
 	kfree_skb(skb);
commit 69fe24d1d80feac4289778582cf0a15256d59baf
Author: Zou Wei <zou_wei at huawei.com>
Date:   Tue Dec 1 19:51:53 2020 +0800

    firmware: xilinx: Mark pm_api_features_map with static keyword
    
    Fix the following sparse warning:
    
    drivers/firmware/xilinx/zynqmp.c:32:1: warning: symbol 'pm_api_features_map' was not declared. Should it be static?
    
    Signed-off-by: Zou Wei <zou_wei at huawei.com>
    Link: https://lore.kernel.org/r/1606823513-121578-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Michal Simek <michal.simek at xilinx.com>
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c
index d08ac824c993..fd95edeb702b 100644
--- a/drivers/firmware/xilinx/zynqmp.c
+++ b/drivers/firmware/xilinx/zynqmp.c
@@ -29,7 +29,7 @@
 #define PM_API_FEATURE_CHECK_MAX_ORDER  7
 
 static bool feature_check_enabled;
-DEFINE_HASHTABLE(pm_api_features_map, PM_API_FEATURE_CHECK_MAX_ORDER);
+static DEFINE_HASHTABLE(pm_api_features_map, PM_API_FEATURE_CHECK_MAX_ORDER);
 
 /**
  * struct pm_api_feature_data - PM API Feature data
commit 387270cb0b4035491c4812effd8b5af0e385a66c
Author: Zhen Lei <thunder.leizhen at huawei.com>
Date:   Mon Dec 7 16:47:52 2020 +0800

    ARM: dts: mmp2-olpc-xo-1-75: clear the warnings when make dtbs
    
    The check_spi_bus_bridge() in scripts/dtc/checks.c requires that the node
    have "spi-slave" property must with "#address-cells = <0>" and
    "#size-cells = <0>". But currently both "#address-cells" and "#size-cells"
    properties are deleted, the corresponding default values are 2 and 1. As a
    result, the check fails and below warnings is displayed.
    
    arch/arm/boot/dts/mmp2.dtsi:472.23-480.6: Warning (spi_bus_bridge): \
    /soc/apb at d4000000/spi at d4037000: incorrect #address-cells for SPI bus
      also defined at arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts:225.7-237.3
    arch/arm/boot/dts/mmp2.dtsi:472.23-480.6: Warning (spi_bus_bridge): \
    /soc/apb at d4000000/spi at d4037000: incorrect #size-cells for SPI bus
      also defined at arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts:225.7-237.3
    arch/arm/boot/dts/mmp2-olpc-xo-1-75.dtb: Warning (spi_bus_reg): \
    Failed prerequisite 'spi_bus_bridge'
    
    Because the value of "#size-cells" is already defined as zero in the node
    "ssp3: spi at d4037000" in arch/arm/boot/dts/mmp2.dtsi. So we only need to
    explicitly add "#address-cells = <0>" and keep "#size-cells" no change.
    
    Signed-off-by: Zhen Lei <thunder.leizhen at huawei.com>
    Link: https://lore.kernel.org/r/20201207084752.1665-2-thunder.leizhen@huawei.com'
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts b/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts
index adde62d6fce7..342304f5653a 100644
--- a/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts
+++ b/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts
@@ -223,8 +223,7 @@
 };
 
 &ssp3 {
-	/delete-property/ #address-cells;
-	/delete-property/ #size-cells;
+	#address-cells = <0>;
 	spi-slave;
 	status = "okay";
 	ready-gpios = <&gpio 125 GPIO_ACTIVE_HIGH>;
commit 340b940ea0ed12d9adbb8f72dea17d516b2019e8
Author: Leon Romanovsky <leonro at nvidia.com>
Date:   Fri Dec 4 08:42:05 2020 +0200

    RDMA/cm: Fix an attempt to use non-valid pointer when cleaning timewait
    
    If cm_create_timewait_info() fails, the timewait_info pointer will contain
    an error value and will be used in cm_remove_remote() later.
    
      general protection fault, probably for non-canonical address 0xdffffc0000000024: 0000 [#1] SMP KASAN PTI
      KASAN: null-ptr-deref in range [0×0000000000000120-0×0000000000000127]
      CPU: 2 PID: 12446 Comm: syz-executor.3 Not tainted 5.10.0-rc5-5d4c0742a60e #27
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
      RIP: 0010:cm_remove_remote.isra.0+0x24/0×170 drivers/infiniband/core/cm.c:978
      Code: 84 00 00 00 00 00 41 54 55 53 48 89 fb 48 8d ab 2d 01 00 00 e8 7d bf 4b fe 48 89 ea 48 b8 00 00 00 00 00 fc ff df 48 c1 ea 03 <0f> b6 04 02 48 89 ea 83 e2 07 38 d0 7f 08 84 c0 0f 85 fc 00 00 00
      RSP: 0018:ffff888013127918 EFLAGS: 00010006
      RAX: dffffc0000000000 RBX: fffffffffffffff4 RCX: ffffc9000a18b000
      RDX: 0000000000000024 RSI: ffffffff82edc573 RDI: fffffffffffffff4
      RBP: 0000000000000121 R08: 0000000000000001 R09: ffffed1002624f1d
      R10: 0000000000000003 R11: ffffed1002624f1c R12: ffff888107760c70
      R13: ffff888107760c40 R14: fffffffffffffff4 R15: ffff888107760c9c
      FS:  00007fe1ffcc1700(0000) GS:ffff88811a600000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 0000001b2ff21000 CR3: 000000010f504001 CR4: 0000000000370ee0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       cm_destroy_id+0x189/0×15b0 drivers/infiniband/core/cm.c:1155
       cma_connect_ib drivers/infiniband/core/cma.c:4029 [inline]
       rdma_connect_locked+0x1100/0×17c0 drivers/infiniband/core/cma.c:4107
       rdma_connect+0x2a/0×40 drivers/infiniband/core/cma.c:4140
       ucma_connect+0x277/0×340 drivers/infiniband/core/ucma.c:1069
       ucma_write+0x236/0×2f0 drivers/infiniband/core/ucma.c:1724
       vfs_write+0x220/0×830 fs/read_write.c:603
       ksys_write+0x1df/0×240 fs/read_write.c:658
       do_syscall_64+0x33/0×40 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: a977049dacde ("[PATCH] IB: Add the kernel CM implementation")
    Link: https://lore.kernel.org/r/20201204064205.145795-1-leon@kernel.org
    Reviewed-by: Maor Gottlieb <maorg at nvidia.com>
    Reported-by: Amit Matityahu <mitm at nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro at nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 012156624b82..5afd142fe8c7 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -1522,6 +1522,7 @@ int ib_send_cm_req(struct ib_cm_id *cm_id,
 							    id.local_id);
 	if (IS_ERR(cm_id_priv->timewait_info)) {
 		ret = PTR_ERR(cm_id_priv->timewait_info);
+		cm_id_priv->timewait_info = NULL;
 		goto out;
 	}
 
@@ -2114,6 +2115,7 @@ static int cm_req_handler(struct cm_work *work)
 							    id.local_id);
 	if (IS_ERR(cm_id_priv->timewait_info)) {
 		ret = PTR_ERR(cm_id_priv->timewait_info);
+		cm_id_priv->timewait_info = NULL;
 		goto destroy;
 	}
 	cm_id_priv->timewait_info->work.remote_id = cm_id_priv->id.remote_id;
commit ca4bbdaf171604841f77648a2877e2e43db69b71
Merge: a68a0262abda 4165bf015ba9
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 9 09:59:14 2020 -0800

    Merge tag 'iommu-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
    
    Pull iommu fix from Will Deacon:
     "Fix interrupt table length definition for AMD IOMMU.
    
      It's actually a fix for a fix, where the size of the interrupt
      remapping table was increased but a related constant for the
      size of the interrupt table was forgotten"
    
    * tag 'iommu-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
      iommu/amd: Set DTE[IntTabLen] to represent 512 IRTEs

commit 323a391a220c4a234cb1e678689d7f4c3b73f863
Author: Oliver Hartkopp <socketcan at hartkopp.net>
Date:   Fri Dec 4 14:35:07 2020 +0100

    can: isotp: isotp_setsockopt(): block setsockopt on bound sockets
    
    The isotp socket can be widely configured in its behaviour regarding addressing
    types, fill-ups, receive pattern tests and link layer length. Usually all
    these settings need to be fixed before bind() and can not be changed
    afterwards.
    
    This patch adds a check to enforce the common usage pattern.
    
    Fixes: e057dd3fc20f ("can: add ISO 15765-2:2016 transport protocol")
    Signed-off-by: Oliver Hartkopp <socketcan at hartkopp.net>
    Tested-by: Thomas Wagner <thwa1 at web.de>
    Link: https://lore.kernel.org/r/20201203140604.25488-2-socketcan@hartkopp.net
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Link: https://lore.kernel.org/r/20201204133508.742120-3-mkl@pengutronix.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/can/isotp.c b/net/can/isotp.c
index d78ab13bd8be..26bdc3c20b7e 100644
--- a/net/can/isotp.c
+++ b/net/can/isotp.c
@@ -1157,6 +1157,9 @@ static int isotp_setsockopt(struct socket *sock, int level, int optname,
 	if (level != SOL_CAN_ISOTP)
 		return -EINVAL;
 
+	if (so->bound)
+		return -EISCONN;
+
 	switch (optname) {
 	case CAN_ISOTP_OPTS:
 		if (optlen != sizeof(struct can_isotp_options))
commit 4e083fdfa39db29bbc7725e229e701867d0da183
Merge: b62527005d46 8158cad13435
Author: Daniel Borkmann <daniel at iogearbox.net>
Date:   Wed Dec 9 16:27:42 2020 +0100

    Merge branch 'bpf-xdp-offload-fixes'
    
    Toke Høiland-Jørgensen says:
    
    ====================
    This series restores the test_offload.py selftest to working order. It seems a
    number of subtle behavioural changes have crept into various subsystems which
    broke test_offload.py in a number of ways. Most of these are fairly benign
    changes where small adjustments to the test script seems to be the best fix,
    but one is an actual kernel bug that I've observed in the wild caused by a bad
    interaction between xdp_attachment_flags_ok() and the rework of XDP program
    handling in the core netdev code.
    
    Patch 1 fixes the bug by removing xdp_attachment_flags_ok(), and the reminder of
    the patches are adjustments to test_offload.py, including a new feature for
    netdevsim to force a BPF verification fail. Please see the individual patches
    for details.
    
    Changelog:
    
    v4:
      - Accidentally truncated the Fixes: hashes in patches 3/4 to 11 chars
    v3:
      - Add Fixes: tags
    v2:
      - Replace xdp_attachment_flags_ok() with a check in dev_xdp_attach()
      - Better packing of struct nsim_dev
    ====================
    
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>

commit 8158cad13435639cd4962fb88970960f880ef6d9
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:43 2020 +0100

    selftests/bpf/test_offload.py: Filter bpftool internal map when counting maps
    
    A few of the tests in test_offload.py expects to see a certain number of
    maps created, and checks this by counting the number of maps returned by
    bpftool. There is already a filter that will remove any maps already there
    at the beginning of the test, but bpftool now creates a map for the PID
    iterator rodata on each invocation, which makes the map count wrong. Fix
    this by also filtering the pid_iter.rodata map by name when counting.
    
    Fixes: d53dee3fe013 ("tools/bpftool: Show info for processes holding BPF map/prog/link/btf FDs")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752226387.110217.9887866138149423444.stgit@toke.dk

diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py
index 2128fbd8414b..b99bb8ed3ed4 100755
--- a/tools/testing/selftests/bpf/test_offload.py
+++ b/tools/testing/selftests/bpf/test_offload.py
@@ -184,9 +184,7 @@ def bpftool_prog_list(expected=None, ns=""):
 def bpftool_map_list(expected=None, ns=""):
     _, maps = bpftool("map show", JSON=True, ns=ns, fail=True)
     # Remove the base maps
-    for m in base_maps:
-        if m in maps:
-            maps.remove(m)
+    maps = [m for m in maps if m not in base_maps and m.get('name') not in base_map_names]
     if expected is not None:
         if len(maps) != expected:
             fail(True, "%d BPF maps loaded, expected %d" %
@@ -770,6 +768,9 @@ ret, progs = bpftool("prog", fail=False)
 skip(ret != 0, "bpftool not installed")
 base_progs = progs
 _, base_maps = bpftool("map")
+base_map_names = [
+    'pid_iter.rodata' # created on each bpftool invocation
+]
 
 # Check netdevsim
 ret, out = cmd("modprobe netdevsim", fail=False)
commit 766e62b7fcd2cf1d43e6594ba37c659dc48f7ddb
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:42 2020 +0100

    selftests/bpf/test_offload.py: Reset ethtool features after failed setting
    
    When setting the ethtool feature flag fails (as expected for the test), the
    kernel now tracks that the feature was requested to be 'off' and refuses to
    subsequently disable it again. So reset it back to 'on' so a subsequent
    disable (that's not supposed to fail) can succeed.
    
    Fixes: 417ec26477a5 ("selftests/bpf: add offload test based on netdevsim")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752226280.110217.10696241563705667871.stgit@toke.dk

diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py
index 51a5e4d939cc..2128fbd8414b 100755
--- a/tools/testing/selftests/bpf/test_offload.py
+++ b/tools/testing/selftests/bpf/test_offload.py
@@ -946,6 +946,7 @@ try:
     start_test("Test disabling TC offloads is rejected while filters installed...")
     ret, _ = sim.set_ethtool_tc_offloads(False, fail=False)
     fail(ret == 0, "Driver should refuse to disable TC offloads with filters installed...")
+    sim.set_ethtool_tc_offloads(True)
 
     start_test("Test qdisc removal frees things...")
     sim.tc_flush_filters()
commit 852c2ee338f0ac6026458615b624e1c496142cf6
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:41 2020 +0100

    selftests/bpf/test_offload.py: Fix expected case of extack messages
    
    Commit 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF programs
    in net_device") changed the case of some of the extack messages being
    returned when attaching of XDP programs failed. This broke test_offload.py,
    so let's fix the test to reflect this.
    
    Fixes: 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF programs in net_device")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752226175.110217.11214100824416344952.stgit@toke.dk

diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py
index 61527b43f067..51a5e4d939cc 100755
--- a/tools/testing/selftests/bpf/test_offload.py
+++ b/tools/testing/selftests/bpf/test_offload.py
@@ -1004,7 +1004,7 @@ try:
                               fail=False, include_stderr=True)
     fail(ret == 0, "Replaced XDP program with a program in different mode")
     check_extack(err,
-                 "native and generic XDP can't be active at the same time.",
+                 "Native and generic XDP can't be active at the same time.",
                  args)
 
     start_test("Test MTU restrictions...")
@@ -1035,7 +1035,7 @@ try:
     offload = bpf_pinned("/sys/fs/bpf/offload")
     ret, _, err = sim.set_xdp(offload, "drv", fail=False, include_stderr=True)
     fail(ret == 0, "attached offloaded XDP program to drv")
-    check_extack(err, "using device-bound program without HW_MODE flag is not supported.", args)
+    check_extack(err, "Using device-bound program without HW_MODE flag is not supported.", args)
     rm("/sys/fs/bpf/offload")
     sim.wait_for_flush()
 
commit d8b5e76ae4e02908d000397597c6bc2868362fbb
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:40 2020 +0100

    selftests/bpf/test_offload.py: Only check verifier log on verification fails
    
    Since commit 6f8a57ccf851 ("bpf: Make verifier log more relevant by
    default"), the verifier discards log messages for successfully-verified
    programs. This broke test_offload.py which is looking for a verification
    message from the driver callback. Change test_offload.py to use the toggle
    in netdevsim to make the verification fail before looking for the
    verification message.
    
    Fixes: 6f8a57ccf851 ("bpf: Make verifier log more relevant by default")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752226069.110217.12370824996153348073.stgit@toke.dk

diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py
index becd27b2f4ba..61527b43f067 100755
--- a/tools/testing/selftests/bpf/test_offload.py
+++ b/tools/testing/selftests/bpf/test_offload.py
@@ -911,11 +911,18 @@ try:
 
     sim.tc_flush_filters()
 
+    start_test("Test TC offloads failure...")
+    sim.dfs["dev/bpf_bind_verifier_accept"] = 0
+    ret, _, err = sim.cls_bpf_add_filter(obj, verbose=True, skip_sw=True,
+                                         fail=False, include_stderr=True)
+    fail(ret == 0, "TC filter did not reject with TC offloads enabled")
+    check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
+    sim.dfs["dev/bpf_bind_verifier_accept"] = 1
+
     start_test("Test TC offloads work...")
     ret, _, err = sim.cls_bpf_add_filter(obj, verbose=True, skip_sw=True,
                                          fail=False, include_stderr=True)
     fail(ret != 0, "TC filter did not load with TC offloads enabled")
-    check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
 
     start_test("Test TC offload basics...")
     dfs = simdev.dfs_get_bound_progs(expected=1)
@@ -1032,6 +1039,15 @@ try:
     rm("/sys/fs/bpf/offload")
     sim.wait_for_flush()
 
+    start_test("Test XDP load failure...")
+    sim.dfs["dev/bpf_bind_verifier_accept"] = 0
+    ret, _, err = bpftool_prog_load("sample_ret0.o", "/sys/fs/bpf/offload",
+                                 dev=sim['ifname'], fail=False, include_stderr=True)
+    fail(ret == 0, "verifier should fail on load")
+    check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
+    sim.dfs["dev/bpf_bind_verifier_accept"] = 1
+    sim.wait_for_flush()
+
     start_test("Test XDP offload...")
     _, _, err = sim.set_xdp(obj, "offload", verbose=True, include_stderr=True)
     ipl = sim.ip_link_show(xdp=True)
@@ -1039,7 +1055,6 @@ try:
     progs = bpftool_prog_list(expected=1)
     prog = progs[0]
     fail(link_xdp["id"] != prog["id"], "Loaded program has wrong ID")
-    check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
 
     start_test("Test XDP offload is device bound...")
     dfs = simdev.dfs_get_bound_progs(expected=1)
commit e4ff5aa469403462091eb22e2b0843b894167e10
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:39 2020 +0100

    netdevsim: Add debugfs toggle to reject BPF programs in verifier
    
    This adds a new debugfs toggle ('bpf_bind_verifier_accept') that can be
    used to make netdevsim reject BPF programs from being accepted by the
    verifier. If this toggle (which defaults to true) is set to false,
    nsim_bpf_verify_insn() will return EOPNOTSUPP on the last
    instruction (after outputting the 'Hello from netdevsim' verifier message).
    
    This makes it possible to check the verification callback in the driver
    from test_offload.py in selftests, since the verifier now clears the
    verifier log on a successful load, hiding the message from the driver.
    
    Fixes: 6f8a57ccf851 ("bpf: Make verifier log more relevant by default")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752225964.110217.12584017165318065332.stgit@toke.dk

diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c
index 85546664bdd5..90aafb56f140 100644
--- a/drivers/net/netdevsim/bpf.c
+++ b/drivers/net/netdevsim/bpf.c
@@ -63,15 +63,20 @@ static int
 nsim_bpf_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn)
 {
 	struct nsim_bpf_bound_prog *state;
+	int ret = 0;
 
 	state = env->prog->aux->offload->dev_priv;
 	if (state->nsim_dev->bpf_bind_verifier_delay && !insn_idx)
 		msleep(state->nsim_dev->bpf_bind_verifier_delay);
 
-	if (insn_idx == env->prog->len - 1)
+	if (insn_idx == env->prog->len - 1) {
 		pr_vlog(env, "Hello from netdevsim!\n");
 
-	return 0;
+		if (!state->nsim_dev->bpf_bind_verifier_accept)
+			ret = -EOPNOTSUPP;
+	}
+
+	return ret;
 }
 
 static int nsim_bpf_finalize(struct bpf_verifier_env *env)
@@ -595,6 +600,9 @@ int nsim_bpf_dev_init(struct nsim_dev *nsim_dev)
 			    &nsim_dev->bpf_bind_accept);
 	debugfs_create_u32("bpf_bind_verifier_delay", 0600, nsim_dev->ddir,
 			   &nsim_dev->bpf_bind_verifier_delay);
+	nsim_dev->bpf_bind_verifier_accept = true;
+	debugfs_create_bool("bpf_bind_verifier_accept", 0600, nsim_dev->ddir,
+			    &nsim_dev->bpf_bind_verifier_accept);
 	return 0;
 }
 
diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h
index 827fc80f50a0..c4e7ad2a1964 100644
--- a/drivers/net/netdevsim/netdevsim.h
+++ b/drivers/net/netdevsim/netdevsim.h
@@ -189,6 +189,7 @@ struct nsim_dev {
 	struct dentry *take_snapshot;
 	struct bpf_offload_dev *bpf_dev;
 	bool bpf_bind_accept;
+	bool bpf_bind_verifier_accept;
 	u32 bpf_bind_verifier_delay;
 	struct dentry *ddir_bpf_bound_progs;
 	u32 prog_id_gen;
commit 0b5b6e747c86e57b7ebd64ccb84314a227ccfcc2
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:38 2020 +0100

    selftests/bpf/test_offload.py: Remove check for program load flags match
    
    Since we just removed the xdp_attachment_flags_ok() callback, also remove
    the check for it in test_offload.py, and replace it with a test for the new
    ambiguity-avoid check when multiple programs are loaded.
    
    Fixes: 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF programs in net_device")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752225858.110217.13036901876869496246.stgit@toke.dk

diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py
index 43c9cda199b8..becd27b2f4ba 100755
--- a/tools/testing/selftests/bpf/test_offload.py
+++ b/tools/testing/selftests/bpf/test_offload.py
@@ -716,13 +716,11 @@ def test_multi_prog(simdev, sim, obj, modename, modeid):
     fail(ret == 0, "Replaced one of programs without -force")
     check_extack(err, "XDP program already attached.", args)
 
-    if modename == "" or modename == "drv":
-        othermode = "" if modename == "drv" else "drv"
-        start_test("Test multi-attachment XDP - detach...")
-        ret, _, err = sim.unset_xdp(othermode, force=True,
-                                    fail=False, include_stderr=True)
-        fail(ret == 0, "Removed program with a bad mode")
-        check_extack(err, "program loaded with different flags.", args)
+    start_test("Test multi-attachment XDP - remove without mode...")
+    ret, _, err = sim.unset_xdp("", force=True,
+                                fail=False, include_stderr=True)
+    fail(ret == 0, "Removed program without a mode flag")
+    check_extack(err, "More than one program loaded, unset mode is ambiguous.", args)
 
     sim.unset_xdp("offload")
     xdp = sim.ip_link_show(xdp=True)["xdp"]
@@ -1001,16 +999,6 @@ try:
     check_extack(err,
                  "native and generic XDP can't be active at the same time.",
                  args)
-    ret, _, err = sim.set_xdp(obj, "", force=True,
-                              fail=False, include_stderr=True)
-    fail(ret == 0, "Replaced XDP program with a program in different mode")
-    check_extack(err, "program loaded with different flags.", args)
-
-    start_test("Test XDP prog remove with bad flags...")
-    ret, _, err = sim.unset_xdp("", force=True,
-                                fail=False, include_stderr=True)
-    fail(ret == 0, "Removed program with a bad mode")
-    check_extack(err, "program loaded with different flags.", args)
 
     start_test("Test MTU restrictions...")
     ret, _ = sim.set_mtu(9000, fail=False)
commit 998f17296234aa8d3676b4a13962eb39f4ad24e0
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Wed Dec 9 14:57:37 2020 +0100

    xdp: Remove the xdp_attachment_flags_ok() callback
    
    Since commit 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF
    programs in net_device"), the XDP program attachment info is now maintained
    in the core code. This interacts badly with the xdp_attachment_flags_ok()
    check that prevents unloading an XDP program with different load flags than
    it was loaded with. In practice, two kinds of failures are seen:
    
    - An XDP program loaded without specifying a mode (and which then ends up
      in driver mode) cannot be unloaded if the program mode is specified on
      unload.
    
    - The dev_xdp_uninstall() hook always calls the driver callback with the
      mode set to the type of the program but an empty flags argument, which
      means the flags_ok() check prevents the program from being removed,
      leading to bpf prog reference leaks.
    
    The original reason this check was added was to avoid ambiguity when
    multiple programs were loaded. With the way the checks are done in the core
    now, this is quite simple to enforce in the core code, so let's add a check
    there and get rid of the xdp_attachment_flags_ok() callback entirely.
    
    Fixes: 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF programs in net_device")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Jakub Kicinski <kuba at kernel.org>
    Link: https://lore.kernel.org/bpf/160752225751.110217.10267659521308669050.stgit@toke.dk

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index b150da43adb2..437226866ce8 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -3562,9 +3562,6 @@ static int nfp_net_xdp_setup_drv(struct nfp_net *nn, struct netdev_bpf *bpf)
 	struct nfp_net_dp *dp;
 	int err;
 
-	if (!xdp_attachment_flags_ok(&nn->xdp, bpf))
-		return -EBUSY;
-
 	if (!prog == !nn->dp.xdp_prog) {
 		WRITE_ONCE(nn->dp.xdp_prog, prog);
 		xdp_attachment_setup(&nn->xdp, bpf);
@@ -3593,9 +3590,6 @@ static int nfp_net_xdp_setup_hw(struct nfp_net *nn, struct netdev_bpf *bpf)
 {
 	int err;
 
-	if (!xdp_attachment_flags_ok(&nn->xdp_hw, bpf))
-		return -EBUSY;
-
 	err = nfp_app_xdp_offload(nn->app, nn, bpf->prog, bpf->extack);
 	if (err)
 		return err;
diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c
index 31c5e36ff706..424e644724e4 100644
--- a/drivers/net/ethernet/ti/cpsw_priv.c
+++ b/drivers/net/ethernet/ti/cpsw_priv.c
@@ -1265,9 +1265,6 @@ static int cpsw_xdp_prog_setup(struct cpsw_priv *priv, struct netdev_bpf *bpf)
 	if (!priv->xdpi.prog && !prog)
 		return 0;
 
-	if (!xdp_attachment_flags_ok(&priv->xdpi, bpf))
-		return -EBUSY;
-
 	WRITE_ONCE(priv->xdp_prog, prog);
 
 	xdp_attachment_setup(&priv->xdpi, bpf);
diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c
index 2e90512f3bbe..85546664bdd5 100644
--- a/drivers/net/netdevsim/bpf.c
+++ b/drivers/net/netdevsim/bpf.c
@@ -190,9 +190,6 @@ nsim_xdp_set_prog(struct netdevsim *ns, struct netdev_bpf *bpf,
 {
 	int err;
 
-	if (!xdp_attachment_flags_ok(xdp, bpf))
-		return -EBUSY;
-
 	if (bpf->command == XDP_SETUP_PROG && !ns->bpf_xdpdrv_accept) {
 		NSIM_EA(bpf->extack, "driver XDP disabled in DebugFS");
 		return -EOPNOTSUPP;
diff --git a/include/net/xdp.h b/include/net/xdp.h
index 3814fb631d52..9dab2bc6f187 100644
--- a/include/net/xdp.h
+++ b/include/net/xdp.h
@@ -240,8 +240,6 @@ struct xdp_attachment_info {
 };
 
 struct netdev_bpf;
-bool xdp_attachment_flags_ok(struct xdp_attachment_info *info,
-			     struct netdev_bpf *bpf);
 void xdp_attachment_setup(struct xdp_attachment_info *info,
 			  struct netdev_bpf *bpf);
 
diff --git a/net/core/dev.c b/net/core/dev.c
index 8588ade790cb..38412e70f761 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -8917,6 +8917,17 @@ static struct bpf_prog *dev_xdp_prog(struct net_device *dev,
 	return dev->xdp_state[mode].prog;
 }
 
+static u8 dev_xdp_prog_count(struct net_device *dev)
+{
+	u8 count = 0;
+	int i;
+
+	for (i = 0; i < __MAX_XDP_MODE; i++)
+		if (dev->xdp_state[i].prog || dev->xdp_state[i].link)
+			count++;
+	return count;
+}
+
 u32 dev_xdp_prog_id(struct net_device *dev, enum bpf_xdp_mode mode)
 {
 	struct bpf_prog *prog = dev_xdp_prog(dev, mode);
@@ -9007,6 +9018,7 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack
 			  struct bpf_xdp_link *link, struct bpf_prog *new_prog,
 			  struct bpf_prog *old_prog, u32 flags)
 {
+	unsigned int num_modes = hweight32(flags & XDP_FLAGS_MODES);
 	struct bpf_prog *cur_prog;
 	enum bpf_xdp_mode mode;
 	bpf_op_t bpf_op;
@@ -9022,11 +9034,17 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack
 		NL_SET_ERR_MSG(extack, "Invalid XDP flags for BPF link attachment");
 		return -EINVAL;
 	}
-	/* just one XDP mode bit should be set, zero defaults to SKB mode */
-	if (hweight32(flags & XDP_FLAGS_MODES) > 1) {
+	/* just one XDP mode bit should be set, zero defaults to drv/skb mode */
+	if (num_modes > 1) {
 		NL_SET_ERR_MSG(extack, "Only one XDP mode flag can be set");
 		return -EINVAL;
 	}
+	/* avoid ambiguity if offload + drv/skb mode progs are both loaded */
+	if (!num_modes && dev_xdp_prog_count(dev) > 1) {
+		NL_SET_ERR_MSG(extack,
+			       "More than one program loaded, unset mode is ambiguous");
+		return -EINVAL;
+	}
 	/* old_prog != NULL implies XDP_FLAGS_REPLACE is set */
 	if (old_prog && !(flags & XDP_FLAGS_REPLACE)) {
 		NL_SET_ERR_MSG(extack, "XDP_FLAGS_REPLACE is not specified");
diff --git a/net/core/xdp.c b/net/core/xdp.c
index 491ad569a79c..d900cebc0acd 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -403,18 +403,6 @@ void __xdp_release_frame(void *data, struct xdp_mem_info *mem)
 }
 EXPORT_SYMBOL_GPL(__xdp_release_frame);
 
-bool xdp_attachment_flags_ok(struct xdp_attachment_info *info,
-			     struct netdev_bpf *bpf)
-{
-	if (info->prog && (bpf->flags ^ info->flags) & XDP_FLAGS_MODES) {
-		NL_SET_ERR_MSG(bpf->extack,
-			       "program loaded with different flags");
-		return false;
-	}
-	return true;
-}
-EXPORT_SYMBOL_GPL(xdp_attachment_flags_ok);
-
 void xdp_attachment_setup(struct xdp_attachment_info *info,
 			  struct netdev_bpf *bpf)
 {
commit ab43234d0bafcf2accd9db4fc4d193180b752f94
Author: Andrey Grodzovsky <andrey.grodzovsky at amd.com>
Date:   Tue Dec 8 15:16:15 2020 -0500

    drm/amdgpu: Initialise drm_gem_object_funcs for imported BOs
    
    For BOs imported from outside of amdgpu, setting of amdgpu_gem_object_funcs
    was missing in amdgpu_dma_buf_create_obj. Fix by refactoring BO creation
    and amdgpu_gem_object_funcs setting into single function called
    from both code paths.
    
    Fixes: d693def4fd1c ("drm: Remove obsolete GEM and PRIME callbacks from struct drm_driver")
    
    v2: Use use amdgpu_gem_object_create() directly
    v3: fix warning
    
    Reviewed-by: Christian König <christian.koenig at amd.com>
    Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
index 957934926b24..1b56dbc1f304 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
@@ -459,6 +459,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
 	struct amdgpu_device *adev = drm_to_adev(dev);
 	struct amdgpu_bo *bo;
 	struct amdgpu_bo_param bp;
+	struct drm_gem_object *gobj;
 	int ret;
 
 	memset(&bp, 0, sizeof(bp));
@@ -469,17 +470,20 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
 	bp.type = ttm_bo_type_sg;
 	bp.resv = resv;
 	dma_resv_lock(resv, NULL);
-	ret = amdgpu_bo_create(adev, &bp, &bo);
+	ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
+			AMDGPU_GEM_DOMAIN_CPU,
+			0, ttm_bo_type_sg, resv, &gobj);
 	if (ret)
 		goto error;
 
+	bo = gem_to_amdgpu_bo(gobj);
 	bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
 	bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
 	if (dma_buf->ops != &amdgpu_dmabuf_ops)
 		bo->prime_shared_count = 1;
 
 	dma_resv_unlock(resv);
-	return &bo->tbo.base;
+	return gobj;
 
 error:
 	dma_resv_unlock(resv);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 7e8265da9f25..e8c76bd8c501 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -66,26 +66,12 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
 	bp.type = type;
 	bp.resv = resv;
 	bp.preferred_domain = initial_domain;
-retry:
 	bp.flags = flags;
 	bp.domain = initial_domain;
 	r = amdgpu_bo_create(adev, &bp, &bo);
-	if (r) {
-		if (r != -ERESTARTSYS) {
-			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
-				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
-				goto retry;
-			}
-
-			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
-				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
-				goto retry;
-			}
-			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
-				  size, initial_domain, alignment, r);
-		}
+	if (r)
 		return r;
-	}
+
 	*obj = &bo->tbo.base;
 
 	return 0;
@@ -225,7 +211,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 	uint64_t size = args->in.bo_size;
 	struct dma_resv *resv = NULL;
 	struct drm_gem_object *gobj;
-	uint32_t handle;
+	uint32_t handle, initial_domain;
 	int r;
 
 	/* reject invalid gem flags */
@@ -269,9 +255,28 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 		resv = vm->root.base.bo->tbo.base.resv;
 	}
 
+retry:
+	initial_domain = (u32)(0xffffffff & args->in.domains);
 	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
-				     (u32)(0xffffffff & args->in.domains),
+				     initial_domain,
 				     flags, ttm_bo_type_device, resv, &gobj);
+	if (r) {
+		if (r != -ERESTARTSYS) {
+			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
+				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
+				goto retry;
+			}
+
+			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
+				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
+				goto retry;
+			}
+			DRM_DEBUG("Failed to allocate GEM object (%llu, %d, %llu, %d)\n",
+				  size, initial_domain, args->in.alignment, r);
+		}
+		return r;
+	}
+
 	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
 		if (!r) {
 			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
commit 157fe68d74c2ad2db438c91af9ed3d3a51de4ed7
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Mon Dec 7 13:12:29 2020 -0500

    drm/amdgpu: fix size calculation with stolen vga memory
    
    If we need to keep the stolen vga memory, make sure it is
    at least as big as the legacy vga size.
    
    Acked-by: Christian König <christian.koenig at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index 36604d751d62..3e4892b7b7d3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -499,6 +499,9 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
 	else
 		size = amdgpu_gmc_get_vbios_fb_size(adev);
 
+	if (adev->mman.keep_stolen_vga_memory)
+		size = max(size, (unsigned)AMDGPU_VBIOS_VGA_ALLOCATION);
+
 	/* set to 0 if the pre-OS buffer uses up most of vram */
 	if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
 		size = 0;
commit c9918d1f63a3e77ec20997a77c997a6fa7282f2f
Author: Changfeng <Changfeng.Zhu at amd.com>
Date:   Mon Dec 7 15:42:29 2020 +0800

    drm/amd/pm: update smu10.h WORKLOAD_PPLIB setting for raven
    
    When using old WORKLOAD_PPLIB setting in smu10.h, there is problem that
    it can't be able to switch to mak gpu clk during compute workload.
    It needs to update WORKLOAD_PPLIB setting to fix this issue.
    
    Signed-off-by: Changfeng <Changfeng.Zhu at amd.com>
    Reviewed-by: Huang Rui <ray.huang at amd.com>
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/pm/inc/smu10.h b/drivers/gpu/drm/amd/pm/inc/smu10.h
index b96520528240..9e837a5014c5 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu10.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu10.h
@@ -136,14 +136,12 @@
 #define FEATURE_CORE_CSTATES_MASK     (1 << FEATURE_CORE_CSTATES_BIT)
 
 /* Workload bits */
-#define WORKLOAD_DEFAULT_BIT              0
-#define WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT 1
-#define WORKLOAD_PPLIB_POWER_SAVING_BIT   2
-#define WORKLOAD_PPLIB_VIDEO_BIT          3
-#define WORKLOAD_PPLIB_VR_BIT             4
-#define WORKLOAD_PPLIB_COMPUTE_BIT        5
-#define WORKLOAD_PPLIB_CUSTOM_BIT         6
-#define WORKLOAD_PPLIB_COUNT              7
+#define WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT 0
+#define WORKLOAD_PPLIB_VIDEO_BIT          2
+#define WORKLOAD_PPLIB_VR_BIT             3
+#define WORKLOAD_PPLIB_COMPUTE_BIT        4
+#define WORKLOAD_PPLIB_CUSTOM_BIT         5
+#define WORKLOAD_PPLIB_COUNT              6
 
 typedef struct {
 	/* MP1_EXT_SCRATCH0 */
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
index cf60f3992303..e6f40ee9f313 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
@@ -1297,15 +1297,9 @@ static int conv_power_profile_to_pplib_workload(int power_profile)
 	int pplib_workload = 0;
 
 	switch (power_profile) {
-	case PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT:
-		pplib_workload = WORKLOAD_DEFAULT_BIT;
-		break;
 	case PP_SMC_POWER_PROFILE_FULLSCREEN3D:
 		pplib_workload = WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT;
 		break;
-	case PP_SMC_POWER_PROFILE_POWERSAVING:
-		pplib_workload = WORKLOAD_PPLIB_POWER_SAVING_BIT;
-		break;
 	case PP_SMC_POWER_PROFILE_VIDEO:
 		pplib_workload = WORKLOAD_PPLIB_VIDEO_BIT;
 		break;
@@ -1315,6 +1309,9 @@ static int conv_power_profile_to_pplib_workload(int power_profile)
 	case PP_SMC_POWER_PROFILE_COMPUTE:
 		pplib_workload = WORKLOAD_PPLIB_COMPUTE_BIT;
 		break;
+	case PP_SMC_POWER_PROFILE_CUSTOM:
+		pplib_workload = WORKLOAD_PPLIB_CUSTOM_BIT;
+		break;
 	}
 
 	return pplib_workload;
commit ab6e4e9de8dd7febfdf6719741f10dc6693d8ce9
Author: Felix Kuehling <Felix.Kuehling at amd.com>
Date:   Tue Dec 8 12:23:15 2020 -0500

    drm/amdkfd: Fix leak in dmabuf import
    
    Release dmabuf reference before returning from kfd_ioctl_import_dmabuf.
    amdgpu_amdkfd_gpuvm_import_dmabuf takes a reference to the underlying
    GEM BO and doesn't keep the reference to the dmabuf wrapper.
    
    Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
    Reviewed-by: Kent Russell <kent.russell at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index 222f1df1a6b6..8cc51cec988a 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -1736,6 +1736,7 @@ static int kfd_ioctl_import_dmabuf(struct file *filep,
 	}
 
 	mutex_unlock(&p->mutex);
+	dma_buf_put(dmabuf);
 
 	args->handle = MAKE_HANDLE(args->gpu_id, idr_handle);
 
@@ -1745,6 +1746,7 @@ err_free:
 	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem, NULL);
 err_unlock:
 	mutex_unlock(&p->mutex);
+	dma_buf_put(dmabuf);
 	return r;
 }
 
commit 6896887b8676d8fb445c85ea56333b9661a6a8aa
Author: Stanley.Yang <Stanley.Yang at amd.com>
Date:   Mon Dec 7 14:38:33 2020 +0800

    drm/amdgpu: fix sdma instance fw version and feature version init
    
    each sdma instance fw_version and feature_version
    should be set right value when asic type isn't
    between SIENNA_CICHILD and CHIP_DIMGREY_CAVEFISH
    
    Signed-off-by: Stanley.Yang <Stanley.Yang at amd.com>
    Reviewed-by: Tao Zhou <tao.zhou1 at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 9f3952723c63..2a485052e3ab 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -186,7 +186,7 @@ static int sdma_v5_2_init_microcode(struct amdgpu_device *adev)
 			if (err)
 				goto out;
 
-			err = sdma_v5_2_init_inst_ctx(&adev->sdma.instance[0]);
+			err = sdma_v5_2_init_inst_ctx(&adev->sdma.instance[i]);
 			if (err)
 				goto out;
 		}
commit 369b7ebe1792b620b7a9404e7b71daaae13ebfd6
Author: Sung Lee <sung.lee at amd.com>
Date:   Mon Nov 23 15:38:54 2020 -0500

    drm/amd/display: Add wm table for Renoir
    
    [Why]
    Without additional HostVM Latency, Renoir takes 2us longer to exit
    self-refresh. This causes underflow in certain cases.
    
    [How]
    Add table for Renoir with updated sr exit latencies for WM set A.
    
    Signed-off-by: Sung Lee <sung.lee at amd.com>
    Reviewed-by: Yongqiang Sun <yongqiang.sun at amd.com>
    Reviewed-by: Roman Li <Roman.Li at amd.com>
    Acked-by: Eryk Brol <eryk.brol at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
index c001307b0a59..6b431db146cd 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
@@ -579,7 +579,7 @@ static struct clk_bw_params rn_bw_params = {
 
 };
 
-static struct wm_table ddr4_wm_table = {
+static struct wm_table ddr4_wm_table_gs = {
 	.entries = {
 		{
 			.wm_inst = WM_A,
@@ -616,7 +616,7 @@ static struct wm_table ddr4_wm_table = {
 	}
 };
 
-static struct wm_table lpddr4_wm_table = {
+static struct wm_table lpddr4_wm_table_gs = {
 	.entries = {
 		{
 			.wm_inst = WM_A,
@@ -690,6 +690,80 @@ static struct wm_table lpddr4_wm_table_with_disabled_ppt = {
 	}
 };
 
+static struct wm_table ddr4_wm_table_rn = {
+	.entries = {
+		{
+			.wm_inst = WM_A,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.72,
+			.sr_exit_time_us = 9.09,
+			.sr_enter_plus_exit_time_us = 10.14,
+			.valid = true,
+		},
+		{
+			.wm_inst = WM_B,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.72,
+			.sr_exit_time_us = 10.12,
+			.sr_enter_plus_exit_time_us = 11.48,
+			.valid = true,
+		},
+		{
+			.wm_inst = WM_C,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.72,
+			.sr_exit_time_us = 10.12,
+			.sr_enter_plus_exit_time_us = 11.48,
+			.valid = true,
+		},
+		{
+			.wm_inst = WM_D,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.72,
+			.sr_exit_time_us = 10.12,
+			.sr_enter_plus_exit_time_us = 11.48,
+			.valid = true,
+		},
+	}
+};
+
+static struct wm_table lpddr4_wm_table_rn = {
+	.entries = {
+		{
+			.wm_inst = WM_A,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.65333,
+			.sr_exit_time_us = 7.32,
+			.sr_enter_plus_exit_time_us = 8.38,
+			.valid = true,
+		},
+		{
+			.wm_inst = WM_B,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.65333,
+			.sr_exit_time_us = 9.82,
+			.sr_enter_plus_exit_time_us = 11.196,
+			.valid = true,
+		},
+		{
+			.wm_inst = WM_C,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.65333,
+			.sr_exit_time_us = 9.89,
+			.sr_enter_plus_exit_time_us = 11.24,
+			.valid = true,
+		},
+		{
+			.wm_inst = WM_D,
+			.wm_type = WM_TYPE_PSTATE_CHG,
+			.pstate_latency_us = 11.65333,
+			.sr_exit_time_us = 9.748,
+			.sr_enter_plus_exit_time_us = 11.102,
+			.valid = true,
+		},
+	}
+};
+
 static unsigned int find_dcfclk_for_voltage(struct dpm_clocks *clock_table, unsigned int voltage)
 {
 	int i;
@@ -771,6 +845,11 @@ void rn_clk_mgr_construct(
 	struct dc_debug_options *debug = &ctx->dc->debug;
 	struct dpm_clocks clock_table = { 0 };
 	enum pp_smu_status status = 0;
+	int is_green_sardine = 0;
+
+#if defined(CONFIG_DRM_AMD_DC_DCN)
+	is_green_sardine = ASICREV_IS_GREEN_SARDINE(ctx->asic_id.hw_internal_rev);
+#endif
 
 	clk_mgr->base.ctx = ctx;
 	clk_mgr->base.funcs = &dcn21_funcs;
@@ -811,10 +890,16 @@ void rn_clk_mgr_construct(
 			if (clk_mgr->periodic_retraining_disabled) {
 				rn_bw_params.wm_table = lpddr4_wm_table_with_disabled_ppt;
 			} else {
-				rn_bw_params.wm_table = lpddr4_wm_table;
+				if (is_green_sardine)
+					rn_bw_params.wm_table = lpddr4_wm_table_gs;
+				else
+					rn_bw_params.wm_table = lpddr4_wm_table_rn;
 			}
 		} else {
-			rn_bw_params.wm_table = ddr4_wm_table;
+			if (is_green_sardine)
+				rn_bw_params.wm_table = ddr4_wm_table_gs;
+			else
+				rn_bw_params.wm_table = ddr4_wm_table_rn;
 		}
 		/* Saved clocks configured at boot for debug purposes */
 		rn_dump_clk_registers(&clk_mgr->base.boot_snapshot, &clk_mgr->base, &log_info);
commit c2ffe78b8b1354603a7d5afb719b2a6dfbb582da
Author: Chris Park <Chris.Park at amd.com>
Date:   Tue Nov 24 20:11:25 2020 -0500

    drm/amd/display: Prevent bandwidth overflow
    
    [Why]
    At very high pixel clock, bandwidth calculation exceeds 32 bit size
    and overflow value. This causes the resulting selection of link rate
    to be inaccurate.
    
    [How]
    Change order of operation and use fixed point to deal with integer
    accuracy. Also address bug found when forcing link rate.
    
    Signed-off-by: Chris Park <Chris.Park at amd.com>
    Reviewed-by: Wenjing Liu <Wenjing.Liu at amd.com>
    Acked-by: Eryk Brol <eryk.brol at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index fec87a2e210c..5b0cedfa824a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -3394,10 +3394,13 @@ uint32_t dc_bandwidth_in_kbps_from_timing(
 {
 	uint32_t bits_per_channel = 0;
 	uint32_t kbps;
+	struct fixed31_32 link_bw_kbps;
 
 	if (timing->flags.DSC) {
-		kbps = (timing->pix_clk_100hz * timing->dsc_cfg.bits_per_pixel);
-		kbps = kbps / 160 + ((kbps % 160) ? 1 : 0);
+		link_bw_kbps = dc_fixpt_from_int(timing->pix_clk_100hz);
+		link_bw_kbps = dc_fixpt_div_int(link_bw_kbps, 160);
+		link_bw_kbps = dc_fixpt_mul_int(link_bw_kbps, timing->dsc_cfg.bits_per_pixel);
+		kbps = dc_fixpt_ceil(link_bw_kbps);
 		return kbps;
 	}
 
commit 2343e9d2c5a94459b9de92649f1650e36eb79a10
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 4 00:06:43 2020 +0100

    drm/amdgpu: fix debugfs creation/removal, again
    
    There is still a warning when CONFIG_DEBUG_FS is disabled:
    
    drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c:1145:13: error: 'amdgpu_ras_debugfs_create_ctrl_node' defined but not used [-Werror=unused-function]
     1145 | static void amdgpu_ras_debugfs_create_ctrl_node(struct amdgpu_device *adev)
    
    Change the code again to make the compiler actually drop
    this code but not warn about it.
    
    Fixes: ae2bf61ff39e ("drm/amdgpu: guard ras debugfs creation/removal based on CONFIG_DEBUG_FS")
    Reviewed-by: Tao Zhou <tao.zhou1 at amd.com>
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 4e36551ab50b..82cd8e55595a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -1172,7 +1172,7 @@ static void amdgpu_ras_debugfs_create_ctrl_node(struct amdgpu_device *adev)
 			con->dir, &con->disable_ras_err_cnt_harvest);
 }
 
-void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
+static void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
 		struct ras_fs_if *head)
 {
 	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
@@ -1194,7 +1194,6 @@ void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
 
 void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
 {
-#if defined(CONFIG_DEBUG_FS)
 	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
 	struct ras_manager *obj;
 	struct ras_fs_if fs_info;
@@ -1203,7 +1202,7 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
 	 * it won't be called in resume path, no need to check
 	 * suspend and gpu reset status
 	 */
-	if (!con)
+	if (!IS_ENABLED(CONFIG_DEBUG_FS) || !con)
 		return;
 
 	amdgpu_ras_debugfs_create_ctrl_node(adev);
@@ -1217,10 +1216,9 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
 			amdgpu_ras_debugfs_create(adev, &fs_info);
 		}
 	}
-#endif
 }
 
-void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
+static void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
 		struct ras_common_if *head)
 {
 	struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
@@ -1234,7 +1232,6 @@ void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
 
 static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
 {
-#if defined(CONFIG_DEBUG_FS)
 	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
 	struct ras_manager *obj, *tmp;
 
@@ -1243,7 +1240,6 @@ static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
 	}
 
 	con->dir = NULL;
-#endif
 }
 /* debugfs end */
 
@@ -1291,7 +1287,8 @@ static int amdgpu_ras_fs_init(struct amdgpu_device *adev)
 
 static int amdgpu_ras_fs_fini(struct amdgpu_device *adev)
 {
-	amdgpu_ras_debugfs_remove_all(adev);
+	if (IS_ENABLED(CONFIG_DEBUG_FS))
+		amdgpu_ras_debugfs_remove_all(adev);
 	amdgpu_ras_sysfs_remove_all(adev);
 	return 0;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
index 6b8d7bb83bb3..ec398ed7deb8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
@@ -607,14 +607,8 @@ int amdgpu_ras_sysfs_create(struct amdgpu_device *adev,
 int amdgpu_ras_sysfs_remove(struct amdgpu_device *adev,
 		struct ras_common_if *head);
 
-void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
-		struct ras_fs_if *head);
-
 void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev);
 
-void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
-		struct ras_common_if *head);
-
 int amdgpu_ras_error_query(struct amdgpu_device *adev,
 		struct ras_query_if *info);
 
commit 578b6c487899179fed730e710ffec0b069917971
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Thu Dec 3 16:06:26 2020 -0500

    drm/amdgpu/disply: set num_crtc earlier
    
    To avoid a recently added warning:
     Bogus possible_crtcs: [ENCODER:65:TMDS-65] possible_crtcs=0xf (full crtc mask=0x7)
     WARNING: CPU: 3 PID: 439 at drivers/gpu/drm/drm_mode_config.c:617 drm_mode_config_validate+0x178/0x200 [drm]
    In this case the warning is harmless, but confusing to users.
    
    Fixes: 0df108237433 ("drm: Validate encoder->possible_crtcs")
    Bug: https://bugzilla.kernel.org/show_bug.cgi?id=209123
    Reviewed-by: Daniel Vetter <daniel at ffwll.ch>
    Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 9b6809f309f4..0f7749e9424d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1058,9 +1058,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
 		goto error;
 	}
 
-	/* Update the actual used number of crtc */
-	adev->mode_info.num_crtc = adev->dm.display_indexes_num;
-
 	/* create fake encoders for MST */
 	dm_dp_create_fake_mst_encoders(adev);
 
@@ -3251,6 +3248,10 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
 	enum dc_connection_type new_connection_type = dc_connection_none;
 	const struct dc_plane_cap *plane;
 
+	dm->display_indexes_num = dm->dc->caps.max_streams;
+	/* Update the actual used number of crtc */
+	adev->mode_info.num_crtc = adev->dm.display_indexes_num;
+
 	link_cnt = dm->dc->caps.max_links;
 	if (amdgpu_dm_mode_config_init(dm->adev)) {
 		DRM_ERROR("DM: Failed to initialize mode config\n");
@@ -3312,8 +3313,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
 			goto fail;
 		}
 
-	dm->display_indexes_num = dm->dc->caps.max_streams;
-
 	/* loops over all connectors on the board */
 	for (i = 0; i < link_cnt; i++) {
 		struct dc_link *link = NULL;
commit 2d94b20b95b009eec1a267dcf026b01af627c0cd
Author: Brett Mastbergen <brett.mastbergen at gmail.com>
Date:   Tue Dec 8 16:39:24 2020 -0500

    netfilter: nft_ct: Remove confirmation check for NFT_CT_ID
    
    Since commit 656c8e9cc1ba ("netfilter: conntrack: Use consistent ct id
    hash calculation") the ct id will not change from initialization to
    confirmation.  Removing the confirmation check allows for things like
    adding an element to a 'typeof ct id' set in prerouting upon reception
    of the first packet of a new connection, and then being able to
    reference that set consistently both before and after the connection
    is confirmed.
    
    Fixes: 656c8e9cc1ba ("netfilter: conntrack: Use consistent ct id hash calculation")
    Signed-off-by: Brett Mastbergen <brett.mastbergen at gmail.com>
    Acked-by: Florian Westphal <fw at strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c
index 322bd674963e..a1b0aac46e9e 100644
--- a/net/netfilter/nft_ct.c
+++ b/net/netfilter/nft_ct.c
@@ -177,8 +177,6 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
 	}
 #endif
 	case NFT_CT_ID:
-		if (!nf_ct_is_confirmed(ct))
-			goto err;
 		*dest = nf_ct_get_id(ct);
 		return;
 	default:
commit ee32f32335e8c7f6154bf397f4ac9b6175b488a8
Author: Juergen Gross <jgross at suse.com>
Date:   Mon Dec 7 09:36:14 2020 +0100

    xen: don't use page->lru for ZONE_DEVICE memory
    
    Commit 9e2369c06c8a18 ("xen: add helpers to allocate unpopulated
    memory") introduced usage of ZONE_DEVICE memory for foreign memory
    mappings.
    
    Unfortunately this collides with using page->lru for Xen backend
    private page caches.
    
    Fix that by using page->zone_device_data instead.
    
    Cc: <stable at vger.kernel.org> # 5.9
    Fixes: 9e2369c06c8a18 ("xen: add helpers to allocate unpopulated memory")
    Signed-off-by: Juergen Gross <jgross at suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovksy at oracle.com>
    Reviewed-by: Jason Andryuk <jandryuk at gmail.com>
    Signed-off-by: Juergen Gross <jgross at suse.com>

diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index e2e42912f241..3729bea0c989 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -813,10 +813,63 @@ int gnttab_alloc_pages(int nr_pages, struct page **pages)
 }
 EXPORT_SYMBOL_GPL(gnttab_alloc_pages);
 
+#ifdef CONFIG_XEN_UNPOPULATED_ALLOC
+static inline void cache_init(struct gnttab_page_cache *cache)
+{
+	cache->pages = NULL;
+}
+
+static inline bool cache_empty(struct gnttab_page_cache *cache)
+{
+	return !cache->pages;
+}
+
+static inline struct page *cache_deq(struct gnttab_page_cache *cache)
+{
+	struct page *page;
+
+	page = cache->pages;
+	cache->pages = page->zone_device_data;
+
+	return page;
+}
+
+static inline void cache_enq(struct gnttab_page_cache *cache, struct page *page)
+{
+	page->zone_device_data = cache->pages;
+	cache->pages = page;
+}
+#else
+static inline void cache_init(struct gnttab_page_cache *cache)
+{
+	INIT_LIST_HEAD(&cache->pages);
+}
+
+static inline bool cache_empty(struct gnttab_page_cache *cache)
+{
+	return list_empty(&cache->pages);
+}
+
+static inline struct page *cache_deq(struct gnttab_page_cache *cache)
+{
+	struct page *page;
+
+	page = list_first_entry(&cache->pages, struct page, lru);
+	list_del(&page->lru);
+
+	return page;
+}
+
+static inline void cache_enq(struct gnttab_page_cache *cache, struct page *page)
+{
+	list_add(&page->lru, &cache->pages);
+}
+#endif
+
 void gnttab_page_cache_init(struct gnttab_page_cache *cache)
 {
 	spin_lock_init(&cache->lock);
-	INIT_LIST_HEAD(&cache->pages);
+	cache_init(cache);
 	cache->num_pages = 0;
 }
 EXPORT_SYMBOL_GPL(gnttab_page_cache_init);
@@ -827,13 +880,12 @@ int gnttab_page_cache_get(struct gnttab_page_cache *cache, struct page **page)
 
 	spin_lock_irqsave(&cache->lock, flags);
 
-	if (list_empty(&cache->pages)) {
+	if (cache_empty(cache)) {
 		spin_unlock_irqrestore(&cache->lock, flags);
 		return gnttab_alloc_pages(1, page);
 	}
 
-	page[0] = list_first_entry(&cache->pages, struct page, lru);
-	list_del(&page[0]->lru);
+	page[0] = cache_deq(cache);
 	cache->num_pages--;
 
 	spin_unlock_irqrestore(&cache->lock, flags);
@@ -851,7 +903,7 @@ void gnttab_page_cache_put(struct gnttab_page_cache *cache, struct page **page,
 	spin_lock_irqsave(&cache->lock, flags);
 
 	for (i = 0; i < num; i++)
-		list_add(&page[i]->lru, &cache->pages);
+		cache_enq(cache, page[i]);
 	cache->num_pages += num;
 
 	spin_unlock_irqrestore(&cache->lock, flags);
@@ -867,8 +919,7 @@ void gnttab_page_cache_shrink(struct gnttab_page_cache *cache, unsigned int num)
 	spin_lock_irqsave(&cache->lock, flags);
 
 	while (cache->num_pages > num) {
-		page[i] = list_first_entry(&cache->pages, struct page, lru);
-		list_del(&page[i]->lru);
+		page[i] = cache_deq(cache);
 		cache->num_pages--;
 		if (++i == ARRAY_SIZE(page)) {
 			spin_unlock_irqrestore(&cache->lock, flags);
diff --git a/drivers/xen/unpopulated-alloc.c b/drivers/xen/unpopulated-alloc.c
index 8c512ea550bb..7762c1bb23cb 100644
--- a/drivers/xen/unpopulated-alloc.c
+++ b/drivers/xen/unpopulated-alloc.c
@@ -12,7 +12,7 @@
 #include <xen/xen.h>
 
 static DEFINE_MUTEX(list_lock);
-static LIST_HEAD(page_list);
+static struct page *page_list;
 static unsigned int list_count;
 
 static int fill_list(unsigned int nr_pages)
@@ -84,7 +84,8 @@ static int fill_list(unsigned int nr_pages)
 		struct page *pg = virt_to_page(vaddr + PAGE_SIZE * i);
 
 		BUG_ON(!virt_addr_valid(vaddr + PAGE_SIZE * i));
-		list_add(&pg->lru, &page_list);
+		pg->zone_device_data = page_list;
+		page_list = pg;
 		list_count++;
 	}
 
@@ -118,12 +119,10 @@ int xen_alloc_unpopulated_pages(unsigned int nr_pages, struct page **pages)
 	}
 
 	for (i = 0; i < nr_pages; i++) {
-		struct page *pg = list_first_entry_or_null(&page_list,
-							   struct page,
-							   lru);
+		struct page *pg = page_list;
 
 		BUG_ON(!pg);
-		list_del(&pg->lru);
+		page_list = pg->zone_device_data;
 		list_count--;
 		pages[i] = pg;
 
@@ -134,7 +133,8 @@ int xen_alloc_unpopulated_pages(unsigned int nr_pages, struct page **pages)
 				unsigned int j;
 
 				for (j = 0; j <= i; j++) {
-					list_add(&pages[j]->lru, &page_list);
+					pages[j]->zone_device_data = page_list;
+					page_list = pages[j];
 					list_count++;
 				}
 				goto out;
@@ -160,7 +160,8 @@ void xen_free_unpopulated_pages(unsigned int nr_pages, struct page **pages)
 
 	mutex_lock(&list_lock);
 	for (i = 0; i < nr_pages; i++) {
-		list_add(&pages[i]->lru, &page_list);
+		pages[i]->zone_device_data = page_list;
+		page_list = pages[i];
 		list_count++;
 	}
 	mutex_unlock(&list_lock);
@@ -189,7 +190,8 @@ static int __init init(void)
 			struct page *pg =
 				pfn_to_page(xen_extra_mem[i].start_pfn + j);
 
-			list_add(&pg->lru, &page_list);
+			pg->zone_device_data = page_list;
+			page_list = pg;
 			list_count++;
 		}
 	}
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index c6ef8ffc1a09..b9c937b3a149 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -200,7 +200,11 @@ void gnttab_free_pages(int nr_pages, struct page **pages);
 
 struct gnttab_page_cache {
 	spinlock_t		lock;
+#ifdef CONFIG_XEN_UNPOPULATED_ALLOC
+	struct page		*pages;
+#else
 	struct list_head	pages;
+#endif
 	unsigned int		num_pages;
 };
 
commit ca33479cc7be2c9b5f8be078c8bf3ac26b7d6186
Author: Juergen Gross <jgross at suse.com>
Date:   Mon Dec 7 08:31:22 2020 +0100

    xen: add helpers for caching grant mapping pages
    
    Instead of having similar helpers in multiple backend drivers use
    common helpers for caching pages allocated via gnttab_alloc_pages().
    
    Make use of those helpers in blkback and scsiback.
    
    Cc: <stable at vger.kernel.org> # 5.9
    Signed-off-by: Juergen Gross <jgross at suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovksy at oracle.com>
    Signed-off-by: Juergen Gross <jgross at suse.com>

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 501e9dacfff9..9ebf53903d7b 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -132,73 +132,12 @@ module_param(log_stats, int, 0644);
 
 #define BLKBACK_INVALID_HANDLE (~0)
 
-/* Number of free pages to remove on each call to gnttab_free_pages */
-#define NUM_BATCH_FREE_PAGES 10
-
 static inline bool persistent_gnt_timeout(struct persistent_gnt *persistent_gnt)
 {
 	return pgrant_timeout && (jiffies - persistent_gnt->last_used >=
 			HZ * pgrant_timeout);
 }
 
-static inline int get_free_page(struct xen_blkif_ring *ring, struct page **page)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&ring->free_pages_lock, flags);
-	if (list_empty(&ring->free_pages)) {
-		BUG_ON(ring->free_pages_num != 0);
-		spin_unlock_irqrestore(&ring->free_pages_lock, flags);
-		return gnttab_alloc_pages(1, page);
-	}
-	BUG_ON(ring->free_pages_num == 0);
-	page[0] = list_first_entry(&ring->free_pages, struct page, lru);
-	list_del(&page[0]->lru);
-	ring->free_pages_num--;
-	spin_unlock_irqrestore(&ring->free_pages_lock, flags);
-
-	return 0;
-}
-
-static inline void put_free_pages(struct xen_blkif_ring *ring, struct page **page,
-                                  int num)
-{
-	unsigned long flags;
-	int i;
-
-	spin_lock_irqsave(&ring->free_pages_lock, flags);
-	for (i = 0; i < num; i++)
-		list_add(&page[i]->lru, &ring->free_pages);
-	ring->free_pages_num += num;
-	spin_unlock_irqrestore(&ring->free_pages_lock, flags);
-}
-
-static inline void shrink_free_pagepool(struct xen_blkif_ring *ring, int num)
-{
-	/* Remove requested pages in batches of NUM_BATCH_FREE_PAGES */
-	struct page *page[NUM_BATCH_FREE_PAGES];
-	unsigned int num_pages = 0;
-	unsigned long flags;
-
-	spin_lock_irqsave(&ring->free_pages_lock, flags);
-	while (ring->free_pages_num > num) {
-		BUG_ON(list_empty(&ring->free_pages));
-		page[num_pages] = list_first_entry(&ring->free_pages,
-		                                   struct page, lru);
-		list_del(&page[num_pages]->lru);
-		ring->free_pages_num--;
-		if (++num_pages == NUM_BATCH_FREE_PAGES) {
-			spin_unlock_irqrestore(&ring->free_pages_lock, flags);
-			gnttab_free_pages(num_pages, page);
-			spin_lock_irqsave(&ring->free_pages_lock, flags);
-			num_pages = 0;
-		}
-	}
-	spin_unlock_irqrestore(&ring->free_pages_lock, flags);
-	if (num_pages != 0)
-		gnttab_free_pages(num_pages, page);
-}
-
 #define vaddr(page) ((unsigned long)pfn_to_kaddr(page_to_pfn(page)))
 
 static int do_block_io_op(struct xen_blkif_ring *ring, unsigned int *eoi_flags);
@@ -331,7 +270,8 @@ static void free_persistent_gnts(struct xen_blkif_ring *ring, struct rb_root *ro
 			unmap_data.count = segs_to_unmap;
 			BUG_ON(gnttab_unmap_refs_sync(&unmap_data));
 
-			put_free_pages(ring, pages, segs_to_unmap);
+			gnttab_page_cache_put(&ring->free_pages, pages,
+					      segs_to_unmap);
 			segs_to_unmap = 0;
 		}
 
@@ -371,7 +311,8 @@ void xen_blkbk_unmap_purged_grants(struct work_struct *work)
 		if (++segs_to_unmap == BLKIF_MAX_SEGMENTS_PER_REQUEST) {
 			unmap_data.count = segs_to_unmap;
 			BUG_ON(gnttab_unmap_refs_sync(&unmap_data));
-			put_free_pages(ring, pages, segs_to_unmap);
+			gnttab_page_cache_put(&ring->free_pages, pages,
+					      segs_to_unmap);
 			segs_to_unmap = 0;
 		}
 		kfree(persistent_gnt);
@@ -379,7 +320,7 @@ void xen_blkbk_unmap_purged_grants(struct work_struct *work)
 	if (segs_to_unmap > 0) {
 		unmap_data.count = segs_to_unmap;
 		BUG_ON(gnttab_unmap_refs_sync(&unmap_data));
-		put_free_pages(ring, pages, segs_to_unmap);
+		gnttab_page_cache_put(&ring->free_pages, pages, segs_to_unmap);
 	}
 }
 
@@ -664,9 +605,10 @@ purge_gnt_list:
 
 		/* Shrink the free pages pool if it is too large. */
 		if (time_before(jiffies, blkif->buffer_squeeze_end))
-			shrink_free_pagepool(ring, 0);
+			gnttab_page_cache_shrink(&ring->free_pages, 0);
 		else
-			shrink_free_pagepool(ring, max_buffer_pages);
+			gnttab_page_cache_shrink(&ring->free_pages,
+						 max_buffer_pages);
 
 		if (log_stats && time_after(jiffies, ring->st_print))
 			print_stats(ring);
@@ -697,7 +639,7 @@ void xen_blkbk_free_caches(struct xen_blkif_ring *ring)
 	ring->persistent_gnt_c = 0;
 
 	/* Since we are shutting down remove all pages from the buffer */
-	shrink_free_pagepool(ring, 0 /* All */);
+	gnttab_page_cache_shrink(&ring->free_pages, 0 /* All */);
 }
 
 static unsigned int xen_blkbk_unmap_prepare(
@@ -736,7 +678,7 @@ static void xen_blkbk_unmap_and_respond_callback(int result, struct gntab_unmap_
 	   but is this the best way to deal with this? */
 	BUG_ON(result);
 
-	put_free_pages(ring, data->pages, data->count);
+	gnttab_page_cache_put(&ring->free_pages, data->pages, data->count);
 	make_response(ring, pending_req->id,
 		      pending_req->operation, pending_req->status);
 	free_req(ring, pending_req);
@@ -803,7 +745,8 @@ static void xen_blkbk_unmap(struct xen_blkif_ring *ring,
 		if (invcount) {
 			ret = gnttab_unmap_refs(unmap, NULL, unmap_pages, invcount);
 			BUG_ON(ret);
-			put_free_pages(ring, unmap_pages, invcount);
+			gnttab_page_cache_put(&ring->free_pages, unmap_pages,
+					      invcount);
 		}
 		pages += batch;
 		num -= batch;
@@ -850,7 +793,8 @@ again:
 			pages[i]->page = persistent_gnt->page;
 			pages[i]->persistent_gnt = persistent_gnt;
 		} else {
-			if (get_free_page(ring, &pages[i]->page))
+			if (gnttab_page_cache_get(&ring->free_pages,
+						  &pages[i]->page))
 				goto out_of_memory;
 			addr = vaddr(pages[i]->page);
 			pages_to_gnt[segs_to_map] = pages[i]->page;
@@ -883,7 +827,8 @@ again:
 			BUG_ON(new_map_idx >= segs_to_map);
 			if (unlikely(map[new_map_idx].status != 0)) {
 				pr_debug("invalid buffer -- could not remap it\n");
-				put_free_pages(ring, &pages[seg_idx]->page, 1);
+				gnttab_page_cache_put(&ring->free_pages,
+						      &pages[seg_idx]->page, 1);
 				pages[seg_idx]->handle = BLKBACK_INVALID_HANDLE;
 				ret |= 1;
 				goto next;
@@ -944,7 +889,7 @@ next:
 
 out_of_memory:
 	pr_alert("%s: out of memory\n", __func__);
-	put_free_pages(ring, pages_to_gnt, segs_to_map);
+	gnttab_page_cache_put(&ring->free_pages, pages_to_gnt, segs_to_map);
 	for (i = last_map; i < num; i++)
 		pages[i]->handle = BLKBACK_INVALID_HANDLE;
 	return -ENOMEM;
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index c6ea5d38c509..a1b9df2c4ef1 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -288,9 +288,7 @@ struct xen_blkif_ring {
 	struct work_struct	persistent_purge_work;
 
 	/* Buffer of free pages to map grant refs. */
-	spinlock_t		free_pages_lock;
-	int			free_pages_num;
-	struct list_head	free_pages;
+	struct gnttab_page_cache free_pages;
 
 	struct work_struct	free_work;
 	/* Thread shutdown wait queue. */
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index f5705569e2a7..76912c584a76 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -144,8 +144,7 @@ static int xen_blkif_alloc_rings(struct xen_blkif *blkif)
 		INIT_LIST_HEAD(&ring->pending_free);
 		INIT_LIST_HEAD(&ring->persistent_purge_list);
 		INIT_WORK(&ring->persistent_purge_work, xen_blkbk_unmap_purged_grants);
-		spin_lock_init(&ring->free_pages_lock);
-		INIT_LIST_HEAD(&ring->free_pages);
+		gnttab_page_cache_init(&ring->free_pages);
 
 		spin_lock_init(&ring->pending_free_lock);
 		init_waitqueue_head(&ring->pending_free_wq);
@@ -317,8 +316,7 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif)
 		BUG_ON(atomic_read(&ring->persistent_gnt_in_use) != 0);
 		BUG_ON(!list_empty(&ring->persistent_purge_list));
 		BUG_ON(!RB_EMPTY_ROOT(&ring->persistent_gnts));
-		BUG_ON(!list_empty(&ring->free_pages));
-		BUG_ON(ring->free_pages_num != 0);
+		BUG_ON(ring->free_pages.num_pages != 0);
 		BUG_ON(ring->persistent_gnt_c != 0);
 		WARN_ON(i != (XEN_BLKIF_REQS_PER_PAGE * blkif->nr_ring_pages));
 		ring->active = false;
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 523dcdf39cc9..e2e42912f241 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -813,6 +813,78 @@ int gnttab_alloc_pages(int nr_pages, struct page **pages)
 }
 EXPORT_SYMBOL_GPL(gnttab_alloc_pages);
 
+void gnttab_page_cache_init(struct gnttab_page_cache *cache)
+{
+	spin_lock_init(&cache->lock);
+	INIT_LIST_HEAD(&cache->pages);
+	cache->num_pages = 0;
+}
+EXPORT_SYMBOL_GPL(gnttab_page_cache_init);
+
+int gnttab_page_cache_get(struct gnttab_page_cache *cache, struct page **page)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&cache->lock, flags);
+
+	if (list_empty(&cache->pages)) {
+		spin_unlock_irqrestore(&cache->lock, flags);
+		return gnttab_alloc_pages(1, page);
+	}
+
+	page[0] = list_first_entry(&cache->pages, struct page, lru);
+	list_del(&page[0]->lru);
+	cache->num_pages--;
+
+	spin_unlock_irqrestore(&cache->lock, flags);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(gnttab_page_cache_get);
+
+void gnttab_page_cache_put(struct gnttab_page_cache *cache, struct page **page,
+			   unsigned int num)
+{
+	unsigned long flags;
+	unsigned int i;
+
+	spin_lock_irqsave(&cache->lock, flags);
+
+	for (i = 0; i < num; i++)
+		list_add(&page[i]->lru, &cache->pages);
+	cache->num_pages += num;
+
+	spin_unlock_irqrestore(&cache->lock, flags);
+}
+EXPORT_SYMBOL_GPL(gnttab_page_cache_put);
+
+void gnttab_page_cache_shrink(struct gnttab_page_cache *cache, unsigned int num)
+{
+	struct page *page[10];
+	unsigned int i = 0;
+	unsigned long flags;
+
+	spin_lock_irqsave(&cache->lock, flags);
+
+	while (cache->num_pages > num) {
+		page[i] = list_first_entry(&cache->pages, struct page, lru);
+		list_del(&page[i]->lru);
+		cache->num_pages--;
+		if (++i == ARRAY_SIZE(page)) {
+			spin_unlock_irqrestore(&cache->lock, flags);
+			gnttab_free_pages(i, page);
+			i = 0;
+			spin_lock_irqsave(&cache->lock, flags);
+		}
+	}
+
+	spin_unlock_irqrestore(&cache->lock, flags);
+
+	if (i != 0)
+		gnttab_free_pages(i, page);
+}
+EXPORT_SYMBOL_GPL(gnttab_page_cache_shrink);
+
 void gnttab_pages_clear_private(int nr_pages, struct page **pages)
 {
 	int i;
diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
index 4acc4e899600..862162dca33c 100644
--- a/drivers/xen/xen-scsiback.c
+++ b/drivers/xen/xen-scsiback.c
@@ -99,6 +99,8 @@ struct vscsibk_info {
 	struct list_head v2p_entry_lists;
 
 	wait_queue_head_t waiting_to_free;
+
+	struct gnttab_page_cache free_pages;
 };
 
 /* theoretical maximum of grants for one request */
@@ -188,10 +190,6 @@ module_param_named(max_buffer_pages, scsiback_max_buffer_pages, int, 0644);
 MODULE_PARM_DESC(max_buffer_pages,
 "Maximum number of free pages to keep in backend buffer");
 
-static DEFINE_SPINLOCK(free_pages_lock);
-static int free_pages_num;
-static LIST_HEAD(scsiback_free_pages);
-
 /* Global spinlock to protect scsiback TPG list */
 static DEFINE_MUTEX(scsiback_mutex);
 static LIST_HEAD(scsiback_list);
@@ -207,41 +205,6 @@ static void scsiback_put(struct vscsibk_info *info)
 		wake_up(&info->waiting_to_free);
 }
 
-static void put_free_pages(struct page **page, int num)
-{
-	unsigned long flags;
-	int i = free_pages_num + num, n = num;
-
-	if (num == 0)
-		return;
-	if (i > scsiback_max_buffer_pages) {
-		n = min(num, i - scsiback_max_buffer_pages);
-		gnttab_free_pages(n, page + num - n);
-		n = num - n;
-	}
-	spin_lock_irqsave(&free_pages_lock, flags);
-	for (i = 0; i < n; i++)
-		list_add(&page[i]->lru, &scsiback_free_pages);
-	free_pages_num += n;
-	spin_unlock_irqrestore(&free_pages_lock, flags);
-}
-
-static int get_free_page(struct page **page)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&free_pages_lock, flags);
-	if (list_empty(&scsiback_free_pages)) {
-		spin_unlock_irqrestore(&free_pages_lock, flags);
-		return gnttab_alloc_pages(1, page);
-	}
-	page[0] = list_first_entry(&scsiback_free_pages, struct page, lru);
-	list_del(&page[0]->lru);
-	free_pages_num--;
-	spin_unlock_irqrestore(&free_pages_lock, flags);
-	return 0;
-}
-
 static unsigned long vaddr_page(struct page *page)
 {
 	unsigned long pfn = page_to_pfn(page);
@@ -302,7 +265,8 @@ static void scsiback_fast_flush_area(struct vscsibk_pend *req)
 		BUG_ON(err);
 	}
 
-	put_free_pages(req->pages, req->n_grants);
+	gnttab_page_cache_put(&req->info->free_pages, req->pages,
+			      req->n_grants);
 	req->n_grants = 0;
 }
 
@@ -445,8 +409,8 @@ static int scsiback_gnttab_data_map_list(struct vscsibk_pend *pending_req,
 	struct vscsibk_info *info = pending_req->info;
 
 	for (i = 0; i < cnt; i++) {
-		if (get_free_page(pg + mapcount)) {
-			put_free_pages(pg, mapcount);
+		if (gnttab_page_cache_get(&info->free_pages, pg + mapcount)) {
+			gnttab_page_cache_put(&info->free_pages, pg, mapcount);
 			pr_err("no grant page\n");
 			return -ENOMEM;
 		}
@@ -796,6 +760,8 @@ static int scsiback_do_cmd_fn(struct vscsibk_info *info,
 		cond_resched();
 	}
 
+	gnttab_page_cache_shrink(&info->free_pages, scsiback_max_buffer_pages);
+
 	RING_FINAL_CHECK_FOR_REQUESTS(&info->ring, more_to_do);
 	return more_to_do;
 }
@@ -1233,6 +1199,8 @@ static int scsiback_remove(struct xenbus_device *dev)
 
 	scsiback_release_translation_entry(info);
 
+	gnttab_page_cache_shrink(&info->free_pages, 0);
+
 	dev_set_drvdata(&dev->dev, NULL);
 
 	return 0;
@@ -1263,6 +1231,7 @@ static int scsiback_probe(struct xenbus_device *dev,
 	info->irq = 0;
 	INIT_LIST_HEAD(&info->v2p_entry_lists);
 	spin_lock_init(&info->v2p_lock);
+	gnttab_page_cache_init(&info->free_pages);
 
 	err = xenbus_printf(XBT_NIL, dev->nodename, "feature-sg-grant", "%u",
 			    SG_ALL);
@@ -1879,13 +1848,6 @@ out:
 
 static void __exit scsiback_exit(void)
 {
-	struct page *page;
-
-	while (free_pages_num) {
-		if (get_free_page(&page))
-			BUG();
-		gnttab_free_pages(1, &page);
-	}
 	target_unregister_template(&scsiback_ops);
 	xenbus_unregister_driver(&scsiback_driver);
 }
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index 9bc5bc07d4d3..c6ef8ffc1a09 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -198,6 +198,19 @@ void gnttab_free_auto_xlat_frames(void);
 int gnttab_alloc_pages(int nr_pages, struct page **pages);
 void gnttab_free_pages(int nr_pages, struct page **pages);
 
+struct gnttab_page_cache {
+	spinlock_t		lock;
+	struct list_head	pages;
+	unsigned int		num_pages;
+};
+
+void gnttab_page_cache_init(struct gnttab_page_cache *cache);
+int gnttab_page_cache_get(struct gnttab_page_cache *cache, struct page **page);
+void gnttab_page_cache_put(struct gnttab_page_cache *cache, struct page **page,
+			   unsigned int num);
+void gnttab_page_cache_shrink(struct gnttab_page_cache *cache,
+			      unsigned int num);
+
 #ifdef CONFIG_XEN_GRANT_DMA_ALLOC
 struct gnttab_dma_alloc_args {
 	/* Device for which DMA memory will be/was allocated. */
commit 263ade7166a2e589c5b605272690c155c0637dcb
Author: Chunyan Zhang <chunyan.zhang at unisoc.com>
Date:   Wed Dec 9 13:51:06 2020 +0800

    gpio: eic-sprd: break loop when getting NULL device resource
    
    EIC controller have unfixed numbers of banks on different Spreadtrum SoCs,
    and each bank has its own base address, the loop of getting there base
    address in driver should break if the resource gotten via
    platform_get_resource() is NULL already. The later ones would be all NULL
    even if the loop continues.
    
    Fixes: 25518e024e3a ("gpio: Add Spreadtrum EIC driver support")
    Signed-off-by: Chunyan Zhang <chunyan.zhang at unisoc.com>
    Link: https://lore.kernel.org/r/20201209055106.840100-1-zhang.lyra@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/gpio/gpio-eic-sprd.c b/drivers/gpio/gpio-eic-sprd.c
index ad61daf6c212..865ab2b34fdd 100644
--- a/drivers/gpio/gpio-eic-sprd.c
+++ b/drivers/gpio/gpio-eic-sprd.c
@@ -598,7 +598,7 @@ static int sprd_eic_probe(struct platform_device *pdev)
 		 */
 		res = platform_get_resource(pdev, IORESOURCE_MEM, i);
 		if (!res)
-			continue;
+			break;
 
 		sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res);
 		if (IS_ERR(sprd_eic->base[i]))
commit e45cdc71d1fa5ac3a57b23acc31eb959e4f60135
Author: Andy Lutomirski <luto at kernel.org>
Date:   Thu Dec 3 21:07:06 2020 -0800

    membarrier: Execute SYNC_CORE on the calling thread
    
    membarrier()'s MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE is documented as
    syncing the core on all sibling threads but not necessarily the calling
    thread.  This behavior is fundamentally buggy and cannot be used safely.
    
    Suppose a user program has two threads.  Thread A is on CPU 0 and thread B
    is on CPU 1.  Thread A modifies some text and calls
    membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE).
    
    Then thread B executes the modified code.  If, at any point after
    membarrier() decides which CPUs to target, thread A could be preempted and
    replaced by thread B on CPU 0.  This could even happen on exit from the
    membarrier() syscall.  If this happens, thread B will end up running on CPU
    0 without having synced.
    
    In principle, this could be fixed by arranging for the scheduler to issue
    sync_core_before_usermode() whenever switching between two threads in the
    same mm if there is any possibility of a concurrent membarrier() call, but
    this would have considerable overhead.  Instead, make membarrier() sync the
    calling CPU as well.
    
    As an optimization, this avoids an extra smp_mb() in the default
    barrier-only mode and an extra rseq preempt on the caller.
    
    Fixes: 70216e18e519 ("membarrier: Provide core serializing command, *_SYNC_CORE")
    Signed-off-by: Andy Lutomirski <luto at kernel.org>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
    Link: https://lore.kernel.org/r/250ded637696d490c69bef1877148db86066881c.1607058304.git.luto@kernel.org

diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c
index 1c278dff4f2d..9d8df34bea75 100644
--- a/kernel/sched/membarrier.c
+++ b/kernel/sched/membarrier.c
@@ -194,7 +194,8 @@ static int membarrier_private_expedited(int flags, int cpu_id)
 			return -EPERM;
 	}
 
-	if (atomic_read(&mm->mm_users) == 1 || num_online_cpus() == 1)
+	if (flags != MEMBARRIER_FLAG_SYNC_CORE &&
+	    (atomic_read(&mm->mm_users) == 1 || num_online_cpus() == 1))
 		return 0;
 
 	/*
@@ -213,8 +214,6 @@ static int membarrier_private_expedited(int flags, int cpu_id)
 
 		if (cpu_id >= nr_cpu_ids || !cpu_online(cpu_id))
 			goto out;
-		if (cpu_id == raw_smp_processor_id())
-			goto out;
 		rcu_read_lock();
 		p = rcu_dereference(cpu_rq(cpu_id)->curr);
 		if (!p || p->mm != mm) {
@@ -229,16 +228,6 @@ static int membarrier_private_expedited(int flags, int cpu_id)
 		for_each_online_cpu(cpu) {
 			struct task_struct *p;
 
-			/*
-			 * Skipping the current CPU is OK even through we can be
-			 * migrated at any point. The current CPU, at the point
-			 * where we read raw_smp_processor_id(), is ensured to
-			 * be in program order with respect to the caller
-			 * thread. Therefore, we can skip this CPU from the
-			 * iteration.
-			 */
-			if (cpu == raw_smp_processor_id())
-				continue;
 			p = rcu_dereference(cpu_rq(cpu)->curr);
 			if (p && p->mm == mm)
 				__cpumask_set_cpu(cpu, tmpmask);
@@ -246,12 +235,38 @@ static int membarrier_private_expedited(int flags, int cpu_id)
 		rcu_read_unlock();
 	}
 
-	preempt_disable();
-	if (cpu_id >= 0)
+	if (cpu_id >= 0) {
+		/*
+		 * smp_call_function_single() will call ipi_func() if cpu_id
+		 * is the calling CPU.
+		 */
 		smp_call_function_single(cpu_id, ipi_func, NULL, 1);
-	else
-		smp_call_function_many(tmpmask, ipi_func, NULL, 1);
-	preempt_enable();
+	} else {
+		/*
+		 * For regular membarrier, we can save a few cycles by
+		 * skipping the current cpu -- we're about to do smp_mb()
+		 * below, and if we migrate to a different cpu, this cpu
+		 * and the new cpu will execute a full barrier in the
+		 * scheduler.
+		 *
+		 * For SYNC_CORE, we do need a barrier on the current cpu --
+		 * otherwise, if we are migrated and replaced by a different
+		 * task in the same mm just before, during, or after
+		 * membarrier, we will end up with some thread in the mm
+		 * running without a core sync.
+		 *
+		 * For RSEQ, don't rseq_preempt() the caller.  User code
+		 * is not supposed to issue syscalls at all from inside an
+		 * rseq critical section.
+		 */
+		if (flags != MEMBARRIER_FLAG_SYNC_CORE) {
+			preempt_disable();
+			smp_call_function_many(tmpmask, ipi_func, NULL, true);
+			preempt_enable();
+		} else {
+			on_each_cpu_mask(tmpmask, ipi_func, NULL, true);
+		}
+	}
 
 out:
 	if (cpu_id < 0)
commit 758c9373d84168dc7d039cf85a0e920046b17b41
Author: Andy Lutomirski <luto at kernel.org>
Date:   Thu Dec 3 21:07:05 2020 -0800

    membarrier: Explicitly sync remote cores when SYNC_CORE is requested
    
    membarrier() does not explicitly sync_core() remote CPUs; instead, it
    relies on the assumption that an IPI will result in a core sync.  On x86,
    this may be true in practice, but it's not architecturally reliable.  In
    particular, the SDM and APM do not appear to guarantee that interrupt
    delivery is serializing.  While IRET does serialize, IPI return can
    schedule, thereby switching to another task in the same mm that was
    sleeping in a syscall.  The new task could then SYSRET back to usermode
    without ever executing IRET.
    
    Make this more robust by explicitly calling sync_core_before_usermode()
    on remote cores.  (This also helps people who search the kernel tree for
    instances of sync_core() and sync_core_before_usermode() -- one might be
    surprised that the core membarrier code doesn't currently show up in a
    such a search.)
    
    Fixes: 70216e18e519 ("membarrier: Provide core serializing command, *_SYNC_CORE")
    Signed-off-by: Andy Lutomirski <luto at kernel.org>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/776b448d5f7bd6b12690707f5ed67bcda7f1d427.1607058304.git.luto@kernel.org

diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c
index 7d98ef5d3bcd..1c278dff4f2d 100644
--- a/kernel/sched/membarrier.c
+++ b/kernel/sched/membarrier.c
@@ -38,6 +38,23 @@ static void ipi_mb(void *info)
 	smp_mb();	/* IPIs should be serializing but paranoid. */
 }
 
+static void ipi_sync_core(void *info)
+{
+	/*
+	 * The smp_mb() in membarrier after all the IPIs is supposed to
+	 * ensure that memory on remote CPUs that occur before the IPI
+	 * become visible to membarrier()'s caller -- see scenario B in
+	 * the big comment at the top of this file.
+	 *
+	 * A sync_core() would provide this guarantee, but
+	 * sync_core_before_usermode() might end up being deferred until
+	 * after membarrier()'s smp_mb().
+	 */
+	smp_mb();	/* IPIs should be serializing but paranoid. */
+
+	sync_core_before_usermode();
+}
+
 static void ipi_rseq(void *info)
 {
 	/*
@@ -162,6 +179,7 @@ static int membarrier_private_expedited(int flags, int cpu_id)
 		if (!(atomic_read(&mm->membarrier_state) &
 		      MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY))
 			return -EPERM;
+		ipi_func = ipi_sync_core;
 	} else if (flags == MEMBARRIER_FLAG_RSEQ) {
 		if (!IS_ENABLED(CONFIG_RSEQ))
 			return -EINVAL;
commit 2ecedd7569080fd05c1a457e8af2165afecfa29f
Author: Andy Lutomirski <luto at kernel.org>
Date:   Thu Dec 3 21:07:04 2020 -0800

    membarrier: Add an actual barrier before rseq_preempt()
    
    It seems that most RSEQ membarrier users will expect any stores done before
    the membarrier() syscall to be visible to the target task(s).  While this
    is extremely likely to be true in practice, nothing actually guarantees it
    by a strict reading of the x86 manuals.  Rather than providing this
    guarantee by accident and potentially causing a problem down the road, just
    add an explicit barrier.
    
    Fixes: 70216e18e519 ("membarrier: Provide core serializing command, *_SYNC_CORE")
    Signed-off-by: Andy Lutomirski <luto at kernel.org>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/d3e7197e034fa4852afcf370ca49c30496e58e40.1607058304.git.luto@kernel.org

diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c
index e23e74d52db5..7d98ef5d3bcd 100644
--- a/kernel/sched/membarrier.c
+++ b/kernel/sched/membarrier.c
@@ -40,6 +40,14 @@ static void ipi_mb(void *info)
 
 static void ipi_rseq(void *info)
 {
+	/*
+	 * Ensure that all stores done by the calling thread are visible
+	 * to the current task before the current task resumes.  We could
+	 * probably optimize this away on most architectures, but by the
+	 * time we've already sent an IPI, the cost of the extra smp_mb()
+	 * is negligible.
+	 */
+	smp_mb();
 	rseq_preempt(current);
 }
 
commit a493d1ca1a03b532871f1da27f8dbda2b28b04c4
Author: Andy Lutomirski <luto at kernel.org>
Date:   Thu Dec 3 21:07:03 2020 -0800

    x86/membarrier: Get rid of a dubious optimization
    
    sync_core_before_usermode() had an incorrect optimization.  If the kernel
    returns from an interrupt, it can get to usermode without IRET. It just has
    to schedule to a different task in the same mm and do SYSRET.  Fortunately,
    there were no callers of sync_core_before_usermode() that could have had
    in_irq() or in_nmi() equal to true, because it's only ever called from the
    scheduler.
    
    While at it, clarify a related comment.
    
    Fixes: 70216e18e519 ("membarrier: Provide core serializing command, *_SYNC_CORE")
    Signed-off-by: Andy Lutomirski <luto at kernel.org>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/5afc7632be1422f91eaf7611aaaa1b5b8580a086.1607058304.git.luto@kernel.org

diff --git a/arch/x86/include/asm/sync_core.h b/arch/x86/include/asm/sync_core.h
index 0fd4a9dfb29c..ab7382f92aff 100644
--- a/arch/x86/include/asm/sync_core.h
+++ b/arch/x86/include/asm/sync_core.h
@@ -98,12 +98,13 @@ static inline void sync_core_before_usermode(void)
 	/* With PTI, we unconditionally serialize before running user code. */
 	if (static_cpu_has(X86_FEATURE_PTI))
 		return;
+
 	/*
-	 * Return from interrupt and NMI is done through iret, which is core
-	 * serializing.
+	 * Even if we're in an interrupt, we might reschedule before returning,
+	 * in which case we could switch to a different thread in the same mm
+	 * and return using SYSRET or SYSEXIT.  Instead of trying to keep
+	 * track of our need to sync the core, just sync right away.
 	 */
-	if (in_irq() || in_nmi())
-		return;
 	sync_core();
 }
 
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index 11666ba19b62..569ac1d57f55 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -474,8 +474,14 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
 	/*
 	 * The membarrier system call requires a full memory barrier and
 	 * core serialization before returning to user-space, after
-	 * storing to rq->curr. Writing to CR3 provides that full
-	 * memory barrier and core serializing instruction.
+	 * storing to rq->curr, when changing mm.  This is because
+	 * membarrier() sends IPIs to all CPUs that are in the target mm
+	 * to make them issue memory barriers.  However, if another CPU
+	 * switches to/from the target mm concurrently with
+	 * membarrier(), it can cause that CPU not to receive an IPI
+	 * when it really should issue a memory barrier.  Writing to CR3
+	 * provides that full memory barrier and core serializing
+	 * instruction.
 	 */
 	if (real_prev == next) {
 		VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) !=
commit e8873c0afd34beb67ec492cd648dd0095b911f65
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Tue Dec 8 20:24:03 2020 +0200

    pinctrl: intel: Actually disable Tx and Rx buffers on GPIO request
    
    Mistakenly the buffers (input and output) become enabled together for a short
    period of time during GPIO request. This is problematic, because instead of
    initial motive to disable them in the commit af7e3eeb84e2
    ("pinctrl: intel: Disable input and output buffer when switching to GPIO"),
    the driven value on the pin, which might be used as an IRQ line, brings
    firmwares of some touch pads to an awkward state that needs a full power off
    to recover. Fix this, as stated in the culprit commit, by disabling the buffers.
    
    Fixes: af7e3eeb84e2 ("pinctrl: intel: Disable input and output buffer when switching to GPIO")
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=210497
    Reported-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>
    Tested-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
    Tested-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
    Link: https://lore.kernel.org/r/20201208182403.40435-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
index 1c10ab184783..b6ef1911c1dd 100644
--- a/drivers/pinctrl/intel/pinctrl-intel.c
+++ b/drivers/pinctrl/intel/pinctrl-intel.c
@@ -442,8 +442,8 @@ static void intel_gpio_set_gpio_mode(void __iomem *padcfg0)
 	value |= PADCFG0_PMODE_GPIO;
 
 	/* Disable input and output buffers */
-	value &= ~PADCFG0_GPIORXDIS;
-	value &= ~PADCFG0_GPIOTXDIS;
+	value |= PADCFG0_GPIORXDIS;
+	value |= PADCFG0_GPIOTXDIS;
 
 	/* Disable SCI/SMI/NMI generation */
 	value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
commit a68a0262abdaa251e12c53715f48e698a18ef402
Author: Minchan Kim <minchan at kernel.org>
Date:   Tue Dec 8 20:57:18 2020 -0800

    mm/madvise: remove racy mm ownership check
    
    Jann spotted the security hole due to race of mm ownership check.
    
    If the task is sharing the mm_struct but goes through execve() before
    mm_access(), it could skip process_madvise_behavior_valid check.  That
    makes *any advice hint* to reach into the remote process.
    
    This patch removes the mm ownership check.  With it, it will lose the
    ability that local process could give *any* advice hint with vector
    interface for some reason (e.g., performance).  Since there is no
    concrete example in upstream yet, it would be better to remove the
    abiliity at this moment and need to review when such new advice comes
    up.
    
    Fixes: ecb8ac8b1f14 ("mm/madvise: introduce process_madvise() syscall: an external memory hinting API")
    Reported-by: Jann Horn <jannh at google.com>
    Suggested-by: Jann Horn <jannh at google.com>
    Signed-off-by: Minchan Kim <minchan at kernel.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/madvise.c b/mm/madvise.c
index a8d8d48a57fe..13f5677b9322 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1204,8 +1204,7 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
 		goto put_pid;
 	}
 
-	if (task->mm != current->mm &&
-			!process_madvise_behavior_valid(behavior)) {
+	if (!process_madvise_behavior_valid(behavior)) {
 		ret = -EINVAL;
 		goto release_task;
 	}
commit 0e830d2872cf6e75ef6619edd23050ddf3673358
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Tue Dec 1 17:44:58 2020 -0500

    drm/amdgpu/powerplay: parse fan table for CI asics
    
    Set up all the parameters required for SMU fan control if supported.
    
    Bug: https://bugzilla.kernel.org/show_bug.cgi?id=201539
    Acked-by: Evan Quan <evan.quan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
index 719597c5d27d..6606511891e3 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c
@@ -24,6 +24,8 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
+#include <linux/pci.h>
+
 #include <drm/amdgpu_drm.h>
 #include "processpptables.h"
 #include <atom-types.h>
@@ -984,6 +986,8 @@ static int init_thermal_controller(
 			struct pp_hwmgr *hwmgr,
 			const ATOM_PPLIB_POWERPLAYTABLE *powerplay_table)
 {
+	struct amdgpu_device *adev = hwmgr->adev;
+
 	hwmgr->thermal_controller.ucType =
 			powerplay_table->sThermalController.ucType;
 	hwmgr->thermal_controller.ucI2cLine =
@@ -1008,7 +1012,104 @@ static int init_thermal_controller(
 		   ATOM_PP_THERMALCONTROLLER_NONE != hwmgr->thermal_controller.ucType,
 		   PHM_PlatformCaps_ThermalController);
 
-	hwmgr->thermal_controller.use_hw_fan_control = 1;
+        if (powerplay_table->usTableSize >= sizeof(ATOM_PPLIB_POWERPLAYTABLE3)) {
+		const ATOM_PPLIB_POWERPLAYTABLE3 *powerplay_table3 =
+			(const ATOM_PPLIB_POWERPLAYTABLE3 *)powerplay_table;
+
+		if (0 == le16_to_cpu(powerplay_table3->usFanTableOffset)) {
+			hwmgr->thermal_controller.use_hw_fan_control = 1;
+			return 0;
+		} else {
+			const ATOM_PPLIB_FANTABLE *fan_table =
+				(const ATOM_PPLIB_FANTABLE *)(((unsigned long)powerplay_table) +
+							      le16_to_cpu(powerplay_table3->usFanTableOffset));
+
+			if (1 <= fan_table->ucFanTableFormat) {
+				hwmgr->thermal_controller.advanceFanControlParameters.ucTHyst =
+					fan_table->ucTHyst;
+				hwmgr->thermal_controller.advanceFanControlParameters.usTMin =
+					le16_to_cpu(fan_table->usTMin);
+				hwmgr->thermal_controller.advanceFanControlParameters.usTMed =
+					le16_to_cpu(fan_table->usTMed);
+				hwmgr->thermal_controller.advanceFanControlParameters.usTHigh =
+					le16_to_cpu(fan_table->usTHigh);
+				hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin =
+					le16_to_cpu(fan_table->usPWMMin);
+				hwmgr->thermal_controller.advanceFanControlParameters.usPWMMed =
+					le16_to_cpu(fan_table->usPWMMed);
+				hwmgr->thermal_controller.advanceFanControlParameters.usPWMHigh =
+					le16_to_cpu(fan_table->usPWMHigh);
+				hwmgr->thermal_controller.advanceFanControlParameters.usTMax = 10900;
+				hwmgr->thermal_controller.advanceFanControlParameters.ulCycleDelay = 100000;
+
+				phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+					    PHM_PlatformCaps_MicrocodeFanControl);
+			}
+
+			if (2 <= fan_table->ucFanTableFormat) {
+				const ATOM_PPLIB_FANTABLE2 *fan_table2 =
+					(const ATOM_PPLIB_FANTABLE2 *)(((unsigned long)powerplay_table) +
+								       le16_to_cpu(powerplay_table3->usFanTableOffset));
+				hwmgr->thermal_controller.advanceFanControlParameters.usTMax =
+					le16_to_cpu(fan_table2->usTMax);
+			}
+
+			if (3 <= fan_table->ucFanTableFormat) {
+				const ATOM_PPLIB_FANTABLE3 *fan_table3 =
+					(const ATOM_PPLIB_FANTABLE3 *) (((unsigned long)powerplay_table) +
+									le16_to_cpu(powerplay_table3->usFanTableOffset));
+
+				hwmgr->thermal_controller.advanceFanControlParameters.ucFanControlMode =
+					fan_table3->ucFanControlMode;
+
+				if ((3 == fan_table->ucFanTableFormat) &&
+				    (0x67B1 == adev->pdev->device))
+					hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanPWM =
+						47;
+				else
+					hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanPWM =
+						le16_to_cpu(fan_table3->usFanPWMMax);
+
+				hwmgr->thermal_controller.advanceFanControlParameters.usDefaultFanOutputSensitivity =
+					4836;
+				hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity =
+					le16_to_cpu(fan_table3->usFanOutputSensitivity);
+			}
+
+			if (6 <= fan_table->ucFanTableFormat) {
+				const ATOM_PPLIB_FANTABLE4 *fan_table4 =
+					(const ATOM_PPLIB_FANTABLE4 *)(((unsigned long)powerplay_table) +
+								       le16_to_cpu(powerplay_table3->usFanTableOffset));
+
+				phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+					    PHM_PlatformCaps_FanSpeedInTableIsRPM);
+
+				hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanRPM =
+					le16_to_cpu(fan_table4->usFanRPMMax);
+			}
+
+			if (7 <= fan_table->ucFanTableFormat) {
+				const ATOM_PPLIB_FANTABLE5 *fan_table5 =
+					(const ATOM_PPLIB_FANTABLE5 *)(((unsigned long)powerplay_table) +
+								       le16_to_cpu(powerplay_table3->usFanTableOffset));
+
+				if (0x67A2 == adev->pdev->device ||
+				    0x67A9 == adev->pdev->device ||
+				    0x67B9 == adev->pdev->device) {
+					phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+						    PHM_PlatformCaps_GeminiRegulatorFanControlSupport);
+					hwmgr->thermal_controller.advanceFanControlParameters.usFanCurrentLow =
+						le16_to_cpu(fan_table5->usFanCurrentLow);
+					hwmgr->thermal_controller.advanceFanControlParameters.usFanCurrentHigh =
+						le16_to_cpu(fan_table5->usFanCurrentHigh);
+					hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMLow =
+						le16_to_cpu(fan_table5->usFanRPMLow);
+					hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMHigh =
+						le16_to_cpu(fan_table5->usFanRPMHigh);
+				}
+			}
+		}
+	}
 
 	return 0;
 }
commit b62527005d46d52b4733cbc57f2f9b514b673ed9
Author: KP Singh <kpsingh at kernel.org>
Date:   Tue Dec 8 22:49:00 2020 +0100

    bpf, doc: Update KP's email in MAINTAINERS
    
    Helps me use a single account to sign off and send patches use
    appropriate email redirection without needing to update MAINTAINERS.
    
    Signed-off-by: KP Singh <kpsingh at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201208214900.80684-1-kpsingh@kernel.org

diff --git a/MAINTAINERS b/MAINTAINERS
index 98f0bd050ff5..ba63f61e4ef1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3237,7 +3237,7 @@ R:	Martin KaFai Lau <kafai at fb.com>
 R:	Song Liu <songliubraving at fb.com>
 R:	Yonghong Song <yhs at fb.com>
 R:	John Fastabend <john.fastabend at gmail.com>
-R:	KP Singh <kpsingh at chromium.org>
+R:	KP Singh <kpsingh at kernel.org>
 L:	netdev at vger.kernel.org
 L:	bpf at vger.kernel.org
 S:	Supported
@@ -3356,7 +3356,7 @@ F:	arch/x86/net/
 X:	arch/x86/net/bpf_jit_comp32.c
 
 BPF LSM (Security Audit and Enforcement using BPF)
-M:	KP Singh <kpsingh at chromium.org>
+M:	KP Singh <kpsingh at kernel.org>
 R:	Florent Revest <revest at chromium.org>
 R:	Brendan Jackman <jackmanb at chromium.org>
 L:	bpf at vger.kernel.org
commit 72d05c00d7ecda85df29abd046da7e41cc071c17
Author: Eric Dumazet <edumazet at google.com>
Date:   Tue Dec 8 08:21:31 2020 -0800

    tcp: select sane initial rcvq_space.space for big MSS
    
    Before commit a337531b942b ("tcp: up initial rmem to 128KB and SYN rwin to around 64KB")
    small tcp_rmem[1] values were overridden by tcp_fixup_rcvbuf() to accommodate various MSS.
    
    This is no longer the case, and Hazem Mohamed Abuelfotoh reported
    that DRS would not work for MTU 9000 endpoints receiving regular (1500 bytes) frames.
    
    Root cause is that tcp_init_buffer_space() uses tp->rcv_wnd for upper limit
    of rcvq_space.space computation, while it can select later a smaller
    value for tp->rcv_ssthresh and tp->window_clamp.
    
    ss -temoi on receiver would show :
    
    skmem:(r0,rb131072,t0,tb46080,f0,w0,o0,bl0,d0) rcv_space:62496 rcv_ssthresh:56596
    
    This means that TCP can not increase its window in tcp_grow_window(),
    and that DRS can never kick.
    
    Fix this by making sure that rcvq_space.space is not bigger than number of bytes
    that can be held in TCP receive queue.
    
    People unable/unwilling to change their kernel can work around this issue by
    selecting a bigger tcp_rmem[1] value as in :
    
    echo "4096 196608 6291456" >/proc/sys/net/ipv4/tcp_rmem
    
    Based on an initial report and patch from Hazem Mohamed Abuelfotoh
     https://lore.kernel.org/netdev/20201204180622.14285-1-abuehaze@amazon.com/
    
    Fixes: a337531b942b ("tcp: up initial rmem to 128KB and SYN rwin to around 64KB")
    Fixes: 041a14d26715 ("tcp: start receiver buffer autotuning sooner")
    Reported-by: Hazem Mohamed Abuelfotoh <abuehaze at amazon.com>
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Acked-by: Soheil Hassas Yeganeh <soheil at google.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 389d1b340248..ef4bdb038a4b 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -510,7 +510,6 @@ static void tcp_init_buffer_space(struct sock *sk)
 	if (!(sk->sk_userlocks & SOCK_SNDBUF_LOCK))
 		tcp_sndbuf_expand(sk);
 
-	tp->rcvq_space.space = min_t(u32, tp->rcv_wnd, TCP_INIT_CWND * tp->advmss);
 	tcp_mstamp_refresh(tp);
 	tp->rcvq_space.time = tp->tcp_mstamp;
 	tp->rcvq_space.seq = tp->copied_seq;
@@ -534,6 +533,8 @@ static void tcp_init_buffer_space(struct sock *sk)
 
 	tp->rcv_ssthresh = min(tp->rcv_ssthresh, tp->window_clamp);
 	tp->snd_cwnd_stamp = tcp_jiffies32;
+	tp->rcvq_space.space = min3(tp->rcv_ssthresh, tp->rcv_wnd,
+				    (u32)TCP_INIT_CWND * tp->advmss);
 }
 
 /* 4. Recalculate window clamp after socket hit its memory bounds. */
commit cc6596fc7295e9dcd78156ed42f9f8e1221f7530
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Tue Dec 8 09:53:42 2020 +0800

    net: ll_temac: Fix potential NULL dereference in temac_probe()
    
    platform_get_resource() may fail and in this case a NULL dereference
    will occur.
    
    Fix it to use devm_platform_ioremap_resource() instead of calling
    platform_get_resource() and devm_ioremap().
    
    This is detected by Coccinelle semantic patch.
    
    @@
    expression pdev, res, n, t, e, e1, e2;
    @@
    
    res = \(platform_get_resource\|platform_get_resource_byname\)(pdev, t, n);
    + if (!res)
    +   return -EINVAL;
    ... when != res == NULL
    e = devm_ioremap(e1, res->start, e2);
    
    Fixes: 8425c41d1ef7 ("net: ll_temac: Extend support to non-device-tree platforms")
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Acked-by: Esben Haabendal <esben at geanix.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 60c199fcb91e..030185301014 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -1351,7 +1351,6 @@ static int temac_probe(struct platform_device *pdev)
 	struct device_node *temac_np = dev_of_node(&pdev->dev), *dma_np;
 	struct temac_local *lp;
 	struct net_device *ndev;
-	struct resource *res;
 	const void *addr;
 	__be32 *p;
 	bool little_endian;
@@ -1500,13 +1499,11 @@ static int temac_probe(struct platform_device *pdev)
 		of_node_put(dma_np);
 	} else if (pdata) {
 		/* 2nd memory resource specifies DMA registers */
-		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-		lp->sdma_regs = devm_ioremap(&pdev->dev, res->start,
-						     resource_size(res));
-		if (!lp->sdma_regs) {
+		lp->sdma_regs = devm_platform_ioremap_resource(pdev, 1);
+		if (IS_ERR(lp->sdma_regs)) {
 			dev_err(&pdev->dev,
 				"could not map DMA registers\n");
-			return -ENOMEM;
+			return PTR_ERR(lp->sdma_regs);
 		}
 		if (pdata->dma_little_endian) {
 			lp->dma_in = temac_dma_in32_le;
commit 4cb682964706deffb4861f0a91329ab3a705039f
Author: David Howells <dhowells at redhat.com>
Date:   Tue Dec 8 23:52:03 2020 +0000

    afs: Fix memory leak when mounting with multiple source parameters
    
    There's a memory leak in afs_parse_source() whereby multiple source=
    parameters overwrite fc->source in the fs_context struct without freeing
    the previously recorded source.
    
    Fix this by only permitting a single source parameter and rejecting with
    an error all subsequent ones.
    
    This was caught by syzbot with the kernel memory leak detector, showing
    something like the following trace:
    
      unreferenced object 0xffff888114375440 (size 32):
        comm "repro", pid 5168, jiffies 4294923723 (age 569.948s)
        backtrace:
          slab_post_alloc_hook+0x42/0x79
          __kmalloc_track_caller+0x125/0x16a
          kmemdup_nul+0x24/0x3c
          vfs_parse_fs_string+0x5a/0xa1
          generic_parse_monolithic+0x9d/0xc5
          do_new_mount+0x10d/0x15a
          do_mount+0x5f/0x8e
          __do_sys_mount+0xff/0x127
          do_syscall_64+0x2d/0x3a
          entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: 13fcc6837049 ("afs: Add fs_context support")
    Reported-by: syzbot+86dc6632faaca40133ab at syzkaller.appspotmail.com
    Signed-off-by: David Howells <dhowells at redhat.com>
    cc: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/afs/super.c b/fs/afs/super.c
index 6c5900df6aa5..e38bb1e7a4d2 100644
--- a/fs/afs/super.c
+++ b/fs/afs/super.c
@@ -230,6 +230,9 @@ static int afs_parse_source(struct fs_context *fc, struct fs_parameter *param)
 
 	_enter(",%s", name);
 
+	if (fc->source)
+		return invalf(fc, "kAFS: Multiple sources not supported");
+
 	if (!name) {
 		printk(KERN_ERR "kAFS: no volume name specified\n");
 		return -EINVAL;
commit 0398ba9e5a4b5675aa571e0445689d3c2e499c2d
Author: Cengiz Can <cengiz at kernel.wtf>
Date:   Mon Dec 7 11:14:24 2020 +0300

    net: tipc: prevent possible null deref of link
    
    `tipc_node_apply_property` does a null check on a `tipc_link_entry`
    pointer but also accesses the same pointer out of the null check block.
    
    This triggers a warning on Coverity Static Analyzer because we're
    implying that `e->link` can BE null.
    
    Move "Update MTU for node link entry" line into if block to make sure
    that we're not in a state that `e->link` is null.
    
    Signed-off-by: Cengiz Can <cengiz at kernel.wtf>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/net/tipc/node.c b/net/tipc/node.c
index c95d037fde51..83978d5dae59 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -2181,9 +2181,11 @@ void tipc_node_apply_property(struct net *net, struct tipc_bearer *b,
 							&xmitq);
 			else if (prop == TIPC_NLA_PROP_MTU)
 				tipc_link_set_mtu(e->link, b->mtu);
+
+			/* Update MTU for node link entry */
+			e->mtu = tipc_link_mss(e->link);
 		}
-		/* Update MTU for node link entry */
-		e->mtu = tipc_link_mss(e->link);
+
 		tipc_node_write_unlock(n);
 		tipc_bearer_xmit(net, bearer_id, &xmitq, &e->maddr, NULL);
 	}
commit d23e6297176453a247b83b3a476e33d75bf2968a
Merge: db2082700a0c d0c6707ca423
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Wed Dec 9 00:13:37 2020 +0100

    Merge tag 'sunxi-fixes-for-5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into arm/fixes
    
    A few more RGMII-ID fixes
    
    * tag 'sunxi-fixes-for-5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux:
      arm64: dts: allwinner: H5: NanoPi Neo Plus2: phy-mode rgmii-id
      arm64: dts: allwinner: A64 Sopine: phy-mode rgmii-id
    
    Link: https://lore.kernel.org/r/2a351c9c-470f-4c5e-ba37-80065ae0586d.lettre@localhost
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit c6f7e1510b872c281ff603a3108c084b6548d35c
Merge: 1a0e1943d879 6220e48d9640
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Dec 8 15:03:39 2020 -0800

    Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
    
    Pull sparc64 csum fix from Al Viro:
     "Fix for a brown paperbag regression in sparc64"
    
    * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
      [regression fix] really dumb fuckup in sparc64 __csum_partial_copy() changes

commit 1a0e1943d8798cb3241fb5edb9a836af1611b60a
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Dec 8 15:00:36 2020 -0800

    Revert "scsi: megaraid_sas: Added support for shared host tagset for cpuhotplug"
    
    This reverts commit 103fbf8e4020845e4fcf63819288cedb092a3c91.
    
    It turns out that it causes long boot-time latencies (to the point of
    timeouts and failed boots).
    
    The cause is the increase in request queues, and a fix for that is
    queued up for 5.11, but we're reverting this commit that triggered the
    problem for now.
    
    Reported-and-tested-by: John Garry <john.garry at huawei.com>
    Reported-and-tested-by: Julia Lawall <julia.lawall at inria.fr>
    Reported-by: Qian Cai <cai at redhat.com>
    Acked-by: Jens Axboe <axboe at kernel.dk>
    Acked-by: Martin K. Petersen <martin.petersen at oracle.com>
    Link: https://lore.kernel.org/linux-scsi/fe3dff7dae4494e5a88caffbb4d877bbf472dceb.camel@redhat.com/
    Link: https://lore.kernel.org/lkml/alpine.DEB.2.22.394.2012081813310.2680@hadrien/
    Link: https://lore.kernel.org/linux-block/20201203012638.543321-1-ming.lei@redhat.com/
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index 41cd66fc7d81..e158d3d62056 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -37,7 +37,6 @@
 #include <linux/poll.h>
 #include <linux/vmalloc.h>
 #include <linux/irq_poll.h>
-#include <linux/blk-mq-pci.h>
 
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
@@ -114,10 +113,6 @@ unsigned int enable_sdev_max_qd;
 module_param(enable_sdev_max_qd, int, 0444);
 MODULE_PARM_DESC(enable_sdev_max_qd, "Enable sdev max qd as can_queue. Default: 0");
 
-int host_tagset_enable = 1;
-module_param(host_tagset_enable, int, 0444);
-MODULE_PARM_DESC(host_tagset_enable, "Shared host tagset enable/disable Default: enable(1)");
-
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGASAS_VERSION);
 MODULE_AUTHOR("megaraidlinux.pdl at broadcom.com");
@@ -3124,19 +3119,6 @@ megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
 	return 0;
 }
 
-static int megasas_map_queues(struct Scsi_Host *shost)
-{
-	struct megasas_instance *instance;
-
-	instance = (struct megasas_instance *)shost->hostdata;
-
-	if (shost->nr_hw_queues == 1)
-		return 0;
-
-	return blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
-			instance->pdev, instance->low_latency_index_start);
-}
-
 static void megasas_aen_polling(struct work_struct *work);
 
 /**
@@ -3445,7 +3427,6 @@ static struct scsi_host_template megasas_template = {
 	.eh_timed_out = megasas_reset_timer,
 	.shost_attrs = megaraid_host_attrs,
 	.bios_param = megasas_bios_param,
-	.map_queues = megasas_map_queues,
 	.change_queue_depth = scsi_change_queue_depth,
 	.max_segment_size = 0xffffffff,
 };
@@ -6827,26 +6808,6 @@ static int megasas_io_attach(struct megasas_instance *instance)
 	host->max_lun = MEGASAS_MAX_LUN;
 	host->max_cmd_len = 16;
 
-	/* Use shared host tagset only for fusion adaptors
-	 * if there are managed interrupts (smp affinity enabled case).
-	 * Single msix_vectors in kdump, so shared host tag is also disabled.
-	 */
-
-	host->host_tagset = 0;
-	host->nr_hw_queues = 1;
-
-	if ((instance->adapter_type != MFI_SERIES) &&
-		(instance->msix_vectors > instance->low_latency_index_start) &&
-		host_tagset_enable &&
-		instance->smp_affinity_enable) {
-		host->host_tagset = 1;
-		host->nr_hw_queues = instance->msix_vectors -
-			instance->low_latency_index_start;
-	}
-
-	dev_info(&instance->pdev->dev,
-		"Max firmware commands: %d shared with nr_hw_queues = %d\n",
-		instance->max_fw_cmds, host->nr_hw_queues);
 	/*
 	 * Notify the mid-layer about the new controller
 	 */
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index fd607287608e..b0c01cf0428f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -359,29 +359,24 @@ megasas_get_msix_index(struct megasas_instance *instance,
 {
 	int sdev_busy;
 
-	/* TBD - if sml remove device_busy in future, driver
-	 * should track counter in internal structure.
-	 */
-	sdev_busy = atomic_read(&scmd->device->device_busy);
+	/* nr_hw_queue = 1 for MegaRAID */
+	struct blk_mq_hw_ctx *hctx =
+		scmd->device->request_queue->queue_hw_ctx[0];
+
+	sdev_busy = atomic_read(&hctx->nr_active);
 
 	if (instance->perf_mode == MR_BALANCED_PERF_MODE &&
-	    sdev_busy > (data_arms * MR_DEVICE_HIGH_IOPS_DEPTH)) {
+	    sdev_busy > (data_arms * MR_DEVICE_HIGH_IOPS_DEPTH))
 		cmd->request_desc->SCSIIO.MSIxIndex =
 			mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) /
 					MR_HIGH_IOPS_BATCH_COUNT), instance->low_latency_index_start);
-	} else if (instance->msix_load_balance) {
+	else if (instance->msix_load_balance)
 		cmd->request_desc->SCSIIO.MSIxIndex =
 			(mega_mod64(atomic64_add_return(1, &instance->total_io_count),
 				instance->msix_vectors));
-	} else if (instance->host->nr_hw_queues > 1) {
-		u32 tag = blk_mq_unique_tag(scmd->request);
-
-		cmd->request_desc->SCSIIO.MSIxIndex = blk_mq_unique_tag_to_hwq(tag) +
-			instance->low_latency_index_start;
-	} else {
+	else
 		cmd->request_desc->SCSIIO.MSIxIndex =
 			instance->reply_map[raw_smp_processor_id()];
-	}
 }
 
 /**
@@ -961,6 +956,9 @@ megasas_alloc_cmds_fusion(struct megasas_instance *instance)
 	if (megasas_alloc_cmdlist_fusion(instance))
 		goto fail_exit;
 
+	dev_info(&instance->pdev->dev, "Configured max firmware commands: %d\n",
+		 instance->max_fw_cmds);
+
 	/* The first 256 bytes (SMID 0) is not used. Don't add to the cmd list */
 	io_req_base = fusion->io_request_frames + MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE;
 	io_req_base_phys = fusion->io_request_frames_phys + MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE;
@@ -1104,9 +1102,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
 		MR_HIGH_IOPS_QUEUE_COUNT) && cur_intr_coalescing)
 		instance->perf_mode = MR_BALANCED_PERF_MODE;
 
-	dev_info(&instance->pdev->dev, "Performance mode :%s (latency index = %d)\n",
-		MEGASAS_PERF_MODE_2STR(instance->perf_mode),
-		instance->low_latency_index_start);
+	dev_info(&instance->pdev->dev, "Performance mode :%s\n",
+		MEGASAS_PERF_MODE_2STR(instance->perf_mode));
 
 	instance->fw_sync_cache_support = (scratch_pad_1 &
 		MR_CAN_HANDLE_SYNC_CACHE_OFFSET) ? 1 : 0;
commit 9756bb63e8d10aad720c378f3fd18e5fa1cc06ec
Merge: 007ab5345545 f119cc9818eb
Author: David S. Miller <davem at davemloft.net>
Date:   Tue Dec 8 14:52:29 2020 -0800

    Merge branch 'stmmac-fixes'
    
    Joakim Zhang says:
    
    ====================
    patches for stmmac
    
    A patch set for stmmac, fix some driver issues.
    
    ChangeLogs:
    V1->V2:
            * add Fixes tag.
            * add patch 5/5 into this patch set.
    
    V2->V3:
            * rebase to latest net tree where fixes go.
    ====================
    
    Signed-off-by: David S. Miller <davem at davemloft.net>

commit f119cc9818eb33b66e977ad3af75aef6500bbdc3
Author: Fugang Duan <fugang.duan at nxp.com>
Date:   Mon Dec 7 18:51:41 2020 +0800

    net: stmmac: overwrite the dma_cap.addr64 according to HW design
    
    The current IP register MAC_HW_Feature1[ADDR64] only defines
    32/40/64 bit width, but some SOCs support others like i.MX8MP
    support 34 bits but it maps to 40 bits width in MAC_HW_Feature1[ADDR64].
    So overwrite dma_cap.addr64 according to HW real design.
    
    Fixes: 94abdad6974a ("net: ethernet: dwmac: add ethernet glue logic for NXP imx8 chip")
    Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang at nxp.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
index efef5476a577..223f69da7e95 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
@@ -246,13 +246,7 @@ static int imx_dwmac_probe(struct platform_device *pdev)
 		goto err_parse_dt;
 	}
 
-	ret = dma_set_mask_and_coherent(&pdev->dev,
-					DMA_BIT_MASK(dwmac->ops->addr_width));
-	if (ret) {
-		dev_err(&pdev->dev, "DMA mask set failed\n");
-		goto err_dma_mask;
-	}
-
+	plat_dat->addr64 = dwmac->ops->addr_width;
 	plat_dat->init = imx_dwmac_init;
 	plat_dat->exit = imx_dwmac_exit;
 	plat_dat->fix_mac_speed = imx_dwmac_fix_speed;
@@ -272,7 +266,6 @@ static int imx_dwmac_probe(struct platform_device *pdev)
 err_dwmac_init:
 err_drv_probe:
 	imx_dwmac_exit(pdev, plat_dat->bsp_priv);
-err_dma_mask:
 err_parse_dt:
 err_match_data:
 	stmmac_remove_config_dt(pdev, plat_dat);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index d2521ebb8217..c33db79cdd0a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -4945,6 +4945,14 @@ int stmmac_dvr_probe(struct device *device,
 		dev_info(priv->device, "SPH feature enabled\n");
 	}
 
+	/* The current IP register MAC_HW_Feature1[ADDR64] only define
+	 * 32/40/64 bit width, but some SOC support others like i.MX8MP
+	 * support 34 bits but it map to 40 bits width in MAC_HW_Feature1[ADDR64].
+	 * So overwrite dma_cap.addr64 according to HW real design.
+	 */
+	if (priv->plat->addr64)
+		priv->dma_cap.addr64 = priv->plat->addr64;
+
 	if (priv->dma_cap.addr64) {
 		ret = dma_set_mask_and_coherent(device,
 				DMA_BIT_MASK(priv->dma_cap.addr64));
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
index 628e28903b8b..15ca6b4167cc 100644
--- a/include/linux/stmmac.h
+++ b/include/linux/stmmac.h
@@ -170,6 +170,7 @@ struct plat_stmmacenet_data {
 	int unicast_filter_entries;
 	int tx_fifo_size;
 	int rx_fifo_size;
+	u32 addr64;
 	u32 rx_queues_to_use;
 	u32 tx_queues_to_use;
 	u8 rx_sched_algorithm;
commit 5f58591323bf3f342920179f24515935c4b5fd60
Author: Fugang Duan <fugang.duan at nxp.com>
Date:   Mon Dec 7 18:51:40 2020 +0800

    net: stmmac: delete the eee_ctrl_timer after napi disabled
    
    There have chance to re-enable the eee_ctrl_timer and fire the timer
    in napi callback after delete the timer in .stmmac_release(), which
    introduces to access eee registers in the timer function after clocks
    are disabled then causes system hang. Found this issue when do
    suspend/resume and reboot stress test.
    
    It is safe to delete the timer after napi disabled and disable lpi mode.
    
    Fixes: d765955d2ae0b ("stmmac: add the Energy Efficient Ethernet support")
    Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang at nxp.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 7452f3c1cab9..d2521ebb8217 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2908,9 +2908,6 @@ static int stmmac_release(struct net_device *dev)
 	struct stmmac_priv *priv = netdev_priv(dev);
 	u32 chan;
 
-	if (priv->eee_enabled)
-		del_timer_sync(&priv->eee_ctrl_timer);
-
 	if (device_may_wakeup(priv->device))
 		phylink_speed_down(priv->phylink, false);
 	/* Stop and disconnect the PHY */
@@ -2929,6 +2926,11 @@ static int stmmac_release(struct net_device *dev)
 	if (priv->lpi_irq > 0)
 		free_irq(priv->lpi_irq, dev);
 
+	if (priv->eee_enabled) {
+		priv->tx_path_in_lpi_mode = false;
+		del_timer_sync(&priv->eee_ctrl_timer);
+	}
+
 	/* Stop TX/RX DMA and clear the descriptors */
 	stmmac_stop_all_dma(priv);
 
@@ -5155,6 +5157,11 @@ int stmmac_suspend(struct device *dev)
 	for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
 		del_timer_sync(&priv->tx_queue[chan].txtimer);
 
+	if (priv->eee_enabled) {
+		priv->tx_path_in_lpi_mode = false;
+		del_timer_sync(&priv->eee_ctrl_timer);
+	}
+
 	/* Stop TX/RX DMA */
 	stmmac_stop_all_dma(priv);
 
commit 4ec236c7c51f89abb0224a4da4a6b77f9beb6600
Author: Fugang Duan <fugang.duan at nxp.com>
Date:   Mon Dec 7 18:51:39 2020 +0800

    net: stmmac: free tx skb buffer in stmmac_resume()
    
    When do suspend/resume test, there have WARN_ON() log dump from
    stmmac_xmit() funciton, the code logic:
            entry = tx_q->cur_tx;
            first_entry = entry;
            WARN_ON(tx_q->tx_skbuff[first_entry]);
    
    In normal case, tx_q->tx_skbuff[txq->cur_tx] should be NULL because
    the skb should be handled and freed in stmmac_tx_clean().
    
    But stmmac_resume() reset queue parameters like below, skb buffers
    may not be freed.
            tx_q->cur_tx = 0;
            tx_q->dirty_tx = 0;
    
    So free tx skb buffer in stmmac_resume() to avoid warning and
    memory leak.
    
    log:
    [   46.139824] ------------[ cut here ]------------
    [   46.144453] WARNING: CPU: 0 PID: 0 at drivers/net/ethernet/stmicro/stmmac/stmmac_main.c:3235 stmmac_xmit+0x7a0/0x9d0
    [   46.154969] Modules linked in: crct10dif_ce vvcam(O) flexcan can_dev
    [   46.161328] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G           O      5.4.24-2.1.0+g2ad925d15481 #1
    [   46.170369] Hardware name: NXP i.MX8MPlus EVK board (DT)
    [   46.175677] pstate: 80000005 (Nzcv daif -PAN -UAO)
    [   46.180465] pc : stmmac_xmit+0x7a0/0x9d0
    [   46.184387] lr : dev_hard_start_xmit+0x94/0x158
    [   46.188913] sp : ffff800010003cc0
    [   46.192224] x29: ffff800010003cc0 x28: ffff000177e2a100
    [   46.197533] x27: ffff000176ef0840 x26: ffff000176ef0090
    [   46.202842] x25: 0000000000000000 x24: 0000000000000000
    [   46.208151] x23: 0000000000000003 x22: ffff8000119ddd30
    [   46.213460] x21: ffff00017636f000 x20: ffff000176ef0cc0
    [   46.218769] x19: 0000000000000003 x18: 0000000000000000
    [   46.224078] x17: 0000000000000000 x16: 0000000000000000
    [   46.229386] x15: 0000000000000079 x14: 0000000000000000
    [   46.234695] x13: 0000000000000003 x12: 0000000000000003
    [   46.240003] x11: 0000000000000010 x10: 0000000000000010
    [   46.245312] x9 : ffff00017002b140 x8 : 0000000000000000
    [   46.250621] x7 : ffff00017636f000 x6 : 0000000000000010
    [   46.255930] x5 : 0000000000000001 x4 : ffff000176ef0000
    [   46.261238] x3 : 0000000000000003 x2 : 00000000ffffffff
    [   46.266547] x1 : ffff000177e2a000 x0 : 0000000000000000
    [   46.271856] Call trace:
    [   46.274302]  stmmac_xmit+0x7a0/0x9d0
    [   46.277874]  dev_hard_start_xmit+0x94/0x158
    [   46.282056]  sch_direct_xmit+0x11c/0x338
    [   46.285976]  __qdisc_run+0x118/0x5f0
    [   46.289549]  net_tx_action+0x110/0x198
    [   46.293297]  __do_softirq+0x120/0x23c
    [   46.296958]  irq_exit+0xb8/0xd8
    [   46.300098]  __handle_domain_irq+0x64/0xb8
    [   46.304191]  gic_handle_irq+0x5c/0x148
    [   46.307936]  el1_irq+0xb8/0x180
    [   46.311076]  cpuidle_enter_state+0x84/0x360
    [   46.315256]  cpuidle_enter+0x34/0x48
    [   46.318829]  call_cpuidle+0x18/0x38
    [   46.322314]  do_idle+0x1e0/0x280
    [   46.325539]  cpu_startup_entry+0x24/0x40
    [   46.329460]  rest_init+0xd4/0xe0
    [   46.332687]  arch_call_rest_init+0xc/0x14
    [   46.336695]  start_kernel+0x420/0x44c
    [   46.340353] ---[ end trace bc1ee695123cbacd ]---
    
    Fixes: 47dd7a540b8a0 ("net: add support for STMicroelectronics Ethernet controllers.")
    Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang at nxp.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 0cef414f1289..7452f3c1cab9 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -1533,6 +1533,19 @@ static void dma_free_tx_skbufs(struct stmmac_priv *priv, u32 queue)
 		stmmac_free_tx_buffer(priv, queue, i);
 }
 
+/**
+ * stmmac_free_tx_skbufs - free TX skb buffers
+ * @priv: private structure
+ */
+static void stmmac_free_tx_skbufs(struct stmmac_priv *priv)
+{
+	u32 tx_queue_cnt = priv->plat->tx_queues_to_use;
+	u32 queue;
+
+	for (queue = 0; queue < tx_queue_cnt; queue++)
+		dma_free_tx_skbufs(priv, queue);
+}
+
 /**
  * free_dma_rx_desc_resources - free RX dma desc resources
  * @priv: private structure
@@ -5260,6 +5273,7 @@ int stmmac_resume(struct device *dev)
 
 	stmmac_reset_queues_param(priv);
 
+	stmmac_free_tx_skbufs(priv);
 	stmmac_clear_descriptors(priv);
 
 	stmmac_hw_setup(ndev, false);
commit 36d18b5664ef617ccf4da266291d2f2342fab89d
Author: Fugang Duan <fugang.duan at nxp.com>
Date:   Mon Dec 7 18:51:38 2020 +0800

    net: stmmac: start phylink instance before stmmac_hw_setup()
    
    Start phylink instance and resume back the PHY to supply
    RX clock to MAC before MAC layer initialization by calling
    .stmmac_hw_setup(), since DMA reset depends on the RX clock,
    otherwise DMA reset cost maximum timeout value then finally
    timeout.
    
    Fixes: 74371272f97f ("net: stmmac: Convert to phylink and remove phylib logic")
    Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang at nxp.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index ba45fe237512..0cef414f1289 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -5247,6 +5247,14 @@ int stmmac_resume(struct device *dev)
 			return ret;
 	}
 
+	if (!device_may_wakeup(priv->device) || !priv->plat->pmt) {
+		rtnl_lock();
+		phylink_start(priv->phylink);
+		/* We may have called phylink_speed_down before */
+		phylink_speed_up(priv->phylink);
+		rtnl_unlock();
+	}
+
 	rtnl_lock();
 	mutex_lock(&priv->lock);
 
@@ -5265,14 +5273,6 @@ int stmmac_resume(struct device *dev)
 	mutex_unlock(&priv->lock);
 	rtnl_unlock();
 
-	if (!device_may_wakeup(priv->device) || !priv->plat->pmt) {
-		rtnl_lock();
-		phylink_start(priv->phylink);
-		/* We may have called phylink_speed_down before */
-		phylink_speed_up(priv->phylink);
-		rtnl_unlock();
-	}
-
 	phylink_mac_change(priv->phylink, true);
 
 	netif_device_attach(ndev);
commit 9d14edfdeabf37d8d8f045e63e5873712aadcd6b
Author: Fugang Duan <fugang.duan at nxp.com>
Date:   Mon Dec 7 18:51:37 2020 +0800

    net: stmmac: increase the timeout for dma reset
    
    Current timeout value is not enough for gmac5 dma reset
    on imx8mp platform, increase the timeout range.
    
    Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang at nxp.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
index 6e30d7eb4983..0b4ee2dbb691 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
@@ -22,7 +22,7 @@ int dwmac4_dma_reset(void __iomem *ioaddr)
 
 	return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
 				 !(value & DMA_BUS_MODE_SFT_RESET),
-				 10000, 100000);
+				 10000, 1000000);
 }
 
 void dwmac4_set_rx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan)
commit 6220e48d9640538ff700f2e7d24c2f9277555fd6
Author: Al Viro <viro at zeniv.linux.org.uk>
Date:   Tue Dec 8 16:37:47 2020 -0500

    [regression fix] really dumb fuckup in sparc64 __csum_partial_copy() changes
    
    ~0U is -1, not 1
    
    Reported-by: Anatoly Pugachev <matorola at gmail.com>
    Tested-by: Anatoly Pugachev <matorola at gmail.com>
    Fixes: fdf8bee96f9a "sparc64: propagate the calling convention changes down to __csum_partial_copy_...()"
    X-brown-paperbag: yes
    Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>

diff --git a/arch/sparc/lib/csum_copy.S b/arch/sparc/lib/csum_copy.S
index 0c0268e77155..d839956407a7 100644
--- a/arch/sparc/lib/csum_copy.S
+++ b/arch/sparc/lib/csum_copy.S
@@ -71,7 +71,7 @@
 FUNC_NAME:		/* %o0=src, %o1=dst, %o2=len */
 	LOAD(prefetch, %o0 + 0x000, #n_reads)
 	xor		%o0, %o1, %g1
-	mov		1, %o3
+	mov		-1, %o3
 	clr		%o4
 	andcc		%g1, 0x3, %g0
 	bne,pn		%icc, 95f
commit 42f1c27120906a54e73101a7d6a12f58813f6a9f
Author: Pablo Neira Ayuso <pablo at netfilter.org>
Date:   Tue Dec 8 18:57:02 2020 +0100

    netfilter: nftables: comment indirect serialization of commit_mutex with rtnl_mutex
    
    Add an explicit comment in the code to describe the indirect
    serialization of the holders of the commit_mutex with the rtnl_mutex.
    Commit 90d2723c6d4c ("netfilter: nf_tables: do not hold reference on
    netdevice from preparation phase") already describes this, but a comment
    in this case is better for reference.
    
    Reported-by: Vladimir Oltean <olteanv at gmail.com>
    Reviewed-by: Vladimir Oltean <olteanv at gmail.com>
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index c2f59879a48d..9a080767667b 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -1723,6 +1723,10 @@ static struct nft_hook *nft_netdev_hook_alloc(struct net *net,
 	}
 
 	nla_strlcpy(ifname, attr, IFNAMSIZ);
+	/* nf_tables_netdev_event() is called under rtnl_mutex, this is
+	 * indirectly serializing all the other holders of the commit_mutex with
+	 * the rtnl_mutex.
+	 */
 	dev = __dev_get_by_name(net, ifname);
 	if (!dev) {
 		err = -ENOENT;
commit 7d8761ba27fcd9c761919beeaaceac06eed3ad74
Merge: cd796ed33450 4bbf439b09c5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Dec 8 12:20:34 2020 -0800

    Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
    
    Pull seq_file fix from Al Viro:
     "This fixes a regression introduced in this cycle wrt iov_iter based
      variant for reading a seq_file"
    
    * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
      fix return values of seq_read_iter()

commit 917d80d376ffbaa9725fde9e3c0282f63643f278
Author: Pablo Neira Ayuso <pablo at netfilter.org>
Date:   Tue Dec 8 18:25:53 2020 +0100

    netfilter: nft_dynset: fix timeouts later than 23 days
    
    Use nf_msecs_to_jiffies64 and nf_jiffies64_to_msecs as provided by
    8e1102d5a159 ("netfilter: nf_tables: support timeouts larger than 23
    days"), otherwise ruleset listing breaks.
    
    Fixes: a8b1e36d0d1d ("netfilter: nft_dynset: fix element timeout for HZ != 1000")
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h
index 55b4cadf290a..c1c0a4ff92ae 100644
--- a/include/net/netfilter/nf_tables.h
+++ b/include/net/netfilter/nf_tables.h
@@ -1524,4 +1524,8 @@ void __init nft_chain_route_init(void);
 void nft_chain_route_fini(void);
 
 void nf_tables_trans_destroy_flush_work(void);
+
+int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result);
+__be64 nf_jiffies64_to_msecs(u64 input);
+
 #endif /* _NET_NF_TABLES_H */
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 23abf1578594..c2f59879a48d 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -3719,7 +3719,7 @@ cont:
 	return 0;
 }
 
-static int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result)
+int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result)
 {
 	u64 ms = be64_to_cpu(nla_get_be64(nla));
 	u64 max = (u64)(~((u64)0));
@@ -3733,7 +3733,7 @@ static int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result)
 	return 0;
 }
 
-static __be64 nf_jiffies64_to_msecs(u64 input)
+__be64 nf_jiffies64_to_msecs(u64 input)
 {
 	return cpu_to_be64(jiffies64_to_msecs(input));
 }
diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c
index 64ca13a1885b..9af4f93c7f0e 100644
--- a/net/netfilter/nft_dynset.c
+++ b/net/netfilter/nft_dynset.c
@@ -157,8 +157,10 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
 	if (tb[NFTA_DYNSET_TIMEOUT] != NULL) {
 		if (!(set->flags & NFT_SET_TIMEOUT))
 			return -EINVAL;
-		timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
-						tb[NFTA_DYNSET_TIMEOUT])));
+
+		err = nf_msecs_to_jiffies64(tb[NFTA_DYNSET_TIMEOUT], &timeout);
+		if (err)
+			return err;
 	}
 
 	priv->sreg_key = nft_parse_register(tb[NFTA_DYNSET_SREG_KEY]);
@@ -267,7 +269,7 @@ static int nft_dynset_dump(struct sk_buff *skb, const struct nft_expr *expr)
 	if (nla_put_string(skb, NFTA_DYNSET_SET_NAME, priv->set->name))
 		goto nla_put_failure;
 	if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT,
-			 cpu_to_be64(jiffies_to_msecs(priv->timeout)),
+			 nf_jiffies64_to_msecs(priv->timeout),
 			 NFTA_DYNSET_PAD))
 		goto nla_put_failure;
 	if (priv->expr && nft_expr_dump(skb, NFTA_DYNSET_EXPR, priv->expr))
commit 007ab5345545aba2f9cbe4c096cc35d2fd3275ac
Author: Jarod Wilson <jarod at redhat.com>
Date:   Sat Dec 5 12:22:29 2020 -0500

    bonding: fix feature flag setting at init time
    
    Don't try to adjust XFRM support flags if the bond device isn't yet
    registered. Bad things can currently happen when netdev_change_features()
    is called without having wanted_features fully filled in yet. This code
    runs both on post-module-load mode changes, as well as at module init
    time, and when run at module init time, it is before register_netdevice()
    has been called and filled in wanted_features. The empty wanted_features
    led to features also getting emptied out, which was definitely not the
    intended behavior, so prevent that from happening.
    
    Originally, I'd hoped to stop adjusting wanted_features at all in the
    bonding driver, as it's documented as being something only the network
    core should touch, but we actually do need to do this to properly update
    both the features and wanted_features fields when changing the bond type,
    or we get to a situation where ethtool sees:
    
        esp-hw-offload: off [requested on]
    
    I do think we should be using netdev_update_features instead of
    netdev_change_features here though, so we only send notifiers when the
    features actually changed.
    
    Fixes: a3b658cfb664 ("bonding: allow xfrm offload setup post-module-load")
    Reported-by: Ivan Vecera <ivecera at redhat.com>
    Suggested-by: Ivan Vecera <ivecera at redhat.com>
    Cc: Jay Vosburgh <j.vosburgh at gmail.com>
    Cc: Veaceslav Falico <vfalico at gmail.com>
    Cc: Andy Gospodarek <andy at greyhouse.net>
    Signed-off-by: Jarod Wilson <jarod at redhat.com>
    Link: https://lore.kernel.org/r/20201205172229.576587-1-jarod@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index 9abfaae1c6f7..a4e4e15f574d 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c
@@ -745,6 +745,19 @@ const struct bond_option *bond_opt_get(unsigned int option)
 	return &bond_opts[option];
 }
 
+static void bond_set_xfrm_features(struct net_device *bond_dev, u64 mode)
+{
+	if (!IS_ENABLED(CONFIG_XFRM_OFFLOAD))
+		return;
+
+	if (mode == BOND_MODE_ACTIVEBACKUP)
+		bond_dev->wanted_features |= BOND_XFRM_FEATURES;
+	else
+		bond_dev->wanted_features &= ~BOND_XFRM_FEATURES;
+
+	netdev_update_features(bond_dev);
+}
+
 static int bond_option_mode_set(struct bonding *bond,
 				const struct bond_opt_value *newval)
 {
@@ -767,13 +780,8 @@ static int bond_option_mode_set(struct bonding *bond,
 	if (newval->value == BOND_MODE_ALB)
 		bond->params.tlb_dynamic_lb = 1;
 
-#ifdef CONFIG_XFRM_OFFLOAD
-	if (newval->value == BOND_MODE_ACTIVEBACKUP)
-		bond->dev->wanted_features |= BOND_XFRM_FEATURES;
-	else
-		bond->dev->wanted_features &= ~BOND_XFRM_FEATURES;
-	netdev_change_features(bond->dev);
-#endif /* CONFIG_XFRM_OFFLOAD */
+	if (bond->dev->reg_state == NETREG_REGISTERED)
+		bond_set_xfrm_features(bond->dev, newval->value);
 
 	/* don't cache arp_validate between modes */
 	bond->params.arp_validate = BOND_ARP_VALIDATE_NONE;
diff --git a/include/net/bonding.h b/include/net/bonding.h
index d9d0ff3b0ad3..adc3da776970 100644
--- a/include/net/bonding.h
+++ b/include/net/bonding.h
@@ -86,10 +86,8 @@
 #define bond_for_each_slave_rcu(bond, pos, iter) \
 	netdev_for_each_lower_private_rcu((bond)->dev, pos, iter)
 
-#ifdef CONFIG_XFRM_OFFLOAD
 #define BOND_XFRM_FEATURES (NETIF_F_HW_ESP | NETIF_F_HW_ESP_TX_CSUM | \
 			    NETIF_F_GSO_ESP)
-#endif /* CONFIG_XFRM_OFFLOAD */
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
 extern atomic_t netpoll_block_tx;
commit f26c08b444df833b19c00838a530d93963ce9cd0
Author: Hillf Danton <hdanton at sina.com>
Date:   Tue Dec 8 08:54:26 2020 -0700

    io_uring: fix file leak on error path of io ctx creation
    
    Put file as part of error handling when setting up io ctx to fix
    memory leaks like the following one.
    
       BUG: memory leak
       unreferenced object 0xffff888101ea2200 (size 256):
         comm "syz-executor355", pid 8470, jiffies 4294953658 (age 32.400s)
         hex dump (first 32 bytes):
           00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
           20 59 03 01 81 88 ff ff 80 87 a8 10 81 88 ff ff   Y..............
         backtrace:
           [<000000002e0a7c5f>] kmem_cache_zalloc include/linux/slab.h:654 [inline]
           [<000000002e0a7c5f>] __alloc_file+0x1f/0x130 fs/file_table.c:101
           [<000000001a55b73a>] alloc_empty_file+0x69/0x120 fs/file_table.c:151
           [<00000000fb22349e>] alloc_file+0x33/0x1b0 fs/file_table.c:193
           [<000000006e1465bb>] alloc_file_pseudo+0xb2/0x140 fs/file_table.c:233
           [<000000007118092a>] anon_inode_getfile fs/anon_inodes.c:91 [inline]
           [<000000007118092a>] anon_inode_getfile+0xaa/0x120 fs/anon_inodes.c:74
           [<000000002ae99012>] io_uring_get_fd fs/io_uring.c:9198 [inline]
           [<000000002ae99012>] io_uring_create fs/io_uring.c:9377 [inline]
           [<000000002ae99012>] io_uring_setup+0x1125/0x1630 fs/io_uring.c:9411
           [<000000008280baad>] do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
           [<00000000685d8cf0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Reported-by: syzbot+71c4697e27c99fddcf17 at syzkaller.appspotmail.com
    Fixes: 0f2122045b94 ("io_uring: don't rely on weak ->files references")
    Cc: Pavel Begunkov <asml.silence at gmail.com>
    Signed-off-by: Hillf Danton <hdanton at sina.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 908817cea4f5..86dac2b2e276 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -9183,6 +9183,7 @@ static int io_uring_get_fd(struct io_ring_ctx *ctx)
 {
 	struct file *file;
 	int ret;
+	int fd;
 
 #if defined(CONFIG_UNIX)
 	ret = sock_create_kern(&init_net, PF_UNIX, SOCK_RAW, IPPROTO_IP,
@@ -9194,12 +9195,12 @@ static int io_uring_get_fd(struct io_ring_ctx *ctx)
 	ret = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
 	if (ret < 0)
 		goto err;
+	fd = ret;
 
 	file = anon_inode_getfile("[io_uring]", &io_uring_fops, ctx,
 					O_RDWR | O_CLOEXEC);
 	if (IS_ERR(file)) {
-err_fd:
-		put_unused_fd(ret);
+		put_unused_fd(fd);
 		ret = PTR_ERR(file);
 		goto err;
 	}
@@ -9207,12 +9208,14 @@ err_fd:
 #if defined(CONFIG_UNIX)
 	ctx->ring_sock->file = file;
 #endif
-	if (unlikely(io_uring_add_task_file(ctx, file))) {
-		file = ERR_PTR(-ENOMEM);
-		goto err_fd;
+	ret = io_uring_add_task_file(ctx, file);
+	if (ret) {
+		fput(file);
+		put_unused_fd(fd);
+		goto err;
 	}
-	fd_install(ret, file);
-	return ret;
+	fd_install(fd, file);
+	return fd;
 err:
 #if defined(CONFIG_UNIX)
 	sock_release(ctx->ring_sock);
commit 932c60558109a9131e54dacfda6070147fd1cdfb
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Fri Dec 4 15:20:01 2020 -0800

    tools/bpftool: Fix PID fetching with a lot of results
    
    In case of having so many PID results that they don't fit into a singe page
    (4096) bytes, bpftool will erroneously conclude that it got corrupted data due
    to 4096 not being a multiple of struct pid_iter_entry, so the last entry will
    be partially truncated. Fix this by sizing the buffer to fit exactly N entries
    with no truncation in the middle of record.
    
    Fixes: d53dee3fe013 ("tools/bpftool: Show info for processes holding BPF map/prog/link/btf FDs")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Yonghong Song <yhs at fb.com>
    Link: https://lore.kernel.org/bpf/20201204232002.3589803-1-andrii@kernel.org

diff --git a/tools/bpf/bpftool/pids.c b/tools/bpf/bpftool/pids.c
index df7d8ec76036..477e55d59c34 100644
--- a/tools/bpf/bpftool/pids.c
+++ b/tools/bpf/bpftool/pids.c
@@ -89,9 +89,9 @@ libbpf_print_none(__maybe_unused enum libbpf_print_level level,
 
 int build_obj_refs_table(struct obj_refs_table *table, enum bpf_obj_type type)
 {
-	char buf[4096];
-	struct pid_iter_bpf *skel;
 	struct pid_iter_entry *e;
+	char buf[4096 / sizeof(*e) * sizeof(*e)];
+	struct pid_iter_bpf *skel;
 	int err, ret, fd = -1, i;
 	libbpf_print_fn_t default_print;
 
commit 7c5c15dffe1e3c42f44735ce9552afb7207f1584
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 27 10:25:40 2020 +0000

    drm/i915/gt: Declare gen9 has 64 mocs entries!
    
    We checked the table size against a hardcoded number of entries, and
    that number was excluding the special mocs registers at the end.
    
    Fixes: 777a7717d60c ("drm/i915/gt: Program mocs:63 for cache eviction on gen9")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: <stable at vger.kernel.org> # v4.3+
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127102540.13117-1-chris@chris-wilson.co.uk
    (cherry picked from commit 444fbf5d7058099447c5366ba8bb60d610aeb44b)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
    [backported and updated the Fixes sha]

diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.c b/drivers/gpu/drm/i915/gt/intel_mocs.c
index 4f74706967fd..413dadfac2d1 100644
--- a/drivers/gpu/drm/i915/gt/intel_mocs.c
+++ b/drivers/gpu/drm/i915/gt/intel_mocs.c
@@ -59,8 +59,7 @@ struct drm_i915_mocs_table {
 #define _L3_CACHEABILITY(value)	((value) << 4)
 
 /* Helper defines */
-#define GEN9_NUM_MOCS_ENTRIES	62  /* 62 out of 64 - 63 & 64 are reserved. */
-#define GEN11_NUM_MOCS_ENTRIES	64  /* 63-64 are reserved, but configured. */
+#define GEN9_NUM_MOCS_ENTRIES	64  /* 63-64 are reserved, but configured. */
 
 /* (e)LLC caching options */
 /*
@@ -328,11 +327,11 @@ static unsigned int get_mocs_settings(const struct drm_i915_private *i915,
 	if (INTEL_GEN(i915) >= 12) {
 		table->size  = ARRAY_SIZE(tgl_mocs_table);
 		table->table = tgl_mocs_table;
-		table->n_entries = GEN11_NUM_MOCS_ENTRIES;
+		table->n_entries = GEN9_NUM_MOCS_ENTRIES;
 	} else if (IS_GEN(i915, 11)) {
 		table->size  = ARRAY_SIZE(icl_mocs_table);
 		table->table = icl_mocs_table;
-		table->n_entries = GEN11_NUM_MOCS_ENTRIES;
+		table->n_entries = GEN9_NUM_MOCS_ENTRIES;
 	} else if (IS_GEN9_BC(i915) || IS_CANNONLAKE(i915)) {
 		table->size  = ARRAY_SIZE(skl_mocs_table);
 		table->n_entries = GEN9_NUM_MOCS_ENTRIES;
commit f6cbe49be65ed800863ac5ba695555057363f9c2
Author: Manasi Navare <manasi.d.navare at intel.com>
Date:   Fri Dec 4 12:58:04 2020 -0800

    drm/i915/display/dp: Compute the correct slice count for VDSC on DP
    
    This patch fixes the slice count computation algorithm
    for calculating the slice count based on Peak pixel rate
    and the max slice width allowed on the DSC engines.
    We need to ensure slice count > min slice count req
    as per DP spec based on peak pixel rate and that it is
    greater than min slice count based on the max slice width
    advertised by DPCD. So use max of these two.
    In the prev patch we were using min of these 2 causing it
    to violate the max slice width limitation causing a blank
    screen on 8K at 60.
    
    Fixes: d9218c8f6cf4 ("drm/i915/dp: Add helpers for Compressed BPP and Slice Count for DSC")
    Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
    Cc: Jani Nikula <jani.nikula at intel.com>
    Cc: <stable at vger.kernel.org> # v5.0+
    Signed-off-by: Manasi Navare <manasi.d.navare at intel.com>
    Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201204205804.25225-1-manasi.d.navare@intel.com
    (cherry picked from commit d371d6ea92ad2a47f42bbcaa786ee5f6069c9c14)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index bf1e9cf1c0f3..9bc59fd2f95f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -573,7 +573,7 @@ static u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
 		return 0;
 	}
 	/* Also take into account max slice width */
-	min_slice_count = min_t(u8, min_slice_count,
+	min_slice_count = max_t(u8, min_slice_count,
 				DIV_ROUND_UP(mode_hdisplay,
 					     max_slice_width));
 
commit 88c52d805eb61da99aa4607fb5131f41c0ff6bd4
Author: Colin Ian King <colin.king at canonical.com>
Date:   Fri Oct 2 18:03:54 2020 +0100

    drm/i915: fix size_t greater or equal to zero comparison
    
    Currently the check that the unsigned size_t variable i is >= 0
    is always true because the unsigned variable will never be negative,
    causing the loop to run forever.  Fix this by changing the
    pre-decrement check to a zero check on i followed by a decrement of i.
    
    Addresses-Coverity: ("Unsigned compared against 0")
    Fixes: bfed6708d6c9 ("drm/i915: use vmap in shmem_pin_map")
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201002170354.94627-1-colin.king@canonical.com
    (cherry picked from commit e70956a2498dc81d8f2522cba074f55ae910e13c)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/shmem_utils.c b/drivers/gpu/drm/i915/gt/shmem_utils.c
index 463af675fadd..5982b62f913d 100644
--- a/drivers/gpu/drm/i915/gt/shmem_utils.c
+++ b/drivers/gpu/drm/i915/gt/shmem_utils.c
@@ -73,7 +73,7 @@ void *shmem_pin_map(struct file *file)
 	mapping_set_unevictable(file->f_mapping);
 	return vaddr;
 err_page:
-	while (--i >= 0)
+	while (i--)
 		put_page(pages[i]);
 	kvfree(pages);
 	return NULL;
commit 0fe8bf4d3edce7aad6c14b9d5d92ff54dc19f0ba
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Dec 4 15:12:32 2020 +0000

    drm/i915/gt: Cancel the preemption timeout on responding to it
    
    We currently presume that the engine reset is successful, cancelling the
    expired preemption timer in the process. However, engine resets can
    fail, leaving the timeout still pending and we will then respond to the
    timeout again next time the tasklet fires. What we want is for the
    failed engine reset to be promoted to a full device reset, which is
    kicked by the heartbeat once the engine stops processing events.
    
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1168
    Fixes: 3a7a92aba8fb ("drm/i915/execlists: Force preemption")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: <stable at vger.kernel.org> # v5.5+
    Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201204151234.19729-2-chris@chris-wilson.co.uk
    (cherry picked from commit d997e240ceecb4f732611985d3a939ad1bfc1893)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 03fd1fa42a75..724b2cb897d3 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -3172,8 +3172,10 @@ static void execlists_submission_tasklet(unsigned long data)
 		spin_unlock_irqrestore(&engine->active.lock, flags);
 
 		/* Recheck after serialising with direct-submission */
-		if (unlikely(timeout && preempt_timeout(engine)))
+		if (unlikely(timeout && preempt_timeout(engine))) {
+			cancel_timer(&engine->execlists.preempt);
 			execlists_reset(engine, "preemption time out");
+		}
 	}
 }
 
commit 5419d93ffd774127b195b8543b063b2b4fa5aea9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Dec 4 15:12:31 2020 +0000

    drm/i915/gt: Ignore repeated attempts to suspend request flow across reset
    
    Before reseting the engine, we suspend the execution of the guilty
    request, so that we can continue execution with a new context while we
    slowly compress the captured error state for the guilty context. However,
    if the reset fails, we will promptly attempt to reset the same request
    again, and discover the ongoing capture. Ignore the second attempt to
    suspend and capture the same request.
    
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1168
    Fixes: 32ff621fd744 ("drm/i915/gt: Allow temporary suspension of inflight requests")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: <stable at vger.kernel.org> # v5.7+
    Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201204151234.19729-1-chris@chris-wilson.co.uk
    (cherry picked from commit b969540500bce60cf1cdfff5464388af32b9a553)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 0952bf157234..03fd1fa42a75 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -2788,6 +2788,9 @@ static void __execlists_hold(struct i915_request *rq)
 static bool execlists_hold(struct intel_engine_cs *engine,
 			   struct i915_request *rq)
 {
+	if (i915_request_on_hold(rq))
+		return false;
+
 	spin_lock_irq(&engine->active.lock);
 
 	if (i915_request_completed(rq)) { /* too late! */
commit 0e124e19ce52d20b28ee9f1d5cdb22e2106bfd29
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 3 10:34:32 2020 +0000

    drm/i915/gem: Propagate error from cancelled submit due to context closure
    
    In the course of discovering and closing many races with context closure
    and execbuf submission, since commit 61231f6bd056 ("drm/i915/gem: Check
    that the context wasn't closed during setup") we started checking that
    the context was not closed by another userspace thread during the execbuf
    ioctl. In doing so we cancelled the inflight request (by telling it to be
    skipped), but kept reporting success since we do submit a request, albeit
    one that doesn't execute. As the error is known before we return from the
    ioctl, we can report the error we detect immediately, rather than leave
    it on the fence status. With the immediate propagation of the error, it
    is easier for userspace to handle.
    
    Fixes: 61231f6bd056 ("drm/i915/gem: Check that the context wasn't closed during setup")
    Testcase: igt/gem_ctx_exec/basic-close-race
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: <stable at vger.kernel.org> # v5.7+
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201203103432.31526-1-chris@chris-wilson.co.uk
    (cherry picked from commit ba38b79eaeaeed29d2383f122d5c711ebf5ed3d1)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 1904e6e5ea64..b07dc1156a0e 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -3097,7 +3097,7 @@ static void retire_requests(struct intel_timeline *tl, struct i915_request *end)
 			break;
 }
 
-static void eb_request_add(struct i915_execbuffer *eb)
+static int eb_request_add(struct i915_execbuffer *eb, int err)
 {
 	struct i915_request *rq = eb->request;
 	struct intel_timeline * const tl = i915_request_timeline(rq);
@@ -3118,6 +3118,7 @@ static void eb_request_add(struct i915_execbuffer *eb)
 		/* Serialise with context_close via the add_to_timeline */
 		i915_request_set_error_once(rq, -ENOENT);
 		__i915_request_skip(rq);
+		err = -ENOENT; /* override any transient errors */
 	}
 
 	__i915_request_queue(rq, &attr);
@@ -3127,6 +3128,8 @@ static void eb_request_add(struct i915_execbuffer *eb)
 		retire_requests(tl, prev);
 
 	mutex_unlock(&tl->mutex);
+
+	return err;
 }
 
 static const i915_user_extension_fn execbuf_extensions[] = {
@@ -3332,7 +3335,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
 	err = eb_submit(&eb, batch);
 err_request:
 	i915_request_get(eb.request);
-	eb_request_add(&eb);
+	err = eb_request_add(&eb, err);
 
 	if (eb.fences)
 		signal_fence_array(&eb);
commit 352ded44fbd8622670ff95e90ca732a5b036ce79
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Thu Dec 3 11:45:17 2020 +0300

    drm/i915/gem: Check the correct variable in selftest
    
    There is a copy and paste bug in this code.  It's supposed to check
    "obj2" instead of checking "obj" a second time.
    
    Fixes: 80f0b679d6f0 ("drm/i915: Add an implementation for i915_gem_ww_ctx locking, v2.")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Andi Shyti <andi.shyti at intel.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/8ilneOcJAjwqU4t@mwand
    (cherry picked from commit 14f2d7604f7ce4cb3d303aea17292d119dfafa75)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c
index 23a6132c5f4e..412e21604a05 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem.c
@@ -211,8 +211,8 @@ static int igt_gem_ww_ctx(void *arg)
 		return PTR_ERR(obj);
 
 	obj2 = i915_gem_object_create_internal(i915, PAGE_SIZE);
-	if (IS_ERR(obj)) {
-		err = PTR_ERR(obj);
+	if (IS_ERR(obj2)) {
+		err = PTR_ERR(obj2);
 		goto put1;
 	}
 
commit cc00bcaa589914096edef7fb87ca5cee4a166b5c
Author: Subash Abhinov Kasiviswanathan <subashab at codeaurora.org>
Date:   Wed Nov 25 11:27:22 2020 -0700

    netfilter: x_tables: Switch synchronization to RCU
    
    When running concurrent iptables rules replacement with data, the per CPU
    sequence count is checked after the assignment of the new information.
    The sequence count is used to synchronize with the packet path without the
    use of any explicit locking. If there are any packets in the packet path using
    the table information, the sequence count is incremented to an odd value and
    is incremented to an even after the packet process completion.
    
    The new table value assignment is followed by a write memory barrier so every
    CPU should see the latest value. If the packet path has started with the old
    table information, the sequence counter will be odd and the iptables
    replacement will wait till the sequence count is even prior to freeing the
    old table info.
    
    However, this assumes that the new table information assignment and the memory
    barrier is actually executed prior to the counter check in the replacement
    thread. If CPU decides to execute the assignment later as there is no user of
    the table information prior to the sequence check, the packet path in another
    CPU may use the old table information. The replacement thread would then free
    the table information under it leading to a use after free in the packet
    processing context-
    
    Unable to handle kernel NULL pointer dereference at virtual
    address 000000000000008e
    pc : ip6t_do_table+0x5d0/0x89c
    lr : ip6t_do_table+0x5b8/0x89c
    ip6t_do_table+0x5d0/0x89c
    ip6table_filter_hook+0x24/0x30
    nf_hook_slow+0x84/0x120
    ip6_input+0x74/0xe0
    ip6_rcv_finish+0x7c/0x128
    ipv6_rcv+0xac/0xe4
    __netif_receive_skb+0x84/0x17c
    process_backlog+0x15c/0x1b8
    napi_poll+0x88/0x284
    net_rx_action+0xbc/0x23c
    __do_softirq+0x20c/0x48c
    
    This could be fixed by forcing instruction order after the new table
    information assignment or by switching to RCU for the synchronization.
    
    Fixes: 80055dab5de0 ("netfilter: x_tables: make xt_replace_table wait until old rules are not used anymore")
    Reported-by: Sean Tranchetti <stranche at codeaurora.org>
    Reported-by: kernel test robot <lkp at intel.com>
    Suggested-by: Florian Westphal <fw at strlen.de>
    Signed-off-by: Subash Abhinov Kasiviswanathan <subashab at codeaurora.org>
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
index 5deb099d156d..8ebb64193757 100644
--- a/include/linux/netfilter/x_tables.h
+++ b/include/linux/netfilter/x_tables.h
@@ -227,7 +227,7 @@ struct xt_table {
 	unsigned int valid_hooks;
 
 	/* Man behind the curtain... */
-	struct xt_table_info *private;
+	struct xt_table_info __rcu *private;
 
 	/* Set this to THIS_MODULE if you are a module, otherwise NULL */
 	struct module *me;
@@ -448,6 +448,9 @@ xt_get_per_cpu_counter(struct xt_counters *cnt, unsigned int cpu)
 
 struct nf_hook_ops *xt_hook_ops_alloc(const struct xt_table *, nf_hookfn *);
 
+struct xt_table_info
+*xt_table_get_private_protected(const struct xt_table *table);
+
 #ifdef CONFIG_COMPAT
 #include <net/compat.h>
 
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index d1e04d2b5170..563b62b76a5f 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -203,7 +203,7 @@ unsigned int arpt_do_table(struct sk_buff *skb,
 
 	local_bh_disable();
 	addend = xt_write_recseq_begin();
-	private = READ_ONCE(table->private); /* Address dependency. */
+	private = rcu_access_pointer(table->private);
 	cpu     = smp_processor_id();
 	table_base = private->entries;
 	jumpstack  = (struct arpt_entry **)private->jumpstack[cpu];
@@ -649,7 +649,7 @@ static struct xt_counters *alloc_counters(const struct xt_table *table)
 {
 	unsigned int countersize;
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 
 	/* We need atomic snapshot of counters: rest doesn't change
 	 * (other than comefrom, which userspace doesn't care
@@ -673,7 +673,7 @@ static int copy_entries_to_user(unsigned int total_size,
 	unsigned int off, num;
 	const struct arpt_entry *e;
 	struct xt_counters *counters;
-	struct xt_table_info *private = table->private;
+	struct xt_table_info *private = xt_table_get_private_protected(table);
 	int ret = 0;
 	void *loc_cpu_entry;
 
@@ -807,7 +807,7 @@ static int get_info(struct net *net, void __user *user, const int *len)
 	t = xt_request_find_table_lock(net, NFPROTO_ARP, name);
 	if (!IS_ERR(t)) {
 		struct arpt_getinfo info;
-		const struct xt_table_info *private = t->private;
+		const struct xt_table_info *private = xt_table_get_private_protected(t);
 #ifdef CONFIG_COMPAT
 		struct xt_table_info tmp;
 
@@ -860,7 +860,7 @@ static int get_entries(struct net *net, struct arpt_get_entries __user *uptr,
 
 	t = xt_find_table_lock(net, NFPROTO_ARP, get.name);
 	if (!IS_ERR(t)) {
-		const struct xt_table_info *private = t->private;
+		const struct xt_table_info *private = xt_table_get_private_protected(t);
 
 		if (get.size == private->size)
 			ret = copy_entries_to_user(private->size,
@@ -1017,7 +1017,7 @@ static int do_add_counters(struct net *net, sockptr_t arg, unsigned int len)
 	}
 
 	local_bh_disable();
-	private = t->private;
+	private = xt_table_get_private_protected(t);
 	if (private->number != tmp.num_counters) {
 		ret = -EINVAL;
 		goto unlock_up_free;
@@ -1330,7 +1330,7 @@ static int compat_copy_entries_to_user(unsigned int total_size,
 				       void __user *userptr)
 {
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 	void __user *pos;
 	unsigned int size;
 	int ret = 0;
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
index f15bc21d7301..6e2851f8d3a3 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -258,7 +258,7 @@ ipt_do_table(struct sk_buff *skb,
 	WARN_ON(!(table->valid_hooks & (1 << hook)));
 	local_bh_disable();
 	addend = xt_write_recseq_begin();
-	private = READ_ONCE(table->private); /* Address dependency. */
+	private = rcu_access_pointer(table->private);
 	cpu        = smp_processor_id();
 	table_base = private->entries;
 	jumpstack  = (struct ipt_entry **)private->jumpstack[cpu];
@@ -791,7 +791,7 @@ static struct xt_counters *alloc_counters(const struct xt_table *table)
 {
 	unsigned int countersize;
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 
 	/* We need atomic snapshot of counters: rest doesn't change
 	   (other than comefrom, which userspace doesn't care
@@ -815,7 +815,7 @@ copy_entries_to_user(unsigned int total_size,
 	unsigned int off, num;
 	const struct ipt_entry *e;
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 	int ret = 0;
 	const void *loc_cpu_entry;
 
@@ -964,7 +964,7 @@ static int get_info(struct net *net, void __user *user, const int *len)
 	t = xt_request_find_table_lock(net, AF_INET, name);
 	if (!IS_ERR(t)) {
 		struct ipt_getinfo info;
-		const struct xt_table_info *private = t->private;
+		const struct xt_table_info *private = xt_table_get_private_protected(t);
 #ifdef CONFIG_COMPAT
 		struct xt_table_info tmp;
 
@@ -1018,7 +1018,7 @@ get_entries(struct net *net, struct ipt_get_entries __user *uptr,
 
 	t = xt_find_table_lock(net, AF_INET, get.name);
 	if (!IS_ERR(t)) {
-		const struct xt_table_info *private = t->private;
+		const struct xt_table_info *private = xt_table_get_private_protected(t);
 		if (get.size == private->size)
 			ret = copy_entries_to_user(private->size,
 						   t, uptr->entrytable);
@@ -1173,7 +1173,7 @@ do_add_counters(struct net *net, sockptr_t arg, unsigned int len)
 	}
 
 	local_bh_disable();
-	private = t->private;
+	private = xt_table_get_private_protected(t);
 	if (private->number != tmp.num_counters) {
 		ret = -EINVAL;
 		goto unlock_up_free;
@@ -1543,7 +1543,7 @@ compat_copy_entries_to_user(unsigned int total_size, struct xt_table *table,
 			    void __user *userptr)
 {
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 	void __user *pos;
 	unsigned int size;
 	int ret = 0;
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index 2e2119bfcf13..c4f532f4d311 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -280,7 +280,7 @@ ip6t_do_table(struct sk_buff *skb,
 
 	local_bh_disable();
 	addend = xt_write_recseq_begin();
-	private = READ_ONCE(table->private); /* Address dependency. */
+	private = rcu_access_pointer(table->private);
 	cpu        = smp_processor_id();
 	table_base = private->entries;
 	jumpstack  = (struct ip6t_entry **)private->jumpstack[cpu];
@@ -807,7 +807,7 @@ static struct xt_counters *alloc_counters(const struct xt_table *table)
 {
 	unsigned int countersize;
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 
 	/* We need atomic snapshot of counters: rest doesn't change
 	   (other than comefrom, which userspace doesn't care
@@ -831,7 +831,7 @@ copy_entries_to_user(unsigned int total_size,
 	unsigned int off, num;
 	const struct ip6t_entry *e;
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 	int ret = 0;
 	const void *loc_cpu_entry;
 
@@ -980,7 +980,7 @@ static int get_info(struct net *net, void __user *user, const int *len)
 	t = xt_request_find_table_lock(net, AF_INET6, name);
 	if (!IS_ERR(t)) {
 		struct ip6t_getinfo info;
-		const struct xt_table_info *private = t->private;
+		const struct xt_table_info *private = xt_table_get_private_protected(t);
 #ifdef CONFIG_COMPAT
 		struct xt_table_info tmp;
 
@@ -1035,7 +1035,7 @@ get_entries(struct net *net, struct ip6t_get_entries __user *uptr,
 
 	t = xt_find_table_lock(net, AF_INET6, get.name);
 	if (!IS_ERR(t)) {
-		struct xt_table_info *private = t->private;
+		struct xt_table_info *private = xt_table_get_private_protected(t);
 		if (get.size == private->size)
 			ret = copy_entries_to_user(private->size,
 						   t, uptr->entrytable);
@@ -1189,7 +1189,7 @@ do_add_counters(struct net *net, sockptr_t arg, unsigned int len)
 	}
 
 	local_bh_disable();
-	private = t->private;
+	private = xt_table_get_private_protected(t);
 	if (private->number != tmp.num_counters) {
 		ret = -EINVAL;
 		goto unlock_up_free;
@@ -1552,7 +1552,7 @@ compat_copy_entries_to_user(unsigned int total_size, struct xt_table *table,
 			    void __user *userptr)
 {
 	struct xt_counters *counters;
-	const struct xt_table_info *private = table->private;
+	const struct xt_table_info *private = xt_table_get_private_protected(table);
 	void __user *pos;
 	unsigned int size;
 	int ret = 0;
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index af22dbe85e2c..acce622582e3 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -1349,6 +1349,14 @@ struct xt_counters *xt_counters_alloc(unsigned int counters)
 }
 EXPORT_SYMBOL(xt_counters_alloc);
 
+struct xt_table_info
+*xt_table_get_private_protected(const struct xt_table *table)
+{
+	return rcu_dereference_protected(table->private,
+					 mutex_is_locked(&xt[table->af].mutex));
+}
+EXPORT_SYMBOL(xt_table_get_private_protected);
+
 struct xt_table_info *
 xt_replace_table(struct xt_table *table,
 	      unsigned int num_counters,
@@ -1356,7 +1364,6 @@ xt_replace_table(struct xt_table *table,
 	      int *error)
 {
 	struct xt_table_info *private;
-	unsigned int cpu;
 	int ret;
 
 	ret = xt_jumpstack_alloc(newinfo);
@@ -1366,47 +1373,20 @@ xt_replace_table(struct xt_table *table,
 	}
 
 	/* Do the substitution. */
-	local_bh_disable();
-	private = table->private;
+	private = xt_table_get_private_protected(table);
 
 	/* Check inside lock: is the old number correct? */
 	if (num_counters != private->number) {
 		pr_debug("num_counters != table->private->number (%u/%u)\n",
 			 num_counters, private->number);
-		local_bh_enable();
 		*error = -EAGAIN;
 		return NULL;
 	}
 
 	newinfo->initial_entries = private->initial_entries;
-	/*
-	 * Ensure contents of newinfo are visible before assigning to
-	 * private.
-	 */
-	smp_wmb();
-	table->private = newinfo;
-
-	/* make sure all cpus see new ->private value */
-	smp_wmb();
 
-	/*
-	 * Even though table entries have now been swapped, other CPU's
-	 * may still be using the old entries...
-	 */
-	local_bh_enable();
-
-	/* ... so wait for even xt_recseq on all cpus */
-	for_each_possible_cpu(cpu) {
-		seqcount_t *s = &per_cpu(xt_recseq, cpu);
-		u32 seq = raw_read_seqcount(s);
-
-		if (seq & 1) {
-			do {
-				cond_resched();
-				cpu_relax();
-			} while (seq == raw_read_seqcount(s));
-		}
-	}
+	rcu_assign_pointer(table->private, newinfo);
+	synchronize_rcu();
 
 	audit_log_nfcfg(table->name, table->af, private->number,
 			!private->number ? AUDIT_XT_OP_REGISTER :
@@ -1442,12 +1422,12 @@ struct xt_table *xt_register_table(struct net *net,
 	}
 
 	/* Simplifies replace_table code. */
-	table->private = bootstrap;
+	rcu_assign_pointer(table->private, bootstrap);
 
 	if (!xt_replace_table(table, 0, newinfo, &ret))
 		goto unlock;
 
-	private = table->private;
+	private = xt_table_get_private_protected(table);
 	pr_debug("table->private->number = %u\n", private->number);
 
 	/* save number of initial entries */
@@ -1470,7 +1450,8 @@ void *xt_unregister_table(struct xt_table *table)
 	struct xt_table_info *private;
 
 	mutex_lock(&xt[table->af].mutex);
-	private = table->private;
+	private = xt_table_get_private_protected(table);
+	RCU_INIT_POINTER(table->private, NULL);
 	list_del(&table->list);
 	mutex_unlock(&xt[table->af].mutex);
 	audit_log_nfcfg(table->name, table->af, private->number,
commit 7aeb353802611a8e655e019f09a370ff682af1a6
Author: Andrew Jeffery <andrew at aj.id.au>
Date:   Thu Nov 26 17:03:37 2020 +1030

    pinctrl: aspeed: Fix GPIO requests on pass-through banks
    
    Commit 6726fbff19bf ("pinctrl: aspeed: Fix GPI only function problem.")
    fixes access to GPIO banks T and U on the AST2600. Both banks contain
    input-only pins and the GPIO pin function is named GPITx and GPIUx
    respectively. Unfortunately the fix had a negative impact on GPIO banks
    D and E for the AST2400 and AST2500 where the GPIO pass-through
    functions take similar "GPI"-style names. The net effect on the older
    SoCs was that when the GPIO subsystem requested a pin in banks D or E be
    muxed for GPIO, they were instead muxed for pass-through mode.
    Mistakenly muxing pass-through mode e.g. breaks booting the host on
    IBM's Witherspoon (AC922) platform where GPIOE0 is used for FSI.
    
    Further exploit the names in the provided expression structure to
    differentiate pass-through from pin-specific GPIO modes.
    
    This follow-up fix gives the expected behaviour for the following tests:
    
    Witherspoon BMC (AST2500):
    
    1. Power-on the Witherspoon host
    2. Request GPIOD1 be muxed via /sys/class/gpio/export
    3. Request GPIOE1 be muxed via /sys/class/gpio/export
    4. Request the balls for GPIOs E2 and E3 be muxed as GPIO pass-through
       ("GPIE2" mode) via a pinctrl hog in the devicetree
    
    Rainier BMC (AST2600):
    
    5. Request GPIT0 be muxed via /sys/class/gpio/export
    6. Request GPIU0 be muxed via /sys/class/gpio/export
    
    Together the tests demonstrate that all three pieces of functionality
    (general GPIOs via 1, 2 and 3, input-only GPIOs via 5 and 6, pass-through
    mode via 4) operate as desired across old and new SoCs.
    
    Fixes: 9b92f5c51e9a ("pinctrl: aspeed: Fix GPI only function problem.")
    Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
    Tested-by: Joel Stanley <joel at jms.id.au>
    Reviewed-by: Joel Stanley <joel at jms.id.au>
    Cc: Billy Tsai <billy_tsai at aspeedtech.com>
    Cc: Joel Stanley <joel at jms.id.au>
    Link: https://lore.kernel.org/r/20201126063337.489927-1-andrew@aj.id.au
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed.c b/drivers/pinctrl/aspeed/pinctrl-aspeed.c
index d6b849552a1e..9c65d560d48f 100644
--- a/drivers/pinctrl/aspeed/pinctrl-aspeed.c
+++ b/drivers/pinctrl/aspeed/pinctrl-aspeed.c
@@ -286,14 +286,76 @@ int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function,
 static bool aspeed_expr_is_gpio(const struct aspeed_sig_expr *expr)
 {
 	/*
-	 * The signal type is GPIO if the signal name has "GPI" as a prefix.
-	 * strncmp (rather than strcmp) is used to implement the prefix
-	 * requirement.
+	 * We need to differentiate between GPIO and non-GPIO signals to
+	 * implement the gpio_request_enable() interface. For better or worse
+	 * the ASPEED pinctrl driver uses the expression names to determine
+	 * whether an expression will mux a pin for GPIO.
 	 *
-	 * expr->signal might look like "GPIOB1" in the GPIO case.
-	 * expr->signal might look like "GPIT0" in the GPI case.
+	 * Generally we have the following - A GPIO such as B1 has:
+	 *
+	 *    - expr->signal set to "GPIOB1"
+	 *    - expr->function set to "GPIOB1"
+	 *
+	 * Using this fact we can determine whether the provided expression is
+	 * a GPIO expression by testing the signal name for the string prefix
+	 * "GPIO".
+	 *
+	 * However, some GPIOs are input-only, and the ASPEED datasheets name
+	 * them differently. An input-only GPIO such as T0 has:
+	 *
+	 *    - expr->signal set to "GPIT0"
+	 *    - expr->function set to "GPIT0"
+	 *
+	 * It's tempting to generalise the prefix test from "GPIO" to "GPI" to
+	 * account for both GPIOs and GPIs, but in doing so we run aground on
+	 * another feature:
+	 *
+	 * Some pins in the ASPEED BMC SoCs have a "pass-through" GPIO
+	 * function where the input state of one pin is replicated as the
+	 * output state of another (as if they were shorted together - a mux
+	 * configuration that is typically enabled by hardware strapping).
+	 * This feature allows the BMC to pass e.g. power button state through
+	 * to the host while the BMC is yet to boot, but take control of the
+	 * button state once the BMC has booted by muxing each pin as a
+	 * separate, pin-specific GPIO.
+	 *
+	 * Conceptually this pass-through mode is a form of GPIO and is named
+	 * as such in the datasheets, e.g. "GPID0". This naming similarity
+	 * trips us up with the simple GPI-prefixed-signal-name scheme
+	 * discussed above, as the pass-through configuration is not what we
+	 * want when muxing a pin as GPIO for the GPIO subsystem.
+	 *
+	 * On e.g. the AST2400, a pass-through function "GPID0" is grouped on
+	 * balls A18 and D16, where we have:
+	 *
+	 *    For ball A18:
+	 *    - expr->signal set to "GPID0IN"
+	 *    - expr->function set to "GPID0"
+	 *
+	 *    For ball D16:
+	 *    - expr->signal set to "GPID0OUT"
+	 *    - expr->function set to "GPID0"
+	 *
+	 * By contrast, the pin-specific GPIO expressions for the same pins are
+	 * as follows:
+	 *
+	 *    For ball A18:
+	 *    - expr->signal looks like "GPIOD0"
+	 *    - expr->function looks like "GPIOD0"
+	 *
+	 *    For ball D16:
+	 *    - expr->signal looks like "GPIOD1"
+	 *    - expr->function looks like "GPIOD1"
+	 *
+	 * Testing both the signal _and_ function names gives us the means
+	 * differentiate the pass-through GPIO pinmux configuration from the
+	 * pin-specific configuration that the GPIO subsystem is after: An
+	 * expression is a pin-specific (non-pass-through) GPIO configuration
+	 * if the signal prefix is "GPI" and the signal name matches the
+	 * function name.
 	 */
-	return strncmp(expr->signal, "GPI", 3) == 0;
+	return !strncmp(expr->signal, "GPI", 3) &&
+			!strcmp(expr->signal, expr->function);
 }
 
 static bool aspeed_gpio_in_exprs(const struct aspeed_sig_expr **exprs)
diff --git a/drivers/pinctrl/aspeed/pinmux-aspeed.h b/drivers/pinctrl/aspeed/pinmux-aspeed.h
index f86739e800c3..dba5875ff276 100644
--- a/drivers/pinctrl/aspeed/pinmux-aspeed.h
+++ b/drivers/pinctrl/aspeed/pinmux-aspeed.h
@@ -452,10 +452,11 @@ struct aspeed_sig_desc {
  * evaluation of the descriptors.
  *
  * @signal: The signal name for the priority level on the pin. If the signal
- *          type is GPIO, then the signal name must begin with the string
- *          "GPIO", e.g. GPIOA0, GPIOT4 etc.
+ *          type is GPIO, then the signal name must begin with the
+ *          prefix "GPI", e.g. GPIOA0, GPIT0 etc.
  * @function: The name of the function the signal participates in for the
- *            associated expression
+ *            associated expression. For pin-specific GPIO, the function
+ *            name must match the signal name.
  * @ndescs: The number of signal descriptors in the expression
  * @descs: Pointer to an array of signal descriptors that comprise the
  *         function expression
commit 3d1387b3b8f6cc1ccdbb5f0d7af24df02f4baef9
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Dec 8 07:57:13 2020 +0100

    media: vidtv: fix some warnings
    
    As reported by sparse:
    
            drivers/media/test-drivers/vidtv/vidtv_ts.h:47:47: warning: array of flexible structures
            drivers/media/test-drivers/vidtv/vidtv_channel.c:458:54: warning: incorrect type in argument 3 (different base types)
            drivers/media/test-drivers/vidtv/vidtv_channel.c:458:54:    expected unsigned short [usertype] service_id
            drivers/media/test-drivers/vidtv/vidtv_channel.c:458:54:    got restricted __be16 [usertype] service_id
            drivers/media/test-drivers/vidtv/vidtv_s302m.c:471 vidtv_s302m_encoder_init() warn: possible memory leak of 'e'
    
    Address such warnings.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 6651cc91bda1..fdc825e54138 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -743,7 +743,7 @@ struct vidtv_psi_table_eit {
 struct vidtv_psi_table_eit
 *vidtv_psi_eit_table_init(u16 network_id,
 			  u16 transport_stream_id,
-			  u16 service_id);
+			  __be16 service_id);
 
 /**
  * struct vidtv_psi_eit_write_args - Arguments for writing an EIT section
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index ce7dd6cafc8b..d79b65854627 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -467,8 +467,10 @@ struct vidtv_encoder
 	e->is_video_encoder = false;
 
 	ctx = kzalloc(priv_sz, GFP_KERNEL);
-	if (!ctx)
+	if (!ctx) {
+		kfree(e);
 		return NULL;
+	}
 
 	e->ctx = ctx;
 	ctx->last_duration = 0;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_ts.h b/drivers/media/test-drivers/vidtv/vidtv_ts.h
index 10838a2b8389..f5e8e1f37f05 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_ts.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_ts.h
@@ -44,7 +44,7 @@ struct vidtv_mpeg_ts {
 		u8 adaptation_field:1;
 		u8 scrambling:2;
 	} __packed;
-	struct vidtv_mpeg_ts_adaption adaption[];
+	struct vidtv_mpeg_ts_adaption *adaption;
 } __packed;
 
 /**
commit 819f56bad110cb27a8be3232467986e2baebe069
Merge: 82ca4c922b89 48f486e13ffd
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Dec 7 18:29:53 2020 -0800

    Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
    
    Steffen Klassert says:
    
    ====================
    pull request (net): ipsec 2020-12-07
    
    1) Sysbot reported fixes for the new 64/32 bit compat layer.
       From Dmitry Safonov.
    
    2) Fix a memory leak in xfrm_user_policy that was introduced
       by adding the 64/32 bit compat layer. From Yu Kuai.
    
    * 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec:
      net: xfrm: fix memory leak in xfrm_user_policy()
      xfrm/compat: Don't allocate memory with __GFP_ZERO
      xfrm/compat: memset(0) 64-bit padding at right place
      xfrm/compat: Translate by copying XFRMA_UNSPEC attribute
    ====================
    
    Link: https://lore.kernel.org/r/20201207093937.2874932-1-steffen.klassert@secunet.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 359db63378eded1ee9c8c9ad72245f9b0158ae95
Author: Xiang Chen <chenxiang66 at hisilicon.com>
Date:   Mon Dec 7 21:30:55 2020 +0800

    scsi: hisi_sas: Select a suitable queue for internal I/Os
    
    For when managed interrupts are used (and shost->nr_hw_queues is set), a
    fixed queue - set per-device - is still used for internal I/Os.
    
    If all the CPUs mapped to that queue are offlined, then the completions for
    that queue are not serviced and any internal I/Os will time out.
    
    Fix by selecting a queue for internal I/Os from the queue mapped from the
    current CPU in this scenario.
    
    This is still not ideal as it does not deal with CPU hotplug for inflight
    internal I/Os, and needs proper support from [0].
    
    [0] https://lore.kernel.org/linux-scsi/20200703130122.111448-1-hare@suse.de/T/#m7d77d049b18f33a24ef206af69ebb66d07440556
    
    Link: https://lore.kernel.org/r/1607347855-59091-1-git-send-email-john.garry@huawei.com
    Fixes: 8d98416a55eb ("scsi: hisi_sas: Switch v3 hw to MQ")
    Signed-off-by: Xiang Chen <chenxiang66 at hisilicon.com>
    Signed-off-by: John Garry <john.garry at huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index c8dd8588f800..274ccf18ce2d 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -452,6 +452,12 @@ static int hisi_sas_task_prep(struct sas_task *task,
 		blk_tag = blk_mq_unique_tag(scmd->request);
 		dq_index = blk_mq_unique_tag_to_hwq(blk_tag);
 		*dq_pointer = dq = &hisi_hba->dq[dq_index];
+	} else if (hisi_hba->shost->nr_hw_queues)  {
+		struct Scsi_Host *shost = hisi_hba->shost;
+		struct blk_mq_queue_map *qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT];
+		int queue = qmap->mq_map[raw_smp_processor_id()];
+
+		*dq_pointer = dq = &hisi_hba->dq[queue];
 	} else {
 		*dq_pointer = dq = sas_dev->dq;
 	}
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index 7133ca859b5e..960de375ce69 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2452,6 +2452,11 @@ static int interrupt_init_v3_hw(struct hisi_hba *hisi_hba)
 			rc = -ENOENT;
 			goto free_irq_vectors;
 		}
+		cq->irq_mask = pci_irq_get_affinity(pdev, i + BASE_VECTORS_V3_HW);
+		if (!cq->irq_mask) {
+			dev_err(dev, "could not get cq%d irq affinity!\n", i);
+			return -ENOENT;
+		}
 	}
 
 	return 0;
commit 673235f915318ced5d7ec4b2bfd8cb909e6a4a55
Author: Ming Lei <ming.lei at redhat.com>
Date:   Wed Dec 2 18:04:19 2020 +0800

    scsi: core: Fix race between handling STS_RESOURCE and completion
    
    When queuing I/O request to LLD, STS_RESOURCE may be returned because:
    
     - Host is in recovery or blocked
    
     - Target queue throttling or target is blocked
    
     - LLD rejection
    
    In these scenarios BLK_STS_DEV_RESOURCE is returned to the block layer to
    avoid an unnecessary re-run of the queue. However, all of the requests
    queued to this SCSI device may complete immediately after reading
    'sdev->device_busy' and BLK_STS_DEV_RESOURCE is returned to block layer. In
    that case the current I/O won't get a chance to get queued since it is
    invisible at that time for both scsi_run_queue_async() and blk-mq's
    RESTART.
    
    Fix the issue by not returning BLK_STS_DEV_RESOURCE in this situation.
    
    Link: https://lore.kernel.org/r/20201202100419.525144-1-ming.lei@redhat.com
    Fixes: 86ff7c2a80cd ("blk-mq: introduce BLK_STS_DEV_RESOURCE")
    Cc: Hannes Reinecke <hare at suse.com>
    Cc: Sumit Saxena <sumit.saxena at broadcom.com>
    Cc: Kashyap Desai <kashyap.desai at broadcom.com>
    Cc: Bart Van Assche <bvanassche at acm.org>
    Cc: Ewan Milne <emilne at redhat.com>
    Cc: Long Li <longli at microsoft.com>
    Reported-by: John Garry <john.garry at huawei.com>
    Tested-by: "chenxiang (M)" <chenxiang66 at hisilicon.com>
    Signed-off-by: Ming Lei <ming.lei at redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 60c7a7d74852..03c6d0620bfd 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1703,8 +1703,7 @@ out_put_budget:
 		break;
 	case BLK_STS_RESOURCE:
 	case BLK_STS_ZONE_RESOURCE:
-		if (atomic_read(&sdev->device_busy) ||
-		    scsi_device_blocked(sdev))
+		if (scsi_device_blocked(sdev))
 			ret = BLK_STS_DEV_RESOURCE;
 		break;
 	default:
commit 82ca4c922b8992013a238d65cf4e60cc33e12f36
Author: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
Date:   Sat Dec 5 22:32:07 2020 +0100

    net: stmmac: dwmac-meson8b: fix mask definition of the m250_sel mux
    
    The m250_sel mux clock uses bit 4 in the PRG_ETH0 register. Fix this by
    shifting the PRG_ETH0_CLK_M250_SEL_MASK accordingly as the "mask" in
    struct clk_mux expects the mask relative to the "shift" field in the
    same struct.
    
    While here, get rid of the PRG_ETH0_CLK_M250_SEL_SHIFT macro and use
    __ffs() to determine it from the existing PRG_ETH0_CLK_M250_SEL_MASK
    macro.
    
    Fixes: 566e8251625304 ("net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC")
    Signed-off-by: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
    Reviewed-by: Jerome Brunet <jbrunet at baylibre.com>
    Link: https://lore.kernel.org/r/20201205213207.519341-1-martin.blumenstingl@googlemail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
index 5afcf05bbf9c..6d6bd77bb6af 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
@@ -30,7 +30,6 @@
 #define PRG_ETH0_EXT_RMII_MODE		4
 
 /* mux to choose between fclk_div2 (bit unset) and mpll2 (bit set) */
-#define PRG_ETH0_CLK_M250_SEL_SHIFT	4
 #define PRG_ETH0_CLK_M250_SEL_MASK	GENMASK(4, 4)
 
 /* TX clock delay in ns = "8ns / 4 * tx_dly_val" (where 8ns are exactly one
@@ -155,8 +154,9 @@ static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac)
 		return -ENOMEM;
 
 	clk_configs->m250_mux.reg = dwmac->regs + PRG_ETH0;
-	clk_configs->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT;
-	clk_configs->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK;
+	clk_configs->m250_mux.shift = __ffs(PRG_ETH0_CLK_M250_SEL_MASK);
+	clk_configs->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK >>
+				     clk_configs->m250_mux.shift;
 	clk = meson8b_dwmac_register_clk(dwmac, "m250_sel", mux_parents,
 					 ARRAY_SIZE(mux_parents), &clk_mux_ops,
 					 &clk_configs->m250_mux.hw);
commit bbef72c630b522a9ffbf62dae19b59c880da6ea1
Author: Christophe JAILLET <christophe.jaillet at wanadoo.fr>
Date:   Sun Dec 6 16:13:39 2020 +0100

    dpaa2-mac: Add a missing of_node_put after of_device_is_available
    
    Add an 'of_node_put()' call when a tested device node is not available.
    
    Fixes: 94ae899b2096 ("dpaa2-mac: add PCS support through the Lynx module")
    Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr>
    Reviewed-by: Ioana Ciornei <ioana.ciornei at nxp.com>
    Link: https://lore.kernel.org/r/20201206151339.44306-1-christophe.jaillet@wanadoo.fr
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
index 90cd243070d7..828c177df03d 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
@@ -269,6 +269,7 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
 
 	if (!of_device_is_available(node)) {
 		netdev_err(mac->net_dev, "pcs-handle node not available\n");
+		of_node_put(node);
 		return -ENODEV;
 	}
 
commit f55628b3e7648198e9c072b52080c5dea8678adf
Author: Jianguo Wu <wujianguo at chinatelecom.cn>
Date:   Sat Dec 5 15:56:33 2020 +0800

    mptcp: print new line in mptcp_seq_show() if mptcp isn't in use
    
    When do cat /proc/net/netstat, the output isn't append with a new line, it looks like this:
    [root at localhost ~]# cat /proc/net/netstat
    ...
    MPTcpExt: 0 0 0 0 0 0 0 0 0 0 0 0 0[root at localhost ~]#
    
    This is because in mptcp_seq_show(), if mptcp isn't in use, net->mib.mptcp_statistics is NULL,
    so it just puts all 0 after "MPTcpExt:", and return, forgot the '\n'.
    
    After this patch:
    
    [root at localhost ~]# cat /proc/net/netstat
    ...
    MPTcpExt: 0 0 0 0 0 0 0 0 0 0 0 0 0
    [root at localhost ~]#
    
    Fixes: fc518953bc9c8d7d ("mptcp: add and use MIB counter infrastructure")
    Signed-off-by: Jianguo Wu <wujianguo at chinatelecom.cn>
    Acked-by: Florian Westphal <fw at strlen.de>
    Link: https://lore.kernel.org/r/142e2fd9-58d9-bb13-fb75-951cccc2331e@163.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/mptcp/mib.c b/net/mptcp/mib.c
index 84d119436b22..b921cbdd9aaa 100644
--- a/net/mptcp/mib.c
+++ b/net/mptcp/mib.c
@@ -67,6 +67,7 @@ void mptcp_seq_show(struct seq_file *seq)
 		for (i = 0; mptcp_snmp_list[i].name; i++)
 			seq_puts(seq, " 0");
 
+		seq_putc(seq, '\n');
 		return;
 	}
 
commit 851d0a73c90e6c8c63fef106c6c1e73df7e05d9d
Author: Joseph Huang <Joseph.Huang at garmin.com>
Date:   Fri Dec 4 18:56:28 2020 -0500

    bridge: Fix a deadlock when enabling multicast snooping
    
    When enabling multicast snooping, bridge module deadlocks on multicast_lock
    if 1) IPv6 is enabled, and 2) there is an existing querier on the same L2
    network.
    
    The deadlock was caused by the following sequence: While holding the lock,
    br_multicast_open calls br_multicast_join_snoopers, which eventually causes
    IP stack to (attempt to) send out a Listener Report (in igmp6_join_group).
    Since the destination Ethernet address is a multicast address, br_dev_xmit
    feeds the packet back to the bridge via br_multicast_rcv, which in turn
    calls br_multicast_add_group, which then deadlocks on multicast_lock.
    
    The fix is to move the call br_multicast_join_snoopers outside of the
    critical section. This works since br_multicast_join_snoopers only deals
    with IP and does not modify any multicast data structures of the bridge,
    so there's no need to hold the lock.
    
    Steps to reproduce:
    1. sysctl net.ipv6.conf.all.force_mld_version=1
    2. have another querier
    3. ip link set dev bridge type bridge mcast_snooping 0 && \
       ip link set dev bridge type bridge mcast_snooping 1 < deadlock >
    
    A typical call trace looks like the following:
    
    [  936.251495]  _raw_spin_lock+0x5c/0x68
    [  936.255221]  br_multicast_add_group+0x40/0x170 [bridge]
    [  936.260491]  br_multicast_rcv+0x7ac/0xe30 [bridge]
    [  936.265322]  br_dev_xmit+0x140/0x368 [bridge]
    [  936.269689]  dev_hard_start_xmit+0x94/0x158
    [  936.273876]  __dev_queue_xmit+0x5ac/0x7f8
    [  936.277890]  dev_queue_xmit+0x10/0x18
    [  936.281563]  neigh_resolve_output+0xec/0x198
    [  936.285845]  ip6_finish_output2+0x240/0x710
    [  936.290039]  __ip6_finish_output+0x130/0x170
    [  936.294318]  ip6_output+0x6c/0x1c8
    [  936.297731]  NF_HOOK.constprop.0+0xd8/0xe8
    [  936.301834]  igmp6_send+0x358/0x558
    [  936.305326]  igmp6_join_group.part.0+0x30/0xf0
    [  936.309774]  igmp6_group_added+0xfc/0x110
    [  936.313787]  __ipv6_dev_mc_inc+0x1a4/0x290
    [  936.317885]  ipv6_dev_mc_inc+0x10/0x18
    [  936.321677]  br_multicast_open+0xbc/0x110 [bridge]
    [  936.326506]  br_multicast_toggle+0xec/0x140 [bridge]
    
    Fixes: 4effd28c1245 ("bridge: join all-snoopers multicast address")
    Signed-off-by: Joseph Huang <Joseph.Huang at garmin.com>
    Acked-by: Nikolay Aleksandrov <nikolay at nvidia.com>
    Link: https://lore.kernel.org/r/20201204235628.50653-1-Joseph.Huang@garmin.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 7730c8f3cb53..d3ea9d0779fb 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -177,6 +177,9 @@ static int br_dev_open(struct net_device *dev)
 	br_stp_enable_bridge(br);
 	br_multicast_open(br);
 
+	if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
+		br_multicast_join_snoopers(br);
+
 	return 0;
 }
 
@@ -197,6 +200,9 @@ static int br_dev_stop(struct net_device *dev)
 	br_stp_disable_bridge(br);
 	br_multicast_stop(br);
 
+	if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
+		br_multicast_leave_snoopers(br);
+
 	netif_stop_queue(dev);
 
 	return 0;
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index eae898c3cff7..54cb82a69056 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -3286,7 +3286,7 @@ static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br)
 }
 #endif
 
-static void br_multicast_join_snoopers(struct net_bridge *br)
+void br_multicast_join_snoopers(struct net_bridge *br)
 {
 	br_ip4_multicast_join_snoopers(br);
 	br_ip6_multicast_join_snoopers(br);
@@ -3317,7 +3317,7 @@ static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
 }
 #endif
 
-static void br_multicast_leave_snoopers(struct net_bridge *br)
+void br_multicast_leave_snoopers(struct net_bridge *br)
 {
 	br_ip4_multicast_leave_snoopers(br);
 	br_ip6_multicast_leave_snoopers(br);
@@ -3336,9 +3336,6 @@ static void __br_multicast_open(struct net_bridge *br,
 
 void br_multicast_open(struct net_bridge *br)
 {
-	if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
-		br_multicast_join_snoopers(br);
-
 	__br_multicast_open(br, &br->ip4_own_query);
 #if IS_ENABLED(CONFIG_IPV6)
 	__br_multicast_open(br, &br->ip6_own_query);
@@ -3354,9 +3351,6 @@ void br_multicast_stop(struct net_bridge *br)
 	del_timer_sync(&br->ip6_other_query.timer);
 	del_timer_sync(&br->ip6_own_query.timer);
 #endif
-
-	if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
-		br_multicast_leave_snoopers(br);
 }
 
 void br_multicast_dev_del(struct net_bridge *br)
@@ -3487,6 +3481,7 @@ static void br_multicast_start_querier(struct net_bridge *br,
 int br_multicast_toggle(struct net_bridge *br, unsigned long val)
 {
 	struct net_bridge_port *port;
+	bool change_snoopers = false;
 
 	spin_lock_bh(&br->multicast_lock);
 	if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val)
@@ -3495,7 +3490,7 @@ int br_multicast_toggle(struct net_bridge *br, unsigned long val)
 	br_mc_disabled_update(br->dev, val);
 	br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val);
 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
-		br_multicast_leave_snoopers(br);
+		change_snoopers = true;
 		goto unlock;
 	}
 
@@ -3506,9 +3501,30 @@ int br_multicast_toggle(struct net_bridge *br, unsigned long val)
 	list_for_each_entry(port, &br->port_list, list)
 		__br_multicast_enable_port(port);
 
+	change_snoopers = true;
+
 unlock:
 	spin_unlock_bh(&br->multicast_lock);
 
+	/* br_multicast_join_snoopers has the potential to cause
+	 * an MLD Report/Leave to be delivered to br_multicast_rcv,
+	 * which would in turn call br_multicast_add_group, which would
+	 * attempt to acquire multicast_lock. This function should be
+	 * called after the lock has been released to avoid deadlocks on
+	 * multicast_lock.
+	 *
+	 * br_multicast_leave_snoopers does not have the problem since
+	 * br_multicast_rcv first checks BROPT_MULTICAST_ENABLED, and
+	 * returns without calling br_multicast_ipv4/6_rcv if it's not
+	 * enabled. Moved both functions out just for symmetry.
+	 */
+	if (change_snoopers) {
+		if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
+			br_multicast_join_snoopers(br);
+		else
+			br_multicast_leave_snoopers(br);
+	}
+
 	return 0;
 }
 
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 345118e35c42..8424464186a6 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -792,6 +792,8 @@ void br_multicast_del_port(struct net_bridge_port *port);
 void br_multicast_enable_port(struct net_bridge_port *port);
 void br_multicast_disable_port(struct net_bridge_port *port);
 void br_multicast_init(struct net_bridge *br);
+void br_multicast_join_snoopers(struct net_bridge *br);
+void br_multicast_leave_snoopers(struct net_bridge *br);
 void br_multicast_open(struct net_bridge *br);
 void br_multicast_stop(struct net_bridge *br);
 void br_multicast_dev_del(struct net_bridge *br);
@@ -969,6 +971,14 @@ static inline void br_multicast_init(struct net_bridge *br)
 {
 }
 
+static inline void br_multicast_join_snoopers(struct net_bridge *br)
+{
+}
+
+static inline void br_multicast_leave_snoopers(struct net_bridge *br)
+{
+}
+
 static inline void br_multicast_open(struct net_bridge *br)
 {
 }
commit eb96b686fc2c601e78903cc61b6cf4588ddde013
Author: Claudiu Manoil <claudiu.manoil at nxp.com>
Date:   Fri Dec 4 19:15:05 2020 +0200

    enetc: Fix reporting of h/w packet counters
    
    Noticed some inconsistencies in packet statistics reporting.
    This patch adds the missing Tx packet counter registers to
    ethtool reporting and fixes the information strings for a
    few of them.
    
    Fixes: 16eb4c85c964 ("enetc: Add ethtool statistics")
    Signed-off-by: Claudiu Manoil <claudiu.manoil at nxp.com>
    Link: https://lore.kernel.org/r/20201204171505.21389-1-claudiu.manoil@nxp.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c b/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c
index 8ed1ebd5a183..89e558135432 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c
@@ -143,8 +143,8 @@ static const struct {
 	{ ENETC_PM0_R255,   "MAC rx 128-255 byte packets" },
 	{ ENETC_PM0_R511,   "MAC rx 256-511 byte packets" },
 	{ ENETC_PM0_R1023,  "MAC rx 512-1023 byte packets" },
-	{ ENETC_PM0_R1518,  "MAC rx 1024-1518 byte packets" },
-	{ ENETC_PM0_R1519X, "MAC rx 1519 to max-octet packets" },
+	{ ENETC_PM0_R1522,  "MAC rx 1024-1522 byte packets" },
+	{ ENETC_PM0_R1523X, "MAC rx 1523 to max-octet packets" },
 	{ ENETC_PM0_ROVR,   "MAC rx oversized packets" },
 	{ ENETC_PM0_RJBR,   "MAC rx jabber packets" },
 	{ ENETC_PM0_RFRG,   "MAC rx fragment packets" },
@@ -163,9 +163,13 @@ static const struct {
 	{ ENETC_PM0_TBCA,   "MAC tx broadcast frames" },
 	{ ENETC_PM0_TPKT,   "MAC tx packets" },
 	{ ENETC_PM0_TUND,   "MAC tx undersized packets" },
+	{ ENETC_PM0_T64,    "MAC tx 64 byte packets" },
 	{ ENETC_PM0_T127,   "MAC tx 65-127 byte packets" },
+	{ ENETC_PM0_T255,   "MAC tx 128-255 byte packets" },
+	{ ENETC_PM0_T511,   "MAC tx 256-511 byte packets" },
 	{ ENETC_PM0_T1023,  "MAC tx 512-1023 byte packets" },
-	{ ENETC_PM0_T1518,  "MAC tx 1024-1518 byte packets" },
+	{ ENETC_PM0_T1522,  "MAC tx 1024-1522 byte packets" },
+	{ ENETC_PM0_T1523X, "MAC tx 1523 to max-octet packets" },
 	{ ENETC_PM0_TCNP,   "MAC tx control packets" },
 	{ ENETC_PM0_TDFR,   "MAC tx deferred packets" },
 	{ ENETC_PM0_TMCOL,  "MAC tx multiple collisions" },
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
index eb6bbf1113c7..4cbf1667d7ff 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
@@ -267,8 +267,8 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_R255		0x8180
 #define ENETC_PM0_R511		0x8188
 #define ENETC_PM0_R1023		0x8190
-#define ENETC_PM0_R1518		0x8198
-#define ENETC_PM0_R1519X	0x81A0
+#define ENETC_PM0_R1522		0x8198
+#define ENETC_PM0_R1523X	0x81A0
 #define ENETC_PM0_ROVR		0x81A8
 #define ENETC_PM0_RJBR		0x81B0
 #define ENETC_PM0_RFRG		0x81B8
@@ -287,9 +287,13 @@ enum enetc_bdr_type {TX, RX};
 #define ENETC_PM0_TBCA		0x8250
 #define ENETC_PM0_TPKT		0x8260
 #define ENETC_PM0_TUND		0x8268
+#define ENETC_PM0_T64		0x8270
 #define ENETC_PM0_T127		0x8278
+#define ENETC_PM0_T255		0x8280
+#define ENETC_PM0_T511		0x8288
 #define ENETC_PM0_T1023		0x8290
-#define ENETC_PM0_T1518		0x8298
+#define ENETC_PM0_T1522		0x8298
+#define ENETC_PM0_T1523X	0x82A0
 #define ENETC_PM0_TCNP		0x82C0
 #define ENETC_PM0_TDFR		0x82D0
 #define ENETC_PM0_TMCOL		0x82D8
commit 5eedf9fe8db23313df104576845cec5f481b9b60
Author: Christophe Leroy <christophe.leroy at csgroup.eu>
Date:   Mon Dec 7 16:58:01 2020 +0000

    powerpc/mm: Fix KUAP warning by providing copy_from_kernel_nofault_allowed()
    
    Since commit c33165253492 ("powerpc: use non-set_fs based maccess
    routines"), userspace access is not granted anymore when using
    copy_from_kernel_nofault()
    
    However, kthread_probe_data() uses copy_from_kernel_nofault()
    to check validity of pointers. When the pointer is NULL,
    it points to userspace, leading to a KUAP fault and triggering
    the following big hammer warning many times when you request
    a sysrq "show task":
    
    [ 1117.202054] ------------[ cut here ]------------
    [ 1117.202102] Bug: fault blocked by AP register !
    [ 1117.202261] WARNING: CPU: 0 PID: 377 at arch/powerpc/include/asm/nohash/32/kup-8xx.h:66 do_page_fault+0x4a8/0x5ec
    [ 1117.202310] Modules linked in:
    [ 1117.202428] CPU: 0 PID: 377 Comm: sh Tainted: G        W         5.10.0-rc5-01340-g83f53be2de31-dirty #4175
    [ 1117.202499] NIP:  c0012048 LR: c0012048 CTR: 00000000
    [ 1117.202573] REGS: cacdbb88 TRAP: 0700   Tainted: G        W          (5.10.0-rc5-01340-g83f53be2de31-dirty)
    [ 1117.202625] MSR:  00021032 <ME,IR,DR,RI>  CR: 24082222  XER: 20000000
    [ 1117.202899]
    [ 1117.202899] GPR00: c0012048 cacdbc40 c2929290 00000023 c092e554 00000001 c09865e8 c092e640
    [ 1117.202899] GPR08: 00001032 00000000 00000000 00014efc 28082224 100d166a 100a0920 00000000
    [ 1117.202899] GPR16: 100cac0c 100b0000 1080c3fc 1080d685 100d0000 100d0000 00000000 100a0900
    [ 1117.202899] GPR24: 100d0000 c07892ec 00000000 c0921510 c21f4440 0000005c c0000000 cacdbc80
    [ 1117.204362] NIP [c0012048] do_page_fault+0x4a8/0x5ec
    [ 1117.204461] LR [c0012048] do_page_fault+0x4a8/0x5ec
    [ 1117.204509] Call Trace:
    [ 1117.204609] [cacdbc40] [c0012048] do_page_fault+0x4a8/0x5ec (unreliable)
    [ 1117.204771] [cacdbc70] [c00112f0] handle_page_fault+0x8/0x34
    [ 1117.204911] --- interrupt: 301 at copy_from_kernel_nofault+0x70/0x1c0
    [ 1117.204979] NIP:  c010dbec LR: c010dbac CTR: 00000001
    [ 1117.205053] REGS: cacdbc80 TRAP: 0301   Tainted: G        W          (5.10.0-rc5-01340-g83f53be2de31-dirty)
    [ 1117.205104] MSR:  00009032 <EE,ME,IR,DR,RI>  CR: 28082224  XER: 00000000
    [ 1117.205416] DAR: 0000005c DSISR: c0000000
    [ 1117.205416] GPR00: c0045948 cacdbd38 c2929290 00000001 00000017 00000017 00000027 0000000f
    [ 1117.205416] GPR08: c09926ec 00000000 00000000 3ffff000 24082224
    [ 1117.206106] NIP [c010dbec] copy_from_kernel_nofault+0x70/0x1c0
    [ 1117.206202] LR [c010dbac] copy_from_kernel_nofault+0x30/0x1c0
    [ 1117.206258] --- interrupt: 301
    [ 1117.206372] [cacdbd38] [c004bbb0] kthread_probe_data+0x44/0x70 (unreliable)
    [ 1117.206561] [cacdbd58] [c0045948] print_worker_info+0xe0/0x194
    [ 1117.206717] [cacdbdb8] [c00548ac] sched_show_task+0x134/0x168
    [ 1117.206851] [cacdbdd8] [c005a268] show_state_filter+0x70/0x100
    [ 1117.206989] [cacdbe08] [c039baa0] sysrq_handle_showstate+0x14/0x24
    [ 1117.207122] [cacdbe18] [c039bf18] __handle_sysrq+0xac/0x1d0
    [ 1117.207257] [cacdbe48] [c039c0c0] write_sysrq_trigger+0x4c/0x74
    [ 1117.207407] [cacdbe68] [c01fba48] proc_reg_write+0xb4/0x114
    [ 1117.207550] [cacdbe88] [c0179968] vfs_write+0x12c/0x478
    [ 1117.207686] [cacdbf08] [c0179e60] ksys_write+0x78/0x128
    [ 1117.207826] [cacdbf38] [c00110d0] ret_from_syscall+0x0/0x34
    [ 1117.207938] --- interrupt: c01 at 0xfd4e784
    [ 1117.208008] NIP:  0fd4e784 LR: 0fe0f244 CTR: 10048d38
    [ 1117.208083] REGS: cacdbf48 TRAP: 0c01   Tainted: G        W          (5.10.0-rc5-01340-g83f53be2de31-dirty)
    [ 1117.208134] MSR:  0000d032 <EE,PR,ME,IR,DR,RI>  CR: 44002222  XER: 00000000
    [ 1117.208470]
    [ 1117.208470] GPR00: 00000004 7fc34090 77bfb4e0 00000001 1080fa40 00000002 7400000f fefefeff
    [ 1117.208470] GPR08: 7f7f7f7f 10048d38 1080c414 7fc343c0 00000000
    [ 1117.209104] NIP [0fd4e784] 0xfd4e784
    [ 1117.209180] LR [0fe0f244] 0xfe0f244
    [ 1117.209236] --- interrupt: c01
    [ 1117.209274] Instruction dump:
    [ 1117.209353] 714a4000 418200f0 73ca0001 40820084 73ca0032 408200f8 73c90040 4082ff60
    [ 1117.209727] 0fe00000 3c60c082 386399f4 48013b65 <0fe00000> 80010034 3860000b 7c0803a6
    [ 1117.210102] ---[ end trace 1927c0323393af3e ]---
    
    To avoid that, copy_from_kernel_nofault_allowed() is used to check
    whether the address is a valid kernel address. But the default
    version of it returns true for any address.
    
    Provide a powerpc version of copy_from_kernel_nofault_allowed()
    that returns false when the address is below TASK_USER_MAX,
    so that copy_from_kernel_nofault() will return -ERANGE.
    
    Fixes: c33165253492 ("powerpc: use non-set_fs based maccess routines")
    Reported-by: Qian Cai <qcai at redhat.com>
    Signed-off-by: Christophe Leroy <christophe.leroy at csgroup.eu>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/18bcb456d32a3e74f5ae241fd6f1580c092d07f5.1607360230.git.christophe.leroy@csgroup.eu

diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile
index 5e147986400d..55b4a8bd408a 100644
--- a/arch/powerpc/mm/Makefile
+++ b/arch/powerpc/mm/Makefile
@@ -5,7 +5,7 @@
 
 ccflags-$(CONFIG_PPC64)	:= $(NO_MINIMAL_TOC)
 
-obj-y				:= fault.o mem.o pgtable.o mmap.o \
+obj-y				:= fault.o mem.o pgtable.o mmap.o maccess.o \
 				   init_$(BITS).o pgtable_$(BITS).o \
 				   pgtable-frag.o ioremap.o ioremap_$(BITS).o \
 				   init-common.o mmu_context.o drmem.o
diff --git a/arch/powerpc/mm/maccess.c b/arch/powerpc/mm/maccess.c
new file mode 100644
index 000000000000..fa9a7a718fc6
--- /dev/null
+++ b/arch/powerpc/mm/maccess.c
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/uaccess.h>
+#include <linux/kernel.h>
+
+bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)
+{
+	return is_kernel_addr((unsigned long)unsafe_src);
+}
commit ceabbf94c317c6175dee6e91805fca4a6353745a
Author: Geert Uytterhoeven <geert+renesas at glider.be>
Date:   Mon Nov 30 09:57:43 2020 +0100

    clk: renesas: r9a06g032: Drop __packed for portability
    
    The R9A06G032 clock driver uses an array of packed structures to reduce
    kernel size.  However, this array contains pointers, which are no longer
    aligned naturally, and cannot be relocated on PPC64.  Hence when
    compile-testing this driver on PPC64 with CONFIG_RELOCATABLE=y (e.g.
    PowerPC allyesconfig), the following warnings are produced:
    
        WARNING: 136 bad relocations
        c000000000616be3 R_PPC64_UADDR64   .rodata+0x00000000000cf338
        c000000000616bfe R_PPC64_UADDR64   .rodata+0x00000000000cf370
        ...
    
    Fix this by dropping the __packed attribute from the r9a06g032_clkdesc
    definition, trading a small size increase for portability.
    
    This increases the 156-entry clock table by 1 byte per entry, but due to
    the compiler generating more efficient code for unpacked accesses, the
    net size increase is only 76 bytes (gcc 9.3.0 on arm32).
    
    Reported-by: Stephen Rothwell <sfr at canb.auug.org.au>
    Fixes: 4c3d88526eba2143 ("clk: renesas: Renesas R9A06G032 clock driver")
    Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
    Link: https://lore.kernel.org/r/20201130085743.1656317-1-geert+renesas@glider.be
    Tested-by: Stephen Rothwell <sfr at canb.auug.org.au> # PowerPC allyesconfig build
    Acked-by: Stephen Boyd <sboyd at kernel.org>
    Signed-off-by: Stephen Boyd <sboyd at kernel.org>

diff --git a/drivers/clk/renesas/r9a06g032-clocks.c b/drivers/clk/renesas/r9a06g032-clocks.c
index d900f6bf53d0..892e91b92f2c 100644
--- a/drivers/clk/renesas/r9a06g032-clocks.c
+++ b/drivers/clk/renesas/r9a06g032-clocks.c
@@ -55,7 +55,7 @@ struct r9a06g032_clkdesc {
 			u16 sel, g1, r1, g2, r2;
 		} dual;
 	};
-} __packed;
+};
 
 #define I_GATE(_clk, _rst, _rdy, _midle, _scon, _mirack, _mistat) \
 	{ .gate = _clk, .reset = _rst, \
commit 6247e31b75308c51476e157c9964823aeefbf5dc
Author: Dong Aisheng <aisheng.dong at nxp.com>
Date:   Mon Nov 30 16:46:24 2020 +0800

    clk: imx: scu: fix MXC_CLK_SCU module build break
    
    This issue can be reproduced by having a kernel config with
    CONFIG_IMX_MBOX=m and CONFIG_MXC_CLK_SCU=m.  It's caused by the Makefile
    wanting to build clk-scu.o and clk-imx8qxp.o as different targets but
    that doesn't work (e.g. MXC_CLK_SCU = y while CLK_IMX8QXP = n)
    
    "obj-$(CONFIG_MXC_CLK_SCU) += clk-imx-scu.o clk-imx-lpcg-scu.o
    clk-imx-scu-$(CONFIG_CLK_IMX8QXP) += clk-scu.o clk-imx8qxp.o"
    
    Having MXC_CLK_SCU=y/m while CLK_IMX8QXP=n will cause a linker problem
    like below:
    
      LD [M]  drivers/clk/imx/clk-imx-scu.o
      arm-poky-linux-gnueabi-ld: no input files
    
    Make MXC_CLK_SCU be un-selectable by users so it can only be selected by
    the CLK_IMX8QXP option, ensuring the two symbols are built together.
    Drop COMPILE_TEST too because this option isn't selectable anymore. We
    can remove it from MXC_CLK_SCU because CLK_IMX8QXP selects MXC_CLK_SCU
    which already has COMPILE_TEST.
    
    Fixes: e0d0d4d86c766 ("clk: imx8qxp: Support building i.MX8QXP clock driver as module")
    Acked-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
    Signed-off-by: Dong Aisheng <aisheng.dong at nxp.com>
    Link: https://lore.kernel.org/r/20201130084624.21113-1-aisheng.dong@nxp.com
    [sboyd at kernel.org: Rework commit text]
    Signed-off-by: Stephen Boyd <sboyd at kernel.org>

diff --git a/drivers/clk/imx/Kconfig b/drivers/clk/imx/Kconfig
index 3b393cb07295..3061896503f3 100644
--- a/drivers/clk/imx/Kconfig
+++ b/drivers/clk/imx/Kconfig
@@ -5,8 +5,8 @@ config MXC_CLK
 	depends on ARCH_MXC || COMPILE_TEST
 
 config MXC_CLK_SCU
-	tristate "IMX SCU clock"
-	depends on ARCH_MXC || COMPILE_TEST
+	tristate
+	depends on ARCH_MXC
 	depends on IMX_SCU && HAVE_ARM_SMCCC
 
 config CLK_IMX1
commit e432c04c17993011b2a2f59dcb5738e604bd552e
Author: Gal Pressman <galpress at amazon.com>
Date:   Sun Dec 6 17:32:38 2020 +0200

    RDMA/core: Fix empty gid table for non IB/RoCE devices
    
    The query_gid_table ioctl skips non IB/RoCE ports, which as a result
    returns an empty gid table for devices such as EFA which have a GID table,
    but are not IB/RoCE.
    
    Fixes: c4b4d548fabc ("RDMA/core: Introduce new GID table query API")
    Link: https://lore.kernel.org/r/20201206153238.34878-1-galpress@amazon.com
    Signed-off-by: Gal Pressman <galpress at amazon.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index 8017c40dd110..7989b7e1d1c0 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -1269,9 +1269,6 @@ ssize_t rdma_query_gid_table(struct ib_device *device,
 	unsigned long flags;
 
 	rdma_for_each_port(device, port_num) {
-		if (!rdma_ib_or_roce(device, port_num))
-			continue;
-
 		table = rdma_gid_table(device, port_num);
 		read_lock_irqsave(&table->rwlock, flags);
 		for (i = 0; i < table->sz; i++) {
commit e3366884b383073a7edc1bad9634412ae0a22d4e
Author: Cong Wang <cong.wang at bytedance.com>
Date:   Fri Dec 4 23:59:46 2020 -0800

    lwt_bpf: Replace preempt_disable() with migrate_disable()
    
    migrate_disable() is just a wrapper for preempt_disable() in
    non-RT kernel. It is safe to replace it, and RT kernel will
    benefit.
    
    Note that it is introduced since Feb 2020.
    
    Suggested-by: Alexei Starovoitov <alexei.starovoitov at gmail.com>
    Signed-off-by: Cong Wang <cong.wang at bytedance.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201205075946.497763-2-xiyou.wangcong@gmail.com

diff --git a/net/core/lwt_bpf.c b/net/core/lwt_bpf.c
index 4f3cb7c15ddf..2f7940bcf715 100644
--- a/net/core/lwt_bpf.c
+++ b/net/core/lwt_bpf.c
@@ -39,10 +39,10 @@ static int run_lwt_bpf(struct sk_buff *skb, struct bpf_lwt_prog *lwt,
 {
 	int ret;
 
-	/* Preempt disable and BH disable are needed to protect per-cpu
+	/* Migration disable and BH disable are needed to protect per-cpu
 	 * redirect_info between BPF prog and skb_do_redirect().
 	 */
-	preempt_disable();
+	migrate_disable();
 	local_bh_disable();
 	bpf_compute_data_pointers(skb);
 	ret = bpf_prog_run_save_cb(lwt->prog, skb);
@@ -78,7 +78,7 @@ static int run_lwt_bpf(struct sk_buff *skb, struct bpf_lwt_prog *lwt,
 	}
 
 	local_bh_enable();
-	preempt_enable();
+	migrate_enable();
 
 	return ret;
 }
commit d9054a1ff585ba01029584ab730efc794603d68f
Author: Dongdong Wang <wangdongdong.6 at bytedance.com>
Date:   Fri Dec 4 23:59:45 2020 -0800

    lwt: Disable BH too in run_lwt_bpf()
    
    The per-cpu bpf_redirect_info is shared among all skb_do_redirect()
    and BPF redirect helpers. Callers on RX path are all in BH context,
    disabling preemption is not sufficient to prevent BH interruption.
    
    In production, we observed strange packet drops because of the race
    condition between LWT xmit and TC ingress, and we verified this issue
    is fixed after we disable BH.
    
    Although this bug was technically introduced from the beginning, that
    is commit 3a0af8fd61f9 ("bpf: BPF for lightweight tunnel infrastructure"),
    at that time call_rcu() had to be call_rcu_bh() to match the RCU context.
    So this patch may not work well before RCU flavor consolidation has been
    completed around v5.0.
    
    Update the comments above the code too, as call_rcu() is now BH friendly.
    
    Signed-off-by: Dongdong Wang <wangdongdong.6 at bytedance.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Reviewed-by: Cong Wang <cong.wang at bytedance.com>
    Link: https://lore.kernel.org/bpf/20201205075946.497763-1-xiyou.wangcong@gmail.com

diff --git a/net/core/lwt_bpf.c b/net/core/lwt_bpf.c
index 7d3438215f32..4f3cb7c15ddf 100644
--- a/net/core/lwt_bpf.c
+++ b/net/core/lwt_bpf.c
@@ -39,12 +39,11 @@ static int run_lwt_bpf(struct sk_buff *skb, struct bpf_lwt_prog *lwt,
 {
 	int ret;
 
-	/* Preempt disable is needed to protect per-cpu redirect_info between
-	 * BPF prog and skb_do_redirect(). The call_rcu in bpf_prog_put() and
-	 * access to maps strictly require a rcu_read_lock() for protection,
-	 * mixing with BH RCU lock doesn't work.
+	/* Preempt disable and BH disable are needed to protect per-cpu
+	 * redirect_info between BPF prog and skb_do_redirect().
 	 */
 	preempt_disable();
+	local_bh_disable();
 	bpf_compute_data_pointers(skb);
 	ret = bpf_prog_run_save_cb(lwt->prog, skb);
 
@@ -78,6 +77,7 @@ static int run_lwt_bpf(struct sk_buff *skb, struct bpf_lwt_prog *lwt,
 		break;
 	}
 
+	local_bh_enable();
 	preempt_enable();
 
 	return ret;
commit cd796ed3345030aa1bb332fe5c793b3dddaf56e7
Merge: 0477e9288185 bcee52789588
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Dec 7 11:20:26 2020 -0800

    Merge tag 'trace-v5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
    
    Pull tracing fix from Steven Rostedt:
     "Fix userstacktrace option for instances
    
      While writing an application that requires user stack trace option to
      work in instances, I found that the instance option has a bug that
      makes it a nop. The check for performing the user stack trace in an
      instance, checks the top level options (not the instance options) to
      determine if a user stack trace should be performed or not.
    
      This is not only incorrect, but also confusing for users. It confused
      me for a bit!"
    
    * tag 'trace-v5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
      tracing: Fix userstacktrace option for instances

commit e8c954df234145c5765870382c2bc630a48beec9
Author: Pavel Begunkov <asml.silence at gmail.com>
Date:   Sun Dec 6 22:22:46 2020 +0000

    io_uring: fix mis-seting personality's creds
    
    After io_identity_cow() copies an work.identity it wants to copy creds
    to the new just allocated id, not the old one. Otherwise it's
    akin to req->work.identity->creds = req->work.identity->creds.
    
    Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index a2a7c65a77aa..908817cea4f5 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1284,7 +1284,7 @@ static bool io_identity_cow(struct io_kiocb *req)
 	 */
 	io_init_identity(id);
 	if (creds)
-		req->work.identity->creds = creds;
+		id->creds = creds;
 
 	/* add one for this request */
 	refcount_inc(&id->count);
commit db2082700a0c7974c3a7787d50abff34b2695b4b
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Tue Dec 1 23:15:16 2020 +0200

    MAINTAINERS: add a limited ARM and ARM64 SoC entry
    
    It is expected for ARM and ARM64 SoC related code to go through
    sub-architecture maintainers.  Their addresses were therefore not
    documented to push patch traffic through sub-architecture maintainers.
    
    However when patches touch generic code, e.g. multi_v7_defconfig, the
    patch might not be picked up by them and instead should go to the SoC
    maintainers - Arnd and Olof.
    
    Add a minimal maintainer's entry for SoC covering only Makefile, so it
    will not appear on most of submissions (except new devicetree boards).
    It will though serve as a documentation and reference for cases when
    submitter does not know where to send his SoC-related patches.
    
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Link: https://lore.kernel.org/r/20201201211516.24921-2-krzk@kernel.org'
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/MAINTAINERS b/MAINTAINERS
index 715c84c25fb5..52086876ce40 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1486,6 +1486,16 @@ F:	Documentation/devicetree/bindings/iommu/arm,smmu*
 F:	drivers/iommu/arm/
 F:	drivers/iommu/io-pgtable-arm*
 
+ARM AND ARM64 SoC SUB-ARCHITECTURES (COMMON PARTS)
+M:	Arnd Bergmann <arnd at arndb.de>
+M:	Olof Johansson <olof at lixom.net>
+M:	soc at kernel.org
+L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
+S:	Maintained
+T:	git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git
+F:	arch/arm/boot/dts/Makefile
+F:	arch/arm64/boot/dts/Makefile
+
 ARM SUB-ARCHITECTURES
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
commit c99055ec2c3974386f36eb648af77a8dbe887ca9
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Tue Dec 1 23:15:15 2020 +0200

    MAINTAINERS: correct SoC Git address (formerly: arm-soc)
    
    The SoC Git was moved from arm/arm-soc.git to soc/soc.git.  Correct the
    ARM Sub-architectures entry.
    
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Link: https://lore.kernel.org/r/20201201211516.24921-1-krzk@kernel.org'
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/MAINTAINERS b/MAINTAINERS
index 6f474153dbec..715c84c25fb5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1489,7 +1489,7 @@ F:	drivers/iommu/io-pgtable-arm*
 ARM SUB-ARCHITECTURES
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
-T:	git git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc.git
+T:	git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git
 F:	arch/arm/mach-*/
 F:	arch/arm/plat-*/
 
commit 9280f726097b436c8c907825131cd346d7eb0c0f
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 4 00:18:40 2020 +0100

    ARM: keystone: remove SECTION_SIZE_BITS/MAX_PHYSMEM_BITS
    
    These definitions are evidently left over from the days when
    sparsemem settings were platform specific. This was no longer
    the case when the platform got merged.
    
    There was no warning in the past, but now the asm/sparsemem.h
    header ends up being included indirectly, causing this warning:
    
    In file included from /git/arm-soc/arch/arm/mach-keystone/keystone.c:24:
    arch/arm/mach-keystone/memory.h:10:9: warning: 'SECTION_SIZE_BITS' macro redefined [-Wmacro-redefined]
     #define SECTION_SIZE_BITS       34
            ^
    arch/arm/include/asm/sparsemem.h:23:9: note: previous definition is here
     #define SECTION_SIZE_BITS       28
            ^
    
    Clearly the definitions never had any effect here, so remove them.
    
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Link: https://lore.kernel.org/r/20201203231847.1484900-1-arnd@kernel.org'
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/arch/arm/mach-keystone/memory.h b/arch/arm/mach-keystone/memory.h
index 9147565d0581..1b9ed1271e05 100644
--- a/arch/arm/mach-keystone/memory.h
+++ b/arch/arm/mach-keystone/memory.h
@@ -6,9 +6,6 @@
 #ifndef __MEMORY_H
 #define __MEMORY_H
 
-#define MAX_PHYSMEM_BITS	36
-#define SECTION_SIZE_BITS	34
-
 #define KEYSTONE_LOW_PHYS_START		0x80000000ULL
 #define KEYSTONE_LOW_PHYS_SIZE		0x80000000ULL /* 2G */
 #define KEYSTONE_LOW_PHYS_END		(KEYSTONE_LOW_PHYS_START + \
commit 5e2e740247791e9c0663d8c41d04b52f1db22037
Merge: b11ddaac893a 19ba8fb810c6
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Dec 7 15:28:59 2020 +0100

    Merge tag 'imx-fixes-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into arm/fixes
    
    i.MX fixes for 5.10, round 5:
    
    - Fix a regression on SoC revision detection with ANATOP, that is
      introduced by commit  4a4fb66119eb ("ARM: imx: Add missing
      of_node_put()").
    - Drop PAD_GPIO_6 from imx6qdl-wandboard ENET pin group, as the pin is
      used by camera sensor now.
    - Fix I2C3_SCL pinmux on imx6qdl-kontron-samx6i board, so that SoM EEPROM
      can be accessed.
    
    * tag 'imx-fixes-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
      ARM: dts: imx6qdl-kontron-samx6i: fix I2C_PM scl pin
      ARM: dts: imx6qdl-wandboard-revd1: Remove PAD_GPIO_6 from enetgrp
      ARM: imx: Use correct SRC base address
    
    Link: https://lore.kernel.org/r/20201201091820.GW4072@dragon
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit b11ddaac893ada234895bcfc3be3358957e80717
Merge: 0477e9288185 a7361b9c4615
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Dec 7 15:28:27 2020 +0100

    Merge tag 'sunxi-fixes-for-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into arm/fixes
    
    A few more RGMII-ID fixes, and a bunch of other more random fixes
    
    * tag 'sunxi-fixes-for-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux:
      ARM: dts: sun7i: pcduino3-nano: enable RGMII RX/TX delay on PHY
      ARM: dts: sun8i: v3s: fix GIC node memory range
      ARM: dts: sun8i: v40: bananapi-m2-berry: Fix ethernet node
      ARM: dts: sun8i: r40: bananapi-m2-berry: Fix dcdc1 regulator
      ARM: dts: sun7i: bananapi: Enable RGMII RX/TX delay on Ethernet PHY
      ARM: dts: s3: pinecube: align compatible property to other S3 boards
      ARM: sunxi: Add machine match for the Allwinner V3 SoC
      arm64: dts: allwinner: h6: orangepi-one-plus: Fix ethernet
    
    Link: https://lore.kernel.org/r/1280f1de-1b6d-4cc2-8448-e5a9096a41e8.lettre@localhost
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 4165bf015ba9454f45beaad621d16c516d5c5afe
Author: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
Date:   Mon Dec 7 03:19:20 2020 -0600

    iommu/amd: Set DTE[IntTabLen] to represent 512 IRTEs
    
    According to the AMD IOMMU spec, the commit 73db2fc595f3
    ("iommu/amd: Increase interrupt remapping table limit to 512 entries")
    also requires the interrupt table length (IntTabLen) to be set to 9
    (power of 2) in the device table mapping entry (DTE).
    
    Fixes: 73db2fc595f3 ("iommu/amd: Increase interrupt remapping table limit to 512 entries")
    Reported-by: Jerry Snitselaar <jsnitsel at redhat.com>
    Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
    Reviewed-by: Jerry Snitselaar <jsnitsel at redhat.com>
    Link: https://lore.kernel.org/r/20201207091920.3052-1-suravee.suthikulpanit@amd.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index 89647700bab2..494b42a31b7a 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -257,7 +257,7 @@
 #define DTE_IRQ_REMAP_INTCTL_MASK	(0x3ULL << 60)
 #define DTE_IRQ_TABLE_LEN_MASK	(0xfULL << 1)
 #define DTE_IRQ_REMAP_INTCTL    (2ULL << 60)
-#define DTE_IRQ_TABLE_LEN       (8ULL << 1)
+#define DTE_IRQ_TABLE_LEN       (9ULL << 1)
 #define DTE_IRQ_REMAP_ENABLE    1ULL
 
 #define PAGE_MODE_NONE    0x00
commit 10c678bd0a035ac2c64a9b26b222f20556227a53
Author: Xin Long <lucien.xin at gmail.com>
Date:   Mon Dec 7 15:55:40 2020 +0800

    udp: fix the proto value passed to ip_protocol_deliver_rcu for the segments
    
    Guillaume noticed that: for segments udp_queue_rcv_one_skb() returns the
    proto, and it should pass "ret" unmodified to ip_protocol_deliver_rcu().
    Otherwize, with a negtive value passed, it will underflow inet_protos.
    
    This can be reproduced with IPIP FOU:
    
      # ip fou add port 5555 ipproto 4
      # ethtool -K eth1 rx-gro-list on
    
    Fixes: cf329aa42b66 ("udp: cope with UDP GRO packet misdirection")
    Reported-by: Guillaume Nault <gnault at redhat.com>
    Signed-off-by: Xin Long <lucien.xin at gmail.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 09f0a23d1a01..9eeebd4a0054 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -2173,7 +2173,7 @@ static int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 		__skb_pull(skb, skb_transport_offset(skb));
 		ret = udp_queue_rcv_one_skb(sk, skb);
 		if (ret > 0)
-			ip_protocol_deliver_rcu(dev_net(skb->dev), skb, -ret);
+			ip_protocol_deliver_rcu(dev_net(skb->dev), skb, ret);
 	}
 	return 0;
 }
commit 61f54de2e9194f01874d5eda12037b0978e77519
Author: Huazhong Tan <tanhuazhong at huawei.com>
Date:   Mon Dec 7 15:20:25 2020 +0800

    net: hns3: remove a misused pragma packed
    
    hclge_dbg_reg_info[] is defined as an array of packed structure
    accidentally. However, this array contains pointers, which are
    no longer aligned naturally, and cannot be relocated on PPC64.
    Hence, when compile-testing this driver on PPC64 with
    CONFIG_RELOCATABLE=y (e.g. PowerPC allyesconfig), there will be
    some warnings.
    
    Since each field in structure hclge_qos_pri_map_cmd and
    hclge_dbg_bitmap_cmd is type u8, the pragma packed is unnecessary
    for these two structures as well, so remove the pragma packed in
    hclge_debugfs.h to fix this issue, and this increases
    hclge_dbg_reg_info[] by 4 bytes per entry.
    
    Fixes: a582b78dfc33 ("net: hns3: code optimization for debugfs related to "dump reg"")
    Reported-by: Stephen Rothwell <sfr at canb.auug.org.au>
    Signed-off-by: Huazhong Tan <tanhuazhong at huawei.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.h
index a9066e6ff697..ca2ab6cf84d9 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.h
@@ -35,8 +35,6 @@
 
 #define HCLGE_DBG_DFX_SSU_2_OFFSET 12
 
-#pragma pack(1)
-
 struct hclge_qos_pri_map_cmd {
 	u8 pri0_tc  : 4,
 	   pri1_tc  : 4;
@@ -85,8 +83,6 @@ struct hclge_dbg_reg_type_info {
 	struct hclge_dbg_reg_common_msg reg_msg;
 };
 
-#pragma pack()
-
 static const struct hclge_dbg_dfx_message hclge_dbg_bios_common_reg[] = {
 	{false, "Reserved"},
 	{true,	"BP_CPU_STATE"},
commit 223f61b8c5ad80f01900bc25f8073dfa4f23a2be
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Sun Dec 6 21:59:42 2020 -0800

    Input: soc_button_array - add Lenovo Yoga Tablet2 1051L to the dmi_use_low_level_irq list
    
    Add the Lenovo Yoga Tablet2 1051L to the list of devices where the
    ACPI AML code is poking the GPIO config register directly changing
    the IRQ type to a low_level_irq, which we need to work around.
    
    This fixes the home button on the Lenovo Yoga Tablet2 1051L not
    working.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201206161245.24798-1-hdegoede@redhat.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c
index d14a65683c5e..cb6ec59a045d 100644
--- a/drivers/input/misc/soc_button_array.c
+++ b/drivers/input/misc/soc_button_array.c
@@ -83,6 +83,17 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "One S1003"),
 		},
 	},
+	{
+		/*
+		 * Lenovo Yoga Tab2 1051L, something messes with the home-button
+		 * IRQ settings, leading to a non working home-button.
+		 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "60073"),
+			DMI_MATCH(DMI_PRODUCT_VERSION, "1051L"),
+		},
+	},
 	{} /* Terminating entry */
 };
 
commit 3b384bd6c3f2d6d3526c77bfb264dfbaf737bc2a
Author: Furquan Shaikh <furquan at google.com>
Date:   Sun Dec 6 22:05:13 2020 -0800

    Input: raydium_ts_i2c - do not split tx transactions
    
    Raydium device does not like splitting of tx transactions into multiple
    messages - one for the register address and one for the actual data. This
    results in incorrect behavior on the device side.
    
    This change updates raydium_i2c_read and raydium_i2c_write to create
    i2c_msg arrays separately and passes those arrays into raydium_i2c_xfer
    which decides based on the address whether the bank switch command should
    be sent. The bank switch header is still added by raydium_i2c_read and
    raydium_i2c_write to ensure that all these operations are performed as part
    of a single I2C transfer. It guarantees that no other transactions are
    initiated to any other device on the same bus after the bank switch command
    is sent.
    
    Signed-off-by: Furquan Shaikh <furquan at google.com>
    Link: https://lore.kernel.org/r/20201205005941.1427643-1-furquan@google.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/touchscreen/raydium_i2c_ts.c b/drivers/input/touchscreen/raydium_i2c_ts.c
index e694a9b2b1e5..603a948460d6 100644
--- a/drivers/input/touchscreen/raydium_i2c_ts.c
+++ b/drivers/input/touchscreen/raydium_i2c_ts.c
@@ -137,45 +137,25 @@ struct raydium_data {
 	bool wake_irq_enabled;
 };
 
-static int raydium_i2c_xfer(struct i2c_client *client,
-			    u32 addr, void *data, size_t len, bool is_read)
-{
-	struct raydium_bank_switch_header {
-		u8 cmd;
-		__be32 be_addr;
-	} __packed header = {
-		.cmd = RM_CMD_BANK_SWITCH,
-		.be_addr = cpu_to_be32(addr),
-	};
-
-	u8 reg_addr = addr & 0xff;
-
-	struct i2c_msg xfer[] = {
-		{
-			.addr = client->addr,
-			.len = sizeof(header),
-			.buf = (u8 *)&header,
-		},
-		{
-			.addr = client->addr,
-			.len = 1,
-			.buf = &reg_addr,
-		},
-		{
-			.addr = client->addr,
-			.len = len,
-			.buf = data,
-			.flags = is_read ? I2C_M_RD : 0,
-		}
-	};
+/*
+ * Header to be sent for RM_CMD_BANK_SWITCH command. This is used by
+ * raydium_i2c_{read|send} below.
+ */
+struct __packed raydium_bank_switch_header {
+	u8 cmd;
+	__be32 be_addr;
+};
 
+static int raydium_i2c_xfer(struct i2c_client *client, u32 addr,
+			    struct i2c_msg *xfer, size_t xfer_count)
+{
+	int ret;
 	/*
 	 * If address is greater than 255, then RM_CMD_BANK_SWITCH needs to be
 	 * sent first. Else, skip the header i.e. xfer[0].
 	 */
 	int xfer_start_idx = (addr > 0xff) ? 0 : 1;
-	size_t xfer_count = ARRAY_SIZE(xfer) - xfer_start_idx;
-	int ret;
+	xfer_count -= xfer_start_idx;
 
 	ret = i2c_transfer(client->adapter, &xfer[xfer_start_idx], xfer_count);
 	if (likely(ret == xfer_count))
@@ -189,10 +169,46 @@ static int raydium_i2c_send(struct i2c_client *client,
 {
 	int tries = 0;
 	int error;
+	u8 *tx_buf;
+	u8 reg_addr = addr & 0xff;
+
+	tx_buf = kmalloc(len + 1, GFP_KERNEL);
+	if (!tx_buf)
+		return -ENOMEM;
+
+	tx_buf[0] = reg_addr;
+	memcpy(tx_buf + 1, data, len);
 
 	do {
-		error = raydium_i2c_xfer(client, addr, (void *)data, len,
-					 false);
+		struct raydium_bank_switch_header header = {
+			.cmd = RM_CMD_BANK_SWITCH,
+			.be_addr = cpu_to_be32(addr),
+		};
+
+		/*
+		 * Perform as a single i2c_transfer transaction to ensure that
+		 * no other I2C transactions are initiated on the bus to any
+		 * other device in between. Initiating transacations to other
+		 * devices after RM_CMD_BANK_SWITCH is sent is known to cause
+		 * issues. This is also why regmap infrastructure cannot be used
+		 * for this driver. Regmap handles page(bank) switch and reads
+		 * as separate i2c_transfer() operations. This can result in
+		 * problems if the Raydium device is on a shared I2C bus.
+		 */
+		struct i2c_msg xfer[] = {
+			{
+				.addr = client->addr,
+				.len = sizeof(header),
+				.buf = (u8 *)&header,
+			},
+			{
+				.addr = client->addr,
+				.len = len + 1,
+				.buf = tx_buf,
+			},
+		};
+
+		error = raydium_i2c_xfer(client, addr, xfer, ARRAY_SIZE(xfer));
 		if (likely(!error))
 			return 0;
 
@@ -206,12 +222,46 @@ static int raydium_i2c_send(struct i2c_client *client,
 static int raydium_i2c_read(struct i2c_client *client,
 			    u32 addr, void *data, size_t len)
 {
-	size_t xfer_len;
 	int error;
 
 	while (len) {
-		xfer_len = min_t(size_t, len, RM_MAX_READ_SIZE);
-		error = raydium_i2c_xfer(client, addr, data, xfer_len, true);
+		u8 reg_addr = addr & 0xff;
+		struct raydium_bank_switch_header header = {
+			.cmd = RM_CMD_BANK_SWITCH,
+			.be_addr = cpu_to_be32(addr),
+		};
+		size_t xfer_len = min_t(size_t, len, RM_MAX_READ_SIZE);
+
+		/*
+		 * Perform as a single i2c_transfer transaction to ensure that
+		 * no other I2C transactions are initiated on the bus to any
+		 * other device in between. Initiating transacations to other
+		 * devices after RM_CMD_BANK_SWITCH is sent is known to cause
+		 * issues. This is also why regmap infrastructure cannot be used
+		 * for this driver. Regmap handles page(bank) switch and writes
+		 * as separate i2c_transfer() operations. This can result in
+		 * problems if the Raydium device is on a shared I2C bus.
+		 */
+		struct i2c_msg xfer[] = {
+			{
+				.addr = client->addr,
+				.len = sizeof(header),
+				.buf = (u8 *)&header,
+			},
+			{
+				.addr = client->addr,
+				.len = 1,
+				.buf = &reg_addr,
+			},
+			{
+				.addr = client->addr,
+				.len = xfer_len,
+				.buf = data,
+				.flags = I2C_M_RD,
+			}
+		};
+
+		error = raydium_i2c_xfer(client, addr, xfer, ARRAY_SIZE(xfer));
 		if (unlikely(error))
 			return error;
 
commit 0477e92881850d44910a7e94fc2c46f96faa131f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 14:25:12 2020 -0800

    Linux 5.10-rc7

diff --git a/Makefile b/Makefile
index a2ded5029084..9ec53d947628 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 10
 SUBLEVEL = 0
-EXTRAVERSION = -rc6
+EXTRAVERSION = -rc7
 NAME = Kleptomaniac Octopus
 
 # *DOCUMENTATION*
commit ab91292cb3e9f43d9c6839d7572d17b35bc21710
Merge: d49248eb25a2 264f53b41946
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:48:17 2020 -0800

    Merge tag 'char-misc-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
    
    Pull char/misc driver fixes from Greg KH:
     "Here are some small driver fixes, and one "large" revert, for
      5.10-rc7.
    
      They include:
    
       - revert mei patch from 5.10-rc1 that was using a reserved userspace
         value. It will be resubmitted once the proper id has been assigned
         by the virtio people.
    
       - habanalabs fixes found by the fall-through audit from Gustavo
    
       - speakup driver fixes for reported issues
    
       - fpga config build fix for reported issue.
    
      All of these except the revert have been in linux-next with no
      reported issues. The revert is "clean" and just removes a
      previously-added driver, so no real issue there"
    
    * tag 'char-misc-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
      Revert "mei: virtio: virtualization frontend driver"
      fpga: Specify HAS_IOMEM dependency for FPGA_DFL
      habanalabs: put devices before driver removal
      habanalabs: free host huge va_range if not used
      speakup: Reject setting the speakup line discipline outside of speakup

commit d49248eb25a223b238cd7687ea92b080f595a323
Merge: f5226f1d20c4 c8bcd9c5be24
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:43:50 2020 -0800

    Merge tag 'tty-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
    
    Pull tty fixes from Greg KH:
     "Here are two tty core fixes for 5.10-rc7.
    
      They resolve some reported locking issues in the tty core. While they
      have not been in a released linux-next yet, they have passed all of
      the 0-day bot testing as well as the submitter's testing"
    
    * tag 'tty-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
      tty: Fix ->session locking
      tty: Fix ->pgrp locking in tiocspgrp()

commit f5226f1d20c4113922dbe7742c416f06700c1ea9
Merge: 8100a58044f8 a4b98a7512f1
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:38:36 2020 -0800

    Merge tag 'usb-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
    
    Pull USB fixes from Greg KH:
     "Here are some small USB fixes for 5.10-rc7 that resolve a number of
      reported issues, and add some new device ids.
    
      Nothing major here, but these solve some problems that people were
      having with the 5.10-rc tree:
    
       - reverts for USB storage dma settings that broke working devices
    
       - thunderbolt use-after-free fix
    
       - cdns3 driver fixes
    
       - gadget driver userspace copy fix
    
       - new device ids
    
      All of these except for the reverts have been in linux-next with no
      reported issues. The reverts are "clean" and were tested by Hans, as
      well as passing the 0-day tests"
    
    * tag 'usb-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
      usb: gadget: f_fs: Use local copy of descriptors for userspace copy
      usb: ohci-omap: Fix descriptor conversion
      Revert "usb-storage: fix sdev->host->dma_dev"
      Revert "uas: fix sdev->host->dma_dev"
      Revert "uas: bump hw_max_sectors to 2048 blocks for SS or faster drives"
      USB: serial: kl5kusb105: fix memleak on open
      USB: serial: ch341: sort device-id entries
      USB: serial: ch341: add new Product ID for CH341A
      USB: serial: option: fix Quectel BG96 matching
      usb: cdns3: core: fix goto label for error path
      usb: cdns3: gadget: clear trb->length as zero after preparing every trb
      usb: cdns3: Fix hardware based role switch
      USB: serial: option: add support for Thales Cinterion EXS82
      USB: serial: option: add Fibocom NL668 variants
      thunderbolt: Fix use-after-free in remove_unplugged_switch()

commit 8100a58044f8f502a53d90af96d6030767df0fbd
Merge: 9f6b28d498ba 84da009f06e6
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:22:39 2020 -0800

    Merge tag 'x86-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull x86 fixes from Thomas Gleixner:
     "A set of fixes for x86:
    
       - Make the AMD L3 QoS code and data priorization enable/disable
         mechanism work correctly.
    
         The control bit was only set/cleared on one of the CPUs in a L3
         domain, but it has to be modified on all CPUs in the domain. The
         initial documentation was not clear about this, but the updated one
         from Oct 2020 spells it out.
    
       - Fix an off by one in the UV platform detection code which causes
         the UV hubs to be identified wrongly.
    
         The chip revisions start at 1 not at 0.
    
       - Fix a long standing bug in the evaluation of prefixes in the
         uprobes code which fails to handle repeated prefixes properly.
    
         The aggregate size of the prefixes can be larger than the bytes
         array but the code blindly iterated over the aggregate size beyond
         the array boundary. Add a macro to handle this case properly and
         use it at the affected places"
    
    * tag 'x86-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      x86/sev-es: Use new for_each_insn_prefix() macro to loop over prefixes bytes
      x86/insn-eval: Use new for_each_insn_prefix() macro to loop over prefixes bytes
      x86/uprobes: Do not use prefixes.nbytes when looping over prefixes.bytes
      x86/platform/uv: Fix UV4 hub revision adjustment
      x86/resctrl: Fix AMD L3 QOS CDP enable/disable

commit 9f6b28d498ba084dff970ad95796642f804ffcd8
Merge: 592d9a0835c9 fc17db8aa4c5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:20:18 2020 -0800

    Merge tag 'perf-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull perf fixes from Thomas Gleixner:
     "Two fixes for performance monitoring on X86:
    
       - Add recursion protection to another callchain invoked from
         x86_pmu_stop() which can recurse back into x86_pmu_stop(). The
         first attempt to fix this missed this extra code path.
    
       - Use the already filtered status variable to check for PEBS counter
         overflow bits and not the unfiltered full status read from
         IA32_PERF_GLOBAL_STATUS which can have unrelated bits check which
         would be evaluated incorrectly"
    
    * tag 'perf-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      perf/x86/intel: Check PEBS status correctly
      perf/x86/intel: Fix a warning on x86_pmu_stop() with large PEBS

commit 592d9a0835c97f54744a7c3ce845c16735c0ab14
Merge: ff615c980357 9ea69a55b3b9
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:15:55 2020 -0800

    Merge tag 'irq-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull irq fixes from Thomas Gleixner:
     "A set of updates for the interrupt subsystem:
    
       - Make multiqueue devices which use the managed interrupt affinity
         infrastructure work on PowerPC/Pseries. PowerPC does not use the
         generic infrastructure for setting up PCI/MSI interrupts and the
         multiqueue changes failed to update the legacy PCI/MSI
         infrastructure. Make this work by passing the affinity setup
         information down to the mapping and allocation functions.
    
       - Move Jason Cooper from MAINTAINERS to CREDITS as his mail is
         bouncing and he's not reachable. We hope all is well with him and
         say thanks for his work over the years"
    
    * tag 'irq-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      powerpc/pseries: Pass MSI affinity to irq_create_mapping()
      genirq/irqdomain: Add an irq_create_mapping_affinity() function
      MAINTAINERS: Move Jason Cooper to CREDITS

commit ff615c98035729776a74f9c86c3b137ae35ac1d3
Merge: e6585a493921 4d916140bf28
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 11:11:32 2020 -0800

    Merge tag 'locking-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull intel_idle build fix from Thomas Gleixner:
     "A tiny build fix for a recent change in the intel_idle driver which
      missed a CONFIG dependency and broke the build for certain
      configurations"
    
    * tag 'locking-urgent-2020-12-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      intel_idle: Build fix

commit e6585a493921991653be1fd65c3aa3fb90b000ae
Merge: 12c0ab6658de 7d32358be8ac
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 10:31:39 2020 -0800

    Merge tag 'kbuild-fixes-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
    
    Pull Kbuild fixes from Masahiro Yamada:
    
     - Move -Wcast-align to W=3, which tends to be false-positive and there
       is no tree-wide solution.
    
     - Pass -fmacro-prefix-map to KBUILD_CPPFLAGS because it is a
       preprocessor option and makes sense for .S files as well.
    
     - Disable -gdwarf-2 for Clang's integrated assembler to avoid warnings.
    
     - Disable --orphan-handling=warn for LLD 10.0.1 to avoid warnings.
    
     - Fix undesirable line breaks in *.mod files.
    
    * tag 'kbuild-fixes-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
      kbuild: avoid split lines in .mod files
      kbuild: Disable CONFIG_LD_ORPHAN_WARN for ld.lld 10.0.1
      kbuild: Hoist '--orphan-handling' into Kconfig
      Kbuild: do not emit debug info for assembly with LLVM_IAS=1
      kbuild: use -fmacro-prefix-map for .S sources
      Makefile.extrawarn: move -Wcast-align to W=3

commit 12c0ab6658dea4709189c3730d2431c52808428e
Merge: 7059c2c00a21 309d08d9b3a3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Dec 6 10:20:59 2020 -0800

    Merge branch 'akpm' (patches from Andrew)
    
    Merge misc fixes from Andrew Morton:
     "12 patches.
    
      Subsystems affected by this patch series: mm (memcg, zsmalloc, swap,
      mailmap, selftests, pagecache, hugetlb, pagemap), lib, and coredump"
    
    * emailed patches from Andrew Morton <akpm at linux-foundation.org>:
      mm/mmap.c: fix mmap return value when vma is merged after call_mmap()
      hugetlb_cgroup: fix offline of hugetlb cgroup with reservations
      mm/filemap: add static for function __add_to_page_cache_locked
      userfaultfd: selftests: fix SIGSEGV if huge mmap fails
      tools/testing/selftests/vm: fix build error
      mailmap: add two more addresses of Uwe Kleine-König
      mm/swapfile: do not sleep with a spin lock held
      mm/zsmalloc.c: drop ZSMALLOC_PGTABLE_MAPPING
      mm: list_lru: set shrinker map bit when child nr_items is not zero
      mm: memcg/slab: fix obj_cgroup_charge() return value handling
      coredump: fix core_pattern parse error
      zlib: export S390 symbols for zlib modules

commit 309d08d9b3a3659ab3f239d27d4e38b670b08fc9
Author: Liu Zixian <liuzixian4 at huawei.com>
Date:   Sat Dec 5 22:15:15 2020 -0800

    mm/mmap.c: fix mmap return value when vma is merged after call_mmap()
    
    On success, mmap should return the begin address of newly mapped area,
    but patch "mm: mmap: merge vma after call_mmap() if possible" set
    vm_start of newly merged vma to return value addr.  Users of mmap will
    get wrong address if vma is merged after call_mmap().  We fix this by
    moving the assignment to addr before merging vma.
    
    We have a driver which changes vm_flags, and this bug is found by our
    testcases.
    
    Fixes: d70cec898324 ("mm: mmap: merge vma after call_mmap() if possible")
    Signed-off-by: Liu Zixian <liuzixian4 at huawei.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Jason Gunthorpe <jgg at nvidia.com>
    Reviewed-by: David Hildenbrand <david at redhat.com>
    Cc: Miaohe Lin <linmiaohe at huawei.com>
    Cc: Hongxiang Lou <louhongxiang at huawei.com>
    Cc: Hu Shiyuan <hushiyuan at huawei.com>
    Cc: Matthew Wilcox <willy at infradead.org>
    Link: https://lkml.kernel.org/r/20201203085350.22624-1-liuzixian4@huawei.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/mmap.c b/mm/mmap.c
index d91ecb00d38c..5c8b4485860d 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1808,6 +1808,17 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
 		if (error)
 			goto unmap_and_free_vma;
 
+		/* Can addr have changed??
+		 *
+		 * Answer: Yes, several device drivers can do it in their
+		 *         f_op->mmap method. -DaveM
+		 * Bug: If addr is changed, prev, rb_link, rb_parent should
+		 *      be updated for vma_link()
+		 */
+		WARN_ON_ONCE(addr != vma->vm_start);
+
+		addr = vma->vm_start;
+
 		/* If vm_flags changed after call_mmap(), we should try merge vma again
 		 * as we may succeed this time.
 		 */
@@ -1822,25 +1833,12 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
 				fput(vma->vm_file);
 				vm_area_free(vma);
 				vma = merge;
-				/* Update vm_flags and possible addr to pick up the change. We don't
-				 * warn here if addr changed as the vma is not linked by vma_link().
-				 */
-				addr = vma->vm_start;
+				/* Update vm_flags to pick up the change. */
 				vm_flags = vma->vm_flags;
 				goto unmap_writable;
 			}
 		}
 
-		/* Can addr have changed??
-		 *
-		 * Answer: Yes, several device drivers can do it in their
-		 *         f_op->mmap method. -DaveM
-		 * Bug: If addr is changed, prev, rb_link, rb_parent should
-		 *      be updated for vma_link()
-		 */
-		WARN_ON_ONCE(addr != vma->vm_start);
-
-		addr = vma->vm_start;
 		vm_flags = vma->vm_flags;
 	} else if (vm_flags & VM_SHARED) {
 		error = shmem_zero_setup(vma);
commit 7a5bde37983d37783161681ff7c6122dfd081791
Author: Mike Kravetz <mike.kravetz at oracle.com>
Date:   Sat Dec 5 22:15:12 2020 -0800

    hugetlb_cgroup: fix offline of hugetlb cgroup with reservations
    
    Adrian Moreno was ruuning a kubernetes 1.19 + containerd/docker workload
    using hugetlbfs.  In this environment the issue is reproduced by:
    
     - Start a simple pod that uses the recently added HugePages medium
       feature (pod yaml attached)
    
     - Start a DPDK app. It doesn't need to run successfully (as in transfer
       packets) nor interact with real hardware. It seems just initializing
       the EAL layer (which handles hugepage reservation and locking) is
       enough to trigger the issue
    
     - Delete the Pod (or let it "Complete").
    
    This would result in a kworker thread going into a tight loop (top output):
    
       1425 root      20   0       0      0      0 R  99.7   0.0   5:22.45 kworker/28:7+cgroup_destroy
    
    'perf top -g' reports:
    
      -   63.28%     0.01%  [kernel]                    [k] worker_thread
         - 49.97% worker_thread
            - 52.64% process_one_work
               - 62.08% css_killed_work_fn
                  - hugetlb_cgroup_css_offline
                       41.52% _raw_spin_lock
                     - 2.82% _cond_resched
                          rcu_all_qs
                       2.66% PageHuge
            - 0.57% schedule
               - 0.57% __schedule
    
    We are spinning in the do-while loop in hugetlb_cgroup_css_offline.
    Worse yet, we are holding the master cgroup lock (cgroup_mutex) while
    infinitely spinning.  Little else can be done on the system as the
    cgroup_mutex can not be acquired.
    
    Do note that the issue can be reproduced by simply offlining a hugetlb
    cgroup containing pages with reservation counts.
    
    The loop in hugetlb_cgroup_css_offline is moving page counts from the
    cgroup being offlined to the parent cgroup.  This is done for each
    hstate, and is repeated until hugetlb_cgroup_have_usage returns false.
    The routine moving counts (hugetlb_cgroup_move_parent) is only moving
    'usage' counts.  The routine hugetlb_cgroup_have_usage is checking for
    both 'usage' and 'reservation' counts.  Discussion about what to do with
    reservation counts when reparenting was discussed here:
    
    https://lore.kernel.org/linux-kselftest/CAHS8izMFAYTgxym-Hzb_JmkTK1N_S9tGN71uS6MFV+R7swYu5A@mail.gmail.com/
    
    The decision was made to leave a zombie cgroup for with reservation
    counts.  Unfortunately, the code checking reservation counts was
    incorrectly added to hugetlb_cgroup_have_usage.
    
    To fix the issue, simply remove the check for reservation counts.  While
    fixing this issue, a related bug in hugetlb_cgroup_css_offline was
    noticed.  The hstate index is not reinitialized each time through the
    do-while loop.  Fix this as well.
    
    Fixes: 1adc4d419aa2 ("hugetlb_cgroup: add interface for charge/uncharge hugetlb reservations")
    Reported-by: Adrian Moreno <amorenoz at redhat.com>
    Signed-off-by: Mike Kravetz <mike.kravetz at oracle.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Tested-by: Adrian Moreno <amorenoz at redhat.com>
    Reviewed-by: Shakeel Butt <shakeelb at google.com>
    Cc: Mina Almasry <almasrymina at google.com>
    Cc: David Rientjes <rientjes at google.com>
    Cc: Greg Thelen <gthelen at google.com>
    Cc: Sandipan Das <sandipan at linux.ibm.com>
    Cc: Shuah Khan <shuah at kernel.org>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201203220242.158165-1-mike.kravetz@oracle.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
index 1f87aec9ab5c..9182848dda3e 100644
--- a/mm/hugetlb_cgroup.c
+++ b/mm/hugetlb_cgroup.c
@@ -82,11 +82,8 @@ static inline bool hugetlb_cgroup_have_usage(struct hugetlb_cgroup *h_cg)
 
 	for (idx = 0; idx < hugetlb_max_hstate; idx++) {
 		if (page_counter_read(
-			    hugetlb_cgroup_counter_from_cgroup(h_cg, idx)) ||
-		    page_counter_read(hugetlb_cgroup_counter_from_cgroup_rsvd(
-			    h_cg, idx))) {
+				hugetlb_cgroup_counter_from_cgroup(h_cg, idx)))
 			return true;
-		}
 	}
 	return false;
 }
@@ -202,9 +199,10 @@ static void hugetlb_cgroup_css_offline(struct cgroup_subsys_state *css)
 	struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_css(css);
 	struct hstate *h;
 	struct page *page;
-	int idx = 0;
+	int idx;
 
 	do {
+		idx = 0;
 		for_each_hstate(h) {
 			spin_lock(&hugetlb_lock);
 			list_for_each_entry(page, &h->hugepage_activelist, lru)
commit 3351b16af4946fff0d46481d155fb91adb28b1f9
Author: Alex Shi <alex.shi at linux.alibaba.com>
Date:   Sat Dec 5 22:15:09 2020 -0800

    mm/filemap: add static for function __add_to_page_cache_locked
    
      mm/filemap.c:830:14: warning: no previous prototype for `__add_to_page_cache_locked' [-Wmissing-prototypes]
    
    Signed-off-by: Alex Shi <alex.shi at linux.alibaba.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Souptick Joarder <jrdr.linux at gmail.com>
    Link: https://lkml.kernel.org/r/1604661895-5495-1-git-send-email-alex.shi@linux.alibaba.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/filemap.c b/mm/filemap.c
index 0b2067b3c328..331f4261d723 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -827,7 +827,7 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
 }
 EXPORT_SYMBOL_GPL(replace_page_cache_page);
 
-noinline int __add_to_page_cache_locked(struct page *page,
+static noinline int __add_to_page_cache_locked(struct page *page,
 					struct address_space *mapping,
 					pgoff_t offset, gfp_t gfp,
 					void **shadowp)
commit 573a259336f8c57739bdaf035aa7abbae7d9a713
Author: Axel Rasmussen <axelrasmussen at google.com>
Date:   Sat Dec 5 22:15:05 2020 -0800

    userfaultfd: selftests: fix SIGSEGV if huge mmap fails
    
    The error handling in hugetlb_allocate_area() was incorrect for the
    hugetlb_shared test case.
    
    Previously the behavior was:
    
    - mmap a hugetlb area
      - If this fails, set the pointer to NULL, and carry on
    - mmap an alias of the same hugetlb fd
      - If this fails, munmap the original area
    
    If the original mmap failed, it's likely the second one did too.  If
    both failed, we'd blindly try to munmap a NULL pointer, causing a
    SIGSEGV.  Instead, "goto fail" so we return before trying to mmap the
    alias.
    
    This issue can be hit "in real life" by forgetting to set
    /proc/sys/vm/nr_hugepages (leaving it at 0), and then trying to run the
    hugetlb_shared test.
    
    Another small improvement is, when the original mmap fails, don't just
    print "it failed": perror(), so we can see *why*.  :)
    
    Signed-off-by: Axel Rasmussen <axelrasmussen at google.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Shuah Khan <shuah at kernel.org>
    Cc: Peter Xu <peterx at redhat.com>
    Cc: Joe Perches <joe at perches.com>
    Cc: Mike Rapoport <rppt at linux.vnet.ibm.com>
    Cc: Andrea Arcangeli <aarcange at redhat.com>
    Cc: David Alan Gilbert <dgilbert at redhat.com>
    Link: https://lkml.kernel.org/r/20201204203443.2714693-1-axelrasmussen@google.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
index 9b0912a01777..c4425597769a 100644
--- a/tools/testing/selftests/vm/userfaultfd.c
+++ b/tools/testing/selftests/vm/userfaultfd.c
@@ -206,19 +206,19 @@ static int hugetlb_release_pages(char *rel_area)
 	return ret;
 }
 
-
 static void hugetlb_allocate_area(void **alloc_area)
 {
 	void *area_alias = NULL;
 	char **alloc_area_alias;
+
 	*alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
 			   (map_shared ? MAP_SHARED : MAP_PRIVATE) |
 			   MAP_HUGETLB,
 			   huge_fd, *alloc_area == area_src ? 0 :
 			   nr_pages * page_size);
 	if (*alloc_area == MAP_FAILED) {
-		fprintf(stderr, "mmap of hugetlbfs file failed\n");
-		*alloc_area = NULL;
+		perror("mmap of hugetlbfs file failed");
+		goto fail;
 	}
 
 	if (map_shared) {
@@ -227,14 +227,11 @@ static void hugetlb_allocate_area(void **alloc_area)
 				  huge_fd, *alloc_area == area_src ? 0 :
 				  nr_pages * page_size);
 		if (area_alias == MAP_FAILED) {
-			if (munmap(*alloc_area, nr_pages * page_size) < 0) {
-				perror("hugetlb munmap");
-				exit(1);
-			}
-			*alloc_area = NULL;
-			return;
+			perror("mmap of hugetlb file alias failed");
+			goto fail_munmap;
 		}
 	}
+
 	if (*alloc_area == area_src) {
 		huge_fd_off0 = *alloc_area;
 		alloc_area_alias = &area_src_alias;
@@ -243,6 +240,16 @@ static void hugetlb_allocate_area(void **alloc_area)
 	}
 	if (area_alias)
 		*alloc_area_alias = area_alias;
+
+	return;
+
+fail_munmap:
+	if (munmap(*alloc_area, nr_pages * page_size) < 0) {
+		perror("hugetlb munmap");
+		exit(1);
+	}
+fail:
+	*alloc_area = NULL;
 }
 
 static void hugetlb_alias_mapping(__u64 *start, size_t len, unsigned long offset)
commit d8cbe8bfa7df3c680ddfd5e1eee3a5c86d8dc764
Author: Xingxing Su <suxingxing at loongson.cn>
Date:   Sat Dec 5 22:15:02 2020 -0800

    tools/testing/selftests/vm: fix build error
    
    Only x86 and PowerPC implement the pkey-xxx.h, and an error was reported
    when compiling protection_keys.c.
    
    Add a Arch judgment to compile "protection_keys" in the Makefile.
    
    If other arch implement this, add the arch name to the Makefile.
    eg:
        ifneq (,$(findstring $(ARCH),powerpc mips ... ))
    
    Following build errors:
    
        pkey-helpers.h:93:2: error: #error Architecture not supported
         #error Architecture not supported
        pkey-helpers.h:96:20: error: `PKEY_DISABLE_ACCESS' undeclared
         #define PKEY_MASK (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE)
                            ^
        protection_keys.c:218:45: error: `PKEY_DISABLE_WRITE' undeclared
         pkey_assert(flags & (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE));
                                                    ^
    
    Signed-off-by: Xingxing Su <suxingxing at loongson.cn>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Shuah Khan <shuah at kernel.org>
    Cc: Sandipan Das <sandipan at linux.ibm.com>
    Cc: John Hubbard <jhubbard at nvidia.com>
    Cc: Dave Hansen <dave.hansen at intel.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov at linux.intel.com>
    Cc: Brian Geffon <bgeffon at google.com>
    Cc: Mina Almasry <almasrymina at google.com>
    Link: https://lkml.kernel.org/r/1606826876-30656-1-git-send-email-suxingxing@loongson.cn
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile
index 30873b19d04b..691893afc15d 100644
--- a/tools/testing/selftests/vm/Makefile
+++ b/tools/testing/selftests/vm/Makefile
@@ -60,9 +60,13 @@ ifeq ($(CAN_BUILD_X86_64),1)
 TEST_GEN_FILES += $(BINARIES_64)
 endif
 else
+
+ifneq (,$(findstring $(ARCH),powerpc))
 TEST_GEN_FILES += protection_keys
 endif
 
+endif
+
 ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64))
 TEST_GEN_FILES += va_128TBswitch
 TEST_GEN_FILES += virtual_address_range
commit 4e60340c5ca560278c938726235bc0daa5fc8c7f
Author: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
Date:   Sat Dec 5 22:14:58 2020 -0800

    mailmap: add two more addresses of Uwe Kleine-König
    
    This fixes attribution for the commits (among others)
    
     - d4097456cd1d ("video/framebuffer: move the probe func into
       .devinit.text in Blackfin LCD driver")
    
     - 0312e024d6cd ("mfd: mc13xxx: Add support for mc34708")
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Link: https://lkml.kernel.org/r/20201127213358.3440830-1-u.kleine-koenig@pengutronix.de
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/.mailmap b/.mailmap
index d9fb83d67055..225546cc8028 100644
--- a/.mailmap
+++ b/.mailmap
@@ -322,6 +322,8 @@ TripleX Chung <xxx.phy at gmail.com> <zhongyu at 18mail.cn>
 Tsuneo Yoshioka <Tsuneo.Yoshioka at f-secure.com>
 Tycho Andersen <tycho at tycho.pizza> <tycho at tycho.ws>
 Uwe Kleine-König <ukleinek at informatik.uni-freiburg.de>
+Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
+Uwe Kleine-König <ukleinek at strlen.de>
 Uwe Kleine-König <ukl at pengutronix.de>
 Uwe Kleine-König <Uwe.Kleine-Koenig at digi.com>
 Valdis Kletnieks <Valdis.Kletnieks at vt.edu>
commit b11a76b37a5aa7b07c3e3eeeaae20b25475bddd3
Author: Qian Cai <qcai at redhat.com>
Date:   Sat Dec 5 22:14:55 2020 -0800

    mm/swapfile: do not sleep with a spin lock held
    
    We can't call kvfree() with a spin lock held, so defer it.  Fixes a
    might_sleep() runtime warning.
    
    Fixes: 873d7bcfd066 ("mm/swapfile.c: use kvzalloc for swap_info_struct allocation")
    Signed-off-by: Qian Cai <qcai at redhat.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Hugh Dickins <hughd at google.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201202151549.10350-1-qcai@redhat.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/swapfile.c b/mm/swapfile.c
index c4a613688a17..d58361109066 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -2867,6 +2867,7 @@ late_initcall(max_swapfiles_check);
 static struct swap_info_struct *alloc_swap_info(void)
 {
 	struct swap_info_struct *p;
+	struct swap_info_struct *defer = NULL;
 	unsigned int type;
 	int i;
 
@@ -2895,7 +2896,7 @@ static struct swap_info_struct *alloc_swap_info(void)
 		smp_wmb();
 		WRITE_ONCE(nr_swapfiles, nr_swapfiles + 1);
 	} else {
-		kvfree(p);
+		defer = p;
 		p = swap_info[type];
 		/*
 		 * Do not memset this entry: a racing procfs swap_next()
@@ -2908,6 +2909,7 @@ static struct swap_info_struct *alloc_swap_info(void)
 		plist_node_init(&p->avail_lists[i], 0);
 	p->flags = SWP_USED;
 	spin_unlock(&swap_lock);
+	kvfree(defer);
 	spin_lock_init(&p->lock);
 	spin_lock_init(&p->cont_lock);
 
commit e91d8d78237de8d7120c320b3645b7100848f24d
Author: Minchan Kim <minchan at kernel.org>
Date:   Sat Dec 5 22:14:51 2020 -0800

    mm/zsmalloc.c: drop ZSMALLOC_PGTABLE_MAPPING
    
    While I was doing zram testing, I found sometimes decompression failed
    since the compression buffer was corrupted.  With investigation, I found
    below commit calls cond_resched unconditionally so it could make a
    problem in atomic context if the task is reschedule.
    
      BUG: sleeping function called from invalid context at mm/vmalloc.c:108
      in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 946, name: memhog
      3 locks held by memhog/946:
       #0: ffff9d01d4b193e8 (&mm->mmap_lock#2){++++}-{4:4}, at: __mm_populate+0x103/0x160
       #1: ffffffffa3d53de0 (fs_reclaim){+.+.}-{0:0}, at: __alloc_pages_slowpath.constprop.0+0xa98/0x1160
       #2: ffff9d01d56b8110 (&zspage->lock){.+.+}-{3:3}, at: zs_map_object+0x8e/0x1f0
      CPU: 0 PID: 946 Comm: memhog Not tainted 5.9.3-00011-gc5bfc0287345-dirty #316
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
      Call Trace:
        unmap_kernel_range_noflush+0x2eb/0x350
        unmap_kernel_range+0x14/0x30
        zs_unmap_object+0xd5/0xe0
        zram_bvec_rw.isra.0+0x38c/0x8e0
        zram_rw_page+0x90/0x101
        bdev_write_page+0x92/0xe0
        __swap_writepage+0x94/0x4a0
        pageout+0xe3/0x3a0
        shrink_page_list+0xb94/0xd60
        shrink_inactive_list+0x158/0x460
    
    We can fix this by removing the ZSMALLOC_PGTABLE_MAPPING feature (which
    contains the offending calling code) from zsmalloc.
    
    Even though this option showed some amount improvement(e.g., 30%) in
    some arm32 platforms, it has been headache to maintain since it have
    abused APIs[1](e.g., unmap_kernel_range in atomic context).
    
    Since we are approaching to deprecate 32bit machines and already made
    the config option available for only builtin build since v5.8, lastly it
    has been not default option in zsmalloc, it's time to drop the option
    for better maintenance.
    
    [1] http://lore.kernel.org/linux-mm/20201105170249.387069-1-minchan@kernel.org
    
    Fixes: e47110e90584 ("mm/vunmap: add cond_resched() in vunmap_pmd_range")
    Signed-off-by: Minchan Kim <minchan at kernel.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky at gmail.com>
    Cc: Tony Lindgren <tony at atomide.com>
    Cc: Christoph Hellwig <hch at infradead.org>
    Cc: Harish Sriram <harish at linux.ibm.com>
    Cc: Uladzislau Rezki <urezki at gmail.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201117202916.GA3856507@google.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig
index 34793aabdb65..58df9fd79a76 100644
--- a/arch/arm/configs/omap2plus_defconfig
+++ b/arch/arm/configs/omap2plus_defconfig
@@ -81,7 +81,6 @@ CONFIG_PARTITION_ADVANCED=y
 CONFIG_BINFMT_MISC=y
 CONFIG_CMA=y
 CONFIG_ZSMALLOC=m
-CONFIG_ZSMALLOC_PGTABLE_MAPPING=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h
index 0fdbf653b173..4807ca4d52e0 100644
--- a/include/linux/zsmalloc.h
+++ b/include/linux/zsmalloc.h
@@ -20,7 +20,6 @@
  * zsmalloc mapping modes
  *
  * NOTE: These only make a difference when a mapped object spans pages.
- * They also have no effect when ZSMALLOC_PGTABLE_MAPPING is selected.
  */
 enum zs_mapmode {
 	ZS_MM_RW, /* normal read-write mapping */
diff --git a/mm/Kconfig b/mm/Kconfig
index d42423f884a7..390165ffbb0f 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -707,19 +707,6 @@ config ZSMALLOC
 	  returned by an alloc().  This handle must be mapped in order to
 	  access the allocated space.
 
-config ZSMALLOC_PGTABLE_MAPPING
-	bool "Use page table mapping to access object in zsmalloc"
-	depends on ZSMALLOC=y
-	help
-	  By default, zsmalloc uses a copy-based object mapping method to
-	  access allocations that span two pages. However, if a particular
-	  architecture (ex, ARM) performs VM mapping faster than copying,
-	  then you should select this. This causes zsmalloc to use page table
-	  mapping rather than copying for object mapping.
-
-	  You can check speed with zsmalloc benchmark:
-	  https://github.com/spartacus06/zsmapbench
-
 config ZSMALLOC_STAT
 	bool "Export zsmalloc statistics"
 	depends on ZSMALLOC
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 918c7b019b3d..cdfaaadea8ff 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -293,11 +293,7 @@ struct zspage {
 };
 
 struct mapping_area {
-#ifdef CONFIG_ZSMALLOC_PGTABLE_MAPPING
-	struct vm_struct *vm; /* vm area for mapping object that span pages */
-#else
 	char *vm_buf; /* copy buffer for objects that span pages */
-#endif
 	char *vm_addr; /* address of kmap_atomic()'ed pages */
 	enum zs_mapmode vm_mm; /* mapping mode */
 };
@@ -1113,54 +1109,6 @@ static struct zspage *find_get_zspage(struct size_class *class)
 	return zspage;
 }
 
-#ifdef CONFIG_ZSMALLOC_PGTABLE_MAPPING
-static inline int __zs_cpu_up(struct mapping_area *area)
-{
-	/*
-	 * Make sure we don't leak memory if a cpu UP notification
-	 * and zs_init() race and both call zs_cpu_up() on the same cpu
-	 */
-	if (area->vm)
-		return 0;
-	area->vm = get_vm_area(PAGE_SIZE * 2, 0);
-	if (!area->vm)
-		return -ENOMEM;
-
-	/*
-	 * Populate ptes in advance to avoid pte allocation with GFP_KERNEL
-	 * in non-preemtible context of zs_map_object.
-	 */
-	return apply_to_page_range(&init_mm, (unsigned long)area->vm->addr,
-			PAGE_SIZE * 2, NULL, NULL);
-}
-
-static inline void __zs_cpu_down(struct mapping_area *area)
-{
-	if (area->vm)
-		free_vm_area(area->vm);
-	area->vm = NULL;
-}
-
-static inline void *__zs_map_object(struct mapping_area *area,
-				struct page *pages[2], int off, int size)
-{
-	unsigned long addr = (unsigned long)area->vm->addr;
-
-	BUG_ON(map_kernel_range(addr, PAGE_SIZE * 2, PAGE_KERNEL, pages) < 0);
-	area->vm_addr = area->vm->addr;
-	return area->vm_addr + off;
-}
-
-static inline void __zs_unmap_object(struct mapping_area *area,
-				struct page *pages[2], int off, int size)
-{
-	unsigned long addr = (unsigned long)area->vm_addr;
-
-	unmap_kernel_range(addr, PAGE_SIZE * 2);
-}
-
-#else /* CONFIG_ZSMALLOC_PGTABLE_MAPPING */
-
 static inline int __zs_cpu_up(struct mapping_area *area)
 {
 	/*
@@ -1241,8 +1189,6 @@ out:
 	pagefault_enable();
 }
 
-#endif /* CONFIG_ZSMALLOC_PGTABLE_MAPPING */
-
 static int zs_cpu_prepare(unsigned int cpu)
 {
 	struct mapping_area *area;
commit 8199be001a470209f5c938570cc199abb012fe53
Author: Yang Shi <shy828301 at gmail.com>
Date:   Sat Dec 5 22:14:48 2020 -0800

    mm: list_lru: set shrinker map bit when child nr_items is not zero
    
    When investigating a slab cache bloat problem, significant amount of
    negative dentry cache was seen, but confusingly they neither got shrunk
    by reclaimer (the host has very tight memory) nor be shrunk by dropping
    cache.  The vmcore shows there are over 14M negative dentry objects on
    lru, but tracing result shows they were even not scanned at all.
    
    Further investigation shows the memcg's vfs shrinker_map bit is not set.
    So the reclaimer or dropping cache just skip calling vfs shrinker.  So
    we have to reboot the hosts to get the memory back.
    
    I didn't manage to come up with a reproducer in test environment, and
    the problem can't be reproduced after rebooting.  But it seems there is
    race between shrinker map bit clear and reparenting by code inspection.
    The hypothesis is elaborated as below.
    
    The memcg hierarchy on our production environment looks like:
    
                    root
                   /    \
              system   user
    
    The main workloads are running under user slice's children, and it
    creates and removes memcg frequently.  So reparenting happens very often
    under user slice, but no task is under user slice directly.
    
    So with the frequent reparenting and tight memory pressure, the below
    hypothetical race condition may happen:
    
           CPU A                            CPU B
    reparent
        dst->nr_items == 0
                                     shrinker:
                                         total_objects == 0
        add src->nr_items to dst
        set_bit
                                         return SHRINK_EMPTY
                                         clear_bit
    child memcg offline
        replace child's kmemcg_id with
        parent's (in memcg_offline_kmem())
                                      list_lru_del() between shrinker runs
                                         see parent's kmemcg_id
                                         dec dst->nr_items
    reparent again
        dst->nr_items may go negative
        due to concurrent list_lru_del()
    
                                     The second run of shrinker:
                                         read nr_items without any
                                         synchronization, so it may
                                         see intermediate negative
                                         nr_items then total_objects
                                         may return 0 coincidently
    
                                         keep the bit cleared
        dst->nr_items != 0
        skip set_bit
        add scr->nr_item to dst
    
    After this point dst->nr_item may never go zero, so reparenting will not
    set shrinker_map bit anymore.  And since there is no task under user
    slice directly, so no new object will be added to its lru to set the
    shrinker map bit either.  That bit is kept cleared forever.
    
    How does list_lru_del() race with reparenting? It is because reparenting
    replaces children's kmemcg_id to parent's without protecting from
    nlru->lock, so list_lru_del() may see parent's kmemcg_id but actually
    deleting items from child's lru, but dec'ing parent's nr_items, so the
    parent's nr_items may go negative as commit 2788cf0c401c ("memcg:
    reparent list_lrus and free kmemcg_id on css offline") says.
    
    Since it is impossible that dst->nr_items goes negative and
    src->nr_items goes zero at the same time, so it seems we could set the
    shrinker map bit iff src->nr_items != 0.  We could synchronize
    list_lru_count_one() and reparenting with nlru->lock, but it seems
    checking src->nr_items in reparenting is the simplest and avoids lock
    contention.
    
    Fixes: fae91d6d8be5 ("mm/list_lru.c: set bit in memcg shrinker bitmap on first list_lru item appearance")
    Suggested-by: Roman Gushchin <guro at fb.com>
    Signed-off-by: Yang Shi <shy828301 at gmail.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Roman Gushchin <guro at fb.com>
    Reviewed-by: Shakeel Butt <shakeelb at google.com>
    Acked-by: Kirill Tkhai <ktkhai at virtuozzo.com>
    Cc: Vladimir Davydov <vdavydov.dev at gmail.com>
    Cc: <stable at vger.kernel.org>    [4.19]
    Link: https://lkml.kernel.org/r/20201202171749.264354-1-shy828301@gmail.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/list_lru.c b/mm/list_lru.c
index 5aa6e44bc2ae..fe230081690b 100644
--- a/mm/list_lru.c
+++ b/mm/list_lru.c
@@ -534,7 +534,6 @@ static void memcg_drain_list_lru_node(struct list_lru *lru, int nid,
 	struct list_lru_node *nlru = &lru->node[nid];
 	int dst_idx = dst_memcg->kmemcg_id;
 	struct list_lru_one *src, *dst;
-	bool set;
 
 	/*
 	 * Since list_lru_{add,del} may be called under an IRQ-safe lock,
@@ -546,11 +545,12 @@ static void memcg_drain_list_lru_node(struct list_lru *lru, int nid,
 	dst = list_lru_from_memcg_idx(nlru, dst_idx);
 
 	list_splice_init(&src->list, &dst->list);
-	set = (!dst->nr_items && src->nr_items);
-	dst->nr_items += src->nr_items;
-	if (set)
+
+	if (src->nr_items) {
+		dst->nr_items += src->nr_items;
 		memcg_set_shrinker_bit(dst_memcg, nid, lru_shrinker_id(lru));
-	src->nr_items = 0;
+		src->nr_items = 0;
+	}
 
 	spin_unlock_irq(&nlru->lock);
 }
commit becaba65f62f88e553ec92ed98370e9d2b18e629
Author: Roman Gushchin <guro at fb.com>
Date:   Sat Dec 5 22:14:45 2020 -0800

    mm: memcg/slab: fix obj_cgroup_charge() return value handling
    
    Commit 10befea91b61 ("mm: memcg/slab: use a single set of kmem_caches
    for all allocations") introduced a regression into the handling of the
    obj_cgroup_charge() return value.  If a non-zero value is returned
    (indicating of exceeding one of memory.max limits), the allocation
    should fail, instead of falling back to non-accounted mode.
    
    To make the code more readable, move memcg_slab_pre_alloc_hook() and
    memcg_slab_post_alloc_hook() calling conditions into bodies of these
    hooks.
    
    Fixes: 10befea91b61 ("mm: memcg/slab: use a single set of kmem_caches for all allocations")
    Signed-off-by: Roman Gushchin <guro at fb.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Shakeel Butt <shakeelb at google.com>
    Cc: Johannes Weiner <hannes at cmpxchg.org>
    Cc: Michal Hocko <mhocko at kernel.org>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201127161828.GD840171@carbon.dhcp.thefacebook.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/slab.h b/mm/slab.h
index 6d7c6a5056ba..f9977d6613d6 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -274,22 +274,32 @@ static inline size_t obj_full_size(struct kmem_cache *s)
 	return s->size + sizeof(struct obj_cgroup *);
 }
 
-static inline struct obj_cgroup *memcg_slab_pre_alloc_hook(struct kmem_cache *s,
-							   size_t objects,
-							   gfp_t flags)
+/*
+ * Returns false if the allocation should fail.
+ */
+static inline bool memcg_slab_pre_alloc_hook(struct kmem_cache *s,
+					     struct obj_cgroup **objcgp,
+					     size_t objects, gfp_t flags)
 {
 	struct obj_cgroup *objcg;
 
+	if (!memcg_kmem_enabled())
+		return true;
+
+	if (!(flags & __GFP_ACCOUNT) && !(s->flags & SLAB_ACCOUNT))
+		return true;
+
 	objcg = get_obj_cgroup_from_current();
 	if (!objcg)
-		return NULL;
+		return true;
 
 	if (obj_cgroup_charge(objcg, flags, objects * obj_full_size(s))) {
 		obj_cgroup_put(objcg);
-		return NULL;
+		return false;
 	}
 
-	return objcg;
+	*objcgp = objcg;
+	return true;
 }
 
 static inline void mod_objcg_state(struct obj_cgroup *objcg,
@@ -315,7 +325,7 @@ static inline void memcg_slab_post_alloc_hook(struct kmem_cache *s,
 	unsigned long off;
 	size_t i;
 
-	if (!objcg)
+	if (!memcg_kmem_enabled() || !objcg)
 		return;
 
 	flags &= ~__GFP_ACCOUNT;
@@ -400,11 +410,11 @@ static inline void memcg_free_page_obj_cgroups(struct page *page)
 {
 }
 
-static inline struct obj_cgroup *memcg_slab_pre_alloc_hook(struct kmem_cache *s,
-							   size_t objects,
-							   gfp_t flags)
+static inline bool memcg_slab_pre_alloc_hook(struct kmem_cache *s,
+					     struct obj_cgroup **objcgp,
+					     size_t objects, gfp_t flags)
 {
-	return NULL;
+	return true;
 }
 
 static inline void memcg_slab_post_alloc_hook(struct kmem_cache *s,
@@ -508,9 +518,8 @@ static inline struct kmem_cache *slab_pre_alloc_hook(struct kmem_cache *s,
 	if (should_failslab(s, flags))
 		return NULL;
 
-	if (memcg_kmem_enabled() &&
-	    ((flags & __GFP_ACCOUNT) || (s->flags & SLAB_ACCOUNT)))
-		*objcgp = memcg_slab_pre_alloc_hook(s, size, flags);
+	if (!memcg_slab_pre_alloc_hook(s, objcgp, size, flags))
+		return NULL;
 
 	return s;
 }
@@ -529,8 +538,7 @@ static inline void slab_post_alloc_hook(struct kmem_cache *s,
 					 s->flags, flags);
 	}
 
-	if (memcg_kmem_enabled())
-		memcg_slab_post_alloc_hook(s, objcg, flags, size, p);
+	memcg_slab_post_alloc_hook(s, objcg, flags, size, p);
 }
 
 #ifndef CONFIG_SLOB
commit 2bf509d96d84c3336d08375e8af34d1b85ee71c8
Author: Menglong Dong <dong.menglong at zte.com.cn>
Date:   Sat Dec 5 22:14:42 2020 -0800

    coredump: fix core_pattern parse error
    
    'format_corename()' will splite 'core_pattern' on spaces when it is in
    pipe mode, and take helper_argv[0] as the path to usermode executable.
    It works fine in most cases.
    
    However, if there is a space between '|' and '/file/path', such as
    '| /usr/lib/systemd/systemd-coredump %P %u %g', then helper_argv[0] will
    be parsed as '', and users will get a 'Core dump to | disabled'.
    
    It is not friendly to users, as the pattern above was valid previously.
    Fix this by ignoring the spaces between '|' and '/file/path'.
    
    Fixes: 315c69261dd3 ("coredump: split pipe command whitespace before expanding template")
    Signed-off-by: Menglong Dong <dong.menglong at zte.com.cn>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Paul Wise <pabs3 at bonedaddy.net>
    Cc: Jakub Wilk <jwilk at jwilk.net> [https://bugs.debian.org/924398]
    Cc: Neil Horman <nhorman at tuxdriver.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/5fb62870.1c69fb81.8ef5d.af76@mx.google.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/coredump.c b/fs/coredump.c
index 0cd9056d79cc..c6acfc694f65 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -229,7 +229,8 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
 		 */
 		if (ispipe) {
 			if (isspace(*pat_ptr)) {
-				was_space = true;
+				if (cn->used != 0)
+					was_space = true;
 				pat_ptr++;
 				continue;
 			} else if (was_space) {
commit 11fb479ff5d9872ddff02dd533c16d60372c86b2
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Sat Dec 5 22:14:38 2020 -0800

    zlib: export S390 symbols for zlib modules
    
    Fix build errors when ZLIB_INFLATE=m and ZLIB_DEFLATE=m and ZLIB_DFLTCC=y
    by exporting the 2 needed symbols in dfltcc_inflate.c.
    
    Fixes these build errors:
    
      ERROR: modpost: "dfltcc_inflate" [lib/zlib_inflate/zlib_inflate.ko] undefined!
      ERROR: modpost: "dfltcc_can_inflate" [lib/zlib_inflate/zlib_inflate.ko] undefined!
    
    Fixes: 126196100063 ("lib/zlib: add s390 hardware support for kernel zlib_inflate")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Acked-by: Ilya Leoshkevich <iii at linux.ibm.com>
    Cc: Mikhail Zaslonko <zaslonko at linux.ibm.com>
    Cc: Heiko Carstens <hca at linux.ibm.com>
    Cc: Vasily Gorbik <gor at linux.ibm.com>
    Cc: Christian Borntraeger <borntraeger at de.ibm.com>
    Link: https://lkml.kernel.org/r/20201123191712.4882-1-rdunlap@infradead.org
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/lib/zlib_dfltcc/dfltcc_inflate.c b/lib/zlib_dfltcc/dfltcc_inflate.c
index aa9ef23474df..db107016d29b 100644
--- a/lib/zlib_dfltcc/dfltcc_inflate.c
+++ b/lib/zlib_dfltcc/dfltcc_inflate.c
@@ -4,6 +4,7 @@
 #include "dfltcc_util.h"
 #include "dfltcc.h"
 #include <asm/setup.h>
+#include <linux/export.h>
 #include <linux/zutil.h>
 
 /*
@@ -29,6 +30,7 @@ int dfltcc_can_inflate(
     return is_bit_set(dfltcc_state->af.fns, DFLTCC_XPND) &&
                is_bit_set(dfltcc_state->af.fmts, DFLTCC_FMT0);
 }
+EXPORT_SYMBOL(dfltcc_can_inflate);
 
 static int dfltcc_was_inflate_used(
     z_streamp strm
@@ -147,3 +149,4 @@ dfltcc_inflate_action dfltcc_inflate(
     return (cc == DFLTCC_CC_OP1_TOO_SHORT || cc == DFLTCC_CC_OP2_TOO_SHORT) ?
         DFLTCC_INFLATE_BREAK : DFLTCC_INFLATE_CONTINUE;
 }
+EXPORT_SYMBOL(dfltcc_inflate);
commit 7d32358be8acb119dcfe39b6cf67ec6d94bf1fe7
Author: Masahiro Yamada <masahiroy at kernel.org>
Date:   Fri Dec 4 02:55:51 2020 +0900

    kbuild: avoid split lines in .mod files
    
    "xargs echo" is not a safe way to remove line breaks because the input
    may exceed the command line limit and xargs may break it up into
    multiple invocations of echo. This should never happen because
    scripts/gen_autoksyms.sh expects all undefined symbols are placed in
    the second line of .mod files.
    
    One possible way is to replace "xargs echo" with
    "sed ':x;N;$!bx;s/\n/ /g'" or something, but I rewrote the code by
    using awk because it is more readable.
    
    This issue was reported by Sami Tolvanen; in his Clang LTO patch set,
    $(multi-used-m) is no longer an ELF object, but a thin archive that
    contains LLVM bitcode files. llvm-nm prints out symbols for each
    archive member separately, which results a lot of dupications, in some
    places, beyond the system-defined limit.
    
    This problem must be fixed irrespective of LTO, and we must ensure
    zero possibility of having this issue.
    
    Link: https://lkml.org/lkml/2020/12/1/1658
    Reported-by: Sami Tolvanen <samitolvanen at google.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>
    Reviewed-by: Sami Tolvanen <samitolvanen at google.com>

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index ae647379b579..4c058f12dd73 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -252,6 +252,9 @@ objtool_dep = $(objtool_obj)					\
 ifdef CONFIG_TRIM_UNUSED_KSYMS
 cmd_gen_ksymdeps = \
 	$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
+
+# List module undefined symbols
+undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }';
 endif
 
 define rule_cc_o_c
@@ -271,13 +274,6 @@ define rule_as_o_S
 	$(call cmd,modversions_S)
 endef
 
-# List module undefined symbols (or empty line if not enabled)
-ifdef CONFIG_TRIM_UNUSED_KSYMS
-cmd_undef_syms = $(NM) $< | sed -n 's/^  *U //p' | xargs echo
-else
-cmd_undef_syms = echo
-endif
-
 # Built-in and composite module parts
 $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
 	$(call if_changed_rule,cc_o_c)
@@ -285,7 +281,7 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
 
 cmd_mod = { \
 	echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
-	$(cmd_undef_syms); \
+	$(undefined_syms) echo; \
 	} > $@
 
 $(obj)/%.mod: $(obj)/%.o FORCE
commit 264f53b41946dcabb2b3304190839ab5670c7825
Author: Michael S. Tsirkin <mst at redhat.com>
Date:   Sat Dec 5 14:38:46 2020 -0500

    Revert "mei: virtio: virtualization frontend driver"
    
    This reverts commit d162219c655c8cf8003128a13840d6c1e183fb80.
    
    The device uses a VIRTIO device ID out of a not-for-production range.
    Releasing Linux using an ID out of this range will make it conflict with
    development setups. An official request to reserve an ID for an MEI
    device is yet to be submitted to the virtio TC, thus there's no chance
    it will be reserved and fixed in time before the next release.
    
    Once requested it usually takes 2-3 weeks to land in the spec, which
    means the device can be supported with the official ID in the next Linux
    version if contributors act quickly.
    
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Cc: Tomas Winkler <tomas.winkler at intel.com>
    Cc: Alexander Usyskin <alexander.usyskin at intel.com>
    Cc: Wang Yu <yu1.wang at intel.com>
    Cc: Liu Shuo <shuo.a.liu at intel.com>
    Link: https://lore.kernel.org/r/20201205193625.469773-1-mst@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/misc/mei/Kconfig b/drivers/misc/mei/Kconfig
index c06581ffa7bd..f5fd5b786607 100644
--- a/drivers/misc/mei/Kconfig
+++ b/drivers/misc/mei/Kconfig
@@ -46,14 +46,4 @@ config INTEL_MEI_TXE
 	  Supported SoCs:
 	  Intel Bay Trail
 
-config INTEL_MEI_VIRTIO
-	tristate "Intel MEI interface emulation with virtio framework"
-	select INTEL_MEI
-	depends on X86 && PCI && VIRTIO_PCI
-	help
-	  This module implements mei hw emulation over virtio transport.
-	  The module will be called mei_virtio.
-	  Enable this if your virtual machine supports virtual mei
-	  device over virtio.
-
 source "drivers/misc/mei/hdcp/Kconfig"
diff --git a/drivers/misc/mei/Makefile b/drivers/misc/mei/Makefile
index 52aefaab5c1b..f1c76f7ee804 100644
--- a/drivers/misc/mei/Makefile
+++ b/drivers/misc/mei/Makefile
@@ -22,9 +22,6 @@ obj-$(CONFIG_INTEL_MEI_TXE) += mei-txe.o
 mei-txe-objs := pci-txe.o
 mei-txe-objs += hw-txe.o
 
-obj-$(CONFIG_INTEL_MEI_VIRTIO) += mei-virtio.o
-mei-virtio-objs := hw-virtio.o
-
 mei-$(CONFIG_EVENT_TRACING) += mei-trace.o
 CFLAGS_mei-trace.o = -I$(src)
 
diff --git a/drivers/misc/mei/hw-virtio.c b/drivers/misc/mei/hw-virtio.c
deleted file mode 100644
index 899dc1c5e7ca..000000000000
--- a/drivers/misc/mei/hw-virtio.c
+++ /dev/null
@@ -1,874 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Intel Management Engine Interface (Intel MEI) Linux driver
- * Copyright (c) 2018-2020, Intel Corporation.
- */
-#include <linux/err.h>
-#include <linux/module.h>
-#include <linux/pm_runtime.h>
-#include <linux/scatterlist.h>
-#include <linux/spinlock.h>
-#include <linux/slab.h>
-#include <linux/virtio.h>
-#include <linux/virtio_config.h>
-#include <linux/virtio_ids.h>
-#include <linux/atomic.h>
-
-#include "mei_dev.h"
-#include "hbm.h"
-#include "client.h"
-
-#define MEI_VIRTIO_RPM_TIMEOUT 500
-/* ACRN virtio device types */
-#ifndef VIRTIO_ID_MEI
-#define VIRTIO_ID_MEI 0xFFFE /* virtio mei */
-#endif
-
-/**
- * struct mei_virtio_cfg - settings passed from the virtio backend
- * @buf_depth: read buffer depth in slots (4bytes)
- * @hw_ready: hw is ready for operation
- * @host_reset: synchronize reset with virtio backend
- * @reserved: reserved for alignment
- * @fw_status: FW status
- */
-struct mei_virtio_cfg {
-	u32 buf_depth;
-	u8 hw_ready;
-	u8 host_reset;
-	u8 reserved[2];
-	u32 fw_status[MEI_FW_STATUS_MAX];
-} __packed;
-
-struct mei_virtio_hw {
-	struct mei_device mdev;
-	char name[32];
-
-	struct virtqueue *in;
-	struct virtqueue *out;
-
-	bool host_ready;
-	struct work_struct intr_handler;
-
-	u32 *recv_buf;
-	u8 recv_rdy;
-	size_t recv_sz;
-	u32 recv_idx;
-	u32 recv_len;
-
-	/* send buffer */
-	atomic_t hbuf_ready;
-	const void *send_hdr;
-	const void *send_buf;
-
-	struct mei_virtio_cfg cfg;
-};
-
-#define to_virtio_hw(_dev) container_of(_dev, struct mei_virtio_hw, mdev)
-
-/**
- * mei_virtio_fw_status() - read status register of mei
- * @dev: mei device
- * @fw_status: fw status register values
- *
- * Return: always 0
- */
-static int mei_virtio_fw_status(struct mei_device *dev,
-				struct mei_fw_status *fw_status)
-{
-	struct virtio_device *vdev = dev_to_virtio(dev->dev);
-
-	fw_status->count = MEI_FW_STATUS_MAX;
-	virtio_cread_bytes(vdev, offsetof(struct mei_virtio_cfg, fw_status),
-			   fw_status->status, sizeof(fw_status->status));
-	return 0;
-}
-
-/**
- * mei_virtio_pg_state() - translate internal pg state
- *   to the mei power gating state
- *   There is no power management in ACRN mode always return OFF
- * @dev: mei device
- *
- * Return:
- * * MEI_PG_OFF - if aliveness is on (always)
- * * MEI_PG_ON  - (never)
- */
-static inline enum mei_pg_state mei_virtio_pg_state(struct mei_device *dev)
-{
-	return MEI_PG_OFF;
-}
-
-/**
- * mei_virtio_hw_config() - configure hw dependent settings
- *
- * @dev: mei device
- *
- * Return: always 0
- */
-static int mei_virtio_hw_config(struct mei_device *dev)
-{
-	return 0;
-}
-
-/**
- * mei_virtio_hbuf_empty_slots() - counts write empty slots.
- * @dev: the device structure
- *
- * Return: always return frontend buf size if buffer is ready, 0 otherwise
- */
-static int mei_virtio_hbuf_empty_slots(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	return (atomic_read(&hw->hbuf_ready) == 1) ? hw->cfg.buf_depth : 0;
-}
-
-/**
- * mei_virtio_hbuf_is_ready() - checks if write buffer is ready
- * @dev: the device structure
- *
- * Return: true if hbuf is ready
- */
-static bool mei_virtio_hbuf_is_ready(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	return atomic_read(&hw->hbuf_ready) == 1;
-}
-
-/**
- * mei_virtio_hbuf_max_depth() - returns depth of FE write buffer.
- * @dev: the device structure
- *
- * Return: size of frontend write buffer in bytes
- */
-static u32 mei_virtio_hbuf_depth(const struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	return hw->cfg.buf_depth;
-}
-
-/**
- * mei_virtio_intr_clear() - clear and stop interrupts
- * @dev: the device structure
- */
-static void mei_virtio_intr_clear(struct mei_device *dev)
-{
-	/*
-	 * In our virtio solution, there are two types of interrupts,
-	 * vq interrupt and config change interrupt.
-	 *   1) start/reset rely on virtio config changed interrupt;
-	 *   2) send/recv rely on virtio virtqueue interrupts.
-	 * They are all virtual interrupts. So, we don't have corresponding
-	 * operation to do here.
-	 */
-}
-
-/**
- * mei_virtio_intr_enable() - enables mei BE virtqueues callbacks
- * @dev: the device structure
- */
-static void mei_virtio_intr_enable(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	struct virtio_device *vdev = dev_to_virtio(dev->dev);
-
-	virtio_config_enable(vdev);
-
-	virtqueue_enable_cb(hw->in);
-	virtqueue_enable_cb(hw->out);
-}
-
-/**
- * mei_virtio_intr_disable() - disables mei BE virtqueues callbacks
- *
- * @dev: the device structure
- */
-static void mei_virtio_intr_disable(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	struct virtio_device *vdev = dev_to_virtio(dev->dev);
-
-	virtio_config_disable(vdev);
-
-	virtqueue_disable_cb(hw->in);
-	virtqueue_disable_cb(hw->out);
-}
-
-/**
- * mei_virtio_synchronize_irq() - wait for pending IRQ handlers for all
- *     virtqueue
- * @dev: the device structure
- */
-static void mei_virtio_synchronize_irq(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	/*
-	 * Now, all IRQ handlers are converted to workqueue.
-	 * Change synchronize irq to flush this work.
-	 */
-	flush_work(&hw->intr_handler);
-}
-
-static void mei_virtio_free_outbufs(struct mei_virtio_hw *hw)
-{
-	kfree(hw->send_hdr);
-	kfree(hw->send_buf);
-	hw->send_hdr = NULL;
-	hw->send_buf = NULL;
-}
-
-/**
- * mei_virtio_write_message() - writes a message to mei virtio back-end service.
- * @dev: the device structure
- * @hdr: mei header of message
- * @hdr_len: header length
- * @data: message payload will be written
- * @data_len: message payload length
- *
- * Return:
- * *  0: on success
- * * -EIO: if write has failed
- * * -ENOMEM: on memory allocation failure
- */
-static int mei_virtio_write_message(struct mei_device *dev,
-				    const void *hdr, size_t hdr_len,
-				    const void *data, size_t data_len)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	struct scatterlist sg[2];
-	const void *hbuf, *dbuf;
-	int ret;
-
-	if (WARN_ON(!atomic_add_unless(&hw->hbuf_ready, -1, 0)))
-		return -EIO;
-
-	hbuf = kmemdup(hdr, hdr_len, GFP_KERNEL);
-	hw->send_hdr = hbuf;
-
-	dbuf = kmemdup(data, data_len, GFP_KERNEL);
-	hw->send_buf = dbuf;
-
-	if (!hbuf || !dbuf) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	sg_init_table(sg, 2);
-	sg_set_buf(&sg[0], hbuf, hdr_len);
-	sg_set_buf(&sg[1], dbuf, data_len);
-
-	ret = virtqueue_add_outbuf(hw->out, sg, 2, hw, GFP_KERNEL);
-	if (ret) {
-		dev_err(dev->dev, "failed to add outbuf\n");
-		goto fail;
-	}
-
-	virtqueue_kick(hw->out);
-	return 0;
-fail:
-
-	mei_virtio_free_outbufs(hw);
-
-	return ret;
-}
-
-/**
- * mei_virtio_count_full_read_slots() - counts read full slots.
- * @dev: the device structure
- *
- * Return: -EOVERFLOW if overflow, otherwise filled slots count
- */
-static int mei_virtio_count_full_read_slots(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	if (hw->recv_idx > hw->recv_len)
-		return -EOVERFLOW;
-
-	return hw->recv_len - hw->recv_idx;
-}
-
-/**
- * mei_virtio_read_hdr() - Reads 32bit dword from mei virtio receive buffer
- *
- * @dev: the device structure
- *
- * Return: 32bit dword of receive buffer (u32)
- */
-static inline u32 mei_virtio_read_hdr(const struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	WARN_ON(hw->cfg.buf_depth < hw->recv_idx + 1);
-
-	return hw->recv_buf[hw->recv_idx++];
-}
-
-static int mei_virtio_read(struct mei_device *dev, unsigned char *buffer,
-			   unsigned long len)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	u32 slots = mei_data2slots(len);
-
-	if (WARN_ON(hw->cfg.buf_depth < hw->recv_idx + slots))
-		return -EOVERFLOW;
-
-	/*
-	 * Assumption: There is only one MEI message in recv_buf each time.
-	 * Backend service need follow this rule too.
-	 */
-	memcpy(buffer, hw->recv_buf + hw->recv_idx, len);
-	hw->recv_idx += slots;
-
-	return 0;
-}
-
-static bool mei_virtio_pg_is_enabled(struct mei_device *dev)
-{
-	return false;
-}
-
-static bool mei_virtio_pg_in_transition(struct mei_device *dev)
-{
-	return false;
-}
-
-static void mei_virtio_add_recv_buf(struct mei_virtio_hw *hw)
-{
-	struct scatterlist sg;
-
-	if (hw->recv_rdy) /* not needed */
-		return;
-
-	/* refill the recv_buf to IN virtqueue to get next message */
-	sg_init_one(&sg, hw->recv_buf, mei_slots2data(hw->cfg.buf_depth));
-	hw->recv_len = 0;
-	hw->recv_idx = 0;
-	hw->recv_rdy = 1;
-	virtqueue_add_inbuf(hw->in, &sg, 1, hw->recv_buf, GFP_KERNEL);
-	virtqueue_kick(hw->in);
-}
-
-/**
- * mei_virtio_hw_is_ready() - check whether the BE(hw) has turned ready
- * @dev: mei device
- * Return: bool
- */
-static bool mei_virtio_hw_is_ready(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	struct virtio_device *vdev = dev_to_virtio(dev->dev);
-
-	virtio_cread(vdev, struct mei_virtio_cfg,
-		     hw_ready, &hw->cfg.hw_ready);
-
-	dev_dbg(dev->dev, "hw ready %d\n", hw->cfg.hw_ready);
-
-	return hw->cfg.hw_ready;
-}
-
-/**
- * mei_virtio_hw_reset - resets virtio hw.
- *
- * @dev: the device structure
- * @intr_enable: virtio use data/config callbacks
- *
- * Return: 0 on success an error code otherwise
- */
-static int mei_virtio_hw_reset(struct mei_device *dev, bool intr_enable)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	struct virtio_device *vdev = dev_to_virtio(dev->dev);
-
-	dev_dbg(dev->dev, "hw reset\n");
-
-	dev->recvd_hw_ready = false;
-	hw->host_ready = false;
-	atomic_set(&hw->hbuf_ready, 0);
-	hw->recv_len = 0;
-	hw->recv_idx = 0;
-
-	hw->cfg.host_reset = 1;
-	virtio_cwrite(vdev, struct mei_virtio_cfg,
-		      host_reset, &hw->cfg.host_reset);
-
-	mei_virtio_hw_is_ready(dev);
-
-	if (intr_enable)
-		mei_virtio_intr_enable(dev);
-
-	return 0;
-}
-
-/**
- * mei_virtio_hw_reset_release() - release device from the reset
- * @dev: the device structure
- */
-static void mei_virtio_hw_reset_release(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	struct virtio_device *vdev = dev_to_virtio(dev->dev);
-
-	dev_dbg(dev->dev, "hw reset release\n");
-	hw->cfg.host_reset = 0;
-	virtio_cwrite(vdev, struct mei_virtio_cfg,
-		      host_reset, &hw->cfg.host_reset);
-}
-
-/**
- * mei_virtio_hw_ready_wait() - wait until the virtio(hw) has turned ready
- *  or timeout is reached
- * @dev: mei device
- *
- * Return: 0 on success, error otherwise
- */
-static int mei_virtio_hw_ready_wait(struct mei_device *dev)
-{
-	mutex_unlock(&dev->device_lock);
-	wait_event_timeout(dev->wait_hw_ready,
-			   dev->recvd_hw_ready,
-			   mei_secs_to_jiffies(MEI_HW_READY_TIMEOUT));
-	mutex_lock(&dev->device_lock);
-	if (!dev->recvd_hw_ready) {
-		dev_err(dev->dev, "wait hw ready failed\n");
-		return -ETIMEDOUT;
-	}
-
-	dev->recvd_hw_ready = false;
-	return 0;
-}
-
-/**
- * mei_virtio_hw_start() - hw start routine
- * @dev: mei device
- *
- * Return: 0 on success, error otherwise
- */
-static int mei_virtio_hw_start(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-	int ret;
-
-	dev_dbg(dev->dev, "hw start\n");
-	mei_virtio_hw_reset_release(dev);
-
-	ret = mei_virtio_hw_ready_wait(dev);
-	if (ret)
-		return ret;
-
-	mei_virtio_add_recv_buf(hw);
-	atomic_set(&hw->hbuf_ready, 1);
-	dev_dbg(dev->dev, "hw is ready\n");
-	hw->host_ready = true;
-
-	return 0;
-}
-
-/**
- * mei_virtio_host_is_ready() - check whether the FE has turned ready
- * @dev: mei device
- *
- * Return: bool
- */
-static bool mei_virtio_host_is_ready(struct mei_device *dev)
-{
-	struct mei_virtio_hw *hw = to_virtio_hw(dev);
-
-	dev_dbg(dev->dev, "host ready %d\n", hw->host_ready);
-
-	return hw->host_ready;
-}
-
-/**
- * mei_virtio_data_in() - The callback of recv virtqueue of virtio mei
- * @vq: receiving virtqueue
- */
-static void mei_virtio_data_in(struct virtqueue *vq)
-{
-	struct mei_virtio_hw *hw = vq->vdev->priv;
-
-	/* disable interrupts (enabled again from in the interrupt worker) */
-	virtqueue_disable_cb(hw->in);
-
-	schedule_work(&hw->intr_handler);
-}
-
-/**
- * mei_virtio_data_out() - The callback of send virtqueue of virtio mei
- * @vq: transmitting virtqueue
- */
-static void mei_virtio_data_out(struct virtqueue *vq)
-{
-	struct mei_virtio_hw *hw = vq->vdev->priv;
-
-	schedule_work(&hw->intr_handler);
-}
-
-static void mei_virtio_intr_handler(struct work_struct *work)
-{
-	struct mei_virtio_hw *hw =
-		container_of(work, struct mei_virtio_hw, intr_handler);
-	struct mei_device *dev = &hw->mdev;
-	LIST_HEAD(complete_list);
-	s32 slots;
-	int rets = 0;
-	void *data;
-	unsigned int len;
-
-	mutex_lock(&dev->device_lock);
-
-	if (dev->dev_state == MEI_DEV_DISABLED) {
-		dev_warn(dev->dev, "Interrupt in disabled state.\n");
-		mei_virtio_intr_disable(dev);
-		goto end;
-	}
-
-	/* check if ME wants a reset */
-	if (!mei_hw_is_ready(dev) && dev->dev_state != MEI_DEV_RESETTING) {
-		dev_warn(dev->dev, "BE service not ready: resetting.\n");
-		schedule_work(&dev->reset_work);
-		goto end;
-	}
-
-	/* check if we need to start the dev */
-	if (!mei_host_is_ready(dev)) {
-		if (mei_hw_is_ready(dev)) {
-			dev_dbg(dev->dev, "we need to start the dev.\n");
-			dev->recvd_hw_ready = true;
-			wake_up(&dev->wait_hw_ready);
-		} else {
-			dev_warn(dev->dev, "Spurious Interrupt\n");
-		}
-		goto end;
-	}
-
-	/* read */
-	if (hw->recv_rdy) {
-		data = virtqueue_get_buf(hw->in, &len);
-		if (!data || !len) {
-			dev_dbg(dev->dev, "No data %d", len);
-		} else {
-			dev_dbg(dev->dev, "data_in %d\n", len);
-			WARN_ON(data != hw->recv_buf);
-			hw->recv_len = mei_data2slots(len);
-			hw->recv_rdy = 0;
-		}
-	}
-
-	/* write */
-	if (!atomic_read(&hw->hbuf_ready)) {
-		if (!virtqueue_get_buf(hw->out, &len)) {
-			dev_warn(dev->dev, "Failed to getbuf\n");
-		} else {
-			mei_virtio_free_outbufs(hw);
-			atomic_inc(&hw->hbuf_ready);
-		}
-	}
-
-	/* check slots available for reading */
-	slots = mei_count_full_read_slots(dev);
-	while (slots > 0) {
-		dev_dbg(dev->dev, "slots to read = %08x\n", slots);
-		rets = mei_irq_read_handler(dev, &complete_list, &slots);
-
-		if (rets &&
-		    (dev->dev_state != MEI_DEV_RESETTING &&
-		     dev->dev_state != MEI_DEV_POWER_DOWN)) {
-			dev_err(dev->dev, "mei_irq_read_handler ret = %d.\n",
-				rets);
-			schedule_work(&dev->reset_work);
-			goto end;
-		}
-	}
-
-	dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
-
-	mei_irq_write_handler(dev, &complete_list);
-
-	dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
-
-	mei_irq_compl_handler(dev, &complete_list);
-
-	mei_virtio_add_recv_buf(hw);
-
-end:
-	if (dev->dev_state != MEI_DEV_DISABLED) {
-		if (!virtqueue_enable_cb(hw->in))
-			schedule_work(&hw->intr_handler);
-	}
-
-	mutex_unlock(&dev->device_lock);
-}
-
-static void mei_virtio_config_changed(struct virtio_device *vdev)
-{
-	struct mei_virtio_hw *hw = vdev->priv;
-	struct mei_device *dev = &hw->mdev;
-
-	virtio_cread(vdev, struct mei_virtio_cfg,
-		     hw_ready, &hw->cfg.hw_ready);
-
-	if (dev->dev_state == MEI_DEV_DISABLED) {
-		dev_dbg(dev->dev, "disabled state don't start\n");
-		return;
-	}
-
-	/* Run intr handler once to handle reset notify */
-	schedule_work(&hw->intr_handler);
-}
-
-static void mei_virtio_remove_vqs(struct virtio_device *vdev)
-{
-	struct mei_virtio_hw *hw = vdev->priv;
-
-	virtqueue_detach_unused_buf(hw->in);
-	hw->recv_len = 0;
-	hw->recv_idx = 0;
-	hw->recv_rdy = 0;
-
-	virtqueue_detach_unused_buf(hw->out);
-
-	mei_virtio_free_outbufs(hw);
-
-	vdev->config->del_vqs(vdev);
-}
-
-/*
- * There are two virtqueues, one is for send and another is for recv.
- */
-static int mei_virtio_init_vqs(struct mei_virtio_hw *hw,
-			       struct virtio_device *vdev)
-{
-	struct virtqueue *vqs[2];
-
-	vq_callback_t *cbs[] = {
-		mei_virtio_data_in,
-		mei_virtio_data_out,
-	};
-	static const char * const names[] = {
-		"in",
-		"out",
-	};
-	int ret;
-
-	ret = virtio_find_vqs(vdev, 2, vqs, cbs, names, NULL);
-	if (ret)
-		return ret;
-
-	hw->in = vqs[0];
-	hw->out = vqs[1];
-
-	return 0;
-}
-
-static const struct mei_hw_ops mei_virtio_ops = {
-	.fw_status = mei_virtio_fw_status,
-	.pg_state  = mei_virtio_pg_state,
-
-	.host_is_ready = mei_virtio_host_is_ready,
-
-	.hw_is_ready = mei_virtio_hw_is_ready,
-	.hw_reset = mei_virtio_hw_reset,
-	.hw_config = mei_virtio_hw_config,
-	.hw_start = mei_virtio_hw_start,
-
-	.pg_in_transition = mei_virtio_pg_in_transition,
-	.pg_is_enabled = mei_virtio_pg_is_enabled,
-
-	.intr_clear = mei_virtio_intr_clear,
-	.intr_enable = mei_virtio_intr_enable,
-	.intr_disable = mei_virtio_intr_disable,
-	.synchronize_irq = mei_virtio_synchronize_irq,
-
-	.hbuf_free_slots = mei_virtio_hbuf_empty_slots,
-	.hbuf_is_ready = mei_virtio_hbuf_is_ready,
-	.hbuf_depth = mei_virtio_hbuf_depth,
-
-	.write = mei_virtio_write_message,
-
-	.rdbuf_full_slots = mei_virtio_count_full_read_slots,
-	.read_hdr = mei_virtio_read_hdr,
-	.read = mei_virtio_read,
-};
-
-static int mei_virtio_probe(struct virtio_device *vdev)
-{
-	struct mei_virtio_hw *hw;
-	int ret;
-
-	hw = devm_kzalloc(&vdev->dev, sizeof(*hw), GFP_KERNEL);
-	if (!hw)
-		return -ENOMEM;
-
-	vdev->priv = hw;
-
-	INIT_WORK(&hw->intr_handler, mei_virtio_intr_handler);
-
-	ret = mei_virtio_init_vqs(hw, vdev);
-	if (ret)
-		goto vqs_failed;
-
-	virtio_cread(vdev, struct mei_virtio_cfg,
-		     buf_depth, &hw->cfg.buf_depth);
-
-	hw->recv_buf = kzalloc(mei_slots2data(hw->cfg.buf_depth), GFP_KERNEL);
-	if (!hw->recv_buf) {
-		ret = -ENOMEM;
-		goto hbuf_failed;
-	}
-	atomic_set(&hw->hbuf_ready, 0);
-
-	virtio_device_ready(vdev);
-
-	mei_device_init(&hw->mdev, &vdev->dev, &mei_virtio_ops);
-
-	pm_runtime_get_noresume(&vdev->dev);
-	pm_runtime_set_active(&vdev->dev);
-	pm_runtime_enable(&vdev->dev);
-
-	ret = mei_start(&hw->mdev);
-	if (ret)
-		goto mei_start_failed;
-
-	pm_runtime_set_autosuspend_delay(&vdev->dev, MEI_VIRTIO_RPM_TIMEOUT);
-	pm_runtime_use_autosuspend(&vdev->dev);
-
-	ret = mei_register(&hw->mdev, &vdev->dev);
-	if (ret)
-		goto mei_failed;
-
-	pm_runtime_put(&vdev->dev);
-
-	return 0;
-
-mei_failed:
-	mei_stop(&hw->mdev);
-mei_start_failed:
-	mei_cancel_work(&hw->mdev);
-	mei_disable_interrupts(&hw->mdev);
-	kfree(hw->recv_buf);
-hbuf_failed:
-	vdev->config->del_vqs(vdev);
-vqs_failed:
-	return ret;
-}
-
-static int __maybe_unused mei_virtio_pm_runtime_idle(struct device *device)
-{
-	struct virtio_device *vdev = dev_to_virtio(device);
-	struct mei_virtio_hw *hw = vdev->priv;
-
-	dev_dbg(&vdev->dev, "rpm: mei_virtio : runtime_idle\n");
-
-	if (!hw)
-		return -ENODEV;
-
-	if (mei_write_is_idle(&hw->mdev))
-		pm_runtime_autosuspend(device);
-
-	return -EBUSY;
-}
-
-static int __maybe_unused mei_virtio_pm_runtime_suspend(struct device *device)
-{
-	return 0;
-}
-
-static int __maybe_unused mei_virtio_pm_runtime_resume(struct device *device)
-{
-	return 0;
-}
-
-static int __maybe_unused mei_virtio_freeze(struct virtio_device *vdev)
-{
-	struct mei_virtio_hw *hw = vdev->priv;
-
-	dev_dbg(&vdev->dev, "freeze\n");
-
-	if (!hw)
-		return -ENODEV;
-
-	mei_stop(&hw->mdev);
-	mei_disable_interrupts(&hw->mdev);
-	cancel_work_sync(&hw->intr_handler);
-	vdev->config->reset(vdev);
-	mei_virtio_remove_vqs(vdev);
-
-	return 0;
-}
-
-static int __maybe_unused mei_virtio_restore(struct virtio_device *vdev)
-{
-	struct mei_virtio_hw *hw = vdev->priv;
-	int ret;
-
-	dev_dbg(&vdev->dev, "restore\n");
-
-	if (!hw)
-		return -ENODEV;
-
-	ret = mei_virtio_init_vqs(hw, vdev);
-	if (ret)
-		return ret;
-
-	virtio_device_ready(vdev);
-
-	ret = mei_restart(&hw->mdev);
-	if (ret)
-		return ret;
-
-	/* Start timer if stopped in suspend */
-	schedule_delayed_work(&hw->mdev.timer_work, HZ);
-
-	return 0;
-}
-
-static const struct dev_pm_ops mei_virtio_pm_ops = {
-	SET_RUNTIME_PM_OPS(mei_virtio_pm_runtime_suspend,
-			   mei_virtio_pm_runtime_resume,
-			   mei_virtio_pm_runtime_idle)
-};
-
-static void mei_virtio_remove(struct virtio_device *vdev)
-{
-	struct mei_virtio_hw *hw = vdev->priv;
-
-	mei_stop(&hw->mdev);
-	mei_disable_interrupts(&hw->mdev);
-	cancel_work_sync(&hw->intr_handler);
-	mei_deregister(&hw->mdev);
-	vdev->config->reset(vdev);
-	mei_virtio_remove_vqs(vdev);
-	kfree(hw->recv_buf);
-	pm_runtime_disable(&vdev->dev);
-}
-
-static struct virtio_device_id id_table[] = {
-	{ VIRTIO_ID_MEI, VIRTIO_DEV_ANY_ID },
-	{ }
-};
-
-static struct virtio_driver mei_virtio_driver = {
-	.id_table = id_table,
-	.probe = mei_virtio_probe,
-	.remove = mei_virtio_remove,
-	.config_changed = mei_virtio_config_changed,
-	.driver = {
-		.name = KBUILD_MODNAME,
-		.owner = THIS_MODULE,
-		.pm = &mei_virtio_pm_ops,
-	},
-#ifdef CONFIG_PM_SLEEP
-	.freeze = mei_virtio_freeze,
-	.restore = mei_virtio_restore,
-#endif
-};
-
-module_virtio_driver(mei_virtio_driver);
-MODULE_DEVICE_TABLE(virtio, id_table);
-MODULE_DESCRIPTION("Virtio MEI frontend driver");
-MODULE_LICENSE("GPL v2");
commit 84da009f06e60cf59d5e861f8e2101d2d3885517
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Dec 3 13:51:01 2020 +0900

    x86/sev-es: Use new for_each_insn_prefix() macro to loop over prefixes bytes
    
    Since insn.prefixes.nbytes can be bigger than the size of
    insn.prefixes.bytes[] when a prefix is repeated, the proper
    check must be:
    
      insn.prefixes.bytes[i] != 0 and i < 4
    
    instead of using insn.prefixes.nbytes. Use the new
    for_each_insn_prefix() macro which does it correctly.
    
    Debugged by Kees Cook <keescook at chromium.org>.
    
     [ bp: Massage commit message. ]
    
    Fixes: 25189d08e516 ("x86/sev-es: Add support for handling IOIO exceptions")
    Reported-by: syzbot+9b64b619f10f19d19a7c at syzkaller.appspotmail.com
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Link: https://lkml.kernel.org/r/160697106089.3146288.2052422845039649176.stgit@devnote2

diff --git a/arch/x86/boot/compressed/sev-es.c b/arch/x86/boot/compressed/sev-es.c
index 954cb2702e23..27826c265aab 100644
--- a/arch/x86/boot/compressed/sev-es.c
+++ b/arch/x86/boot/compressed/sev-es.c
@@ -32,13 +32,12 @@ struct ghcb *boot_ghcb;
  */
 static bool insn_has_rep_prefix(struct insn *insn)
 {
+	insn_byte_t p;
 	int i;
 
 	insn_get_prefixes(insn);
 
-	for (i = 0; i < insn->prefixes.nbytes; i++) {
-		insn_byte_t p = insn->prefixes.bytes[i];
-
+	for_each_insn_prefix(insn, i, p) {
 		if (p == 0xf2 || p == 0xf3)
 			return true;
 	}
commit 12cb908a11b2544b5f53e9af856e6b6a90ed5533
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Dec 3 13:50:50 2020 +0900

    x86/insn-eval: Use new for_each_insn_prefix() macro to loop over prefixes bytes
    
    Since insn.prefixes.nbytes can be bigger than the size of
    insn.prefixes.bytes[] when a prefix is repeated, the proper check must
    be
    
      insn.prefixes.bytes[i] != 0 and i < 4
    
    instead of using insn.prefixes.nbytes. Use the new
    for_each_insn_prefix() macro which does it correctly.
    
    Debugged by Kees Cook <keescook at chromium.org>.
    
     [ bp: Massage commit message. ]
    
    Fixes: 32d0b95300db ("x86/insn-eval: Add utility functions to get segment selector")
    Reported-by: syzbot+9b64b619f10f19d19a7c at syzkaller.appspotmail.com
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Cc: stable at vger.kernel.org
    Link: https://lkml.kernel.org/r/160697104969.3146288.16329307586428270032.stgit@devnote2

diff --git a/arch/x86/lib/insn-eval.c b/arch/x86/lib/insn-eval.c
index 58f7fb95c7f4..4229950a5d78 100644
--- a/arch/x86/lib/insn-eval.c
+++ b/arch/x86/lib/insn-eval.c
@@ -63,13 +63,12 @@ static bool is_string_insn(struct insn *insn)
  */
 bool insn_has_rep_prefix(struct insn *insn)
 {
+	insn_byte_t p;
 	int i;
 
 	insn_get_prefixes(insn);
 
-	for (i = 0; i < insn->prefixes.nbytes; i++) {
-		insn_byte_t p = insn->prefixes.bytes[i];
-
+	for_each_insn_prefix(insn, i, p) {
 		if (p == 0xf2 || p == 0xf3)
 			return true;
 	}
@@ -95,14 +94,15 @@ static int get_seg_reg_override_idx(struct insn *insn)
 {
 	int idx = INAT_SEG_REG_DEFAULT;
 	int num_overrides = 0, i;
+	insn_byte_t p;
 
 	insn_get_prefixes(insn);
 
 	/* Look for any segment override prefixes. */
-	for (i = 0; i < insn->prefixes.nbytes; i++) {
+	for_each_insn_prefix(insn, i, p) {
 		insn_attr_t attr;
 
-		attr = inat_get_opcode_attribute(insn->prefixes.bytes[i]);
+		attr = inat_get_opcode_attribute(p);
 		switch (attr) {
 		case INAT_MAKE_PREFIX(INAT_PFX_CS):
 			idx = INAT_SEG_REG_CS;
commit 4e9a5ae8df5b3365183150f6df49e49dece80d8c
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Dec 3 13:50:37 2020 +0900

    x86/uprobes: Do not use prefixes.nbytes when looping over prefixes.bytes
    
    Since insn.prefixes.nbytes can be bigger than the size of
    insn.prefixes.bytes[] when a prefix is repeated, the proper check must
    be
    
      insn.prefixes.bytes[i] != 0 and i < 4
    
    instead of using insn.prefixes.nbytes.
    
    Introduce a for_each_insn_prefix() macro for this purpose. Debugged by
    Kees Cook <keescook at chromium.org>.
    
     [ bp: Massage commit message, sync with the respective header in tools/
       and drop "we". ]
    
    Fixes: 2b1444983508 ("uprobes, mm, x86: Add the ability to install and remove uprobes breakpoints")
    Reported-by: syzbot+9b64b619f10f19d19a7c at syzkaller.appspotmail.com
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Srikar Dronamraju <srikar at linux.vnet.ibm.com>
    Cc: stable at vger.kernel.org
    Link: https://lkml.kernel.org/r/160697103739.3146288.7437620795200799020.stgit@devnote2

diff --git a/arch/x86/include/asm/insn.h b/arch/x86/include/asm/insn.h
index 5c1ae3eff9d4..a8c3d284fa46 100644
--- a/arch/x86/include/asm/insn.h
+++ b/arch/x86/include/asm/insn.h
@@ -201,6 +201,21 @@ static inline int insn_offset_immediate(struct insn *insn)
 	return insn_offset_displacement(insn) + insn->displacement.nbytes;
 }
 
+/**
+ * for_each_insn_prefix() -- Iterate prefixes in the instruction
+ * @insn: Pointer to struct insn.
+ * @idx:  Index storage.
+ * @prefix: Prefix byte.
+ *
+ * Iterate prefix bytes of given @insn. Each prefix byte is stored in @prefix
+ * and the index is stored in @idx (note that this @idx is just for a cursor,
+ * do not change it.)
+ * Since prefixes.nbytes can be bigger than 4 if some prefixes
+ * are repeated, it cannot be used for looping over the prefixes.
+ */
+#define for_each_insn_prefix(insn, idx, prefix)	\
+	for (idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++)
+
 #define POP_SS_OPCODE 0x1f
 #define MOV_SREG_OPCODE 0x8e
 
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
index 3fdaa042823d..138bdb1fd136 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -255,12 +255,13 @@ static volatile u32 good_2byte_insns[256 / 32] = {
 
 static bool is_prefix_bad(struct insn *insn)
 {
+	insn_byte_t p;
 	int i;
 
-	for (i = 0; i < insn->prefixes.nbytes; i++) {
+	for_each_insn_prefix(insn, i, p) {
 		insn_attr_t attr;
 
-		attr = inat_get_opcode_attribute(insn->prefixes.bytes[i]);
+		attr = inat_get_opcode_attribute(p);
 		switch (attr) {
 		case INAT_MAKE_PREFIX(INAT_PFX_ES):
 		case INAT_MAKE_PREFIX(INAT_PFX_CS):
@@ -715,6 +716,7 @@ static const struct uprobe_xol_ops push_xol_ops = {
 static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
 {
 	u8 opc1 = OPCODE1(insn);
+	insn_byte_t p;
 	int i;
 
 	switch (opc1) {
@@ -746,8 +748,8 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
 	 * Intel and AMD behavior differ in 64-bit mode: Intel ignores 66 prefix.
 	 * No one uses these insns, reject any branch insns with such prefix.
 	 */
-	for (i = 0; i < insn->prefixes.nbytes; i++) {
-		if (insn->prefixes.bytes[i] == 0x66)
+	for_each_insn_prefix(insn, i, p) {
+		if (p == 0x66)
 			return -ENOTSUPP;
 	}
 
diff --git a/tools/arch/x86/include/asm/insn.h b/tools/arch/x86/include/asm/insn.h
index 568854b14d0a..52c6262e6bfd 100644
--- a/tools/arch/x86/include/asm/insn.h
+++ b/tools/arch/x86/include/asm/insn.h
@@ -201,6 +201,21 @@ static inline int insn_offset_immediate(struct insn *insn)
 	return insn_offset_displacement(insn) + insn->displacement.nbytes;
 }
 
+/**
+ * for_each_insn_prefix() -- Iterate prefixes in the instruction
+ * @insn: Pointer to struct insn.
+ * @idx:  Index storage.
+ * @prefix: Prefix byte.
+ *
+ * Iterate prefix bytes of given @insn. Each prefix byte is stored in @prefix
+ * and the index is stored in @idx (note that this @idx is just for a cursor,
+ * do not change it.)
+ * Since prefixes.nbytes can be bigger than 4 if some prefixes
+ * are repeated, it cannot be used for looping over the prefixes.
+ */
+#define for_each_insn_prefix(insn, idx, prefix)	\
+	for (idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++)
+
 #define POP_SS_OPCODE 0x1f
 #define MOV_SREG_OPCODE 0x8e
 
commit 7059c2c00a2196865c2139083cbef47cd18109b6
Merge: 33256ce19411 8c3b55a299c3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 16:16:34 2020 -0800

    Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
    
    Pull input fixes from Dmitry Torokhov:
     "A fix for 'RETRIGEN' handling in Atmel touch controllers that was
      causing lost interrupts on systems using edge-triggered interrupts, a
      quirk for i8042 driver, and a couple more fixes."
    
    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
      Input: atmel_mxt_ts - fix lost interrupts
      Input: xpad - support Ardwiino Controllers
      Input: i8042 - add ByteSpeed touchpad to noloop table
      Input: i8042 - fix error return code in i8042_setup_aux()
      Input: soc_button_array - add missing include

commit edd2410b165e2ef00b2264ae362edf7441ca929c
Author: Vladimir Oltean <vladimir.oltean at nxp.com>
Date:   Fri Dec 4 19:54:16 2020 +0200

    net: mscc: ocelot: fix dropping of unknown IPv4 multicast on Seville
    
    The current assumption is that the felix DSA driver has flooding knobs
    per traffic class, while ocelot switchdev has a single flooding knob.
    This was correct for felix VSC9959 and ocelot VSC7514, but with the
    introduction of seville VSC9953, we see a switch driven by felix.c which
    has a single flooding knob.
    
    So it is clear that we must do what should have been done from the
    beginning, which is not to overwrite the configuration done by ocelot.c
    in felix, but instead to teach the common ocelot library about the
    differences in our switches, and set up the flooding PGIDs centrally.
    
    The effect that the bogus iteration through FELIX_NUM_TC has upon
    seville is quite dramatic. ANA_FLOODING is located at 0x00b548, and
    ANA_FLOODING_IPMC is located at 0x00b54c. So the bogus iteration will
    actually overwrite ANA_FLOODING_IPMC when attempting to write
    ANA_FLOODING[1]. There is no ANA_FLOODING[1] in sevile, just ANA_FLOODING.
    
    And when ANA_FLOODING_IPMC is overwritten with a bogus value, the effect
    is that ANA_FLOODING_IPMC gets the value of 0x0003CF7D:
            MC6_DATA = 61,
            MC6_CTRL = 61,
            MC4_DATA = 60,
            MC4_CTRL = 0.
    Because MC4_CTRL is zero, this means that IPv4 multicast control packets
    are not flooded, but dropped. An invalid configuration, and this is how
    the issue was actually spotted.
    
    Reported-by: Eldar Gasanov <eldargasanov2 at gmail.com>
    Reported-by: Maxim Kochetkov <fido_max at inbox.ru>
    Tested-by: Eldar Gasanov <eldargasanov2 at gmail.com>
    Fixes: 84705fc16552 ("net: dsa: felix: introduce support for Seville VSC9953 switch")
    Fixes: 3c7b51bd39b2 ("net: dsa: felix: allow flooding for all traffic classes")
    Signed-off-by: Vladimir Oltean <vladimir.oltean at nxp.com>
    Reviewed-by: Alexandre Belloni <alexandre.belloni at bootlin.com>
    Link: https://lore.kernel.org/r/20201204175416.1445937-1-vladimir.oltean@nxp.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c
index f791860d495f..c444ef3da3e2 100644
--- a/drivers/net/dsa/ocelot/felix.c
+++ b/drivers/net/dsa/ocelot/felix.c
@@ -569,7 +569,6 @@ static int felix_setup(struct dsa_switch *ds)
 	struct ocelot *ocelot = ds->priv;
 	struct felix *felix = ocelot_to_felix(ocelot);
 	int port, err;
-	int tc;
 
 	err = felix_init_structs(felix, ds->num_ports);
 	if (err)
@@ -608,12 +607,6 @@ static int felix_setup(struct dsa_switch *ds)
 	ocelot_write_rix(ocelot,
 			 ANA_PGID_PGID_PGID(GENMASK(ocelot->num_phys_ports, 0)),
 			 ANA_PGID_PGID, PGID_UC);
-	/* Setup the per-traffic class flooding PGIDs */
-	for (tc = 0; tc < FELIX_NUM_TC; tc++)
-		ocelot_write_rix(ocelot, ANA_FLOODING_FLD_MULTICAST(PGID_MC) |
-				 ANA_FLOODING_FLD_BROADCAST(PGID_MC) |
-				 ANA_FLOODING_FLD_UNICAST(PGID_UC),
-				 ANA_FLOODING, tc);
 
 	ds->mtu_enforcement_ingress = true;
 	ds->configure_vlan_while_not_filtering = true;
diff --git a/drivers/net/dsa/ocelot/felix_vsc9959.c b/drivers/net/dsa/ocelot/felix_vsc9959.c
index 3e925b8d5306..2e5bbdca5ea4 100644
--- a/drivers/net/dsa/ocelot/felix_vsc9959.c
+++ b/drivers/net/dsa/ocelot/felix_vsc9959.c
@@ -1429,6 +1429,7 @@ static int felix_pci_probe(struct pci_dev *pdev,
 	pci_set_drvdata(pdev, felix);
 	ocelot = &felix->ocelot;
 	ocelot->dev = &pdev->dev;
+	ocelot->num_flooding_pgids = FELIX_NUM_TC;
 	felix->info = &felix_info_vsc9959;
 	felix->switch_base = pci_resource_start(pdev,
 						felix->info->switch_pci_bar);
diff --git a/drivers/net/dsa/ocelot/seville_vsc9953.c b/drivers/net/dsa/ocelot/seville_vsc9953.c
index 1d420c4a2f0f..ebbaf6817ec8 100644
--- a/drivers/net/dsa/ocelot/seville_vsc9953.c
+++ b/drivers/net/dsa/ocelot/seville_vsc9953.c
@@ -1210,6 +1210,7 @@ static int seville_probe(struct platform_device *pdev)
 
 	ocelot = &felix->ocelot;
 	ocelot->dev = &pdev->dev;
+	ocelot->num_flooding_pgids = 1;
 	felix->info = &seville_info_vsc9953;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c
index 70bf8c67d7ef..a53bd36b11c6 100644
--- a/drivers/net/ethernet/mscc/ocelot.c
+++ b/drivers/net/ethernet/mscc/ocelot.c
@@ -1489,10 +1489,11 @@ int ocelot_init(struct ocelot *ocelot)
 		     SYS_FRM_AGING_MAX_AGE(307692), SYS_FRM_AGING);
 
 	/* Setup flooding PGIDs */
-	ocelot_write_rix(ocelot, ANA_FLOODING_FLD_MULTICAST(PGID_MC) |
-			 ANA_FLOODING_FLD_BROADCAST(PGID_MC) |
-			 ANA_FLOODING_FLD_UNICAST(PGID_UC),
-			 ANA_FLOODING, 0);
+	for (i = 0; i < ocelot->num_flooding_pgids; i++)
+		ocelot_write_rix(ocelot, ANA_FLOODING_FLD_MULTICAST(PGID_MC) |
+				 ANA_FLOODING_FLD_BROADCAST(PGID_MC) |
+				 ANA_FLOODING_FLD_UNICAST(PGID_UC),
+				 ANA_FLOODING, i);
 	ocelot_write(ocelot, ANA_FLOODING_IPMC_FLD_MC6_DATA(PGID_MCIPV6) |
 		     ANA_FLOODING_IPMC_FLD_MC6_CTRL(PGID_MC) |
 		     ANA_FLOODING_IPMC_FLD_MC4_DATA(PGID_MCIPV4) |
diff --git a/drivers/net/ethernet/mscc/ocelot_vsc7514.c b/drivers/net/ethernet/mscc/ocelot_vsc7514.c
index dc00772950e5..1e7729421a82 100644
--- a/drivers/net/ethernet/mscc/ocelot_vsc7514.c
+++ b/drivers/net/ethernet/mscc/ocelot_vsc7514.c
@@ -1254,6 +1254,7 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
 	}
 
 	ocelot->num_phys_ports = of_get_child_count(ports);
+	ocelot->num_flooding_pgids = 1;
 
 	ocelot->vcap = vsc7514_vcap_props;
 	ocelot->inj_prefix = OCELOT_TAG_PREFIX_NONE;
diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h
index 1e9db9577441..49b46df476f2 100644
--- a/include/soc/mscc/ocelot.h
+++ b/include/soc/mscc/ocelot.h
@@ -618,6 +618,9 @@ struct ocelot {
 	/* Keep track of the vlan port masks */
 	u32				vlan_mask[VLAN_N_VID];
 
+	/* Switches like VSC9959 have flooding per traffic class */
+	int				num_flooding_pgids;
+
 	/* In tables like ANA:PORT and the ANA:PGID:PGID mask,
 	 * the CPU is located after the physical ports (at the
 	 * num_phys_ports index).
commit 33256ce194110874d4bc90078b577c59f9076c59
Merge: be1515bad737 2bf9545626f8
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 15:27:22 2020 -0800

    Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
    
    Pull i2c fixes from Wolfram Sang:
     "Some more I2C driver updates. IMX updates are a tad bigger, but not
      exceptionally big"
    
    * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
      i2c: mlxbf: Fix the return check of devm_ioremap and ioremap
      i2c: mlxbf: select CONFIG_I2C_SLAVE
      i2c: imx: Don't generate STOP condition if arbitration has been lost
      i2c: imx: Check for I2SR_IAL after every byte
      i2c: imx: Fix reset of I2SR_IAL flag
      i2c: qcom: Fix IRQ error misassignement
      i2c: qup: Fix error return code in qup_i2c_bam_schedule_desc()

commit be1515bad737ee9efe9229ab8313a236bfa03c5c
Merge: 619ca2664cc6 7e7986f9d3ba
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 14:45:30 2020 -0800

    Merge tag 'block-5.10-2020-12-05' of git://git.kernel.dk/linux-block
    
    Pull block fix from Jens Axboe:
     "Single fix for an issue with chunk_sectors and stacked devices"
    
    * tag 'block-5.10-2020-12-05' of git://git.kernel.dk/linux-block:
      block: use gcd() to fix chunk_sectors limit stacking

commit 619ca2664cc6ebf6ecaff347d15ee8093b634e0c
Merge: 32f741b02f1a 2d280bc8930b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 14:39:59 2020 -0800

    Merge tag 'io_uring-5.10-2020-12-05' of git://git.kernel.dk/linux-block
    
    Pull io_uring fix from Jens Axboe:
     "Just a small fix this time, for an issue with 32-bit compat apps and
      buffer selection with recvmsg"
    
    * tag 'io_uring-5.10-2020-12-05' of git://git.kernel.dk/linux-block:
      io_uring: fix recvmsg setup with compat buf-select

commit 4de377b659035309ba48638d70f3150d5c67611f
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Dec 4 16:49:42 2020 +0800

    net: marvell: prestera: Fix error return code in prestera_port_create()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 501ef3066c89 ("net: marvell: prestera: Add driver for Prestera family ASIC devices")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1607071782-34006-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_main.c b/drivers/net/ethernet/marvell/prestera/prestera_main.c
index 0f20e0788cce..da4b286d1337 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_main.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c
@@ -318,8 +318,10 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
 		goto err_port_init;
 	}
 
-	if (port->fp_id >= PRESTERA_MAC_ADDR_NUM_MAX)
+	if (port->fp_id >= PRESTERA_MAC_ADDR_NUM_MAX) {
+		err = -EINVAL;
 		goto err_port_init;
+	}
 
 	/* firmware requires that port's MAC address consist of the first
 	 * 5 bytes of the base MAC address
commit 205704c618af0ab2366015d2281a3b0814d918a0
Author: Stephen Suryaputra <ssuryaextr at gmail.com>
Date:   Thu Dec 3 22:06:04 2020 -0500

    vrf: packets with lladdr src needs dst at input with orig_iif when needs strict
    
    Depending on the order of the routes to fe80::/64 are installed on the
    VRF table, the NS for the source link-local address of the originator
    might be sent to the wrong interface.
    
    This patch ensures that packets with link-local addr source is doing a
    lookup with the orig_iif when the destination addr indicates that it
    is strict.
    
    Add the reproducer as a use case in self test script fcnal-test.sh.
    
    Fixes: b4869aa2f881 ("net: vrf: ipv6 support for local traffic to local addresses")
    Signed-off-by: Stephen Suryaputra <ssuryaextr at gmail.com>
    Reviewed-by: David Ahern <dsahern at kernel.org>
    Link: https://lore.kernel.org/r/20201204030604.18828-1-ssuryaextr@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index f2793ffde191..b9b7e00b72a8 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -1315,11 +1315,17 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,
 	int orig_iif = skb->skb_iif;
 	bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr);
 	bool is_ndisc = ipv6_ndisc_frame(skb);
+	bool is_ll_src;
 
 	/* loopback, multicast & non-ND link-local traffic; do not push through
-	 * packet taps again. Reset pkt_type for upper layers to process skb
+	 * packet taps again. Reset pkt_type for upper layers to process skb.
+	 * for packets with lladdr src, however, skip so that the dst can be
+	 * determine at input using original ifindex in the case that daddr
+	 * needs strict
 	 */
-	if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) {
+	is_ll_src = ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL;
+	if (skb->pkt_type == PACKET_LOOPBACK ||
+	    (need_strict && !is_ndisc && !is_ll_src)) {
 		skb->dev = vrf_dev;
 		skb->skb_iif = vrf_dev->ifindex;
 		IP6CB(skb)->flags |= IP6SKB_L3SLAVE;
diff --git a/tools/testing/selftests/net/fcnal-test.sh b/tools/testing/selftests/net/fcnal-test.sh
index fb5c55dd6df8..02b0b9ead40b 100755
--- a/tools/testing/selftests/net/fcnal-test.sh
+++ b/tools/testing/selftests/net/fcnal-test.sh
@@ -256,6 +256,28 @@ setup_cmd_nsb()
 	fi
 }
 
+setup_cmd_nsc()
+{
+	local cmd="$*"
+	local rc
+
+	run_cmd_nsc ${cmd}
+	rc=$?
+	if [ $rc -ne 0 ]; then
+		# show user the command if not done so already
+		if [ "$VERBOSE" = "0" ]; then
+			echo "setup command: $cmd"
+		fi
+		echo "failed. stopping tests"
+		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
+			echo
+			echo "hit enter to continue"
+			read a
+		fi
+		exit $rc
+	fi
+}
+
 # set sysctl values in NS-A
 set_sysctl()
 {
@@ -471,6 +493,36 @@ setup()
 	sleep 1
 }
 
+setup_lla_only()
+{
+	# make sure we are starting with a clean slate
+	kill_procs
+	cleanup 2>/dev/null
+
+	log_debug "Configuring network namespaces"
+	set -e
+
+	create_ns ${NSA} "-" "-"
+	create_ns ${NSB} "-" "-"
+	create_ns ${NSC} "-" "-"
+	connect_ns ${NSA} ${NSA_DEV} "-" "-" \
+		   ${NSB} ${NSB_DEV} "-" "-"
+	connect_ns ${NSA} ${NSA_DEV2} "-" "-" \
+		   ${NSC} ${NSC_DEV}  "-" "-"
+
+	NSA_LINKIP6=$(get_linklocal ${NSA} ${NSA_DEV})
+	NSB_LINKIP6=$(get_linklocal ${NSB} ${NSB_DEV})
+	NSC_LINKIP6=$(get_linklocal ${NSC} ${NSC_DEV})
+
+	create_vrf ${NSA} ${VRF} ${VRF_TABLE} "-" "-"
+	ip -netns ${NSA} link set dev ${NSA_DEV} vrf ${VRF}
+	ip -netns ${NSA} link set dev ${NSA_DEV2} vrf ${VRF}
+
+	set +e
+
+	sleep 1
+}
+
 ################################################################################
 # IPv4
 
@@ -3787,10 +3839,53 @@ use_case_br()
 	setup_cmd_nsb ip li del vlan100 2>/dev/null
 }
 
+# VRF only.
+# ns-A device is connected to both ns-B and ns-C on a single VRF but only has
+# LLA on the interfaces
+use_case_ping_lla_multi()
+{
+	setup_lla_only
+	# only want reply from ns-A
+	setup_cmd_nsb sysctl -qw net.ipv6.icmp.echo_ignore_multicast=1
+	setup_cmd_nsc sysctl -qw net.ipv6.icmp.echo_ignore_multicast=1
+
+	log_start
+	run_cmd_nsb ping -c1 -w1 ${MCAST}%${NSB_DEV}
+	log_test_addr ${MCAST}%${NSB_DEV} $? 0 "Pre cycle, ping out ns-B"
+
+	run_cmd_nsc ping -c1 -w1 ${MCAST}%${NSC_DEV}
+	log_test_addr ${MCAST}%${NSC_DEV} $? 0 "Pre cycle, ping out ns-C"
+
+	# cycle/flap the first ns-A interface
+	setup_cmd ip link set ${NSA_DEV} down
+	setup_cmd ip link set ${NSA_DEV} up
+	sleep 1
+
+	log_start
+	run_cmd_nsb ping -c1 -w1 ${MCAST}%${NSB_DEV}
+	log_test_addr ${MCAST}%${NSB_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV}, ping out ns-B"
+	run_cmd_nsc ping -c1 -w1 ${MCAST}%${NSC_DEV}
+	log_test_addr ${MCAST}%${NSC_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV}, ping out ns-C"
+
+	# cycle/flap the second ns-A interface
+	setup_cmd ip link set ${NSA_DEV2} down
+	setup_cmd ip link set ${NSA_DEV2} up
+	sleep 1
+
+	log_start
+	run_cmd_nsb ping -c1 -w1 ${MCAST}%${NSB_DEV}
+	log_test_addr ${MCAST}%${NSB_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV2}, ping out ns-B"
+	run_cmd_nsc ping -c1 -w1 ${MCAST}%${NSC_DEV}
+	log_test_addr ${MCAST}%${NSC_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV2}, ping out ns-C"
+}
+
 use_cases()
 {
 	log_section "Use cases"
+	log_subsection "Device enslaved to bridge"
 	use_case_br
+	log_subsection "Ping LLA with multiple interfaces"
+	use_case_ping_lla_multi
 }
 
 ################################################################################
commit 4d1be581ec6b92a338bb7ed23e1381f45ddf336f
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Fri Dec 4 14:35:06 2020 +0100

    can: softing: softing_netdev_open(): fix error handling
    
    If softing_netdev_open() fails, we should call close_candev() to avoid
    reference leak.
    
    Fixes: 03fd3cf5a179d ("can: add driver for Softing card")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Acked-by: Kurt Van Dijck <dev.kurt at vandijck-laurijssen.be>
    Link: https://lore.kernel.org/r/20201202151632.1343786-1-zhangqilong3@huawei.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Link: https://lore.kernel.org/r/20201204133508.742120-2-mkl@pengutronix.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/can/softing/softing_main.c b/drivers/net/can/softing/softing_main.c
index 9d2faaa39ce4..c9ca8b9fceb9 100644
--- a/drivers/net/can/softing/softing_main.c
+++ b/drivers/net/can/softing/softing_main.c
@@ -382,8 +382,13 @@ static int softing_netdev_open(struct net_device *ndev)
 
 	/* check or determine and set bittime */
 	ret = open_candev(ndev);
-	if (!ret)
-		ret = softing_startstop(ndev, 1);
+	if (ret)
+		return ret;
+
+	ret = softing_startstop(ndev, 1);
+	if (ret < 0)
+		close_candev(ndev);
+
 	return ret;
 }
 
commit a54ba3465d86fa5dd7d41bb88c0b5e71fb3b627e
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Thu Dec 3 23:26:16 2020 +0100

    ch_ktls: fix build warning for ipv4-only config
    
    When CONFIG_IPV6 is disabled, clang complains that a variable
    is uninitialized for non-IPv4 data:
    
    drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c:1046:6: error: variable 'cntrl1' is used uninitialized whenever 'if' condition is false [-Werror,-Wsometimes-uninitialized]
            if (tx_info->ip_family == AF_INET) {
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c:1059:2: note: uninitialized use occurs here
            cntrl1 |= T6_TXPKT_ETHHDR_LEN_V(maclen - ETH_HLEN) |
            ^~~~~~
    
    Replace the preprocessor conditional with the corresponding C version,
    and make the ipv4 case unconditional in this configuration to improve
    readability and avoid the warning.
    
    Fixes: 86716b51d14f ("ch_ktls: Update cheksum information")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Link: https://lore.kernel.org/r/20201203222641.964234-1-arnd@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 7f90b828d159..1b7e8c91b541 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -987,9 +987,7 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	struct fw_eth_tx_pkt_wr *wr;
 	struct cpl_tx_pkt_core *cpl;
 	u32 ctrl, iplen, maclen;
-#if IS_ENABLED(CONFIG_IPV6)
 	struct ipv6hdr *ip6;
-#endif
 	unsigned int ndesc;
 	struct tcphdr *tcp;
 	int len16, pktlen;
@@ -1043,17 +1041,15 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	cpl->len = htons(pktlen);
 
 	memcpy(buf, skb->data, pktlen);
-	if (tx_info->ip_family == AF_INET) {
+	if (!IS_ENABLED(CONFIG_IPV6) || tx_info->ip_family == AF_INET) {
 		/* we need to correct ip header len */
 		ip = (struct iphdr *)(buf + maclen);
 		ip->tot_len = htons(pktlen - maclen);
 		cntrl1 = TXPKT_CSUM_TYPE_V(TX_CSUM_TCPIP);
-#if IS_ENABLED(CONFIG_IPV6)
 	} else {
 		ip6 = (struct ipv6hdr *)(buf + maclen);
 		ip6->payload_len = htons(pktlen - maclen - iplen);
 		cntrl1 = TXPKT_CSUM_TYPE_V(TX_CSUM_TCPIP6);
-#endif
 	}
 
 	cntrl1 |= T6_TXPKT_ETHHDR_LEN_V(maclen - ETH_HLEN) |
commit 32f741b02f1a84dd15cdaf74ea3c8d724f812318
Merge: d4e904198c5b a1ee28117077
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 11:16:21 2020 -0800

    Merge tag 'powerpc-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
    
    Pull powerpc fixes from Michael Ellerman:
     "Some more powerpc fixes for 5.10:
    
       - Three commits fixing possible missed TLB invalidations for
         multi-threaded processes when CPUs are hotplugged in and out.
    
       - A fix for a host crash triggerable by host userspace (qemu) in KVM
         on Power9.
    
       - A fix for a host crash in machine check handling when running HPT
         guests on a HPT host.
    
       - One commit fixing potential missed TLB invalidations when using the
         hash MMU on Power9 or later.
    
       - A regression fix for machines with CPUs on node 0 but no memory.
    
      Thanks to Aneesh Kumar K.V, Cédric Le Goater, Greg Kurz, Milan
      Mohanty, Milton Miller, Nicholas Piggin, Paul Mackerras, and Srikar
      Dronamraju"
    
    * tag 'powerpc-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
      powerpc/64s/powernv: Fix memory corruption when saving SLB entries on MCE
      KVM: PPC: Book3S HV: XIVE: Fix vCPU id sanity check
      powerpc/numa: Fix a regression on memoryless node 0
      powerpc/64s: Trim offlined CPUs from mm_cpumasks
      kernel/cpu: add arch override for clear_tasks_mm_cpumask() mm handling
      powerpc/64s/pseries: Fix hash tlbiel_all_isa300 for guest kernels
      powerpc/64s: Fix hash ISA v3.0 TLBIEL instruction generation

commit d4e904198c5b46c140fdd04492df6ec31f1f03a5
Merge: 312b0bcd402a ea64370bcae1
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 11:09:07 2020 -0800

    Merge tag '5.10-rc6-smb3-fixes-part2' of git://git.samba.org/sfrench/cifs-2.6
    
    Pull cifs fixes from Steve French:
     "Three smb3 fixes (two for stable) fixing
    
       - a null pointer issue in a DFS error path
    
       - a problem with excessive padding when mounted with "idsfromsid"
         causing owner fields to get corrupted
    
       - a more recent problem with compounded reparse point query found in
         testing to the Linux kernel server"
    
    * tag '5.10-rc6-smb3-fixes-part2' of git://git.samba.org/sfrench/cifs-2.6:
      cifs: refactor create_sd_buf() and and avoid corrupting the buffer
      cifs: add NULL check for ses->tcon_ipc
      smb3: set COMPOUND_FID to FileID field of subsequent compound request

commit 312b0bcd402a003053914e13d962e82be906cf41
Merge: 876234056139 85dad327d9b5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 10:59:21 2020 -0800

    Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
    
    Pull SCSI fixes from James Bottomley:
     "Four small fixes in two drivers.
    
      The mpt3sas fixes are all problems with timeout under unusual
      conditions, and the storvsc is a missed incoming packet validation
      and a missed error return"
    
    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
      scsi: mpt3sas: Increase IOCInit request timeout to 30s
      scsi: mpt3sas: Fix ioctl timeout
      scsi: storvsc: Validate length of incoming packet in storvsc_on_channel_callback()
      scsi: storvsc: Fix error return in storvsc_probe()

commit 8762340561397fce0f0b41220ed9619101c870d0
Merge: b3298500b23f 65f33b357229
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Dec 5 10:51:25 2020 -0800

    Merge tag 'for-5.10/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
    
    Pull fix for device mapper fixes from Mike Snitzer:
     "Apologies for the glaring bug I introduced with my previous pull
      request!
    
      Fix incorrect branching at top of blk_max_size_offset()"
    
    * tag 'for-5.10/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
      block: fix incorrect branching in blk_max_size_offset()

commit 2bf9545626f8d09f552ab86d0047a415fe9a07a0
Author: Wang Xiaojun <wangxiaojun11 at huawei.com>
Date:   Wed Dec 2 20:46:47 2020 -0500

    i2c: mlxbf: Fix the return check of devm_ioremap and ioremap
    
    devm_ioremap and ioremap may return NULL which cannot be checked
    by IS_ERR.
    
    Signed-off-by: Wang Xiaojun <wangxiaojun11 at huawei.com>
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Acked-by: Khalil Blaiech <kblaiech at nvidia.com>
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/i2c-mlxbf.c b/drivers/i2c/busses/i2c-mlxbf.c
index 33574d40ea9c..2fb0532d8a16 100644
--- a/drivers/i2c/busses/i2c-mlxbf.c
+++ b/drivers/i2c/busses/i2c-mlxbf.c
@@ -1258,9 +1258,9 @@ static int mlxbf_i2c_get_gpio(struct platform_device *pdev,
 		return -EFAULT;
 
 	gpio_res->io = devm_ioremap(dev, params->start, size);
-	if (IS_ERR(gpio_res->io)) {
+	if (!gpio_res->io) {
 		devm_release_mem_region(dev, params->start, size);
-		return PTR_ERR(gpio_res->io);
+		return -ENOMEM;
 	}
 
 	return 0;
@@ -1323,9 +1323,9 @@ static int mlxbf_i2c_get_corepll(struct platform_device *pdev,
 		return -EFAULT;
 
 	corepll_res->io = devm_ioremap(dev, params->start, size);
-	if (IS_ERR(corepll_res->io)) {
+	if (!corepll_res->io) {
 		devm_release_mem_region(dev, params->start, size);
-		return PTR_ERR(corepll_res->io);
+		return -ENOMEM;
 	}
 
 	return 0;
@@ -1717,9 +1717,9 @@ static int mlxbf_i2c_init_coalesce(struct platform_device *pdev,
 			return -EFAULT;
 
 		coalesce_res->io = ioremap(params->start, size);
-		if (IS_ERR(coalesce_res->io)) {
+		if (!coalesce_res->io) {
 			release_mem_region(params->start, size);
-			return PTR_ERR(coalesce_res->io);
+			return -ENOMEM;
 		}
 
 		priv->coalesce = coalesce_res;
commit c62dac0a35bb6d351cd568e97090c5fd3e7aa532
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Thu Dec 3 23:32:50 2020 +0100

    i2c: mlxbf: select CONFIG_I2C_SLAVE
    
    If this is not enabled, the interfaces used in this driver do not work:
    
    drivers/i2c/busses/i2c-mlxbf.c:1888:3: error: implicit declaration of function 'i2c_slave_event' [-Werror,-Wimplicit-function-declaration]
                    i2c_slave_event(slave, I2C_SLAVE_WRITE_REQUESTED, &value);
                    ^
    drivers/i2c/busses/i2c-mlxbf.c:1888:26: error: use of undeclared identifier 'I2C_SLAVE_WRITE_REQUESTED'
                    i2c_slave_event(slave, I2C_SLAVE_WRITE_REQUESTED, &value);
                                           ^
    drivers/i2c/busses/i2c-mlxbf.c:1890:32: error: use of undeclared identifier 'I2C_SLAVE_WRITE_RECEIVED'
                    ret = i2c_slave_event(slave, I2C_SLAVE_WRITE_RECEIVED,
                                                 ^
    drivers/i2c/busses/i2c-mlxbf.c:1892:26: error: use of undeclared identifier 'I2C_SLAVE_STOP'
                    i2c_slave_event(slave, I2C_SLAVE_STOP, &value);
                                           ^
    
    Fixes: b5b5b32081cd ("i2c: mlxbf: I2C SMBus driver for Mellanox BlueField SoC")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Acked-by: Khalil Blaiech <kblaiech at nvidia.com>
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index a97a9d058198..a49e0ed4a599 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -734,6 +734,7 @@ config I2C_LPC2K
 config I2C_MLXBF
         tristate "Mellanox BlueField I2C controller"
         depends on MELLANOX_PLATFORM && ARM64
+	select I2C_SLAVE
         help
           Enabling this option will add I2C SMBus support for Mellanox BlueField
           system.
commit 905b2032fa424f253d9126271439cc1db2b01130
Author: Eric Dumazet <edumazet at google.com>
Date:   Fri Dec 4 08:24:28 2020 -0800

    mac80211: mesh: fix mesh_pathtbl_init() error path
    
    If tbl_mpp can not be allocated, we call mesh_table_free(tbl_path)
    while tbl_path rhashtable has not yet been initialized, which causes
    panics.
    
    Simply factorize the rhashtable_init() call into mesh_table_alloc()
    
    WARNING: CPU: 1 PID: 8474 at kernel/workqueue.c:3040 __flush_work kernel/workqueue.c:3040 [inline]
    WARNING: CPU: 1 PID: 8474 at kernel/workqueue.c:3040 __cancel_work_timer+0x514/0x540 kernel/workqueue.c:3136
    Modules linked in:
    CPU: 1 PID: 8474 Comm: syz-executor663 Not tainted 5.10.0-rc6-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:__flush_work kernel/workqueue.c:3040 [inline]
    RIP: 0010:__cancel_work_timer+0x514/0x540 kernel/workqueue.c:3136
    Code: 5d c3 e8 bf ae 29 00 0f 0b e9 f0 fd ff ff e8 b3 ae 29 00 0f 0b 43 80 3c 3e 00 0f 85 31 ff ff ff e9 34 ff ff ff e8 9c ae 29 00 <0f> 0b e9 dc fe ff ff 89 e9 80 e1 07 80 c1 03 38 c1 0f 8c 7d fd ff
    RSP: 0018:ffffc9000165f5a0 EFLAGS: 00010293
    RAX: ffffffff814b7064 RBX: 0000000000000001 RCX: ffff888021c80000
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
    RBP: ffff888024039ca0 R08: dffffc0000000000 R09: fffffbfff1dd3e64
    R10: fffffbfff1dd3e64 R11: 0000000000000000 R12: 1ffff920002cbebd
    R13: ffff888024039c88 R14: 1ffff11004807391 R15: dffffc0000000000
    FS:  0000000001347880(0000) GS:ffff8880b9d00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000020000140 CR3: 000000002cc0a000 CR4: 00000000001506e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     rhashtable_free_and_destroy+0x25/0x9c0 lib/rhashtable.c:1137
     mesh_table_free net/mac80211/mesh_pathtbl.c:69 [inline]
     mesh_pathtbl_init+0x287/0x2e0 net/mac80211/mesh_pathtbl.c:785
     ieee80211_mesh_init_sdata+0x2ee/0x530 net/mac80211/mesh.c:1591
     ieee80211_setup_sdata+0x733/0xc40 net/mac80211/iface.c:1569
     ieee80211_if_add+0xd5c/0x1cd0 net/mac80211/iface.c:1987
     ieee80211_add_iface+0x59/0x130 net/mac80211/cfg.c:125
     rdev_add_virtual_intf net/wireless/rdev-ops.h:45 [inline]
     nl80211_new_interface+0x563/0xb40 net/wireless/nl80211.c:3855
     genl_family_rcv_msg_doit net/netlink/genetlink.c:739 [inline]
     genl_family_rcv_msg net/netlink/genetlink.c:783 [inline]
     genl_rcv_msg+0xe4e/0x1280 net/netlink/genetlink.c:800
     netlink_rcv_skb+0x190/0x3a0 net/netlink/af_netlink.c:2494
     genl_rcv+0x24/0x40 net/netlink/genetlink.c:811
     netlink_unicast_kernel net/netlink/af_netlink.c:1304 [inline]
     netlink_unicast+0x780/0x930 net/netlink/af_netlink.c:1330
     netlink_sendmsg+0x9a8/0xd40 net/netlink/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:651 [inline]
     sock_sendmsg net/socket.c:671 [inline]
     ____sys_sendmsg+0x519/0x800 net/socket.c:2353
     ___sys_sendmsg net/socket.c:2407 [inline]
     __sys_sendmsg+0x2b1/0x360 net/socket.c:2440
     do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: 60854fd94573 ("mac80211: mesh: convert path table to rhashtable")
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Reported-by: syzbot <syzkaller at googlegroups.com>
    Reviewed-by: Johannes Berg <johannes at sipsolutions.net>
    Link: https://lore.kernel.org/r/20201204162428.2583119-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 48f31ac9233c..620ecf922408 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -60,6 +60,7 @@ static struct mesh_table *mesh_table_alloc(void)
 	atomic_set(&newtbl->entries,  0);
 	spin_lock_init(&newtbl->gates_lock);
 	spin_lock_init(&newtbl->walk_lock);
+	rhashtable_init(&newtbl->rhead, &mesh_rht_params);
 
 	return newtbl;
 }
@@ -773,9 +774,6 @@ int mesh_pathtbl_init(struct ieee80211_sub_if_data *sdata)
 		goto free_path;
 	}
 
-	rhashtable_init(&tbl_path->rhead, &mesh_rht_params);
-	rhashtable_init(&tbl_mpp->rhead, &mesh_rht_params);
-
 	sdata->u.mesh.mesh_paths = tbl_path;
 	sdata->u.mesh.mpp_paths = tbl_mpp;
 
commit ed9b25d1970a4787ac6a39c2091e63b127ecbfc1
Author: Serge Hallyn <shallyn at cisco.com>
Date:   Sun Nov 15 21:55:31 2020 -0600

    [SECURITY] fix namespaced fscaps when !CONFIG_SECURITY
    
    Namespaced file capabilities were introduced in 8db6c34f1dbc .
    When userspace reads an xattr for a namespaced capability, a
    virtualized representation of it is returned if the caller is
    in a user namespace owned by the capability's owning rootid.
    The function which performs this virtualization was not hooked
    up if CONFIG_SECURITY=n.  Therefore in that case the original
    xattr was shown instead of the virtualized one.
    
    To test this using libcap-bin (*1),
    
    $ v=$(mktemp)
    $ unshare -Ur setcap cap_sys_admin-eip $v
    $ unshare -Ur setcap -v cap_sys_admin-eip $v
    /tmp/tmp.lSiIFRvt8Y: OK
    
    "setcap -v" verifies the values instead of setting them, and
    will check whether the rootid value is set.  Therefore, with
    this bug un-fixed, and with CONFIG_SECURITY=n, setcap -v will
    fail:
    
    $ v=$(mktemp)
    $ unshare -Ur setcap cap_sys_admin=eip $v
    $ unshare -Ur setcap -v cap_sys_admin=eip $v
    nsowner[got=1000, want=0],/tmp/tmp.HHDiOOl9fY differs in []
    
    Fix this bug by calling cap_inode_getsecurity() in
    security_inode_getsecurity() instead of returning
    -EOPNOTSUPP, when CONFIG_SECURITY=n.
    
    *1 - note, if libcap is too old for getcap to have the '-n'
    option, then use verify-caps instead.
    
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=209689
    Cc: Hervé Guillemet <herve at guillemet.org>
    Acked-by: Casey Schaufler <casey at schaufler-ca.com>
    Signed-off-by: Serge Hallyn <shallyn at cisco.com>
    Signed-off-by: Andrew G. Morgan <morgan at kernel.org>
    Signed-off-by: James Morris <jamorris at linux.microsoft.com>

diff --git a/include/linux/security.h b/include/linux/security.h
index 0a0a03b36a3b..2befc0a25eb3 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -864,7 +864,7 @@ static inline int security_inode_killpriv(struct dentry *dentry)
 
 static inline int security_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
 {
-	return -EOPNOTSUPP;
+	return cap_inode_getsecurity(inode, name, buffer, alloc);
 }
 
 static inline int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)
commit bb2da7651a47dc042cb7fc9c40cd77092b6b4445
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Fri Dec 4 19:43:14 2020 +0800

    openvswitch: fix error return code in validate_and_copy_dec_ttl()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Changing 'return start' to 'return action_start' can fix this bug.
    
    Fixes: 69929d4c49e1 ("net: openvswitch: fix TTL decrement action netlink message format")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Reviewed-by: Eelco Chaudron <echaudro at redhat.com>
    Link: https://lore.kernel.org/r/20201204114314.1596-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
index ec0689ddc635..4c5c2331e764 100644
--- a/net/openvswitch/flow_netlink.c
+++ b/net/openvswitch/flow_netlink.c
@@ -2531,7 +2531,7 @@ static int validate_and_copy_dec_ttl(struct net *net,
 
 	action_start = add_nested_action_start(sfa, OVS_DEC_TTL_ATTR_ACTION, log);
 	if (action_start < 0)
-		return start;
+		return action_start;
 
 	err = __ovs_nla_copy_actions(net, actions, key, sfa, eth_type,
 				     vlan_tci, mpls_label_count, log);
commit ee4f52a8de2c6f78b01f10b4c330867d88c1653a
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Dec 4 16:48:56 2020 +0800

    net: bridge: vlan: fix error return code in __vlan_add()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: f8ed289fab84 ("bridge: vlan: use br_vlan_(get|put)_master to deal with refcounts")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Acked-by: Nikolay Aleksandrov <nikolay at nvidia.com>
    Link: https://lore.kernel.org/r/1607071737-33875-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
index 3e493eb85bb2..08c77418c687 100644
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -266,8 +266,10 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
 		}
 
 		masterv = br_vlan_get_master(br, v->vid, extack);
-		if (!masterv)
+		if (!masterv) {
+			err = -ENOMEM;
 			goto out_filt;
+		}
 		v->brvlan = masterv;
 		if (br_opt_get(br, BROPT_VLAN_STATS_PER_PORT)) {
 			v->stats = netdev_alloc_pcpu_stats(struct br_vlan_stats);
commit b410f04eb5b482b5efc4eee90de81ad35d3d923b
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Dec 4 16:48:14 2020 +0800

    ipv4: fix error return code in rtm_to_fib_config()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: d15662682db2 ("ipv4: Allow ipv6 gateway with ipv4 routes")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Reviewed-by: David Ahern <dsahern at kernel.org>
    Link: https://lore.kernel.org/r/1607071695-33740-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index b87140a1fa28..cdf6ec5aa45d 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -825,7 +825,7 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
 	if (has_gw && has_via) {
 		NL_SET_ERR_MSG(extack,
 			       "Nexthop configuration can not contain both GATEWAY and VIA");
-		goto errout;
+		return -EINVAL;
 	}
 
 	return 0;
commit 0b32e91fdfd87314af9943e69eb85a88adb4233c
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Dec 4 00:20:37 2020 +0100

    ethernet: select CONFIG_CRC32 as needed
    
    A number of ethernet drivers require crc32 functionality to be
    avaialable in the kernel, causing a link error otherwise:
    
    arm-linux-gnueabi-ld: drivers/net/ethernet/agere/et131x.o: in function `et1310_setup_device_for_multicast':
    et131x.c:(.text+0x5918): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/cadence/macb_main.o: in function `macb_start_xmit':
    macb_main.c:(.text+0x4b88): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/faraday/ftgmac100.o: in function `ftgmac100_set_rx_mode':
    ftgmac100.c:(.text+0x2b38): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/freescale/fec_main.o: in function `set_multicast_list':
    fec_main.c:(.text+0x6120): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/freescale/fman/fman_dtsec.o: in function `dtsec_add_hash_mac_address':
    fman_dtsec.c:(.text+0x830): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/freescale/fman/fman_dtsec.o:fman_dtsec.c:(.text+0xb68): more undefined references to `crc32_le' follow
    arm-linux-gnueabi-ld: drivers/net/ethernet/netronome/nfp/nfpcore/nfp_hwinfo.o: in function `nfp_hwinfo_read':
    nfp_hwinfo.c:(.text+0x250): undefined reference to `crc32_be'
    arm-linux-gnueabi-ld: nfp_hwinfo.c:(.text+0x288): undefined reference to `crc32_be'
    arm-linux-gnueabi-ld: drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.o: in function `nfp_resource_acquire':
    nfp_resource.c:(.text+0x144): undefined reference to `crc32_be'
    arm-linux-gnueabi-ld: nfp_resource.c:(.text+0x158): undefined reference to `crc32_be'
    arm-linux-gnueabi-ld: drivers/net/ethernet/nxp/lpc_eth.o: in function `lpc_eth_set_multicast_list':
    lpc_eth.c:(.text+0x1934): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/rocker/rocker_ofdpa.o: in function `ofdpa_flow_tbl_do':
    rocker_ofdpa.c:(.text+0x2e08): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/rocker/rocker_ofdpa.o: in function `ofdpa_flow_tbl_del':
    rocker_ofdpa.c:(.text+0x3074): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/rocker/rocker_ofdpa.o: in function `ofdpa_port_fdb':
    arm-linux-gnueabi-ld: drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.o: in function `mlx5dr_ste_calc_hash_index':
    dr_ste.c:(.text+0x354): undefined reference to `crc32_le'
    arm-linux-gnueabi-ld: drivers/net/ethernet/microchip/lan743x_main.o: in function `lan743x_netdev_set_multicast':
    lan743x_main.c:(.text+0x5dc4): undefined reference to `crc32_le'
    
    Add the missing 'select CRC32' entries in Kconfig for each of them.
    
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Acked-by: Nicolas Ferre <nicolas.ferre at microchip.com>
    Acked-by: Madalin Bucur <madalin.bucur at oss.nxp.com>
    Acked-by: Mark Einon <mark.einon at gmail.com>
    Acked-by: Simon Horman <simon.horman at netronome.com>
    Link: https://lore.kernel.org/r/20201203232114.1485603-1-arnd@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/agere/Kconfig b/drivers/net/ethernet/agere/Kconfig
index d92516ae59cc..9cd750184947 100644
--- a/drivers/net/ethernet/agere/Kconfig
+++ b/drivers/net/ethernet/agere/Kconfig
@@ -21,6 +21,7 @@ config ET131X
 	tristate "Agere ET-1310 Gigabit Ethernet support"
 	depends on PCI
 	select PHYLIB
+	select CRC32
 	help
 	  This driver supports Agere ET-1310 ethernet adapters.
 
diff --git a/drivers/net/ethernet/cadence/Kconfig b/drivers/net/ethernet/cadence/Kconfig
index 85858163bac5..e432a68ac520 100644
--- a/drivers/net/ethernet/cadence/Kconfig
+++ b/drivers/net/ethernet/cadence/Kconfig
@@ -23,6 +23,7 @@ config MACB
 	tristate "Cadence MACB/GEM support"
 	depends on HAS_DMA && COMMON_CLK
 	select PHYLINK
+	select CRC32
 	help
 	  The Cadence MACB ethernet interface is found on many Atmel AT32 and
 	  AT91 parts.  This driver also supports the Cadence GEM (Gigabit
diff --git a/drivers/net/ethernet/faraday/Kconfig b/drivers/net/ethernet/faraday/Kconfig
index c2677ec0564d..3d1e9a302148 100644
--- a/drivers/net/ethernet/faraday/Kconfig
+++ b/drivers/net/ethernet/faraday/Kconfig
@@ -33,6 +33,7 @@ config FTGMAC100
 	depends on !64BIT || BROKEN
 	select PHYLIB
 	select MDIO_ASPEED if MACH_ASPEED_G6
+	select CRC32
 	help
 	  This driver supports the FTGMAC100 Gigabit Ethernet controller
 	  from Faraday. It is used on Faraday A369, Andes AG102 and some
diff --git a/drivers/net/ethernet/freescale/Kconfig b/drivers/net/ethernet/freescale/Kconfig
index a1d53ddf1593..3f9175bdce77 100644
--- a/drivers/net/ethernet/freescale/Kconfig
+++ b/drivers/net/ethernet/freescale/Kconfig
@@ -25,6 +25,7 @@ config FEC
 	depends on (M523x || M527x || M5272 || M528x || M520x || M532x || \
 		   ARCH_MXC || SOC_IMX28 || COMPILE_TEST)
 	default ARCH_MXC || SOC_IMX28 if ARM
+	select CRC32
 	select PHYLIB
 	imply PTP_1588_CLOCK
 	help
diff --git a/drivers/net/ethernet/freescale/fman/Kconfig b/drivers/net/ethernet/freescale/fman/Kconfig
index 34150182cc35..48bf8088795d 100644
--- a/drivers/net/ethernet/freescale/fman/Kconfig
+++ b/drivers/net/ethernet/freescale/fman/Kconfig
@@ -4,6 +4,7 @@ config FSL_FMAN
 	depends on FSL_SOC || ARCH_LAYERSCAPE || COMPILE_TEST
 	select GENERIC_ALLOCATOR
 	select PHYLIB
+	select CRC32
 	default n
 	help
 		Freescale Data-Path Acceleration Architecture Frame Manager
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
index 99f1ec3b2575..3e371d24c462 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
@@ -198,6 +198,7 @@ config MLX5_EN_TLS
 config MLX5_SW_STEERING
 	bool "Mellanox Technologies software-managed steering"
 	depends on MLX5_CORE_EN && MLX5_ESWITCH
+	select CRC32
 	default y
 	help
 	Build support for software-managed steering in the NIC.
diff --git a/drivers/net/ethernet/microchip/Kconfig b/drivers/net/ethernet/microchip/Kconfig
index 31f9a82dc113..d0f6dfe0dcf3 100644
--- a/drivers/net/ethernet/microchip/Kconfig
+++ b/drivers/net/ethernet/microchip/Kconfig
@@ -47,6 +47,7 @@ config LAN743X
 	depends on PCI
 	select PHYLIB
 	select CRC16
+	select CRC32
 	help
 	  Support for the Microchip LAN743x PCI Express Gigabit Ethernet chip
 
diff --git a/drivers/net/ethernet/netronome/Kconfig b/drivers/net/ethernet/netronome/Kconfig
index d8b99d6a0356..b82758d5beed 100644
--- a/drivers/net/ethernet/netronome/Kconfig
+++ b/drivers/net/ethernet/netronome/Kconfig
@@ -22,6 +22,7 @@ config NFP
 	depends on VXLAN || VXLAN=n
 	depends on TLS && TLS_DEVICE || TLS_DEVICE=n
 	select NET_DEVLINK
+	select CRC32
 	help
 	  This driver supports the Netronome(R) NFP4000/NFP6000 based
 	  cards working as a advanced Ethernet NIC.  It works with both
diff --git a/drivers/net/ethernet/nxp/Kconfig b/drivers/net/ethernet/nxp/Kconfig
index ee83a71c2509..c84997db828c 100644
--- a/drivers/net/ethernet/nxp/Kconfig
+++ b/drivers/net/ethernet/nxp/Kconfig
@@ -3,6 +3,7 @@ config LPC_ENET
 	tristate "NXP ethernet MAC on LPC devices"
 	depends on ARCH_LPC32XX || COMPILE_TEST
 	select PHYLIB
+	select CRC32
 	help
 	  Say Y or M here if you want to use the NXP ethernet MAC included on
 	  some NXP LPC devices. You can safely enable this option for LPC32xx
diff --git a/drivers/net/ethernet/rocker/Kconfig b/drivers/net/ethernet/rocker/Kconfig
index 99e1290e0307..2318811ff75a 100644
--- a/drivers/net/ethernet/rocker/Kconfig
+++ b/drivers/net/ethernet/rocker/Kconfig
@@ -19,6 +19,7 @@ if NET_VENDOR_ROCKER
 config ROCKER
 	tristate "Rocker switch driver (EXPERIMENTAL)"
 	depends on PCI && NET_SWITCHDEV && BRIDGE
+	select CRC32
 	help
 	  This driver supports Rocker switch device.
 
commit 1130b252480f3c98cf468e78c1c5c516b390a29c
Author: Alex Elder <elder at linaro.org>
Date:   Thu Dec 3 15:51:06 2020 -0600

    net: ipa: pass the correct size when freeing DMA memory
    
    When the coherent memory is freed in gsi_trans_pool_exit_dma(), we
    are mistakenly passing the size of a single element in the pool
    rather than the actual allocated size.  Fix this bug.
    
    Fixes: 9dd441e4ed575 ("soc: qcom: ipa: GSI transactions")
    Reported-by: Stephen Boyd <swboyd at chromium.org>
    Tested-by: Sujit Kautkar <sujitka at chromium.org>
    Signed-off-by: Alex Elder <elder at linaro.org>
    Reviewed-by: Bjorn Andersson <bjorn.andersson at linaro.org>
    Link: https://lore.kernel.org/r/20201203215106.17450-1-elder@linaro.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ipa/gsi_trans.c b/drivers/net/ipa/gsi_trans.c
index e8599bb948c0..6c3ed5b17b80 100644
--- a/drivers/net/ipa/gsi_trans.c
+++ b/drivers/net/ipa/gsi_trans.c
@@ -156,6 +156,9 @@ int gsi_trans_pool_init_dma(struct device *dev, struct gsi_trans_pool *pool,
 	/* The allocator will give us a power-of-2 number of pages.  But we
 	 * can't guarantee that, so request it.  That way we won't waste any
 	 * memory that would be available beyond the required space.
+	 *
+	 * Note that gsi_trans_pool_exit_dma() assumes the total allocated
+	 * size is exactly (count * size).
 	 */
 	total_size = get_order(total_size) << PAGE_SHIFT;
 
@@ -175,7 +178,9 @@ int gsi_trans_pool_init_dma(struct device *dev, struct gsi_trans_pool *pool,
 
 void gsi_trans_pool_exit_dma(struct device *dev, struct gsi_trans_pool *pool)
 {
-	dma_free_coherent(dev, pool->size, pool->base, pool->addr);
+	size_t total_size = pool->count * pool->size;
+
+	dma_free_coherent(dev, total_size, pool->base, pool->addr);
 	memset(pool, 0, sizeof(*pool));
 }
 
commit 65f33b35722952fa076811d5686bfd8a611a80fa
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Fri Dec 4 17:21:03 2020 -0500

    block: fix incorrect branching in blk_max_size_offset()
    
    If non-zero 'chunk_sectors' is passed in to blk_max_size_offset() that
    override will be incorrectly ignored.
    
    Old blk_max_size_offset() branching, prior to commit 3ee16db390b4,
    must be used only if passed 'chunk_sectors' override is zero.
    
    Fixes: 3ee16db390b4 ("dm: fix IO splitting")
    Cc: stable at vger.kernel.org # 5.9
    Reported-by: John Dorminy <jdorminy at redhat.com>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 24ae504cf77d..033eb5f73b65 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1076,10 +1076,12 @@ static inline unsigned int blk_max_size_offset(struct request_queue *q,
 					       sector_t offset,
 					       unsigned int chunk_sectors)
 {
-	if (!chunk_sectors && q->limits.chunk_sectors)
-		chunk_sectors = q->limits.chunk_sectors;
-	else
-		return q->limits.max_sectors;
+	if (!chunk_sectors) {
+		if (q->limits.chunk_sectors)
+			chunk_sectors = q->limits.chunk_sectors;
+		else
+			return q->limits.max_sectors;
+	}
 
 	if (likely(is_power_of_2(chunk_sectors)))
 		chunk_sectors -= offset & (chunk_sectors - 1);
commit 4eef8b1f36f2ff06966b8f7c2143ef0c447877de
Author: Davide Caratti <dcaratti at redhat.com>
Date:   Thu Dec 3 19:40:47 2020 +0100

    net/sched: fq_pie: initialize timer earlier in fq_pie_init()
    
    with the following tdc testcase:
    
     83be: (qdisc, fq_pie) Create FQ-PIE with invalid number of flows
    
    as fq_pie_init() fails, fq_pie_destroy() is called to clean up. Since the
    timer is not yet initialized, it's possible to observe a splat like this:
    
      INFO: trying to register non-static key.
      the code is fine but needs lockdep annotation.
      turning off the locking correctness validator.
      CPU: 0 PID: 975 Comm: tc Not tainted 5.10.0-rc4+ #298
      Hardware name: Red Hat KVM, BIOS 1.11.1-4.module+el8.1.0+4066+0f1aadab 04/01/2014
      Call Trace:
       dump_stack+0x99/0xcb
       register_lock_class+0x12dd/0x1750
       __lock_acquire+0xfe/0x3970
       lock_acquire+0x1c8/0x7f0
       del_timer_sync+0x49/0xd0
       fq_pie_destroy+0x3f/0x80 [sch_fq_pie]
       qdisc_create+0x916/0x1160
       tc_modify_qdisc+0x3c4/0x1630
       rtnetlink_rcv_msg+0x346/0x8e0
       netlink_unicast+0x439/0x630
       netlink_sendmsg+0x719/0xbf0
       sock_sendmsg+0xe2/0x110
       ____sys_sendmsg+0x5ba/0x890
       ___sys_sendmsg+0xe9/0x160
       __sys_sendmsg+0xd3/0x170
       do_syscall_64+0x33/0x40
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [...]
      ODEBUG: assert_init not available (active state 0) object type: timer_list hint: 0x0
      WARNING: CPU: 0 PID: 975 at lib/debugobjects.c:508 debug_print_object+0x162/0x210
      [...]
      Call Trace:
       debug_object_assert_init+0x268/0x380
       try_to_del_timer_sync+0x6a/0x100
       del_timer_sync+0x9e/0xd0
       fq_pie_destroy+0x3f/0x80 [sch_fq_pie]
       qdisc_create+0x916/0x1160
       tc_modify_qdisc+0x3c4/0x1630
       rtnetlink_rcv_msg+0x346/0x8e0
       netlink_rcv_skb+0x120/0x380
       netlink_unicast+0x439/0x630
       netlink_sendmsg+0x719/0xbf0
       sock_sendmsg+0xe2/0x110
       ____sys_sendmsg+0x5ba/0x890
       ___sys_sendmsg+0xe9/0x160
       __sys_sendmsg+0xd3/0x170
       do_syscall_64+0x33/0x40
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    fix it moving timer_setup() before any failure, like it was done on 'red'
    with former commit 608b4adab178 ("net_sched: initialize timer earlier in
    red_init()").
    
    Fixes: ec97ecf1ebe4 ("net: sched: add Flow Queue PIE packet scheduler")
    Signed-off-by: Davide Caratti <dcaratti at redhat.com>
    Reviewed-by: Cong Wang <cong.wang at bytedance.com>
    Link: https://lore.kernel.org/r/2e78e01c504c633ebdff18d041833cf2e079a3a4.1607020450.git.dcaratti@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/sched/sch_fq_pie.c b/net/sched/sch_fq_pie.c
index 4dda15588cf4..949163fe68af 100644
--- a/net/sched/sch_fq_pie.c
+++ b/net/sched/sch_fq_pie.c
@@ -401,6 +401,7 @@ static int fq_pie_init(struct Qdisc *sch, struct nlattr *opt,
 
 	INIT_LIST_HEAD(&q->new_flows);
 	INIT_LIST_HEAD(&q->old_flows);
+	timer_setup(&q->adapt_timer, fq_pie_timer, 0);
 
 	if (opt) {
 		err = fq_pie_change(sch, opt, extack);
@@ -426,7 +427,6 @@ static int fq_pie_init(struct Qdisc *sch, struct nlattr *opt,
 		pie_vars_init(&flow->vars);
 	}
 
-	timer_setup(&q->adapt_timer, fq_pie_timer, 0);
 	mod_timer(&q->adapt_timer, jiffies + HZ / 2);
 
 	return 0;
commit bcee5278958802b40ee8b26679155a6d9231783e
Author: Steven Rostedt (VMware) <rostedt at goodmis.org>
Date:   Fri Dec 4 16:36:16 2020 -0500

    tracing: Fix userstacktrace option for instances
    
    When the instances were able to use their own options, the userstacktrace
    option was left hardcoded for the top level. This made the instance
    userstacktrace option bascially into a nop, and will confuse users that set
    it, but nothing happens (I was confused when it happened to me!)
    
    Cc: stable at vger.kernel.org
    Fixes: 16270145ce6b ("tracing: Add trace options for core options to instances")
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 7d53c5bdea3e..06134189e9a7 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -163,7 +163,8 @@ static union trace_eval_map_item *trace_eval_maps;
 #endif /* CONFIG_TRACE_EVAL_MAP_FILE */
 
 int tracing_set_tracer(struct trace_array *tr, const char *buf);
-static void ftrace_trace_userstack(struct trace_buffer *buffer,
+static void ftrace_trace_userstack(struct trace_array *tr,
+				   struct trace_buffer *buffer,
 				   unsigned long flags, int pc);
 
 #define MAX_TRACER_SIZE		100
@@ -2870,7 +2871,7 @@ void trace_buffer_unlock_commit_regs(struct trace_array *tr,
 	 * two. They are not that meaningful.
 	 */
 	ftrace_trace_stack(tr, buffer, flags, regs ? 0 : STACK_SKIP, pc, regs);
-	ftrace_trace_userstack(buffer, flags, pc);
+	ftrace_trace_userstack(tr, buffer, flags, pc);
 }
 
 /*
@@ -3056,13 +3057,14 @@ EXPORT_SYMBOL_GPL(trace_dump_stack);
 static DEFINE_PER_CPU(int, user_stack_count);
 
 static void
-ftrace_trace_userstack(struct trace_buffer *buffer, unsigned long flags, int pc)
+ftrace_trace_userstack(struct trace_array *tr,
+		       struct trace_buffer *buffer, unsigned long flags, int pc)
 {
 	struct trace_event_call *call = &event_user_stack;
 	struct ring_buffer_event *event;
 	struct userstack_entry *entry;
 
-	if (!(global_trace.trace_flags & TRACE_ITER_USERSTACKTRACE))
+	if (!(tr->trace_flags & TRACE_ITER_USERSTACKTRACE))
 		return;
 
 	/*
@@ -3101,7 +3103,8 @@ ftrace_trace_userstack(struct trace_buffer *buffer, unsigned long flags, int pc)
 	preempt_enable();
 }
 #else /* CONFIG_USER_STACKTRACE_SUPPORT */
-static void ftrace_trace_userstack(struct trace_buffer *buffer,
+static void ftrace_trace_userstack(struct trace_array *tr,
+				   struct trace_buffer *buffer,
 				   unsigned long flags, int pc)
 {
 }
commit b3298500b23f0b53a8d81e0d5ad98a29db71f4f0
Merge: e87297fa080a bde3808bc8c2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 4 13:28:39 2020 -0800

    Merge tag 'for-5.10/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
    
    Pull device mapper fixes from Mike Snitzer:
    
     - Fix DM's bio splitting changes that were made during v5.9. This
       restores splitting in terms of varied per-target ti->max_io_len
       rather than use block core's single stacked 'chunk_sectors' limit.
    
     - Like DM crypt, update DM integrity to not use crypto drivers that
       have CRYPTO_ALG_ALLOCATES_MEMORY set.
    
     - Fix DM writecache target's argument parsing and status display.
    
     - Remove needless BUG() from dm writecache's persistent_memory_claim()
    
     - Remove old gcc workaround in DM cache target's block_div() for ARM
       link errors now that gcc >= 4.9 is required.
    
     - Fix RCU locking in dm_blk_report_zones and dm_dax_zero_page_range.
    
     - Remove old, and now frowned upon, BUG_ON(in_interrupt()) in
       dm_table_event().
    
     - Remove invalid sparse annotations from dm_prepare_ioctl() and
       dm_unprepare_ioctl().
    
    * tag 'for-5.10/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
      dm: remove invalid sparse __acquires and __releases annotations
      dm: fix double RCU unlock in dm_dax_zero_page_range() error path
      dm: fix IO splitting
      dm writecache: remove BUG() and fail gracefully instead
      dm table: Remove BUG_ON(in_interrupt())
      dm: fix bug with RCU locking in dm_blk_report_zones
      Revert "dm cache: fix arm link errors with inline"
      dm writecache: fix the maximum number of arguments
      dm writecache: advance the number of arguments when reporting max_age
      dm integrity: don't use drivers that have CRYPTO_ALG_ALLOCATES_MEMORY

commit bde3808bc8c2741ad3d804f84720409aee0c2972
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Fri Dec 4 15:25:18 2020 -0500

    dm: remove invalid sparse __acquires and __releases annotations
    
    Fixes sparse warnings:
    drivers/md/dm.c:508:12: warning: context imbalance in 'dm_prepare_ioctl' - wrong count at exit
    drivers/md/dm.c:543:13: warning: context imbalance in 'dm_unprepare_ioctl' - wrong count at exit
    
    Fixes: 971888c46993f ("dm: hold DM table for duration of ioctl rather than use blkdev_get")
    Cc: stable at vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 45c623ff931a..4e0cbfe3f14d 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -509,7 +509,6 @@ out:
 
 static int dm_prepare_ioctl(struct mapped_device *md, int *srcu_idx,
 			    struct block_device **bdev)
-	__acquires(md->io_barrier)
 {
 	struct dm_target *tgt;
 	struct dm_table *map;
@@ -543,7 +542,6 @@ retry:
 }
 
 static void dm_unprepare_ioctl(struct mapped_device *md, int srcu_idx)
-	__releases(md->io_barrier)
 {
 	dm_put_live_table(md, srcu_idx);
 }
commit f05c4403db5bba881d4964e731f6da35be46aabd
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Fri Dec 4 15:19:27 2020 -0500

    dm: fix double RCU unlock in dm_dax_zero_page_range() error path
    
    Remove redundant dm_put_live_table() in dm_dax_zero_page_range() error
    path to fix sparse warning:
    drivers/md/dm.c:1208:9: warning: context imbalance in 'dm_dax_zero_page_range' - unexpected unlock
    
    Fixes: cdf6cdcd3b99a ("dm,dax: Add dax zero_page_range operation")
    Cc: stable at vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index f7eb3d2964f3..45c623ff931a 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1201,11 +1201,9 @@ static int dm_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff,
 		 * ->zero_page_range() is mandatory dax operation. If we are
 		 *  here, something is wrong.
 		 */
-		dm_put_live_table(md, srcu_idx);
 		goto out;
 	}
 	ret = ti->type->dax_zero_page_range(ti, pgoff, nr_pages);
-
  out:
 	dm_put_live_table(md, srcu_idx);
 
commit 3ee16db390b42b8a21f2ad2ea2518f3469c6e532
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Mon Nov 30 10:57:43 2020 -0500

    dm: fix IO splitting
    
    Commit 882ec4e609c1 ("dm table: stack 'chunk_sectors' limit to account
    for target-specific splitting") caused a couple regressions:
    1) Using lcm_not_zero() when stacking chunk_sectors was a bug because
       chunk_sectors must reflect the most limited of all devices in the
       IO stack.
    2) DM targets that set max_io_len but that do _not_ provide an
       .iterate_devices method no longer had there IO split properly.
    
    And commit 5091cdec56fa ("dm: change max_io_len() to use
    blk_max_size_offset()") also caused a regression where DM no longer
    supported varied (per target) IO splitting. The implication being the
    potential for severely reduced performance for IO stacks that use a DM
    target like dm-cache to hide performance limitations of a slower
    device (e.g. one that requires 4K IO splitting).
    
    Coming full circle: Fix all these issues by discontinuing stacking
    chunk_sectors up using ti->max_io_len in dm_calculate_queue_limits(),
    add optional chunk_sectors override argument to blk_max_size_offset()
    and update DM's max_io_len() to pass ti->max_io_len to its
    blk_max_size_offset() call.
    
    Passing in an optional chunk_sectors override to blk_max_size_offset()
    allows for code reuse of block's centralized calculation for max IO
    size based on provided offset and split boundary.
    
    Fixes: 882ec4e609c1 ("dm table: stack 'chunk_sectors' limit to account for target-specific splitting")
    Fixes: 5091cdec56fa ("dm: change max_io_len() to use blk_max_size_offset()")
    Cc: stable at vger.kernel.org
    Reported-by: John Dorminy <jdorminy at redhat.com>
    Reported-by: Bruce Johnston <bjohnsto at redhat.com>
    Reported-by: Kirill Tkhai <ktkhai at virtuozzo.com>
    Reviewed-by: John Dorminy <jdorminy at redhat.com>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>
    Reviewed-by: Jens Axboe <axboe at kernel.dk>

diff --git a/block/blk-merge.c b/block/blk-merge.c
index bcf5e4580603..97b7c2821565 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -144,7 +144,7 @@ static struct bio *blk_bio_write_same_split(struct request_queue *q,
 static inline unsigned get_max_io_size(struct request_queue *q,
 				       struct bio *bio)
 {
-	unsigned sectors = blk_max_size_offset(q, bio->bi_iter.bi_sector);
+	unsigned sectors = blk_max_size_offset(q, bio->bi_iter.bi_sector, 0);
 	unsigned max_sectors = sectors;
 	unsigned pbs = queue_physical_block_size(q) >> SECTOR_SHIFT;
 	unsigned lbs = queue_logical_block_size(q) >> SECTOR_SHIFT;
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 2073ee8d18f4..7eeb7c4169c9 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -18,7 +18,6 @@
 #include <linux/mutex.h>
 #include <linux/delay.h>
 #include <linux/atomic.h>
-#include <linux/lcm.h>
 #include <linux/blk-mq.h>
 #include <linux/mount.h>
 #include <linux/dax.h>
@@ -1449,10 +1448,6 @@ int dm_calculate_queue_limits(struct dm_table *table,
 			zone_sectors = ti_limits.chunk_sectors;
 		}
 
-		/* Stack chunk_sectors if target-specific splitting is required */
-		if (ti->max_io_len)
-			ti_limits.chunk_sectors = lcm_not_zero(ti->max_io_len,
-							       ti_limits.chunk_sectors);
 		/* Set I/O hints portion of queue limits */
 		if (ti->type->io_hints)
 			ti->type->io_hints(ti, &ti_limits);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 98866e725f25..f7eb3d2964f3 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1039,15 +1039,18 @@ static sector_t max_io_len(struct dm_target *ti, sector_t sector)
 	sector_t max_len;
 
 	/*
-	 * Does the target need to split even further?
-	 * - q->limits.chunk_sectors reflects ti->max_io_len so
-	 *   blk_max_size_offset() provides required splitting.
-	 * - blk_max_size_offset() also respects q->limits.max_sectors
+	 * Does the target need to split IO even further?
+	 * - varied (per target) IO splitting is a tenet of DM; this
+	 *   explains why stacked chunk_sectors based splitting via
+	 *   blk_max_size_offset() isn't possible here. So pass in
+	 *   ti->max_io_len to override stacked chunk_sectors.
 	 */
-	max_len = blk_max_size_offset(ti->table->md->queue,
-				      target_offset);
-	if (len > max_len)
-		len = max_len;
+	if (ti->max_io_len) {
+		max_len = blk_max_size_offset(ti->table->md->queue,
+					      target_offset, ti->max_io_len);
+		if (len > max_len)
+			len = max_len;
+	}
 
 	return len;
 }
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 639cae2c158b..24ae504cf77d 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1073,11 +1073,12 @@ static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q,
  * file system requests.
  */
 static inline unsigned int blk_max_size_offset(struct request_queue *q,
-					       sector_t offset)
+					       sector_t offset,
+					       unsigned int chunk_sectors)
 {
-	unsigned int chunk_sectors = q->limits.chunk_sectors;
-
-	if (!chunk_sectors)
+	if (!chunk_sectors && q->limits.chunk_sectors)
+		chunk_sectors = q->limits.chunk_sectors;
+	else
 		return q->limits.max_sectors;
 
 	if (likely(is_power_of_2(chunk_sectors)))
@@ -1101,7 +1102,7 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq,
 	    req_op(rq) == REQ_OP_SECURE_ERASE)
 		return blk_queue_get_max_sectors(q, req_op(rq));
 
-	return min(blk_max_size_offset(q, offset),
+	return min(blk_max_size_offset(q, offset, 0),
 			blk_queue_get_max_sectors(q, req_op(rq)));
 }
 
commit a1cdfbe8f0fb2ada84fcc3dbb5ff8fdf288a99b6
Merge: bbe2ba04c5a9 bdeca45a0cc5
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Fri Dec 4 11:26:28 2020 -0800

    Merge tag 'mac80211-for-net-2020-12-04' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211
    
    Johannes Berg says:
    
    ====================
    Three small fixes:
     * initialize some data to avoid using stack garbage
     * fix 6 GHz channel selection in mac80211
     * correctly restart monitor mode interfaces in mac80211
    
    * tag 'mac80211-for-net-2020-12-04' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211:
      mac80211: set SDATA_STATE_RUNNING for monitor interfaces
      cfg80211: initialize rekey_data
      mac80211: fix return value of ieee80211_chandef_he_6ghz_oper
    ====================
    
    Link: https://lore.kernel.org/r/20201204122017.118099-1-johannes@sipsolutions.net
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit e87297fa080a7ed6b431873c771b3801cab573f5
Merge: bbe2ba04c5a9 de9b485d1dc9
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Dec 4 09:25:22 2020 -0800

    Merge tag 'drm-fixes-2020-12-04' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm fixes from Dave Airlie:
     "This week's regular fixes.
    
      i915 has fixes for a few races, use-after-free, and gpu hangs. Tegra
      just has some minor fixes that I didn't see much point in hanging on
      to. The nouveau fix is for all pre-nv50 cards and was reported a few
      times. Otherwise it's just some amdgpu, and a few misc fixes.
    
      Summary:
    
      amdgpu:
       - SMU11 manual fan fix
       - Renoir display clock fix
       - VCN3 dynamic powergating fix
    
      i915:
       - Program mocs:63 for cache eviction on gen9 (Chris)
       - Protect context lifetime with RCU (Chris)
       - Split the breadcrumb spinlock between global and contexts (Chris)
       - Retain default context state across shrinking (Venkata)
       - Limit frequency drop to RPe on parking (Chris)
       - Return earlier from intel_modeset_init() without display (Jani)
       - Defer initial modeset until after GGTT is initialized (Chris)
    
      nouveau:
       - pre-nv50 regression fix
    
      rockchip:
       - uninitialised LVDS property fix
    
      omap:
       - bridge fix
    
      panel:
       - race fix
    
      mxsfb:
       - fence sync fix
       - modifiers fix
    
      tegra:
       - idr init fix
       - sor fixes
       - output/of cleanup fix"
    
    * tag 'drm-fixes-2020-12-04' of git://anongit.freedesktop.org/drm/drm: (22 commits)
      drm/amdgpu/vcn3.0: remove old DPG workaround
      drm/amdgpu/vcn3.0: stall DPG when WPTR/RPTR reset
      drm/amd/display: Init clock value by current vbios CLKs
      drm/amdgpu/pm/smu11: Fix fan set speed bug
      drm/i915/display: Defer initial modeset until after GGTT is initialised
      drm/i915/display: return earlier from intel_modeset_init() without display
      drm/i915/gt: Limit frequency drop to RPe on parking
      drm/i915/gt: Retain default context state across shrinking
      drm/i915/gt: Split the breadcrumb spinlock between global and contexts
      drm/i915/gt: Protect context lifetime with RCU
      drm/i915/gt: Program mocs:63 for cache eviction on gen9
      drm/omap: sdi: fix bridge enable/disable
      drm/panel: sony-acx565akm: Fix race condition in probe
      drm/rockchip: Avoid uninitialized use of endpoint id in LVDS
      drm/tegra: sor: Disable clocks on error in tegra_sor_init()
      drm/nouveau: make sure ret is initialized in nouveau_ttm_io_mem_reserve
      drm: mxsfb: Implement .format_mod_supported
      drm: mxsfb: fix fence synchronization
      drm/tegra: output: Do not put OF node twice
      drm/tegra: replace idr_init() by idr_init_base()
      ...

commit c8bcd9c5be24fb9e6132e97da5a35e55a83e36b9
Author: Jann Horn <jannh at google.com>
Date:   Thu Dec 3 02:25:05 2020 +0100

    tty: Fix ->session locking
    
    Currently, locking of ->session is very inconsistent; most places
    protect it using the legacy tty mutex, but disassociate_ctty(),
    __do_SAK(), tiocspgrp() and tiocgsid() don't.
    Two of the writers hold the ctrl_lock (because they already need it for
    ->pgrp), but __proc_set_tty() doesn't do that yet.
    
    On a PREEMPT=y system, an unprivileged user can theoretically abuse
    this broken locking to read 4 bytes of freed memory via TIOCGSID if
    tiocgsid() is preempted long enough at the right point. (Other things
    might also go wrong, especially if root-only ioctls are involved; I'm
    not sure about that.)
    
    Change the locking on ->session such that:
    
     - tty_lock() is held by all writers: By making disassociate_ctty()
       hold it. This should be fine because the same lock can already be
       taken through the call to tty_vhangup_session().
       The tricky part is that we need to shorten the area covered by
       siglock to be able to take tty_lock() without ugly retry logic; as
       far as I can tell, this should be fine, since nothing in the
       signal_struct is touched in the `if (tty)` branch.
     - ctrl_lock is held by all writers: By changing __proc_set_tty() to
       hold the lock a little longer.
     - All readers that aren't holding tty_lock() hold ctrl_lock: By
       adding locking to tiocgsid() and __do_SAK(), and expanding the area
       covered by ctrl_lock in tiocspgrp().
    
    Cc: stable at kernel.org
    Signed-off-by: Jann Horn <jannh at google.com>
    Reviewed-by: Jiri Slaby <jirislaby at kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index 9f8b9a567b35..56ade99ef99f 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -2897,10 +2897,14 @@ void __do_SAK(struct tty_struct *tty)
 	struct task_struct *g, *p;
 	struct pid *session;
 	int		i;
+	unsigned long flags;
 
 	if (!tty)
 		return;
-	session = tty->session;
+
+	spin_lock_irqsave(&tty->ctrl_lock, flags);
+	session = get_pid(tty->session);
+	spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 
 	tty_ldisc_flush(tty);
 
@@ -2932,6 +2936,7 @@ void __do_SAK(struct tty_struct *tty)
 		task_unlock(p);
 	} while_each_thread(g, p);
 	read_unlock(&tasklist_lock);
+	put_pid(session);
 #endif
 }
 
diff --git a/drivers/tty/tty_jobctrl.c b/drivers/tty/tty_jobctrl.c
index baadeea4a289..aa6d0537b379 100644
--- a/drivers/tty/tty_jobctrl.c
+++ b/drivers/tty/tty_jobctrl.c
@@ -103,8 +103,8 @@ static void __proc_set_tty(struct tty_struct *tty)
 	put_pid(tty->session);
 	put_pid(tty->pgrp);
 	tty->pgrp = get_pid(task_pgrp(current));
-	spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 	tty->session = get_pid(task_session(current));
+	spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 	if (current->signal->tty) {
 		tty_debug(tty, "current tty %s not NULL!!\n",
 			  current->signal->tty->name);
@@ -293,20 +293,23 @@ void disassociate_ctty(int on_exit)
 	spin_lock_irq(&current->sighand->siglock);
 	put_pid(current->signal->tty_old_pgrp);
 	current->signal->tty_old_pgrp = NULL;
-
 	tty = tty_kref_get(current->signal->tty);
+	spin_unlock_irq(&current->sighand->siglock);
+
 	if (tty) {
 		unsigned long flags;
+
+		tty_lock(tty);
 		spin_lock_irqsave(&tty->ctrl_lock, flags);
 		put_pid(tty->session);
 		put_pid(tty->pgrp);
 		tty->session = NULL;
 		tty->pgrp = NULL;
 		spin_unlock_irqrestore(&tty->ctrl_lock, flags);
+		tty_unlock(tty);
 		tty_kref_put(tty);
 	}
 
-	spin_unlock_irq(&current->sighand->siglock);
 	/* Now clear signal->tty under the lock */
 	read_lock(&tasklist_lock);
 	session_clear_tty(task_session(current));
@@ -477,14 +480,19 @@ static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
 		return -ENOTTY;
 	if (retval)
 		return retval;
-	if (!current->signal->tty ||
-	    (current->signal->tty != real_tty) ||
-	    (real_tty->session != task_session(current)))
-		return -ENOTTY;
+
 	if (get_user(pgrp_nr, p))
 		return -EFAULT;
 	if (pgrp_nr < 0)
 		return -EINVAL;
+
+	spin_lock_irq(&real_tty->ctrl_lock);
+	if (!current->signal->tty ||
+	    (current->signal->tty != real_tty) ||
+	    (real_tty->session != task_session(current))) {
+		retval = -ENOTTY;
+		goto out_unlock_ctrl;
+	}
 	rcu_read_lock();
 	pgrp = find_vpid(pgrp_nr);
 	retval = -ESRCH;
@@ -494,12 +502,12 @@ static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
 	if (session_of_pgrp(pgrp) != task_session(current))
 		goto out_unlock;
 	retval = 0;
-	spin_lock_irq(&real_tty->ctrl_lock);
 	put_pid(real_tty->pgrp);
 	real_tty->pgrp = get_pid(pgrp);
-	spin_unlock_irq(&real_tty->ctrl_lock);
 out_unlock:
 	rcu_read_unlock();
+out_unlock_ctrl:
+	spin_unlock_irq(&real_tty->ctrl_lock);
 	return retval;
 }
 
@@ -511,20 +519,30 @@ out_unlock:
  *
  *	Obtain the session id of the tty. If there is no session
  *	return an error.
- *
- *	Locking: none. Reference to current->signal->tty is safe.
  */
 static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
 {
+	unsigned long flags;
+	pid_t sid;
+
 	/*
 	 * (tty == real_tty) is a cheap way of
 	 * testing if the tty is NOT a master pty.
 	*/
 	if (tty == real_tty && current->signal->tty != real_tty)
 		return -ENOTTY;
+
+	spin_lock_irqsave(&real_tty->ctrl_lock, flags);
 	if (!real_tty->session)
-		return -ENOTTY;
-	return put_user(pid_vnr(real_tty->session), p);
+		goto err;
+	sid = pid_vnr(real_tty->session);
+	spin_unlock_irqrestore(&real_tty->ctrl_lock, flags);
+
+	return put_user(sid, p);
+
+err:
+	spin_unlock_irqrestore(&real_tty->ctrl_lock, flags);
+	return -ENOTTY;
 }
 
 /*
diff --git a/include/linux/tty.h b/include/linux/tty.h
index a99e9b8e4e31..eb33d948788c 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -306,6 +306,10 @@ struct tty_struct {
 	struct termiox *termiox;	/* May be NULL for unsupported */
 	char name[64];
 	struct pid *pgrp;		/* Protected by ctrl lock */
+	/*
+	 * Writes protected by both ctrl lock and legacy mutex, readers must use
+	 * at least one of them.
+	 */
 	struct pid *session;
 	unsigned long flags;
 	int count;
commit 54ffccbf053b5b6ca4f6e45094b942fab92a25fc
Author: Jann Horn <jannh at google.com>
Date:   Thu Dec 3 02:25:04 2020 +0100

    tty: Fix ->pgrp locking in tiocspgrp()
    
    tiocspgrp() takes two tty_struct pointers: One to the tty that userspace
    passed to ioctl() (`tty`) and one to the TTY being changed (`real_tty`).
    These pointers are different when ioctl() is called with a master fd.
    
    To properly lock real_tty->pgrp, we must take real_tty->ctrl_lock.
    
    This bug makes it possible for racing ioctl(TIOCSPGRP, ...) calls on
    both sides of a PTY pair to corrupt the refcount of `struct pid`,
    leading to use-after-free errors.
    
    Fixes: 47f86834bbd4 ("redo locking of tty->pgrp")
    CC: stable at kernel.org
    Signed-off-by: Jann Horn <jannh at google.com>
    Reviewed-by: Jiri Slaby <jirislaby at kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/tty/tty_jobctrl.c b/drivers/tty/tty_jobctrl.c
index 28a23a0fef21..baadeea4a289 100644
--- a/drivers/tty/tty_jobctrl.c
+++ b/drivers/tty/tty_jobctrl.c
@@ -494,10 +494,10 @@ static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
 	if (session_of_pgrp(pgrp) != task_session(current))
 		goto out_unlock;
 	retval = 0;
-	spin_lock_irq(&tty->ctrl_lock);
+	spin_lock_irq(&real_tty->ctrl_lock);
 	put_pid(real_tty->pgrp);
 	real_tty->pgrp = get_pid(pgrp);
-	spin_unlock_irq(&tty->ctrl_lock);
+	spin_unlock_irq(&real_tty->ctrl_lock);
 out_unlock:
 	rcu_read_unlock();
 	return retval;
commit 12c8a8ca117f3d734babc3fba131fdaa329d2163
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Dec 4 18:21:16 2020 +0800

    xsk: Return error code if force_zc is set
    
    If force_zc is set, we should exit out with an error, not fall back to
    copy mode.
    
    Fixes: 921b68692abb ("xsk: Enable sharing of dma mappings")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Link: https://lore.kernel.org/bpf/1607077277-41995-1-git-send-email-zhangchangzhong@huawei.com

diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c
index 9287eddec52c..d5adeee9d5d9 100644
--- a/net/xdp/xsk_buff_pool.c
+++ b/net/xdp/xsk_buff_pool.c
@@ -175,6 +175,7 @@ static int __xp_assign_dev(struct xsk_buff_pool *pool,
 
 	if (!pool->dma_pages) {
 		WARN(1, "Driver did not DMA map zero-copy buffers");
+		err = -EINVAL;
 		goto err_unreg_xsk;
 	}
 	pool->umem->zc = true;
commit a4b98a7512f18534ce33a7e98e49115af59ffa00
Author: Vamsi Krishna Samavedam <vskrishn at codeaurora.org>
Date:   Mon Nov 30 12:34:53 2020 -0800

    usb: gadget: f_fs: Use local copy of descriptors for userspace copy
    
    The function may be unbound causing the ffs_ep and its descriptors
    to be freed while userspace is in the middle of an ioctl requesting
    the same descriptors. Avoid dangling pointer reference by first
    making a local copy of desctiptors before releasing the spinlock.
    
    Fixes: c559a3534109 ("usb: gadget: f_fs: add ioctl returning ep descriptor")
    Reviewed-by: Peter Chen <peter.chen at nxp.com>
    Signed-off-by: Vamsi Krishna Samavedam <vskrishn at codeaurora.org>
    Signed-off-by: Jack Pham <jackp at codeaurora.org>
    Cc: stable <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201130203453.28154-1-jackp@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index 046f770a76da..c727cb5de871 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -1324,7 +1324,7 @@ static long ffs_epfile_ioctl(struct file *file, unsigned code,
 	case FUNCTIONFS_ENDPOINT_DESC:
 	{
 		int desc_idx;
-		struct usb_endpoint_descriptor *desc;
+		struct usb_endpoint_descriptor desc1, *desc;
 
 		switch (epfile->ffs->gadget->speed) {
 		case USB_SPEED_SUPER:
@@ -1336,10 +1336,12 @@ static long ffs_epfile_ioctl(struct file *file, unsigned code,
 		default:
 			desc_idx = 0;
 		}
+
 		desc = epfile->ep->descs[desc_idx];
+		memcpy(&desc1, desc, desc->bLength);
 
 		spin_unlock_irq(&epfile->ffs->eps_lock);
-		ret = copy_to_user((void __user *)value, desc, desc->bLength);
+		ret = copy_to_user((void __user *)value, &desc1, desc1.bLength);
 		if (ret)
 			ret = -EFAULT;
 		return ret;
commit 45c5775460f32ed8cdb7c16986ae1a2c254346b3
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Mon Nov 30 09:30:33 2020 +0100

    usb: ohci-omap: Fix descriptor conversion
    
    There were a bunch of issues with the patch converting the
    OMAP1 OSK board to use descriptors for controlling the USB
    host:
    
    - The chip label was incorrect
    - The GPIO offset was off-by-one
    - The code should use sleeping accessors
    
    This patch tries to fix all issues at the same time.
    
    Cc: Aaro Koskinen <aaro.koskinen at iki.fi>
    Reported-by: Aaro Koskinen <aaro.koskinen at iki.fi>
    Fixes: 15d157e87443 ("usb: ohci-omap: Convert to use GPIO descriptors")
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Link: https://lore.kernel.org/r/20201130083033.29435-1-linus.walleij@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c
index 144b9caa935c..a720259099ed 100644
--- a/arch/arm/mach-omap1/board-osk.c
+++ b/arch/arm/mach-omap1/board-osk.c
@@ -288,7 +288,7 @@ static struct gpiod_lookup_table osk_usb_gpio_table = {
 	.dev_id = "ohci",
 	.table = {
 		/* Power GPIO on the I2C-attached TPS65010 */
-		GPIO_LOOKUP("i2c-tps65010", 1, "power", GPIO_ACTIVE_HIGH),
+		GPIO_LOOKUP("tps65010", 0, "power", GPIO_ACTIVE_HIGH),
 		GPIO_LOOKUP(OMAP_GPIO_LABEL, 9, "overcurrent",
 			    GPIO_ACTIVE_HIGH),
 	},
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c
index 9ccdf2c216b5..6374501ba139 100644
--- a/drivers/usb/host/ohci-omap.c
+++ b/drivers/usb/host/ohci-omap.c
@@ -91,14 +91,14 @@ static int omap_ohci_transceiver_power(struct ohci_omap_priv *priv, int on)
 				| ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)),
 			       INNOVATOR_FPGA_CAM_USB_CONTROL);
 		else if (priv->power)
-			gpiod_set_value(priv->power, 0);
+			gpiod_set_value_cansleep(priv->power, 0);
 	} else {
 		if (machine_is_omap_innovator() && cpu_is_omap1510())
 			__raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL)
 				& ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)),
 			       INNOVATOR_FPGA_CAM_USB_CONTROL);
 		else if (priv->power)
-			gpiod_set_value(priv->power, 1);
+			gpiod_set_value_cansleep(priv->power, 1);
 	}
 
 	return 0;
commit 97ad4a77f23e30801d2c0ef0c12b59f0e5760e6e
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Fri Dec 4 16:01:23 2020 +0100

    Revert "usb-storage: fix sdev->host->dma_dev"
    
    This reverts commit 0154012f8018bba4d9971d1007c12ffd48539ddb as Hans
    reports it causes problems on some systems.  Until a "real" fix for this
    can be found, revert this change to get normal functionality back.
    
    Link: https://lore.kernel.org/r/70ca74c2-4a80-e25b-eca9-a63a75516673@redhat.com
    Cc: Tom Yan <tom.ty89 at gmail.com>
    Cc: Alan Stern <stern at rowland.harvard.edu>
    Tested-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index 560efd1479ba..e5a971b83e3f 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -92,7 +92,7 @@ static int slave_alloc (struct scsi_device *sdev)
 static int slave_configure(struct scsi_device *sdev)
 {
 	struct us_data *us = host_to_us(sdev->host);
-	struct device *dev = sdev->host->dma_dev;
+	struct device *dev = us->pusb_dev->bus->sysdev;
 
 	/*
 	 * Many devices have trouble transferring more than 32KB at a time,
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index c2ef367cf257..94a64729dc27 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -1049,9 +1049,8 @@ int usb_stor_probe2(struct us_data *us)
 		goto BadDevice;
 	usb_autopm_get_interface_no_resume(us->pusb_intf);
 	snprintf(us->scsi_name, sizeof(us->scsi_name), "usb-storage %s",
-					dev_name(dev));
-	result = scsi_add_host_with_dma(us_to_host(us), dev,
-					us->pusb_dev->bus->sysdev);
+					dev_name(&us->pusb_intf->dev));
+	result = scsi_add_host(us_to_host(us), dev);
 	if (result) {
 		dev_warn(dev,
 				"Unable to add the scsi host\n");
commit d5c65d32dc240bf600d9e54250a8133e93ece60a
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Fri Dec 4 16:00:34 2020 +0100

    Revert "uas: fix sdev->host->dma_dev"
    
    This reverts commit 558033c2828f832ab3b68c6f8b8710e0de6faef0 as Hans
    reports it causes problems on some systems.  Until a "real" fix for this
    can be found, revert this change to get normal functionality back.
    
    Link: https://lore.kernel.org/r/70ca74c2-4a80-e25b-eca9-a63a75516673@redhat.com
    Cc: Tom Yan <tom.ty89 at gmail.com>
    Cc: Alan Stern <stern at rowland.harvard.edu>
    Tested-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 9369c6df80c3..652d6d6f1f36 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -837,22 +837,17 @@ static int uas_slave_alloc(struct scsi_device *sdev)
 	 */
 	blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1));
 
+	if (devinfo->flags & US_FL_MAX_SECTORS_64)
+		blk_queue_max_hw_sectors(sdev->request_queue, 64);
+	else if (devinfo->flags & US_FL_MAX_SECTORS_240)
+		blk_queue_max_hw_sectors(sdev->request_queue, 240);
+
 	return 0;
 }
 
 static int uas_slave_configure(struct scsi_device *sdev)
 {
 	struct uas_dev_info *devinfo = sdev->hostdata;
-	struct device *dev = sdev->host->dma_dev;
-
-	if (devinfo->flags & US_FL_MAX_SECTORS_64)
-		blk_queue_max_hw_sectors(sdev->request_queue, 64);
-	else if (devinfo->flags & US_FL_MAX_SECTORS_240)
-		blk_queue_max_hw_sectors(sdev->request_queue, 240);
-
-	blk_queue_max_hw_sectors(sdev->request_queue,
-		min_t(size_t, queue_max_hw_sectors(sdev->request_queue),
-		      dma_max_mapping_size(dev) >> SECTOR_SHIFT));
 
 	if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
 		sdev->no_report_opcodes = 1;
@@ -1038,7 +1033,7 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
 	shost->can_queue = devinfo->qdepth - 2;
 
 	usb_set_intfdata(intf, shost);
-	result = scsi_add_host_with_dma(shost, &intf->dev, udev->bus->sysdev);
+	result = scsi_add_host(shost, &intf->dev);
 	if (result)
 		goto free_streams;
 
commit da881ded10a65885cdcb87ab817eea3acf23dcf9
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Fri Dec 4 15:59:27 2020 +0100

    Revert "uas: bump hw_max_sectors to 2048 blocks for SS or faster drives"
    
    This reverts commit 5df7ef7d32fec1d6d1c34dbec019b461a12ce870 as Hans
    reports it causes problems on some systems.  Until a "real" fix for this
    can be found, revert this change to get normal functionality back.
    
    Link: https://lore.kernel.org/r/70ca74c2-4a80-e25b-eca9-a63a75516673@redhat.com
    Cc: Tom Yan <tom.ty89 at gmail.com>
    Cc: Alan Stern <stern at rowland.harvard.edu>
    Tested-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index c8a577309e8f..9369c6df80c3 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -849,8 +849,6 @@ static int uas_slave_configure(struct scsi_device *sdev)
 		blk_queue_max_hw_sectors(sdev->request_queue, 64);
 	else if (devinfo->flags & US_FL_MAX_SECTORS_240)
 		blk_queue_max_hw_sectors(sdev->request_queue, 240);
-	else if (devinfo->udev->speed >= USB_SPEED_SUPER)
-		blk_queue_max_hw_sectors(sdev->request_queue, 2048);
 
 	blk_queue_max_hw_sectors(sdev->request_queue,
 		min_t(size_t, queue_max_hw_sectors(sdev->request_queue),
commit c0d638a03bc5dfdb08fb95d0a79ecada25f40da8
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Thu Dec 3 23:29:16 2020 +0100

    mmc: mediatek: mark PM functions as __maybe_unused
    
    The #ifdef check for the suspend/resume functions is wrong:
    
    drivers/mmc/host/mtk-sd.c:2765:12: error: unused function 'msdc_suspend' [-Werror,-Wunused-function]
    static int msdc_suspend(struct device *dev)
    drivers/mmc/host/mtk-sd.c:2779:12: error: unused function 'msdc_resume' [-Werror,-Wunused-function]
    static int msdc_resume(struct device *dev)
    
    Remove the #ifdef and mark all four as __maybe_unused to aovid the
    problem.
    
    Fixes: c0a2074ac575 ("mmc: mediatek: Fix system suspend/resume support for CQHCI")
    Cc: stable at vger.kernel.org
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Link: https://lore.kernel.org/r/20201203222922.1067522-1-arnd@kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 7eb99255ae3d..004fbfc23672 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2604,7 +2604,6 @@ static int msdc_drv_remove(struct platform_device *pdev)
 	return 0;
 }
 
-#ifdef CONFIG_PM
 static void msdc_save_reg(struct msdc_host *host)
 {
 	u32 tune_reg = host->dev_comp->pad_tune_reg;
@@ -2663,7 +2662,7 @@ static void msdc_restore_reg(struct msdc_host *host)
 		__msdc_enable_sdio_irq(host, 1);
 }
 
-static int msdc_runtime_suspend(struct device *dev)
+static int __maybe_unused msdc_runtime_suspend(struct device *dev)
 {
 	struct mmc_host *mmc = dev_get_drvdata(dev);
 	struct msdc_host *host = mmc_priv(mmc);
@@ -2673,7 +2672,7 @@ static int msdc_runtime_suspend(struct device *dev)
 	return 0;
 }
 
-static int msdc_runtime_resume(struct device *dev)
+static int __maybe_unused msdc_runtime_resume(struct device *dev)
 {
 	struct mmc_host *mmc = dev_get_drvdata(dev);
 	struct msdc_host *host = mmc_priv(mmc);
@@ -2683,7 +2682,7 @@ static int msdc_runtime_resume(struct device *dev)
 	return 0;
 }
 
-static int msdc_suspend(struct device *dev)
+static int __maybe_unused msdc_suspend(struct device *dev)
 {
 	struct mmc_host *mmc = dev_get_drvdata(dev);
 	int ret;
@@ -2697,11 +2696,10 @@ static int msdc_suspend(struct device *dev)
 	return pm_runtime_force_suspend(dev);
 }
 
-static int msdc_resume(struct device *dev)
+static int __maybe_unused msdc_resume(struct device *dev)
 {
 	return pm_runtime_force_resume(dev);
 }
-#endif
 
 static const struct dev_pm_ops msdc_dev_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(msdc_suspend, msdc_resume)
commit 6246d7c9d15aaff0bc3863f67900c6a6e6be921b
Author: Bean Huo <beanhuo at micron.com>
Date:   Wed Dec 2 21:23:20 2020 +0100

    mmc: block: Fixup condition for CMD13 polling for RPMB requests
    
    The CMD13 polling is needed for commands with R1B responses. In commit
    a0d4c7eb71dd ("mmc: block: Add CMD13 polling for MMC IOCTLS with R1B
    response"), the intent was to introduce this for requests targeted to the
    RPMB partition. However, the condition to trigger the polling loop became
    wrong, leading to unnecessary polling. Let's fix the condition to avoid
    this.
    
    Fixes: a0d4c7eb71dd ("mmc: block: Add CMD13 polling for MMC IOCTLS with R1B response")
    Cc: stable at vger.kernel.org
    Reported-by: Zhan Liu <zliua at micron.com>
    Signed-off-by: Zhan Liu <zliua at micron.com>
    Signed-off-by: Bean Huo <beanhuo at micron.com>
    Link: https://lore.kernel.org/r/20201202202320.22165-1-huobean@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 8d3df0be0355..42e27a298218 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -580,7 +580,7 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
 
 	memcpy(&(idata->ic.response), cmd.resp, sizeof(cmd.resp));
 
-	if (idata->rpmb || (cmd.flags & MMC_RSP_R1B)) {
+	if (idata->rpmb || (cmd.flags & MMC_RSP_R1B) == MMC_RSP_R1B) {
 		/*
 		 * Ensure RPMB/R1B command has completed by polling CMD13
 		 * "Send Status".
commit b48a7e755939940136266248e79f9e4bdbe99521
Merge: d3f31301894d 3f203f057edf
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Fri Dec 4 13:15:55 2020 +0100

    Merge tag 'usb-serial-5.10-rc7' of https://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial into usb-linus
    
    Johan writes:
    
    USB-serial fixes for 5.10-rc7
    
    Here's a fix for a regression in the option driver which has been
    backported to the stable trees and fix for a small memory leak on open
    in the kl5kusb105 driver.
    
    Included are also various new device ids.
    
    All but the memleak fix has been in linux-next and with no reported
    issues.
    
    * tag 'usb-serial-5.10-rc7' of https://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial:
      USB: serial: kl5kusb105: fix memleak on open
      USB: serial: ch341: sort device-id entries
      USB: serial: ch341: add new Product ID for CH341A
      USB: serial: option: fix Quectel BG96 matching
      USB: serial: option: add support for Thales Cinterion EXS82
      USB: serial: option: add Fibocom NL668 variants

commit bdeca45a0cc58f864f1eb2e919304203ff5c5f39
Author: Borwankar, Antara <antara.borwankar at intel.com>
Date:   Sun Nov 29 17:30:53 2020 +0200

    mac80211: set SDATA_STATE_RUNNING for monitor interfaces
    
    During restarrt, mac80211 is supposed to reconfigure the driver.
    When there's a monitor interface, the interface is added and the
    channel context for it was created, but not assigned to it as it
    was not considered running during the restart.
    
    Fix this by setting SDATA_STATE_RUNNING while adding monitor
    interfaces.
    
    Signed-off-by: Borwankar, Antara <antara.borwankar at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20201129172929.e1df99693a4c.I494579f28018c2d0b9d4083a664cf872c28405ae@changeid
    [reword commit log]
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 1be775979132..44154cc596cd 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -948,6 +948,8 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
 		return ret;
 	}
 
+	set_bit(SDATA_STATE_RUNNING, &sdata->state);
+
 	ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR);
 	if (ret) {
 		kfree(sdata);
commit f495acd8851d7b345e5f0e521b2645b1e1f928a0
Author: Sara Sharon <sara.sharon at intel.com>
Date:   Sun Nov 29 17:30:44 2020 +0200

    cfg80211: initialize rekey_data
    
    In case we have old supplicant, the akm field is uninitialized.
    
    Signed-off-by: Sara Sharon <sara.sharon at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20201129172929.930f0ab7ebee.Ic546e384efab3f4a89f318eafddc3eb7d556aecb@changeid
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index a77174b99b07..f67ddf2cebcb 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -12634,7 +12634,7 @@ static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
 	struct net_device *dev = info->user_ptr[1];
 	struct wireless_dev *wdev = dev->ieee80211_ptr;
 	struct nlattr *tb[NUM_NL80211_REKEY_DATA];
-	struct cfg80211_gtk_rekey_data rekey_data;
+	struct cfg80211_gtk_rekey_data rekey_data = {};
 	int err;
 
 	if (!info->attrs[NL80211_ATTR_REKEY_DATA])
commit 8fca2b8706f39f86312c086229e0cb364f8b4f97
Author: Wen Gong <wgong at codeaurora.org>
Date:   Mon Nov 23 16:45:52 2020 +0800

    mac80211: fix return value of ieee80211_chandef_he_6ghz_oper
    
    ieee80211_chandef_he_6ghz_oper() needs to return true if it
    determined a value 6 GHz chandef, fix that.
    
    Fixes: 1d00ce807efa ("mac80211: support S1G association")
    Signed-off-by: Wen Gong <wgong at codeaurora.org>
    Link: https://lore.kernel.org/r/1606121152-3452-1-git-send-email-wgong@codeaurora.org
    [rewrite commit message]
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 49342060490f..94e624e9439b 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -3455,7 +3455,7 @@ bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_sub_if_data *sdata,
 
 	*chandef = he_chandef;
 
-	return false;
+	return true;
 }
 
 bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie *oper,
commit 32a9e0c445fa5abfd8730461c3ae0be1860bc6b2
Author: Wolfram Sang <wsa+renesas at sang-engineering.com>
Date:   Wed Nov 25 21:49:53 2020 +0100

    mmc: tmio: improve bringing HW to a sane state with MMC_POWER_OFF
    
    Further testing of error cases revealed that downgrade is not enough, so
    we need to reset the SCC which is done by calling the custom reset
    function. This reset function can distinguish between the various SDHI
    variants, so protecting the call with MIN_RCAR2 is enough here.
    
    Fixes: 24ce2d7b8bea ("mmc: tmio: bring tuning HW to a sane state with MMC_POWER_OFF")
    Reported-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Signed-off-by: Wolfram Sang <wsa+renesas at sang-engineering.com>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Link: https://lore.kernel.org/r/20201125204953.3344-1-wsa+renesas@sang-engineering.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c
index cb4149fd12e0..ac4e7874a3f1 100644
--- a/drivers/mmc/host/tmio_mmc_core.c
+++ b/drivers/mmc/host/tmio_mmc_core.c
@@ -927,9 +927,9 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	switch (ios->power_mode) {
 	case MMC_POWER_OFF:
 		tmio_mmc_power_off(host);
-		/* Downgrade ensures a sane state for tuning HW (e.g. SCC) */
-		if (host->mmc->ops->hs400_downgrade)
-			host->mmc->ops->hs400_downgrade(host->mmc);
+		/* For R-Car Gen2+, we need to reset SDHI specific SCC */
+		if (host->pdata->flags & TMIO_MMC_MIN_RCAR2)
+			host->reset(host);
 		host->set_clock(host, 0);
 		break;
 	case MMC_POWER_UP:
commit 3f203f057edfcf6bd02c6b942799262bfcf31f73
Author: Johan Hovold <johan at kernel.org>
Date:   Fri Dec 4 09:55:19 2020 +0100

    USB: serial: kl5kusb105: fix memleak on open
    
    Fix memory leak of control-message transfer buffer on successful open().
    
    Fixes: 6774d5f53271 ("USB: serial: kl5kusb105: fix open error path")
    Cc: stable at vger.kernel.org
    Signed-off-by: Johan Hovold <johan at kernel.org>

diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
index 5ee48b0650c4..5f6b82ebccc5 100644
--- a/drivers/usb/serial/kl5kusb105.c
+++ b/drivers/usb/serial/kl5kusb105.c
@@ -276,12 +276,12 @@ static int  klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
 	priv->cfg.unknown2 = cfg->unknown2;
 	spin_unlock_irqrestore(&priv->lock, flags);
 
+	kfree(cfg);
+
 	/* READ_ON and urb submission */
 	rc = usb_serial_generic_open(tty, port);
-	if (rc) {
-		retval = rc;
-		goto err_free_cfg;
-	}
+	if (rc)
+		return rc;
 
 	rc = usb_control_msg(port->serial->dev,
 			     usb_sndctrlpipe(port->serial->dev, 0),
@@ -324,8 +324,6 @@ err_disable_read:
 			     KLSI_TIMEOUT);
 err_generic_close:
 	usb_serial_generic_close(port);
-err_free_cfg:
-	kfree(cfg);
 
 	return retval;
 }
commit 4e302c3b568eaf2aeebba804c07aba5d921a8c9e
Author: Diego Santa Cruz <Diego.SantaCruz at spinetix.com>
Date:   Thu Dec 3 22:47:03 2020 +0100

    misc: eeprom: at24: fix NVMEM name with custom AT24 device name
    
    When the "label" property is set on the AT24 EEPROM the NVMEM devid is
    set to NVMEM_DEVID_NONE, but it is not effective since there is a
    leftover line setting it back to NVMEM_DEVID_AUTO a few lines after.
    
    Fixes: 61f764c307f6 ("eeprom: at24: Support custom device names for AT24 EEPROMs")
    Signed-off-by: Diego Santa Cruz <Diego.SantaCruz at spinetix.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 1c0a41803bb6..926408b41270 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -736,7 +736,6 @@ static int at24_probe(struct i2c_client *client)
 
 	nvmem_config.type = NVMEM_TYPE_EEPROM;
 	nvmem_config.dev = dev;
-	nvmem_config.id = NVMEM_DEVID_AUTO;
 	nvmem_config.read_only = !writable;
 	nvmem_config.root_only = !(flags & AT24_FLAG_IRUGO);
 	nvmem_config.owner = THIS_MODULE;
commit 47a0001436352c9853d72bf2071e85b316d688a2
Author: Coiby Xu <coiby.xu at gmail.com>
Date:   Wed Nov 25 21:03:19 2020 +0800

    pinctrl: amd: remove debounce filter setting in IRQ type setting
    
    Debounce filter setting should be independent from IRQ type setting
    because according to the ACPI specs, there are separate arguments for
    specifying debounce timeout and IRQ type in GpioIo() and GpioInt().
    
    Together with commit 06abe8291bc31839950f7d0362d9979edc88a666
    ("pinctrl: amd: fix incorrect way to disable debounce filter") and
    Andy's patch "gpiolib: acpi: Take into account debounce settings" [1],
    this will fix broken touchpads for laptops whose BIOS set the
    debounce timeout to a relatively large value. For example, the BIOS
    of Lenovo AMD gaming laptops including Legion-5 15ARH05 (R7000),
    Legion-5P (R7000P) and IdeaPad Gaming 3 15ARH05, set the debounce
    timeout to 124.8ms. This led to the kernel receiving only ~7 HID
    reports per second from the Synaptics touchpad
    (MSFT0001:00 06CB:7F28).
    
    Existing touchpads like [2][3] are not troubled by this bug because
    the debounce timeout has been set to 0 by the BIOS before enabling
    the debounce filter in setting IRQ type.
    
    [1] https://lore.kernel.org/linux-gpio/20201111222008.39993-11-andriy.shevchenko@linux.intel.com/
        8dcb7a15a585 ("gpiolib: acpi: Take into account debounce settings")
    [2] https://github.com/Syniurge/i2c-amd-mp2/issues/11#issuecomment-721331582
    [3] https://forum.manjaro.org/t/random-short-touchpad-freezes/30832/28
    
    Signed-off-by: Coiby Xu <coiby.xu at gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Cc: Hans de Goede <hdegoede at redhat.com>
    Cc: Andy Shevchenko <andy.shevchenko at gmail.com>
    Cc: Benjamin Tissoires <benjamin.tissoires at redhat.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/linux-gpio/CAHp75VcwiGREBUJ0A06EEw-SyabqYsp%2Bdqs2DpSrhaY-2GVdAA%40mail.gmail.com/
    BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1887190
    Link: https://lore.kernel.org/r/20201125130320.311059-1-coiby.xu@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index 4aea3e05e8c6..899c16c17b6d 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -429,7 +429,6 @@ static int amd_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 		pin_reg &= ~BIT(LEVEL_TRIG_OFF);
 		pin_reg &= ~(ACTIVE_LEVEL_MASK << ACTIVE_LEVEL_OFF);
 		pin_reg |= ACTIVE_HIGH << ACTIVE_LEVEL_OFF;
-		pin_reg |= DB_TYPE_REMOVE_GLITCH << DB_CNTRL_OFF;
 		irq_set_handler_locked(d, handle_edge_irq);
 		break;
 
@@ -437,7 +436,6 @@ static int amd_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 		pin_reg &= ~BIT(LEVEL_TRIG_OFF);
 		pin_reg &= ~(ACTIVE_LEVEL_MASK << ACTIVE_LEVEL_OFF);
 		pin_reg |= ACTIVE_LOW << ACTIVE_LEVEL_OFF;
-		pin_reg |= DB_TYPE_REMOVE_GLITCH << DB_CNTRL_OFF;
 		irq_set_handler_locked(d, handle_edge_irq);
 		break;
 
@@ -445,7 +443,6 @@ static int amd_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 		pin_reg &= ~BIT(LEVEL_TRIG_OFF);
 		pin_reg &= ~(ACTIVE_LEVEL_MASK << ACTIVE_LEVEL_OFF);
 		pin_reg |= BOTH_EADGE << ACTIVE_LEVEL_OFF;
-		pin_reg |= DB_TYPE_REMOVE_GLITCH << DB_CNTRL_OFF;
 		irq_set_handler_locked(d, handle_edge_irq);
 		break;
 
@@ -453,8 +450,6 @@ static int amd_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 		pin_reg |= LEVEL_TRIGGER << LEVEL_TRIG_OFF;
 		pin_reg &= ~(ACTIVE_LEVEL_MASK << ACTIVE_LEVEL_OFF);
 		pin_reg |= ACTIVE_HIGH << ACTIVE_LEVEL_OFF;
-		pin_reg &= ~(DB_CNTRl_MASK << DB_CNTRL_OFF);
-		pin_reg |= DB_TYPE_PRESERVE_LOW_GLITCH << DB_CNTRL_OFF;
 		irq_set_handler_locked(d, handle_level_irq);
 		break;
 
@@ -462,8 +457,6 @@ static int amd_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 		pin_reg |= LEVEL_TRIGGER << LEVEL_TRIG_OFF;
 		pin_reg &= ~(ACTIVE_LEVEL_MASK << ACTIVE_LEVEL_OFF);
 		pin_reg |= ACTIVE_LOW << ACTIVE_LEVEL_OFF;
-		pin_reg &= ~(DB_CNTRl_MASK << DB_CNTRL_OFF);
-		pin_reg |= DB_TYPE_PRESERVE_HIGH_GLITCH << DB_CNTRL_OFF;
 		irq_set_handler_locked(d, handle_level_irq);
 		break;
 
commit 339f5a7fb2d6350fdb11f067da5240fd97e4f284
Author: Rick Edgecombe <rick.p.edgecombe at intel.com>
Date:   Thu Dec 3 15:11:20 2020 -0800

    kvm: x86/mmu: Use cpuid to determine max gfn
    
    In the TDP MMU, use shadow_phys_bits to dermine the maximum possible GFN
    mapped in the guest for zapping operations. boot_cpu_data.x86_phys_bits
    may be reduced in the case of HW features that steal HPA bits for other
    purposes. However, this doesn't necessarily reduce GPA space that can be
    accessed via TDP. So zap based on a maximum gfn calculated with MAXPHYADDR
    retrieved from CPUID. This is already stored in shadow_phys_bits, so use
    it instead of x86_phys_bits.
    
    Fixes: faaf05b00aec ("kvm: x86/mmu: Support zapping SPTEs in the TDP MMU")
    Signed-off-by: Rick Edgecombe <rick.p.edgecombe at intel.com>
    Message-Id: <20201203231120.27307-1-rick.p.edgecombe at intel.com>
    Reviewed-by: Sean Christopherson <seanjc at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
index ff28a5c6abd6..84c8f06bec26 100644
--- a/arch/x86/kvm/mmu/tdp_mmu.c
+++ b/arch/x86/kvm/mmu/tdp_mmu.c
@@ -66,7 +66,7 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
 
 void kvm_tdp_mmu_free_root(struct kvm *kvm, struct kvm_mmu_page *root)
 {
-	gfn_t max_gfn = 1ULL << (boot_cpu_data.x86_phys_bits - PAGE_SHIFT);
+	gfn_t max_gfn = 1ULL << (shadow_phys_bits - PAGE_SHIFT);
 
 	lockdep_assert_held(&kvm->mmu_lock);
 
@@ -456,7 +456,7 @@ bool kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start, gfn_t end)
 
 void kvm_tdp_mmu_zap_all(struct kvm *kvm)
 {
-	gfn_t max_gfn = 1ULL << (boot_cpu_data.x86_phys_bits - PAGE_SHIFT);
+	gfn_t max_gfn = 1ULL << (shadow_phys_bits - PAGE_SHIFT);
 	bool flush;
 
 	flush = kvm_tdp_mmu_zap_gfn_range(kvm, 0, max_gfn);
commit a2b2d4bf5076832339762556b816eec58ca38f77
Author: Jacob Xu <jacobhxu at google.com>
Date:   Thu Dec 3 12:59:39 2020 -0800

    kvm: svm: de-allocate svm_cpu_data for all cpus in svm_cpu_uninit()
    
    The cpu arg for svm_cpu_uninit() was previously ignored resulting in the
    per cpu structure svm_cpu_data not being de-allocated for all cpus.
    
    Signed-off-by: Jacob Xu <jacobhxu at google.com>
    Message-Id: <20201203205939.1783969-1-jacobhxu at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 79b3a564f1c9..da7eb4aaf44f 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -530,12 +530,12 @@ static int svm_hardware_enable(void)
 
 static void svm_cpu_uninit(int cpu)
 {
-	struct svm_cpu_data *sd = per_cpu(svm_data, raw_smp_processor_id());
+	struct svm_cpu_data *sd = per_cpu(svm_data, cpu);
 
 	if (!sd)
 		return;
 
-	per_cpu(svm_data, raw_smp_processor_id()) = NULL;
+	per_cpu(svm_data, cpu) = NULL;
 	kfree(sd->sev_vmcbs);
 	__free_page(sd->save_area);
 	kfree(sd);
commit 77c12bf3839479c3963433043e2051d738f3ab63
Merge: b65054597872 7ee1a01e4740
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Fri Dec 4 09:14:56 2020 +0100

    Merge tag 'gpio-fixes-for-v5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into fixes
    
    gpio fixes for v5.10-rc7
    
    - disable pm_runtime in error path in gpio-arizona
    - fix a NULL pointer dereference in gpio-dwapb
    - fix a resource leak in gpio-zynq
    - balance the freeing of pinctrl ranges if PINCTRL is not selected
    - fix a potential use-after-free error in gpio-mvebu

commit de9b485d1dc993f1fb579b5d15a8176284627f4a
Merge: 5353219ffdff fd4e788e971c
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 4 11:53:43 2020 +1000

    Merge tag 'drm-misc-fixes-2020-12-03' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
    
    One bridge fix for OMAP, one for a race condition in a panel, two for
    uninitialized variables in rockchip and nouveau, and two fixes for mxsfb
    to fix a regression with modifiers and a fix for a fence synchronization
    issue.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Maxime Ripard <maxime at cerno.tech>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201203125943.h2ft2xoywunt5orl@gilmour

commit 5353219ffdff68f861684a642388d6e926547698
Merge: 94cfbd05e46a efd6d85a1810
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 4 11:48:37 2020 +1000

    Merge tag 'amd-drm-fixes-5.10-2020-12-02' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
    
    amd-drm-fixes-5.10-2020-12-02:
    
    amdgpu:
    - SMU11 manual fan fix
    - Renoir display clock fix
    - VCN3 dynamic powergating fix
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    From: Alex Deucher <alexdeucher at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201203044815.41257-1-alexander.deucher@amd.com

commit 94cfbd05e46a31cc181e7ac6bc4b32ac09f8864f
Merge: aac06646aa85 ccc9e67ab26f
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 4 11:45:37 2020 +1000

    Merge tag 'drm-intel-fixes-2020-12-03' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
    
    Fixes for GPU hang, null dereference, suspend-resume, power consumption, and use-after-free.
    
    - Program mocs:63 for cache eviction on gen9 (Chris)
    - Protect context lifetime with RCU (Chris)
    - Split the breadcrumb spinlock between global and contexts (Chris)
    - Retain default context state across shrinking (Venkata)
    - Limit frequency drop to RPe on parking (Chris)
    - Return earlier from intel_modeset_init() without display (Jani)
    - Defer initial modeset until after GGTT is initialized (Chris)
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201203134705.GA1575873@intel.com

commit ea64370bcae126a88cd26a16f1abcc23ab2b9a55
Author: Ronnie Sahlberg <lsahlber at redhat.com>
Date:   Mon Nov 30 11:29:20 2020 +1000

    cifs: refactor create_sd_buf() and and avoid corrupting the buffer
    
    When mounting with "idsfromsid" mount option, Azure
    corrupted the owner SIDs due to excessive padding
    caused by placing the owner fields at the end of the
    security descriptor on create.  Placing owners at the
    front of the security descriptor (rather than the end)
    is also safer, as the number of ACEs (that follow it)
    are variable.
    
    Signed-off-by: Ronnie Sahlberg <lsahlber at redhat.com>
    Suggested-by: Rohith Surabattula <rohiths at microsoft.com>
    CC: Stable <stable at vger.kernel.org> # v5.8
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 445e80862865..acb72705062d 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -2272,17 +2272,15 @@ static struct crt_sd_ctxt *
 create_sd_buf(umode_t mode, bool set_owner, unsigned int *len)
 {
 	struct crt_sd_ctxt *buf;
-	struct cifs_ace *pace;
-	unsigned int sdlen, acelen;
+	__u8 *ptr, *aclptr;
+	unsigned int acelen, acl_size, ace_count;
 	unsigned int owner_offset = 0;
 	unsigned int group_offset = 0;
+	struct smb3_acl acl;
 
-	*len = roundup(sizeof(struct crt_sd_ctxt) + (sizeof(struct cifs_ace) * 2), 8);
+	*len = roundup(sizeof(struct crt_sd_ctxt) + (sizeof(struct cifs_ace) * 4), 8);
 
 	if (set_owner) {
-		/* offset fields are from beginning of security descriptor not of create context */
-		owner_offset = sizeof(struct smb3_acl) + (sizeof(struct cifs_ace) * 2);
-
 		/* sizeof(struct owner_group_sids) is already multiple of 8 so no need to round */
 		*len += sizeof(struct owner_group_sids);
 	}
@@ -2291,26 +2289,22 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len)
 	if (buf == NULL)
 		return buf;
 
+	ptr = (__u8 *)&buf[1];
 	if (set_owner) {
+		/* offset fields are from beginning of security descriptor not of create context */
+		owner_offset = ptr - (__u8 *)&buf->sd;
 		buf->sd.OffsetOwner = cpu_to_le32(owner_offset);
-		group_offset = owner_offset + sizeof(struct owner_sid);
+		group_offset = owner_offset + offsetof(struct owner_group_sids, group);
 		buf->sd.OffsetGroup = cpu_to_le32(group_offset);
+
+		setup_owner_group_sids(ptr);
+		ptr += sizeof(struct owner_group_sids);
 	} else {
 		buf->sd.OffsetOwner = 0;
 		buf->sd.OffsetGroup = 0;
 	}
 
-	sdlen = sizeof(struct smb3_sd) + sizeof(struct smb3_acl) +
-		 2 * sizeof(struct cifs_ace);
-	if (set_owner) {
-		sdlen += sizeof(struct owner_group_sids);
-		setup_owner_group_sids(owner_offset + sizeof(struct create_context) + 8 /* name */
-			+ (char *)buf);
-	}
-
-	buf->ccontext.DataOffset = cpu_to_le16(offsetof
-					(struct crt_sd_ctxt, sd));
-	buf->ccontext.DataLength = cpu_to_le32(sdlen);
+	buf->ccontext.DataOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, sd));
 	buf->ccontext.NameOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, Name));
 	buf->ccontext.NameLength = cpu_to_le16(4);
 	/* SMB2_CREATE_SD_BUFFER_TOKEN is "SecD" */
@@ -2319,6 +2313,7 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len)
 	buf->Name[2] = 'c';
 	buf->Name[3] = 'D';
 	buf->sd.Revision = 1;  /* Must be one see MS-DTYP 2.4.6 */
+
 	/*
 	 * ACL is "self relative" ie ACL is stored in contiguous block of memory
 	 * and "DP" ie the DACL is present
@@ -2326,28 +2321,38 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len)
 	buf->sd.Control = cpu_to_le16(ACL_CONTROL_SR | ACL_CONTROL_DP);
 
 	/* offset owner, group and Sbz1 and SACL are all zero */
-	buf->sd.OffsetDacl = cpu_to_le32(sizeof(struct smb3_sd));
-	buf->acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */
+	buf->sd.OffsetDacl = cpu_to_le32(ptr - (__u8 *)&buf->sd);
+	/* Ship the ACL for now. we will copy it into buf later. */
+	aclptr = ptr;
+	ptr += sizeof(struct cifs_acl);
 
 	/* create one ACE to hold the mode embedded in reserved special SID */
-	pace = (struct cifs_ace *)(sizeof(struct crt_sd_ctxt) + (char *)buf);
-	acelen = setup_special_mode_ACE(pace, (__u64)mode);
+	acelen = setup_special_mode_ACE((struct cifs_ace *)ptr, (__u64)mode);
+	ptr += acelen;
+	acl_size = acelen + sizeof(struct smb3_acl);
+	ace_count = 1;
 
 	if (set_owner) {
 		/* we do not need to reallocate buffer to add the two more ACEs. plenty of space */
-		pace = (struct cifs_ace *)(acelen + (sizeof(struct crt_sd_ctxt) + (char *)buf));
-		acelen += setup_special_user_owner_ACE(pace);
-		/* it does not appear necessary to add an ACE for the NFS group SID */
-		buf->acl.AceCount = cpu_to_le16(3);
-	} else
-		buf->acl.AceCount = cpu_to_le16(2);
+		acelen = setup_special_user_owner_ACE((struct cifs_ace *)ptr);
+		ptr += acelen;
+		acl_size += acelen;
+		ace_count += 1;
+	}
 
 	/* and one more ACE to allow access for authenticated users */
-	pace = (struct cifs_ace *)(acelen + (sizeof(struct crt_sd_ctxt) +
-		(char *)buf));
-	acelen += setup_authusers_ACE(pace);
-
-	buf->acl.AclSize = cpu_to_le16(sizeof(struct cifs_acl) + acelen);
+	acelen = setup_authusers_ACE((struct cifs_ace *)ptr);
+	ptr += acelen;
+	acl_size += acelen;
+	ace_count += 1;
+
+	acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */
+	acl.AclSize = cpu_to_le16(acl_size);
+	acl.AceCount = cpu_to_le16(ace_count);
+	memcpy(aclptr, &acl, sizeof(struct cifs_acl));
+
+	buf->ccontext.DataLength = cpu_to_le32(ptr - (__u8 *)&buf->sd);
+	*len = ptr - (__u8 *)buf;
 
 	return buf;
 }
diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h
index f05f9b12f689..fa57b03ca98c 100644
--- a/fs/cifs/smb2pdu.h
+++ b/fs/cifs/smb2pdu.h
@@ -963,8 +963,6 @@ struct crt_sd_ctxt {
 	struct create_context ccontext;
 	__u8	Name[8];
 	struct smb3_sd sd;
-	struct smb3_acl acl;
-	/* Followed by at least 4 ACEs */
 } __packed;
 
 
commit 59463eb88829f646aed13283fd84d02a475334fe
Author: Aurelien Aptel <aaptel at suse.com>
Date:   Thu Dec 3 19:46:08 2020 +0100

    cifs: add NULL check for ses->tcon_ipc
    
    In some scenarios (DFS and BAD_NETWORK_NAME) set_root_set() can be
    called with a NULL ses->tcon_ipc.
    
    Signed-off-by: Aurelien Aptel <aaptel at suse.com>
    Reviewed-by: Paulo Alcantara (SUSE) <pc at cjr.nz>
    CC: Stable <stable at vger.kernel.org>
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 28c1459fb0fc..44f9cce57099 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -4546,7 +4546,8 @@ static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
 	if (ses) {
 		spin_lock(&cifs_tcp_ses_lock);
 		ses->ses_count++;
-		ses->tcon_ipc->remap = cifs_remap(cifs_sb);
+		if (ses->tcon_ipc)
+			ses->tcon_ipc->remap = cifs_remap(cifs_sb);
 		spin_unlock(&cifs_tcp_ses_lock);
 	}
 	*root_ses = ses;
commit 796317848517292eb951d8876773b98867cf3c28
Author: Namjae Jeon <namjae.jeon at samsung.com>
Date:   Thu Dec 3 12:31:36 2020 +0900

    smb3: set COMPOUND_FID to FileID field of subsequent compound request
    
    For an operation compounded with an SMB2 CREATE request, client must set
    COMPOUND_FID(0xFFFFFFFFFFFFFFFF) to FileID field of smb2 ioctl.
    
    Signed-off-by: Namjae Jeon <namjae.jeon at samsung.com>
    Fixes: 2e4564b31b645 ("smb3: add support stat of WSL reparse points for special file types")
    Reviewed-by: Aurelien Aptel <aaptel at suse.com>
    Reviewed-by: Ronnie Sahlberg <lsahlber at redhat.com>
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index dab94f67c988..3d914d7d0d11 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -3114,8 +3114,8 @@ smb2_query_reparse_tag(const unsigned int xid, struct cifs_tcon *tcon,
 	rqst[1].rq_nvec = SMB2_IOCTL_IOV_SIZE;
 
 	rc = SMB2_ioctl_init(tcon, server,
-			     &rqst[1], fid.persistent_fid,
-			     fid.volatile_fid, FSCTL_GET_REPARSE_POINT,
+			     &rqst[1], COMPOUND_FID,
+			     COMPOUND_FID, FSCTL_GET_REPARSE_POINT,
 			     true /* is_fctl */, NULL, 0,
 			     CIFSMaxBufSize -
 			     MAX_SMB2_CREATE_RESPONSE_SIZE -
commit bbe2ba04c5a92a49db8a42c850a5a2f6481e47eb
Merge: fee5be18524f 6f076ce6ab16
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 3 13:10:11 2020 -0800

    Merge tag 'net-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
    
    Pull networking fixes from Jakub Kicinski:
     "Networking fixes for 5.10-rc7, including fixes from bpf, netfilter,
      wireless drivers, wireless mesh and can.
    
      Current release - regressions:
    
       - mt76: usb: fix crash on device removal
    
      Current release - always broken:
    
       - xsk: Fix umem cleanup from wrong context in socket destruct
    
      Previous release - regressions:
    
       - net: ip6_gre: set dev->hard_header_len when using header_ops
    
       - ipv4: Fix TOS mask in inet_rtm_getroute()
    
       - net, xsk: Avoid taking multiple skbuff references
    
      Previous release - always broken:
    
       - net/x25: prevent a couple of overflows
    
       - netfilter: ipset: prevent uninit-value in hash_ip6_add
    
       - geneve: pull IP header before ECN decapsulation
    
       - mpls: ensure LSE is pullable in TC and openvswitch paths
    
       - vxlan: respect needed_headroom of lower device
    
       - batman-adv: Consider fragmentation for needed packet headroom
    
       - can: drivers: don't count arbitration loss as an error
    
       - netfilter: bridge: reset skb->pkt_type after POST_ROUTING traversal
    
       - inet_ecn: Fix endianness of checksum update when setting ECT(1)
    
       - ibmvnic: fix various corner cases around reset handling
    
       - net/mlx5: fix rejecting unsupported Connect-X6DX SW steering
    
       - net/mlx5: Enforce HW TX csum offload with kTLS"
    
    * tag 'net-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (62 commits)
      net/mlx5: DR, Proper handling of unsupported Connect-X6DX SW steering
      net/mlx5e: kTLS, Enforce HW TX csum offload with kTLS
      net: mlx5e: fix fs_tcp.c build when IPV6 is not enabled
      net/mlx5: Fix wrong address reclaim when command interface is down
      net/sched: act_mpls: ensure LSE is pullable before reading it
      net: openvswitch: ensure LSE is pullable before reading it
      net: skbuff: ensure LSE is pullable before decrementing the MPLS ttl
      net: mvpp2: Fix error return code in mvpp2_open()
      chelsio/chtls: fix a double free in chtls_setkey()
      rtw88: debug: Fix uninitialized memory in debugfs code
      vxlan: fix error return code in __vxlan_dev_create()
      net: pasemi: fix error return code in pasemi_mac_open()
      cxgb3: fix error return code in t3_sge_alloc_qset()
      net/x25: prevent a couple of overflows
      dpaa_eth: copy timestamp fields to new skb in A-050385 workaround
      net: ip6_gre: set dev->hard_header_len when using header_ops
      mt76: usb: fix crash on device removal
      iwlwifi: pcie: add some missing entries for AX210
      iwlwifi: pcie: invert values of NO_160 device config entries
      iwlwifi: pcie: add one missing entry for AX210
      ...

commit eeaf06af6f87e1dba371fbe42674e6f963220b9c
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Thu Dec 3 15:18:26 2020 +0300

    scsi: be2iscsi: Revert "Fix a theoretical leak in beiscsi_create_eqs()"
    
    My patch caused kernel Oopses and delays in boot.  Revert it.
    
    The problem was that I moved the "mem->dma = paddr;" before the call to
    be_fill_queue().  But the first thing that the be_fill_queue() function
    does is memset the whole struct to zero which overwrites the assignment.
    
    Link: https://lore.kernel.org/r/X8jXkt6eThjyVP1v@mwanda
    Fixes: 38b2db564d9a ("scsi: be2iscsi: Fix a theoretical leak in beiscsi_create_eqs()")
    Cc: stable <stable at vger.kernel.org>
    Reported-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index 202ba925c494..5c3513a4b450 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -3020,7 +3020,6 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba,
 			goto create_eq_error;
 		}
 
-		mem->dma = paddr;
 		mem->va = eq_vaddress;
 		ret = be_fill_queue(eq, phba->params.num_eq_entries,
 				    sizeof(struct be_eq_entry), eq_vaddress);
@@ -3030,6 +3029,7 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba,
 			goto create_eq_error;
 		}
 
+		mem->dma = paddr;
 		ret = beiscsi_cmd_eq_create(&phba->ctrl, eq,
 					    BEISCSI_EQ_DELAY_DEF);
 		if (ret) {
@@ -3086,7 +3086,6 @@ static int beiscsi_create_cqs(struct beiscsi_hba *phba,
 			goto create_cq_error;
 		}
 
-		mem->dma = paddr;
 		ret = be_fill_queue(cq, phba->params.num_cq_entries,
 				    sizeof(struct sol_cqe), cq_vaddress);
 		if (ret) {
@@ -3096,6 +3095,7 @@ static int beiscsi_create_cqs(struct beiscsi_hba *phba,
 			goto create_cq_error;
 		}
 
+		mem->dma = paddr;
 		ret = beiscsi_cmd_cq_create(&phba->ctrl, cq, eq, false,
 					    false, 0);
 		if (ret) {
commit fee5be18524f961de653fe6103f927c84ebbfd38
Merge: c82a505c007f b1cae1f84a0f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 3 11:58:26 2020 -0800

    Merge tag 's390-5.10-6' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
    
    Pull s390 fixes from Heiko Carstens:
     "One commit is fixing lockdep irq state tracing which broke with -rc6.
    
      The other one fixes logical vs physical CPU address mixup in our PCI
      code.
    
      Summary:
    
       - fix lockdep irq state tracing
    
       - fix logical vs physical CPU address confusion in PCI code"
    
    * tag 's390-5.10-6' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
      s390: fix irq state tracing
      s390/pci: fix CPU address in MSI for directed IRQ

commit c82a505c007fb754af144d5157e05fa7fd858157
Merge: 72d1249e2ffd 960f4f8a4e60
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Dec 3 11:47:13 2020 -0800

    Merge tag '9p-for-5.10-rc7' of git://github.com/martinetd/linux
    
    Pull 9p fixes from Dominique Martinet:
     "Restore splice functionality for 9p"
    
    * tag '9p-for-5.10-rc7' of git://github.com/martinetd/linux:
      fs: 9p: add generic splice_write file operation
      fs: 9p: add generic splice_read file operations

commit 6f076ce6ab1631abf566a6fb830c02fe5797be9a
Merge: 9608fa653059 d421e466c237
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Thu Dec 3 11:18:37 2020 -0800

    Merge branch 'mlx5-fixes-2020-12-01'
    
    Saeed Mahameed says:
    
    ====================
    mlx5 fixes 2020-12-01
    
    This series introduces some fixes to mlx5 driver.
    ====================
    
    Link: https://lore.kernel.org/r/20201203043946.235385-1-saeedm@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit d421e466c2373095f165ddd25cbabd6c5b077928
Author: Yevgeny Kliteynik <kliteyn at nvidia.com>
Date:   Wed Dec 2 20:39:46 2020 -0800

    net/mlx5: DR, Proper handling of unsupported Connect-X6DX SW steering
    
    STEs format for Connect-X5 and Connect-X6DX different. Currently, on
    Connext-X6DX the SW steering would break at some point when building STEs
    w/o giving a proper error message. Fix this by checking the STE format of
    the current device when initializing domain: add mlx5_ifc definitions for
    Connect-X6DX SW steering, read FW capability to get the current format
    version, and check this version when domain is being created.
    
    Fixes: 26d688e33f88 ("net/mlx5: DR, Add Steering entry (STE) utilities")
    Signed-off-by: Yevgeny Kliteynik <kliteyn at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c
index 6bd34b293007..51bbd88ff021 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c
@@ -92,6 +92,7 @@ int mlx5dr_cmd_query_device(struct mlx5_core_dev *mdev,
 	caps->eswitch_manager	= MLX5_CAP_GEN(mdev, eswitch_manager);
 	caps->gvmi		= MLX5_CAP_GEN(mdev, vhca_id);
 	caps->flex_protocols	= MLX5_CAP_GEN(mdev, flex_parser_protocols);
+	caps->sw_format_ver	= MLX5_CAP_GEN(mdev, steering_format_version);
 
 	if (mlx5dr_matcher_supp_flex_parser_icmp_v4(caps)) {
 		caps->flex_parser_id_icmp_dw0 = MLX5_CAP_GEN(mdev, flex_parser_id_icmp_dw0);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_domain.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_domain.c
index 890767a2a7cb..aa2c2d6c44e6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_domain.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_domain.c
@@ -223,6 +223,11 @@ static int dr_domain_caps_init(struct mlx5_core_dev *mdev,
 	if (ret)
 		return ret;
 
+	if (dmn->info.caps.sw_format_ver != MLX5_STEERING_FORMAT_CONNECTX_5) {
+		mlx5dr_err(dmn, "SW steering is not supported on this device\n");
+		return -EOPNOTSUPP;
+	}
+
 	ret = dr_domain_query_fdb_caps(mdev, dmn);
 	if (ret)
 		return ret;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
index f50f3b107aa3..cf62ea4f882e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
@@ -625,6 +625,7 @@ struct mlx5dr_cmd_caps {
 	u8 max_ft_level;
 	u16 roce_min_src_udp;
 	u8 num_esw_ports;
+	u8 sw_format_ver;
 	bool eswitch_manager;
 	bool rx_sw_owner;
 	bool tx_sw_owner;
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index a092346c7b2d..233352447b1a 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -1223,6 +1223,11 @@ enum mlx5_fc_bulk_alloc_bitmask {
 
 #define MLX5_FC_BULK_NUM_FCS(fc_enum) (MLX5_FC_BULK_SIZE_FACTOR * (fc_enum))
 
+enum {
+	MLX5_STEERING_FORMAT_CONNECTX_5   = 0,
+	MLX5_STEERING_FORMAT_CONNECTX_6DX = 1,
+};
+
 struct mlx5_ifc_cmd_hca_cap_bits {
 	u8         reserved_at_0[0x30];
 	u8         vhca_id[0x10];
@@ -1521,7 +1526,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {
 
 	u8         general_obj_types[0x40];
 
-	u8         reserved_at_440[0x20];
+	u8         reserved_at_440[0x4];
+	u8         steering_format_version[0x4];
+	u8         create_qp_start_hint[0x18];
 
 	u8         reserved_at_460[0x3];
 	u8         log_max_uctx[0x5];
commit b336e6b25e2d053c482ee4339787e6428f390864
Author: Tariq Toukan <tariqt at nvidia.com>
Date:   Wed Dec 2 20:39:45 2020 -0800

    net/mlx5e: kTLS, Enforce HW TX csum offload with kTLS
    
    Checksum calculation cannot be done in SW for TX kTLS HW offloaded
    packets.
    Offload it to the device, disregard the declared state of the TX
    csum offload feature.
    
    Fixes: d2ead1f360e8 ("net/mlx5e: Add kTLS TX HW offload support")
    Signed-off-by: Tariq Toukan <tariqt at nvidia.com>
    Reviewed-by: Maxim Mikityanskiy <maximmi at mellanox.com>
    Reviewed-by: Boris Pismenny <borisp at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
index 6dd3ea3cbbed..d97203cf6a00 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
@@ -161,7 +161,9 @@ ipsec_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 }
 
 static inline void
-mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg)
+mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb,
+			    struct mlx5e_accel_tx_state *accel,
+			    struct mlx5_wqe_eth_seg *eseg)
 {
 	if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
 		eseg->cs_flags = MLX5_ETH_WQE_L3_CSUM;
@@ -173,6 +175,11 @@ mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct
 			eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM;
 			sq->stats->csum_partial++;
 		}
+#ifdef CONFIG_MLX5_EN_TLS
+	} else if (unlikely(accel && accel->tls.tls_tisn)) {
+		eseg->cs_flags = MLX5_ETH_WQE_L3_CSUM | MLX5_ETH_WQE_L4_CSUM;
+		sq->stats->csum_partial++;
+#endif
 	} else if (unlikely(eseg->flow_table_metadata & cpu_to_be32(MLX5_ETH_WQE_FT_META_IPSEC))) {
 		ipsec_txwqe_build_eseg_csum(sq, skb, eseg);
 
@@ -607,12 +614,13 @@ void mlx5e_tx_mpwqe_ensure_complete(struct mlx5e_txqsq *sq)
 }
 
 static bool mlx5e_txwqe_build_eseg(struct mlx5e_priv *priv, struct mlx5e_txqsq *sq,
-				   struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg)
+				   struct sk_buff *skb, struct mlx5e_accel_tx_state *accel,
+				   struct mlx5_wqe_eth_seg *eseg)
 {
 	if (unlikely(!mlx5e_accel_tx_eseg(priv, skb, eseg)))
 		return false;
 
-	mlx5e_txwqe_build_eseg_csum(sq, skb, eseg);
+	mlx5e_txwqe_build_eseg_csum(sq, skb, accel, eseg);
 
 	return true;
 }
@@ -639,7 +647,7 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev)
 		if (mlx5e_tx_skb_supports_mpwqe(skb, &attr)) {
 			struct mlx5_wqe_eth_seg eseg = {};
 
-			if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &eseg)))
+			if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &accel, &eseg)))
 				return NETDEV_TX_OK;
 
 			mlx5e_sq_xmit_mpwqe(sq, skb, &eseg, netdev_xmit_more());
@@ -656,7 +664,7 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev)
 	/* May update the WQE, but may not post other WQEs. */
 	mlx5e_accel_tx_finish(sq, wqe, &accel,
 			      (struct mlx5_wqe_inline_seg *)(wqe->data + wqe_attr.ds_cnt_inl));
-	if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &wqe->eth)))
+	if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &accel, &wqe->eth)))
 		return NETDEV_TX_OK;
 
 	mlx5e_sq_xmit_wqe(sq, skb, &attr, &wqe_attr, wqe, pi, netdev_xmit_more());
@@ -675,7 +683,7 @@ void mlx5e_sq_xmit_simple(struct mlx5e_txqsq *sq, struct sk_buff *skb, bool xmit
 	mlx5e_sq_calc_wqe_attr(skb, &attr, &wqe_attr);
 	pi = mlx5e_txqsq_get_next_pi(sq, wqe_attr.num_wqebbs);
 	wqe = MLX5E_TX_FETCH_WQE(sq, pi);
-	mlx5e_txwqe_build_eseg_csum(sq, skb, &wqe->eth);
+	mlx5e_txwqe_build_eseg_csum(sq, skb, NULL, &wqe->eth);
 	mlx5e_sq_xmit_wqe(sq, skb, &attr, &wqe_attr, wqe, pi, xmit_more);
 }
 
@@ -944,7 +952,7 @@ void mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 
 	mlx5i_txwqe_build_datagram(av, dqpn, dqkey, datagram);
 
-	mlx5e_txwqe_build_eseg_csum(sq, skb, eseg);
+	mlx5e_txwqe_build_eseg_csum(sq, skb, NULL, eseg);
 
 	eseg->mss = attr.mss;
 
commit 8a78a440108e55ddd845b0ef46df575248667520
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Wed Dec 2 20:39:44 2020 -0800

    net: mlx5e: fix fs_tcp.c build when IPV6 is not enabled
    
    Fix build when CONFIG_IPV6 is not enabled by making a function
    be built conditionally.
    
    Fixes these build errors and warnings:
    
    ../drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c: In function 'accel_fs_tcp_set_ipv6_flow':
    ../include/net/sock.h:380:34: error: 'struct sock_common' has no member named 'skc_v6_daddr'; did you mean 'skc_daddr'?
      380 | #define sk_v6_daddr  __sk_common.skc_v6_daddr
          |                                  ^~~~~~~~~~~~
    ../drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c:55:14: note: in expansion of macro 'sk_v6_daddr'
       55 |         &sk->sk_v6_daddr, 16);
          |              ^~~~~~~~~~~
    At top level:
    ../drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c:47:13: warning: 'accel_fs_tcp_set_ipv6_flow' defined but not used [-Wunused-function]
       47 | static void accel_fs_tcp_set_ipv6_flow(struct mlx5_flow_spec *spec, struct sock *sk)
    
    Fixes: 5229a96e59ec ("net/mlx5e: Accel, Expose flow steering API for rules add/del")
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c
index 97f1594cee11..e51f60b55daa 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c
@@ -44,6 +44,7 @@ static void accel_fs_tcp_set_ipv4_flow(struct mlx5_flow_spec *spec, struct sock
 			 outer_headers.dst_ipv4_dst_ipv6.ipv4_layout.ipv4);
 }
 
+#if IS_ENABLED(CONFIG_IPV6)
 static void accel_fs_tcp_set_ipv6_flow(struct mlx5_flow_spec *spec, struct sock *sk)
 {
 	MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.ip_protocol);
@@ -63,6 +64,7 @@ static void accel_fs_tcp_set_ipv6_flow(struct mlx5_flow_spec *spec, struct sock
 			    outer_headers.dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
 	       0xff, 16);
 }
+#endif
 
 void mlx5e_accel_fs_del_sk(struct mlx5_flow_handle *rule)
 {
commit 1d2bb5ad89f47d8ce8aedc70ef85059ab3870292
Author: Eran Ben Elisha <eranbe at nvidia.com>
Date:   Wed Dec 2 20:39:43 2020 -0800

    net/mlx5: Fix wrong address reclaim when command interface is down
    
    When command interface is down, driver to reclaim all 4K page chucks that
    were hold by the Firmeware. Fix a bug for 64K page size systems, where
    driver repeatedly released only the first chunk of the page.
    
    Define helper function to fill 4K chunks for a given Firmware pages.
    Iterate over all unreleased Firmware pages and call the hepler per each.
    
    Fixes: 5adff6a08862 ("net/mlx5: Fix incorrect page count when in internal error")
    Signed-off-by: Eran Ben Elisha <eranbe at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
index 150638814517..4d7f8a357df7 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
@@ -422,6 +422,24 @@ static void release_all_pages(struct mlx5_core_dev *dev, u32 func_id,
 		      npages, ec_function, func_id);
 }
 
+static u32 fwp_fill_manage_pages_out(struct fw_page *fwp, u32 *out, u32 index,
+				     u32 npages)
+{
+	u32 pages_set = 0;
+	unsigned int n;
+
+	for_each_clear_bit(n, &fwp->bitmask, MLX5_NUM_4K_IN_PAGE) {
+		MLX5_ARRAY_SET64(manage_pages_out, out, pas, index + pages_set,
+				 fwp->addr + (n * MLX5_ADAPTER_PAGE_SIZE));
+		pages_set++;
+
+		if (!--npages)
+			break;
+	}
+
+	return pages_set;
+}
+
 static int reclaim_pages_cmd(struct mlx5_core_dev *dev,
 			     u32 *in, int in_size, u32 *out, int out_size)
 {
@@ -448,8 +466,7 @@ static int reclaim_pages_cmd(struct mlx5_core_dev *dev,
 		fwp = rb_entry(p, struct fw_page, rb_node);
 		p = rb_next(p);
 
-		MLX5_ARRAY_SET64(manage_pages_out, out, pas, i, fwp->addr);
-		i++;
+		i += fwp_fill_manage_pages_out(fwp, out, i, npages - i);
 	}
 
 	MLX5_SET(manage_pages_out, out, output_num_entries, i);
commit 9608fa653059c3f72faab0c148ac8773c46e7314
Author: Davide Caratti <dcaratti at redhat.com>
Date:   Thu Dec 3 10:37:52 2020 +0100

    net/sched: act_mpls: ensure LSE is pullable before reading it
    
    when 'act_mpls' is used to mangle the LSE, the current value is read from
    the packet dereferencing 4 bytes at mpls_hdr(): ensure that the label is
    contained in the skb "linear" area.
    
    Found by code inspection.
    
    v2:
     - use MPLS_HLEN instead of sizeof(new_lse), thanks to Jakub Kicinski
    
    Fixes: 2a2ea50870ba ("net: sched: add mpls manipulation actions to TC")
    Signed-off-by: Davide Caratti <dcaratti at redhat.com>
    Acked-by: Guillaume Nault <gnault at redhat.com>
    Link: https://lore.kernel.org/r/3243506cba43d14858f3bd21ee0994160e44d64a.1606987058.git.dcaratti@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/sched/act_mpls.c b/net/sched/act_mpls.c
index 5c7456e5b5cf..d1486ea496a2 100644
--- a/net/sched/act_mpls.c
+++ b/net/sched/act_mpls.c
@@ -105,6 +105,9 @@ static int tcf_mpls_act(struct sk_buff *skb, const struct tc_action *a,
 			goto drop;
 		break;
 	case TCA_MPLS_ACT_MODIFY:
+		if (!pskb_may_pull(skb,
+				   skb_network_offset(skb) + MPLS_HLEN))
+			goto drop;
 		new_lse = tcf_mpls_get_lse(mpls_hdr(skb), p, false);
 		if (skb_mpls_update_lse(skb, new_lse))
 			goto drop;
commit 43c13605bad44b8abbc9776d6e63f62ccb7a47d6
Author: Davide Caratti <dcaratti at redhat.com>
Date:   Thu Dec 3 10:46:06 2020 +0100

    net: openvswitch: ensure LSE is pullable before reading it
    
    when openvswitch is configured to mangle the LSE, the current value is
    read from the packet dereferencing 4 bytes at mpls_hdr(): ensure that
    the label is contained in the skb "linear" area.
    
    Found by code inspection.
    
    Fixes: d27cf5c59a12 ("net: core: add MPLS update core helper and use in OvS")
    Signed-off-by: Davide Caratti <dcaratti at redhat.com>
    Link: https://lore.kernel.org/r/aa099f245d93218b84b5c056b67b6058ccf81a66.1606987185.git.dcaratti@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index 5829a020b81c..c3a664871cb5 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -199,6 +199,9 @@ static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key,
 	__be32 lse;
 	int err;
 
+	if (!pskb_may_pull(skb, skb_network_offset(skb) + MPLS_HLEN))
+		return -ENOMEM;
+
 	stack = mpls_hdr(skb);
 	lse = OVS_MASKED(stack->label_stack_entry, *mpls_lse, *mask);
 	err = skb_mpls_update_lse(skb, lse);
commit 13de4ed9e3a9ccbe54d05f7d5c773f69ecaf6c64
Author: Davide Caratti <dcaratti at redhat.com>
Date:   Thu Dec 3 10:58:21 2020 +0100

    net: skbuff: ensure LSE is pullable before decrementing the MPLS ttl
    
    skb_mpls_dec_ttl() reads the LSE without ensuring that it is contained in
    the skb "linear" area. Fix this calling pskb_may_pull() before reading the
    current ttl.
    
    Found by code inspection.
    
    Fixes: 2a2ea50870ba ("net: sched: add mpls manipulation actions to TC")
    Reported-by: Marcelo Ricardo Leitner <marcelo.leitner at gmail.com>
    Signed-off-by: Davide Caratti <dcaratti at redhat.com>
    Link: https://lore.kernel.org/r/53659f28be8bc336c113b5254dc637cc76bbae91.1606987074.git.dcaratti@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 06c526e0d810..e578544b2cc7 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -5786,6 +5786,9 @@ int skb_mpls_dec_ttl(struct sk_buff *skb)
 	if (unlikely(!eth_p_mpls(skb->protocol)))
 		return -EINVAL;
 
+	if (!pskb_may_pull(skb, skb_network_offset(skb) + MPLS_HLEN))
+		return -ENOMEM;
+
 	lse = be32_to_cpu(mpls_hdr(skb)->label_stack_entry);
 	ttl = (lse & MPLS_LS_TTL_MASK) >> MPLS_LS_TTL_SHIFT;
 	if (!--ttl)
commit 6392b5b28e0e00171018ecd3ced3554f95b9bb46
Merge: 82a10dc7f096 74a8c816fa8f
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Thu Dec 3 10:59:28 2020 -0800

    Merge tag 'wireless-drivers-2020-12-03' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers
    
    Kalle Valo says:
    
    ====================
    wireless-drivers fixes for v5.10
    
    Second, and most likely final, set of fixes for v5.10. Small fixes and
    PCI id addtions.
    
    iwlwifi
     * PCI id additions
    mt76
     * fix a kernel crash during device removal
    rtw88
     * fix uninitialized memory in debugfs code
    
    * tag 'wireless-drivers-2020-12-03' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers:
      rtw88: debug: Fix uninitialized memory in debugfs code
      mt76: usb: fix crash on device removal
      iwlwifi: pcie: add some missing entries for AX210
      iwlwifi: pcie: invert values of NO_160 device config entries
      iwlwifi: pcie: add one missing entry for AX210
      iwlwifi: update MAINTAINERS entry
    ====================
    
    Link: https://lore.kernel.org/r/20201203183408.EE88AC43461@smtp.codeaurora.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 82a10dc7f0960735f40e8d7d3bee56934291600f
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Thu Dec 3 22:18:06 2020 +0800

    net: mvpp2: Fix error return code in mvpp2_open()
    
    Fix to return negative error code -ENOENT from invalid configuration
    error handling case instead of 0, as done elsewhere in this function.
    
    Fixes: 4bb043262878 ("net: mvpp2: phylink support")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Reviewed-by: Andrew Lunn <andrew at lunn.ch>
    Link: https://lore.kernel.org/r/20201203141806.37966-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index f6616c8933ca..cea886c5bcb5 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -4426,6 +4426,7 @@ static int mvpp2_open(struct net_device *dev)
 	if (!valid) {
 		netdev_err(port->dev,
 			   "invalid configuration: no dt or link IRQ");
+		err = -ENOENT;
 		goto err_free_irq;
 	}
 
commit 391119fb5c5c4bdb4d57c7ffeb5e8d18560783d1
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Thu Dec 3 11:44:31 2020 +0300

    chelsio/chtls: fix a double free in chtls_setkey()
    
    The "skb" is freed by the transmit code in cxgb4_ofld_send() and we
    shouldn't use it again.  But in the current code, if we hit an error
    later on in the function then the clean up code will call kfree_skb(skb)
    and so it causes a double free.
    
    Set the "skb" to NULL and that makes the kfree_skb() a no-op.
    
    Fixes: d25f2f71f653 ("crypto: chtls - Program the TLS session Key")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Link: https://lore.kernel.org/r/X8ilb6PtBRLWiSHp@mwanda
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c
index 62c829023da5..a4fb463af22a 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c
@@ -391,6 +391,7 @@ int chtls_setkey(struct chtls_sock *csk, u32 keylen,
 	csk->wr_unacked += DIV_ROUND_UP(len, 16);
 	enqueue_wr(csk, skb);
 	cxgb4_ofld_send(csk->egress_dev, skb);
+	skb = NULL;
 
 	chtls_set_scmd(csk);
 	/* Clear quiesce for Rx key */
commit 72d1249e2ffdbc344e465031ec5335fa3489d62e
Author: Eric Sandeen <sandeen at redhat.com>
Date:   Tue Dec 1 17:21:40 2020 -0600

    uapi: fix statx attribute value overlap for DAX & MOUNT_ROOT
    
    STATX_ATTR_MOUNT_ROOT and STATX_ATTR_DAX got merged with the same value,
    so one of them needs fixing.  Move STATX_ATTR_DAX.
    
    While we're in here, clarify the value-matching scheme for some of the
    attributes, and explain why the value for DAX does not match.
    
    Fixes: 80340fe3605c ("statx: add mount_root")
    Fixes: 712b2698e4c0 ("fs/stat: Define DAX statx attribute")
    Link: https://lore.kernel.org/linux-fsdevel/7027520f-7c79-087e-1d00-743bdefa1a1e@redhat.com/
    Link: https://lore.kernel.org/lkml/20201202214629.1563760-1-ira.weiny@intel.com/
    Reported-by: David Howells <dhowells at redhat.com>
    Signed-off-by: Eric Sandeen <sandeen at redhat.com>
    Reviewed-by: David Howells <dhowells at redhat.com>
    Reviewed-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Ira Weiny <ira.weiny at intel.com>
    Cc: <stable at vger.kernel.org> # 5.8
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/uapi/linux/stat.h b/include/uapi/linux/stat.h
index 82cc58fe9368..1500a0f58041 100644
--- a/include/uapi/linux/stat.h
+++ b/include/uapi/linux/stat.h
@@ -171,9 +171,12 @@ struct statx {
  * be of use to ordinary userspace programs such as GUIs or ls rather than
  * specialised tools.
  *
- * Note that the flags marked [I] correspond to generic FS_IOC_FLAGS
+ * Note that the flags marked [I] correspond to the FS_IOC_SETFLAGS flags
  * semantically.  Where possible, the numerical value is picked to correspond
- * also.
+ * also.  Note that the DAX attribute indicates that the file is in the CPU
+ * direct access state.  It does not correspond to the per-inode flag that
+ * some filesystems support.
+ *
  */
 #define STATX_ATTR_COMPRESSED		0x00000004 /* [I] File is compressed by the fs */
 #define STATX_ATTR_IMMUTABLE		0x00000010 /* [I] File is marked immutable */
@@ -183,7 +186,7 @@ struct statx {
 #define STATX_ATTR_AUTOMOUNT		0x00001000 /* Dir: Automount trigger */
 #define STATX_ATTR_MOUNT_ROOT		0x00002000 /* Root of a mount */
 #define STATX_ATTR_VERITY		0x00100000 /* [I] Verity protected file */
-#define STATX_ATTR_DAX			0x00002000 /* [I] File is DAX */
+#define STATX_ATTR_DAX			0x00200000 /* File is currently in DAX state */
 
 
 #endif /* _UAPI_LINUX_STAT_H */
commit 062c9cdf60a1e581b1002d372f1cf8e745fe3c16
Author: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
Date:   Thu Dec 3 09:41:42 2020 +0100

    pwm: sl28cpld: fix getting driver data in pwm callbacks
    
    Currently .get_state() and .apply() use dev_get_drvdata() on the struct
    device related to the pwm chip.  This only works after .probe() called
    platform_set_drvdata() which in this driver happens only after
    pwmchip_add() and so comes possibly too late.
    
    Instead of setting the driver data earlier use the traditional
    container_of approach as this way the driver data is conceptually and
    computational nearer.
    
    Fixes: 9db33d221efc ("pwm: Add support for sl28cpld PWM controller")
    Tested-by: Michael Walle <michael at walle.cc>
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/drivers/pwm/pwm-sl28cpld.c b/drivers/pwm/pwm-sl28cpld.c
index 5046b6b7fd35..b4c651fc749c 100644
--- a/drivers/pwm/pwm-sl28cpld.c
+++ b/drivers/pwm/pwm-sl28cpld.c
@@ -84,12 +84,14 @@ struct sl28cpld_pwm {
 	struct regmap *regmap;
 	u32 offset;
 };
+#define sl28cpld_pwm_from_chip(_chip) \
+	container_of(_chip, struct sl28cpld_pwm, pwm_chip)
 
 static void sl28cpld_pwm_get_state(struct pwm_chip *chip,
 				   struct pwm_device *pwm,
 				   struct pwm_state *state)
 {
-	struct sl28cpld_pwm *priv = dev_get_drvdata(chip->dev);
+	struct sl28cpld_pwm *priv = sl28cpld_pwm_from_chip(chip);
 	unsigned int reg;
 	int prescaler;
 
@@ -118,7 +120,7 @@ static void sl28cpld_pwm_get_state(struct pwm_chip *chip,
 static int sl28cpld_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
 			      const struct pwm_state *state)
 {
-	struct sl28cpld_pwm *priv = dev_get_drvdata(chip->dev);
+	struct sl28cpld_pwm *priv = sl28cpld_pwm_from_chip(chip);
 	unsigned int cycle, prescaler;
 	bool write_duty_cycle_first;
 	int ret;
commit 4f134b89a24b965991e7c345b9a4591821f7c2a6
Author: Willy Tarreau <w at 1wt.eu>
Date:   Mon Nov 30 08:36:48 2020 +0100

    lib/syscall: fix syscall registers retrieval on 32-bit platforms
    
    Lilith >_> and Claudio Bozzato of Cisco Talos security team reported
    that collect_syscall() improperly casts the syscall registers to 64-bit
    values leaking the uninitialized last 24 bytes on 32-bit platforms, that
    are visible in /proc/self/syscall.
    
    The cause is that info->data.args are u64 while syscall_get_arguments()
    uses longs, as hinted by the bogus pointer cast in the function.
    
    Let's just proceed like the other call places, by retrieving the
    registers into an array of longs before assigning them to the caller's
    array.  This was successfully tested on x86_64, i386 and ppc32.
    
    Reference: CVE-2020-28588, TALOS-2020-1211
    Fixes: 631b7abacd02 ("ptrace: Remove maxargs from task_current_syscall()")
    Cc: Greg KH <greg at kroah.com>
    Reviewed-by: Kees Cook <keescook at chromium.org>
    Tested-by: Michael Ellerman <mpe at ellerman.id.au> (ppc32)
    Signed-off-by: Willy Tarreau <w at 1wt.eu>
    Reviewed-by: Thomas Gleixner <tglx at linutronix.de>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/lib/syscall.c b/lib/syscall.c
index 8533d2fea2d7..ba13e924c430 100644
--- a/lib/syscall.c
+++ b/lib/syscall.c
@@ -7,6 +7,7 @@
 
 static int collect_syscall(struct task_struct *target, struct syscall_info *info)
 {
+	unsigned long args[6] = { };
 	struct pt_regs *regs;
 
 	if (!try_get_task_stack(target)) {
@@ -27,8 +28,14 @@ static int collect_syscall(struct task_struct *target, struct syscall_info *info
 
 	info->data.nr = syscall_get_nr(target, regs);
 	if (info->data.nr != -1L)
-		syscall_get_arguments(target, regs,
-				      (unsigned long *)&info->data.args[0]);
+		syscall_get_arguments(target, regs, args);
+
+	info->data.args[0] = args[0];
+	info->data.args[1] = args[1];
+	info->data.args[2] = args[2];
+	info->data.args[3] = args[3];
+	info->data.args[4] = args[4];
+	info->data.args[5] = args[5];
 
 	put_task_stack(target);
 	return 0;
commit 0c55f867f0c96dff93d4e0b5973975d65afb26d8
Author: Maciej S. Szmigiero <maciej.szmigiero at oracle.com>
Date:   Wed Dec 2 21:35:36 2020 +0100

    selftests: kvm/set_memory_region_test: Fix race in move region test
    
    The current memory region move test correctly handles the situation that
    the second (realigning) memslot move operation would temporarily trigger
    MMIO until it completes, however it does not handle the case in which the
    first (misaligning) move operation does this, too.
    This results in false test assertions in case it does so.
    
    Fix this by handling temporary MMIO from the first memslot move operation
    in the test guest code, too.
    
    Fixes: 8a0639fe9201 ("KVM: sefltests: Add explicit synchronization to move mem region test")
    Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero at oracle.com>
    Message-Id: <0fdddb94bb0e31b7da129a809a308d91c10c0b5e.1606941224.git.maciej.szmigiero at oracle.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index b3ece55a2da6..6f441dd9f33c 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -156,14 +156,23 @@ static void guest_code_move_memory_region(void)
 	GUEST_SYNC(0);
 
 	/*
-	 * Spin until the memory region is moved to a misaligned address.  This
-	 * may or may not trigger MMIO, as the window where the memslot is
-	 * invalid is quite small.
+	 * Spin until the memory region starts getting moved to a
+	 * misaligned address.
+	 * Every region move may or may not trigger MMIO, as the
+	 * window where the memslot is invalid is usually quite small.
 	 */
 	val = guest_spin_on_val(0);
 	GUEST_ASSERT_1(val == 1 || val == MMIO_VAL, val);
 
-	/* Spin until the memory region is realigned. */
+	/* Spin until the misaligning memory region move completes. */
+	val = guest_spin_on_val(MMIO_VAL);
+	GUEST_ASSERT_1(val == 1 || val == 0, val);
+
+	/* Spin until the memory region starts to get re-aligned. */
+	val = guest_spin_on_val(0);
+	GUEST_ASSERT_1(val == 1 || val == MMIO_VAL, val);
+
+	/* Spin until the re-aligning memory region move completes. */
 	val = guest_spin_on_val(MMIO_VAL);
 	GUEST_ASSERT_1(val == 1, val);
 
commit 8dcc0e19dfbd73ad6b3172924d6da8f7f3f8b3b0
Author: Mike Travis <mike.travis at hpe.com>
Date:   Thu Dec 3 09:22:52 2020 -0600

    x86/platform/uv: Fix UV4 hub revision adjustment
    
    Currently, UV4 is incorrectly identified as UV4A and UV4A as UV5. Hub
    chip starts with revision 1, fix it.
    
     [ bp: Massage commit message. ]
    
    Fixes: 647128f1536e ("x86/platform/uv: Update UV MMRs for UV5")
    Signed-off-by: Mike Travis <mike.travis at hpe.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Steve Wahl <steve.wahl at hpe.com>
    Acked-by: Dimitri Sivanich <dimitri.sivanich at hpe.com>
    Link: https://lkml.kernel.org/r/20201203152252.371199-1-mike.travis@hpe.com

diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
index 1b98f8c12b96..235f5cde06fc 100644
--- a/arch/x86/kernel/apic/x2apic_uv_x.c
+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
@@ -161,7 +161,7 @@ static int __init early_set_hub_type(void)
 	/* UV4/4A only have a revision difference */
 	case UV4_HUB_PART_NUMBER:
 		uv_min_hub_revision_id = node_id.s.revision
-					 + UV4_HUB_REVISION_BASE;
+					 + UV4_HUB_REVISION_BASE - 1;
 		uv_hub_type_set(UV4);
 		if (uv_min_hub_revision_id == UV4A_HUB_REVISION_BASE)
 			uv_hub_type_set(UV4|UV4A);
commit 74a8c816fa8fa7862df870660e9821abb56649fe
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Thu Dec 3 11:43:37 2020 +0300

    rtw88: debug: Fix uninitialized memory in debugfs code
    
    This code does not ensure that the whole buffer is initialized and none
    of the callers check for errors so potentially none of the buffer is
    initialized.  Add a memset to eliminate this bug.
    
    Fixes: e3037485c68e ("rtw88: new Realtek 802.11ac driver")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/X8ilOfVz3pf0T5ec@mwanda

diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
index 3852c4f0ac0b..efbba9caef3b 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.c
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
@@ -147,6 +147,8 @@ static int rtw_debugfs_copy_from_user(char tmp[], int size,
 {
 	int tmp_len;
 
+	memset(tmp, 0, size);
+
 	if (count < num)
 		return -EFAULT;
 
commit bf193bfc12dbc3754fc8a6e0e1e3702f1af2f772
Author: Johan Hovold <johan at kernel.org>
Date:   Thu Dec 3 10:11:59 2020 +0100

    USB: serial: ch341: sort device-id entries
    
    Keep the device-id entries sorted to make it easier to add new ones in
    the right spot.
    
    Reviewed-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
    Cc: stable at vger.kernel.org
    Signed-off-by: Johan Hovold <johan at kernel.org>

diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index b157a230178d..28deaaec581f 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -81,11 +81,11 @@
 #define CH341_QUIRK_SIMULATE_BREAK	BIT(1)
 
 static const struct usb_device_id id_table[] = {
-	{ USB_DEVICE(0x4348, 0x5523) },
-	{ USB_DEVICE(0x1a86, 0x7522) },
-	{ USB_DEVICE(0x1a86, 0x7523) },
 	{ USB_DEVICE(0x1a86, 0x5512) },
 	{ USB_DEVICE(0x1a86, 0x5523) },
+	{ USB_DEVICE(0x1a86, 0x7522) },
+	{ USB_DEVICE(0x1a86, 0x7523) },
+	{ USB_DEVICE(0x4348, 0x5523) },
 	{ },
 };
 MODULE_DEVICE_TABLE(usb, id_table);
commit 46ee4abb10a07bd8f8ce910ee6b4ae6a947d7f63
Author: Jan-Niklas Burfeind <kernel at aiyionpri.me>
Date:   Thu Dec 3 04:03:59 2020 +0100

    USB: serial: ch341: add new Product ID for CH341A
    
    Add PID for CH340 that's found on a ch341 based Programmer made by keeyees.
    The specific device that contains the serial converter is described
    here: http://www.keeyees.com/a/Products/ej/36.html
    
    The driver works flawlessly as soon as the new PID (0x5512) is added to
    it.
    
    Signed-off-by: Jan-Niklas Burfeind <kernel at aiyionpri.me>
    Cc: stable at vger.kernel.org
    Signed-off-by: Johan Hovold <johan at kernel.org>

diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index a2e2f56c88cd..b157a230178d 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -84,6 +84,7 @@ static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(0x4348, 0x5523) },
 	{ USB_DEVICE(0x1a86, 0x7522) },
 	{ USB_DEVICE(0x1a86, 0x7523) },
+	{ USB_DEVICE(0x1a86, 0x5512) },
 	{ USB_DEVICE(0x1a86, 0x5523) },
 	{ },
 };
commit fc17db8aa4c53cbd2d5469bb0521ea0f0a6dbb27
Author: Stephane Eranian <eranian at google.com>
Date:   Thu Nov 26 20:09:22 2020 +0900

    perf/x86/intel: Check PEBS status correctly
    
    The kernel cannot disambiguate when 2+ PEBS counters overflow at the
    same time. This is what the comment for this code suggests.  However,
    I see the comparison is done with the unfiltered p->status which is a
    copy of IA32_PERF_GLOBAL_STATUS at the time of the sample. This
    register contains more than the PEBS counter overflow bits. It also
    includes many other bits which could also be set.
    
    Signed-off-by: Namhyung Kim <namhyung at kernel.org>
    Signed-off-by: Stephane Eranian <eranian at google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201126110922.317681-2-namhyung@kernel.org

diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index 89dba588636e..485c5066f8b8 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1916,7 +1916,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs, struct perf_sample_d
 		 * that caused the PEBS record. It's called collision.
 		 * If collision happened, the record will be dropped.
 		 */
-		if (p->status != (1ULL << bit)) {
+		if (pebs_status != (1ULL << bit)) {
 			for_each_set_bit(i, (unsigned long *)&pebs_status, size)
 				error[i]++;
 			continue;
commit 5debf02131227d39988e44adf5090fb796fa8466
Author: Namhyung Kim <namhyung at kernel.org>
Date:   Thu Nov 26 20:09:21 2020 +0900

    perf/x86/intel: Fix a warning on x86_pmu_stop() with large PEBS
    
    The commit 3966c3feca3f ("x86/perf/amd: Remove need to check "running"
    bit in NMI handler") introduced this.  It seems x86_pmu_stop can be
    called recursively (like when it losts some samples) like below:
    
      x86_pmu_stop
        intel_pmu_disable_event  (x86_pmu_disable)
          intel_pmu_pebs_disable
            intel_pmu_drain_pebs_nhm  (x86_pmu_drain_pebs_buffer)
              x86_pmu_stop
    
    While commit 35d1ce6bec13 ("perf/x86/intel/ds: Fix x86_pmu_stop
    warning for large PEBS") fixed it for the normal cases, there's
    another path to call x86_pmu_stop() recursively when a PEBS error was
    detected (like two or more counters overflowed at the same time).
    
    Like in the Kan's previous fix, we can skip the interrupt accounting
    for large PEBS, so check the iregs which is set for PMI only.
    
    Fixes: 3966c3feca3f ("x86/perf/amd: Remove need to check "running" bit in NMI handler")
    Reported-by: John Sperbeck <jsperbeck at google.com>
    Suggested-by: Peter Zijlstra <peterz at infradead.org>
    Signed-off-by: Namhyung Kim <namhyung at kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201126110922.317681-1-namhyung@kernel.org

diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index b47cc4226934..89dba588636e 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1940,7 +1940,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs, struct perf_sample_d
 		if (error[bit]) {
 			perf_log_lost_samples(event, error[bit]);
 
-			if (perf_event_account_interrupt(event))
+			if (iregs && perf_event_account_interrupt(event))
 				x86_pmu_stop(event, 0);
 		}
 
commit 4d916140bf28ff027997144ea1bb4299e1536f87
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Mon Nov 30 12:54:34 2020 +0100

    intel_idle: Build fix
    
    Because CONFIG_ soup.
    
    Fixes: 6e1d2bc675bd ("intel_idle: Fix intel_idle() vs tracing")
    Reported-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201130115402.GO3040@hirez.programming.kicks-ass.net

diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index 7ee7ffe22ae3..d79335506ecd 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -1140,6 +1140,20 @@ static bool __init intel_idle_max_cstate_reached(int cstate)
 	return false;
 }
 
+static bool __init intel_idle_state_needs_timer_stop(struct cpuidle_state *state)
+{
+	unsigned long eax = flg2MWAIT(state->flags);
+
+	if (boot_cpu_has(X86_FEATURE_ARAT))
+		return false;
+
+	/*
+	 * Switch over to one-shot tick broadcast if the target C-state
+	 * is deeper than C1.
+	 */
+	return !!((eax >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK);
+}
+
 #ifdef CONFIG_ACPI_PROCESSOR_CSTATE
 #include <acpi/processor.h>
 
@@ -1210,20 +1224,6 @@ static bool __init intel_idle_acpi_cst_extract(void)
 	return false;
 }
 
-static bool __init intel_idle_state_needs_timer_stop(struct cpuidle_state *state)
-{
-	unsigned long eax = flg2MWAIT(state->flags);
-
-	if (boot_cpu_has(X86_FEATURE_ARAT))
-		return false;
-
-	/*
-	 * Switch over to one-shot tick broadcast if the target C-state
-	 * is deeper than C1.
-	 */
-	return !!((eax >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK);
-}
-
 static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv)
 {
 	int cstate, limit = min_t(int, CPUIDLE_STATE_MAX, acpi_state_table.count);
commit efd6d85a18102241538dd1cc257948a0dbe6fae6
Author: Boyuan Zhang <boyuan.zhang at amd.com>
Date:   Tue May 19 11:38:44 2020 -0400

    drm/amdgpu/vcn3.0: remove old DPG workaround
    
    Port from VCN2.5
    SCRATCH2 is used to keep decode wptr as a workaround
    which fix a hardware DPG decode wptr update bug for
    vcn2.5 beforehand.
    
    Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
    Reviewed-by: James Zhu <James.Zhu at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org # 5.9.x

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 2aa84993f42d..b5f8f3d731cb 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -1587,9 +1587,6 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
 
-				WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
-					RREG32_SOC15(VCN, inst_idx, mmUVD_SCRATCH2) & 0x7FFFFFFF);
-
 				/* Unstall DPG */
 				WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
 					0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
@@ -1650,10 +1647,6 @@ static void vcn_v3_0_dec_ring_set_wptr(struct amdgpu_ring *ring)
 {
 	struct amdgpu_device *adev = ring->adev;
 
-	if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
-		WREG32_SOC15(VCN, ring->me, mmUVD_SCRATCH2,
-			lower_32_bits(ring->wptr) | 0x80000000);
-
 	if (ring->use_doorbell) {
 		adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
 		WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
commit ac2db9488cf21de0be7899c1e5963e5ac0ff351f
Author: Boyuan Zhang <boyuan.zhang at amd.com>
Date:   Sun May 10 15:47:03 2020 -0400

    drm/amdgpu/vcn3.0: stall DPG when WPTR/RPTR reset
    
    Port from VCN2.5
    Add vcn dpg harware synchronization to fix race condition
    issue between vcn driver and hardware.
    
    Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
    Reviewed-by: James Zhu <James.Zhu at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org # 5.9.x

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index e074f7ed388c..2aa84993f42d 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -1011,6 +1011,11 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
 	tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
 	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_CNTL, tmp);
 
+	/* Stall DPG before WPTR/RPTR reset */
+	WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
+		UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK,
+		~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
+
 	/* set the write pointer delay */
 	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR_CNTL, 0);
 
@@ -1033,6 +1038,10 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
 	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
 		lower_32_bits(ring->wptr));
 
+	/* Unstall DPG */
+	WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
+		0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
+
 	return 0;
 }
 
@@ -1556,8 +1565,14 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
 					UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK,
 					UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK);
 
+				/* Stall DPG before WPTR/RPTR reset */
+				WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
+					UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK,
+					~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
+
 				/* Restore */
 				ring = &adev->vcn.inst[inst_idx].ring_enc[0];
+				ring->wptr = 0;
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO, ring->gpu_addr);
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE, ring->ring_size / 4);
@@ -1565,6 +1580,7 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
 
 				ring = &adev->vcn.inst[inst_idx].ring_enc[1];
+				ring->wptr = 0;
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO2, ring->gpu_addr);
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE2, ring->ring_size / 4);
@@ -1574,6 +1590,10 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
 				WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
 					RREG32_SOC15(VCN, inst_idx, mmUVD_SCRATCH2) & 0x7FFFFFFF);
 
+				/* Unstall DPG */
+				WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
+					0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
+
 				SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS,
 					UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
 			}
commit 7e0b367db85ef7b91399006253759a024eab7653
Author: Brandon Syu <Brandon.Syu at amd.com>
Date:   Thu Nov 12 15:35:52 2020 +0800

    drm/amd/display: Init clock value by current vbios CLKs
    
    [Why]
    While booting into OS, driver updates DPP/DISP CLKs.
    But init clock value is zero which is invalid.
    
    [How]
    Get current clocks value to update init clocks.
    To avoid underflow.
    
    Signed-off-by: Brandon Syu <Brandon.Syu at amd.com>
    Reviewed-by: Tony Cheng <Tony.Cheng at amd.com>
    Acked-by: Aurabindo Pillai <aurabindo.pillai at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
index 2f8fee05547a..c001307b0a59 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
@@ -163,8 +163,17 @@ void rn_update_clocks(struct clk_mgr *clk_mgr_base,
 			new_clocks->dppclk_khz = 100000;
 	}
 
-	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {
-		if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz)
+	/*
+	 * Temporally ignore thew 0 cases for disp and dpp clks.
+	 * We may have a new feature that requires 0 clks in the future.
+	 */
+	if (new_clocks->dppclk_khz == 0 || new_clocks->dispclk_khz == 0) {
+		new_clocks->dppclk_khz = clk_mgr_base->clks.dppclk_khz;
+		new_clocks->dispclk_khz = clk_mgr_base->clks.dispclk_khz;
+	}
+
+	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr_base->clks.dppclk_khz)) {
+		if (clk_mgr_base->clks.dppclk_khz > new_clocks->dppclk_khz)
 			dpp_clock_lowered = true;
 		clk_mgr_base->clks.dppclk_khz = new_clocks->dppclk_khz;
 		update_dppclk = true;
commit acab02c1af43d3a9051524579b1c3dcfbfa5479d
Author: Arunpravin <Arunpravin.PaneerSelvam at amd.com>
Date:   Fri Nov 27 21:40:24 2020 +0530

    drm/amdgpu/pm/smu11: Fix fan set speed bug
    
    Fix fan set speed calculation.
    
    Suggested-by: Kenneth Feng <kenneth.feng at amd.com>
    Signed-off-by: Arunpravin <Arunpravin.PaneerSelvam at amd.com>
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Reviewed-by: Kenneth Feng <kenneth.feng at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
index 2380759ddf48..6db96fa1df09 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
@@ -1164,7 +1164,12 @@ int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
 	if (ret)
 		return ret;
 
-	crystal_clock_freq = amdgpu_asic_get_xclk(adev);
+	/*
+	 * crystal_clock_freq div by 4 is required since the fan control
+	 * module refers to 25MHz
+	 */
+
+	crystal_clock_freq = amdgpu_asic_get_xclk(adev) / 4;
 	tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed);
 	WREG32_SOC15(THM, 0, mmCG_TACH_CTRL,
 		     REG_SET_FIELD(RREG32_SOC15(THM, 0, mmCG_TACH_CTRL),
commit 832e09798c261cf58de3a68cfcc6556408c16a5a
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Wed Dec 2 17:58:42 2020 +0800

    vxlan: fix error return code in __vxlan_dev_create()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 0ce1822c2a08 ("vxlan: add adjacent link to limit depth level")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1606903122-2098-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 032f78261913..977f77e2c2ce 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -3880,8 +3880,10 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev,
 
 	if (dst->remote_ifindex) {
 		remote_dev = __dev_get_by_index(net, dst->remote_ifindex);
-		if (!remote_dev)
+		if (!remote_dev) {
+			err = -ENODEV;
 			goto errout;
+		}
 
 		err = netdev_upper_dev_link(remote_dev, dev, extack);
 		if (err)
commit aba84871bd4f52c4dfcf3ad5d4501a6c9d2de90e
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Wed Dec 2 17:57:15 2020 +0800

    net: pasemi: fix error return code in pasemi_mac_open()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 72b05b9940f0 ("pasemi_mac: RX/TX ring management cleanup")
    Fixes: 8d636d8bc5ff ("pasemi_mac: jumbo frame support")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1606903035-1838-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c
index be6660128b55..040a15a828b4 100644
--- a/drivers/net/ethernet/pasemi/pasemi_mac.c
+++ b/drivers/net/ethernet/pasemi/pasemi_mac.c
@@ -1078,16 +1078,20 @@ static int pasemi_mac_open(struct net_device *dev)
 
 	mac->tx = pasemi_mac_setup_tx_resources(dev);
 
-	if (!mac->tx)
+	if (!mac->tx) {
+		ret = -ENOMEM;
 		goto out_tx_ring;
+	}
 
 	/* We might already have allocated rings in case mtu was changed
 	 * before interface was brought up.
 	 */
 	if (dev->mtu > 1500 && !mac->num_cs) {
 		pasemi_mac_setup_csrings(mac);
-		if (!mac->num_cs)
+		if (!mac->num_cs) {
+			ret = -ENOMEM;
 			goto out_tx_ring;
+		}
 	}
 
 	/* Zero out rmon counters */
commit ff9924897f8bfed82e61894b373ab9d2dfea5b10
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Wed Dec 2 17:56:05 2020 +0800

    cxgb3: fix error return code in t3_sge_alloc_qset()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: b1fb1f280d09 ("cxgb3 - Fix dma mapping error path")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Acked-by: Raju Rangoju <rajur at chelsio.com>
    Link: https://lore.kernel.org/r/1606902965-1646-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
index e18e9ce27f94..1cc3c51eff71 100644
--- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
@@ -3175,6 +3175,7 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
 			  GFP_KERNEL | __GFP_COMP);
 	if (!avail) {
 		CH_ALERT(adapter, "free list queue 0 initialization failed\n");
+		ret = -ENOMEM;
 		goto err;
 	}
 	if (avail < q->fl[0].size)
commit aac06646aa85772eed49931d721e917209cabb51
Merge: b65054597872 bf3a3cdcad40
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Dec 3 11:34:06 2020 +1000

    Merge tag 'drm/tegra/for-5.10-rc7' of ssh://git.freedesktop.org/git/tegra/linux into drm-fixes
    
    drm/tegra: Fixes for v5.10-rc7
    
    This is a set of small fixes for various issues found during the last
    couple of weeks.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Thierry Reding <thierry.reding at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127145324.125776-1-thierry.reding@gmail.com

commit 6ee50c8e262a0f0693dad264c3c99e30e6442a56
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Tue Dec 1 18:15:12 2020 +0300

    net/x25: prevent a couple of overflows
    
    The .x25_addr[] address comes from the user and is not necessarily
    NUL terminated.  This leads to a couple problems.  The first problem is
    that the strlen() in x25_bind() can read beyond the end of the buffer.
    
    The second problem is more subtle and could result in memory corruption.
    The call tree is:
      x25_connect()
      --> x25_write_internal()
          --> x25_addr_aton()
    
    The .x25_addr[] buffers are copied to the "addresses" buffer from
    x25_write_internal() so it will lead to stack corruption.
    
    Verify that the strings are NUL terminated and return -EINVAL if they
    are not.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Fixes: a9288525d2ae ("X25: Dont let x25_bind use addresses containing characters")
    Reported-by: "kiyin(尹亮)" <kiyin at tencent.com>
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Acked-by: Martin Schiller <ms at dev.tdt.de>
    Link: https://lore.kernel.org/r/X8ZeAKm8FnFpN//B@mwanda
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index a10487e7574c..e65a50192432 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -681,7 +681,8 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 	int len, i, rc = 0;
 
 	if (addr_len != sizeof(struct sockaddr_x25) ||
-	    addr->sx25_family != AF_X25) {
+	    addr->sx25_family != AF_X25 ||
+	    strnlen(addr->sx25_addr.x25_addr, X25_ADDR_LEN) == X25_ADDR_LEN) {
 		rc = -EINVAL;
 		goto out;
 	}
@@ -775,7 +776,8 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
 
 	rc = -EINVAL;
 	if (addr_len != sizeof(struct sockaddr_x25) ||
-	    addr->sx25_family != AF_X25)
+	    addr->sx25_family != AF_X25 ||
+	    strnlen(addr->sx25_addr.x25_addr, X25_ADDR_LEN) == X25_ADDR_LEN)
 		goto out;
 
 	rc = -ENETUNREACH;
commit 34816d20f173a90389c8a7e641166d8ea9dce70a
Merge: 3bb61aa61828 dd0ecf544125
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 2 17:25:23 2020 -0800

    Merge tag 'gfs2-v5.10-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2
    
    Pull gfs2 fixes from Andreas Gruenbacher:
     "Various gfs2 fixes"
    
    * tag 'gfs2-v5.10-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
      gfs2: Fix deadlock between gfs2_{create_inode,inode_lookup} and delete_work_func
      gfs2: Upgrade shared glocks for atime updates
      gfs2: Don't freeze the file system during unmount
      gfs2: check for empty rgrp tree in gfs2_ri_update
      gfs2: set lockdep subclass for iopen glocks
      gfs2: Fix deadlock dumping resource group glocks

commit ccc9e67ab26feda7e62749bb54c05d7abe07dca9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Nov 25 19:30:32 2020 +0000

    drm/i915/display: Defer initial modeset until after GGTT is initialised
    
    Prior to sanitizing the GGTT, the only operations allowed in
    intel_display_init_nogem() are those to reserve the preallocated (and
    active) regions in the GGTT leftover from the BIOS. Trying to allocate a
    GGTT vma (such as intel_pin_and_fence_fb_obj during the initial modeset)
    may then conflict with other preallocated regions that have not yet been
    protected.
    
    Move the initial modesetting from the end of init_nogem to the beginning
    of init so that any vma pinning (either framebuffers or DSB, for example),
    is after the GGTT is ready to handle it.
    
    This will prevent the DSB object from being destroyed too early:
    
    [   53.449241] BUG: KASAN: use-after-free in i915_init_ggtt+0x324/0x9e0 [i915]
    [   53.449309] Read of size 8 at addr ffff88811b1e8070 by task systemd-udevd/345
    
    [   53.449399] CPU: 1 PID: 345 Comm: systemd-udevd Tainted: G        W         5.10.0-rc5+ #12
    [   53.449409] Call Trace:
    [   53.449418]  dump_stack+0x9a/0xcc
    [   53.449558]  ? i915_init_ggtt+0x324/0x9e0 [i915]
    [   53.449565]  print_address_description.constprop.0+0x3e/0x60
    [   53.449577]  ? _raw_spin_lock_irqsave+0x4e/0x50
    [   53.449718]  ? i915_init_ggtt+0x324/0x9e0 [i915]
    [   53.449849]  ? i915_init_ggtt+0x324/0x9e0 [i915]
    [   53.449857]  kasan_report.cold+0x1f/0x37
    [   53.449993]  ? i915_init_ggtt+0x324/0x9e0 [i915]
    [   53.450130]  i915_init_ggtt+0x324/0x9e0 [i915]
    [   53.450273]  ? i915_ggtt_suspend+0x1f0/0x1f0 [i915]
    [   53.450281]  ? static_obj+0x69/0x80
    [   53.450289]  ? lockdep_init_map_waits+0xa9/0x310
    [   53.450431]  ? intel_wopcm_init+0x96/0x3d0 [i915]
    [   53.450581]  ? i915_gem_init+0x75/0x2d0 [i915]
    [   53.450720]  i915_gem_init+0x75/0x2d0 [i915]
    [   53.450852]  i915_driver_probe+0x8c2/0x1210 [i915]
    [   53.450993]  ? i915_pm_prepare+0x630/0x630 [i915]
    [   53.451006]  ? check_chain_key+0x1e7/0x2e0
    [   53.451025]  ? __pm_runtime_resume+0x58/0xb0
    [   53.451157]  i915_pci_probe+0xa6/0x2b0 [i915]
    [   53.451285]  ? i915_pci_remove+0x40/0x40 [i915]
    [   53.451295]  ? lockdep_hardirqs_on_prepare+0x124/0x230
    [   53.451302]  ? _raw_spin_unlock_irqrestore+0x42/0x50
    [   53.451309]  ? lockdep_hardirqs_on+0xbf/0x130
    [   53.451315]  ? preempt_count_sub+0xf/0xb0
    [   53.451321]  ? _raw_spin_unlock_irqrestore+0x2f/0x50
    [   53.451335]  pci_device_probe+0xf9/0x190
    [   53.451350]  really_probe+0x17f/0x5b0
    [   53.451365]  driver_probe_device+0x13a/0x1c0
    [   53.451376]  device_driver_attach+0x82/0x90
    [   53.451386]  ? device_driver_attach+0x90/0x90
    [   53.451391]  __driver_attach+0xab/0x190
    [   53.451401]  ? device_driver_attach+0x90/0x90
    [   53.451407]  bus_for_each_dev+0xe4/0x140
    [   53.451414]  ? subsys_dev_iter_exit+0x10/0x10
    [   53.451423]  ? __list_add_valid+0x2b/0xa0
    [   53.451440]  bus_add_driver+0x227/0x2e0
    [   53.451454]  driver_register+0xd3/0x150
    [   53.451585]  i915_init+0x92/0xac [i915]
    [   53.451592]  ? 0xffffffffa0a20000
    [   53.451598]  do_one_initcall+0xb6/0x3b0
    [   53.451606]  ? trace_event_raw_event_initcall_finish+0x150/0x150
    [   53.451614]  ? __kasan_kmalloc.constprop.0+0xc2/0xd0
    [   53.451627]  ? kmem_cache_alloc_trace+0x4a4/0x8e0
    [   53.451634]  ? kasan_unpoison_shadow+0x33/0x40
    [   53.451649]  do_init_module+0xf8/0x350
    [   53.451662]  load_module+0x43de/0x47f0
    [   53.451716]  ? module_frob_arch_sections+0x20/0x20
    [   53.451731]  ? rw_verify_area+0x5f/0x130
    [   53.451780]  ? __do_sys_finit_module+0x10d/0x1a0
    [   53.451785]  __do_sys_finit_module+0x10d/0x1a0
    [   53.451792]  ? __ia32_sys_init_module+0x40/0x40
    [   53.451800]  ? seccomp_do_user_notification.isra.0+0x5c0/0x5c0
    [   53.451829]  ? rcu_read_lock_bh_held+0xb0/0xb0
    [   53.451835]  ? mark_held_locks+0x24/0x90
    [   53.451856]  do_syscall_64+0x33/0x80
    [   53.451863]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [   53.451868] RIP: 0033:0x7fde09b4470d
    [   53.451875] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 53 f7 0c 00 f7 d8 64 89 01 48
    [   53.451880] RSP: 002b:00007ffd6abc1718 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
    [   53.451890] RAX: ffffffffffffffda RBX: 000056444e528150 RCX: 00007fde09b4470d
    [   53.451895] RDX: 0000000000000000 RSI: 00007fde09a21ded RDI: 000000000000000f
    [   53.451899] RBP: 0000000000020000 R08: 0000000000000000 R09: 0000000000000000
    [   53.451904] R10: 000000000000000f R11: 0000000000000246 R12: 00007fde09a21ded
    [   53.451909] R13: 0000000000000000 R14: 000056444e329200 R15: 000056444e528150
    
    [   53.451957] Allocated by task 345:
    [   53.451995]  kasan_save_stack+0x1b/0x40
    [   53.452001]  __kasan_kmalloc.constprop.0+0xc2/0xd0
    [   53.452006]  kmem_cache_alloc+0x1cd/0x8d0
    [   53.452146]  i915_vma_instance+0x126/0xb70 [i915]
    [   53.452304]  i915_gem_object_ggtt_pin_ww+0x222/0x3f0 [i915]
    [   53.452446]  intel_dsb_prepare+0x14f/0x230 [i915]
    [   53.452588]  intel_atomic_commit+0x183/0x690 [i915]
    [   53.452730]  intel_initial_commit+0x2bc/0x2f0 [i915]
    [   53.452871]  intel_modeset_init_nogem+0xa02/0x2af0 [i915]
    [   53.452995]  i915_driver_probe+0x8af/0x1210 [i915]
    [   53.453120]  i915_pci_probe+0xa6/0x2b0 [i915]
    [   53.453125]  pci_device_probe+0xf9/0x190
    [   53.453131]  really_probe+0x17f/0x5b0
    [   53.453136]  driver_probe_device+0x13a/0x1c0
    [   53.453142]  device_driver_attach+0x82/0x90
    [   53.453148]  __driver_attach+0xab/0x190
    [   53.453153]  bus_for_each_dev+0xe4/0x140
    [   53.453158]  bus_add_driver+0x227/0x2e0
    [   53.453164]  driver_register+0xd3/0x150
    [   53.453286]  i915_init+0x92/0xac [i915]
    [   53.453292]  do_one_initcall+0xb6/0x3b0
    [   53.453297]  do_init_module+0xf8/0x350
    [   53.453302]  load_module+0x43de/0x47f0
    [   53.453307]  __do_sys_finit_module+0x10d/0x1a0
    [   53.453312]  do_syscall_64+0x33/0x80
    [   53.453318]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    [   53.453345] Freed by task 82:
    [   53.453379]  kasan_save_stack+0x1b/0x40
    [   53.453384]  kasan_set_track+0x1c/0x30
    [   53.453389]  kasan_set_free_info+0x1b/0x30
    [   53.453394]  __kasan_slab_free+0x112/0x160
    [   53.453399]  kmem_cache_free+0xb2/0x3f0
    [   53.453536]  i915_gem_flush_free_objects+0x31a/0x3b0 [i915]
    [   53.453542]  process_one_work+0x519/0x9f0
    [   53.453547]  worker_thread+0x75/0x5c0
    [   53.453552]  kthread+0x1da/0x230
    [   53.453557]  ret_from_fork+0x22/0x30
    
    [   53.453584] The buggy address belongs to the object at ffff88811b1e8040
                    which belongs to the cache i915_vma of size 968
    [   53.453692] The buggy address is located 48 bytes inside of
                    968-byte region [ffff88811b1e8040, ffff88811b1e8408)
    [   53.453792] The buggy address belongs to the page:
    [   53.453842] page:00000000b35f7048 refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff88811b1ef940 pfn:0x11b1e8
    [   53.453847] head:00000000b35f7048 order:3 compound_mapcount:0 compound_pincount:0
    [   53.453853] flags: 0x8000000000010200(slab|head)
    [   53.453860] raw: 8000000000010200 ffff888115596248 ffff888115596248 ffff8881155b6340
    [   53.453866] raw: ffff88811b1ef940 0000000000170001 00000001ffffffff 0000000000000000
    [   53.453870] page dumped because: kasan: bad access detected
    
    [   53.453895] Memory state around the buggy address:
    [   53.453944]  ffff88811b1e7f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [   53.454011]  ffff88811b1e7f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [   53.454079] >ffff88811b1e8000: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb
    [   53.454146]                                                              ^
    [   53.454211]  ffff88811b1e8080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [   53.454279]  ffff88811b1e8100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [   53.454347] ==================================================================
    [   53.454414] Disabling lock debugging due to kernel taint
    [   53.454434] general protection fault, probably for non-canonical address 0xdead0000000000d0: 0000 [#1] PREEMPT SMP KASAN PTI
    [   53.454446] CPU: 1 PID: 345 Comm: systemd-udevd Tainted: G    B   W         5.10.0-rc5+ #12
    [   53.454592] RIP: 0010:i915_init_ggtt+0x26f/0x9e0 [i915]
    [   53.454602] Code: 89 8d 48 ff ff ff 4c 8d 60 d0 49 39 c7 0f 84 37 02 00 00 4c 89 b5 40 ff ff ff 4d 8d bc 24 90 00 00 00 4c 89 ff e8 c1 97 f8 e0 <49> 83 bc 24 90 00 00 00 00 0f 84 0f 02 00 00 49 8d 7c 24 08 e8 a8
    [   53.454618] RSP: 0018:ffff88812247f430 EFLAGS: 00010286
    [   53.454625] RAX: 0000000000000000 RBX: ffff888136440000 RCX: ffffffffa03fb78f
    [   53.454633] RDX: 0000000000000000 RSI: 0000000000000008 RDI: dead000000000160
    [   53.454641] RBP: ffff88812247f500 R08: ffffffff8113589f R09: 0000000000000000
    [   53.454648] R10: ffffffff83063843 R11: fffffbfff060c708 R12: dead0000000000d0
    [   53.454656] R13: ffff888136449ba0 R14: 0000000000002000 R15: dead000000000160
    [   53.454664] FS:  00007fde095c4880(0000) GS:ffff88840c880000(0000) knlGS:0000000000000000
    [   53.454672] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   53.454679] CR2: 00007fef132b4f28 CR3: 000000012245c002 CR4: 00000000003706e0
    [   53.454686] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [   53.454693] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [   53.454700] Call Trace:
    [   53.454833]  ? i915_ggtt_suspend+0x1f0/0x1f0 [i915]
    
    Reported-by: Matthew Auld <matthew.auld at intel.com>
    Fixes: afeda4f3b1c8 ("drm/i915/dsb: Pre allocate and late cleanup of cmd buffer")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Cc: Matthew Auld <matthew.auld at intel.com>
    Cc: Lucas De Marchi <lucas.demarchi at intel.com>
    Tested-by: Matthew Auld <matthew.auld at intel.com>
    Reviewed-by: Matthew Auld <matthew.auld at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201125193032.29282-1-chris@chris-wilson.co.uk
    (cherry picked from commit b3bf99daaee96a141536ce5c60a0d6dba6ec1d23)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index c0d920f596f4..3bfe6ed67da1 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -18021,16 +18021,6 @@ int intel_modeset_init_nogem(struct drm_i915_private *i915)
 	if (!HAS_GMCH(i915))
 		sanitize_watermarks(i915);
 
-	/*
-	 * Force all active planes to recompute their states. So that on
-	 * mode_setcrtc after probe, all the intel_plane_state variables
-	 * are already calculated and there is no assert_plane warnings
-	 * during bootup.
-	 */
-	ret = intel_initial_commit(dev);
-	if (ret)
-		drm_dbg_kms(&i915->drm, "Initial commit in probe failed.\n");
-
 	return 0;
 }
 
@@ -18042,6 +18032,16 @@ int intel_modeset_init(struct drm_i915_private *i915)
 	if (!HAS_DISPLAY(i915))
 		return 0;
 
+	/*
+	 * Force all active planes to recompute their states. So that on
+	 * mode_setcrtc after probe, all the intel_plane_state variables
+	 * are already calculated and there is no assert_plane warnings
+	 * during bootup.
+	 */
+	ret = intel_initial_commit(&i915->drm);
+	if (ret)
+		return ret;
+
 	intel_overlay_setup(i915);
 
 	ret = intel_fbdev_init(&i915->drm);
commit 37eade64eb11c6d548c9a7030ccc655decfb8fa0
Author: Jani Nikula <jani.nikula at intel.com>
Date:   Fri Nov 6 14:55:27 2020 -0800

    drm/i915/display: return earlier from intel_modeset_init() without display
    
    !HAS_DISPLAY() implies !HAS_OVERLAY(), skipping overlay setup anyway, so
    return earlier from intel_modeset_init() for clarity.
    
    Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Signed-off-by: Jani Nikula <jani.nikula at intel.com>
    Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
    Reviewed-by: José Roberto de Souza <jose.souza at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201106225531.920641-4-lucas.demarchi@intel.com
    (cherry picked from commit 71c8415d0daa78ef1295743d0e11ba0214d0a9b9)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 99e682563d47..c0d920f596f4 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -18039,11 +18039,11 @@ int intel_modeset_init(struct drm_i915_private *i915)
 {
 	int ret;
 
-	intel_overlay_setup(i915);
-
 	if (!HAS_DISPLAY(i915))
 		return 0;
 
+	intel_overlay_setup(i915);
+
 	ret = intel_fbdev_init(&i915->drm);
 	if (ret)
 		return ret;
commit aff76ab795364569b1cac58c1d0bc7df956e3899
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 24 18:35:21 2020 +0000

    drm/i915/gt: Limit frequency drop to RPe on parking
    
    We treat idling the GT (intel_rps_park) as a downclock event, and reduce
    the frequency we intend to restart the GT with. Since the two workloads
    are likely related (e.g. a compositor rendering every 16ms), we want to
    carry the frequency and load information from across the idling.
    However, we do also need to update the frequencies so that workloads
    that run for less than 1ms are autotuned by RPS (otherwise we leave
    compositors running at max clocks, draining excess power). Conversely,
    if we try to run too slowly, the next workload has to run longer. Since
    there is a hysteresis in the power graph, below a certain frequency
    running a short workload for longer consumes more energy than running it
    slightly higher for less time. The exact balance point is unknown
    beforehand, but measurements with 30fps media playback indicate that RPe
    is a better choice.
    
    Reported-by: Edward Baker <edward.baker at intel.com>
    Tested-by: Edward Baker <edward.baker at intel.com>
    Fixes: 043cd2d14ede ("drm/i915/gt: Leave rps->cur_freq on unpark")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Edward Baker <edward.baker at intel.com>
    Cc: Andi Shyti <andi.shyti at intel.com>
    Cc: Lyude Paul <lyude at redhat.com>
    Cc: <stable at vger.kernel.org> # v5.8+
    Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Reviewed-by: Andi Shyti <andi.shyti at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201124183521.28623-1-chris@chris-wilson.co.uk
    (cherry picked from commit f7ed83cc1925f0b8ce2515044d674354035c3af9)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c
index e6a00eea0631..c1c9cc0ad3b9 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -883,6 +883,10 @@ void intel_rps_park(struct intel_rps *rps)
 		adj = -2;
 	rps->last_adj = adj;
 	rps->cur_freq = max_t(int, rps->cur_freq + adj, rps->min_freq);
+	if (rps->cur_freq < rps->efficient_freq) {
+		rps->cur_freq = rps->efficient_freq;
+		rps->last_adj = 0;
+	}
 
 	GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq);
 }
commit 78b2eb8a1f10f366681acad8d21c974c1f66791a
Author: Venkata Ramana Nayana <venkata.ramana.nayana at intel.com>
Date:   Fri Nov 27 12:07:16 2020 +0000

    drm/i915/gt: Retain default context state across shrinking
    
    As we use a shmemfs file to hold the context state, when not in use it
    may be swapped out, such as across suspend. Since we wrote into the
    shmemfs without marking the pages as dirty, the contents may be dropped
    instead of being written back to swap. On re-using the shmemfs file,
    such as creating a new context after resume, the contents of that file
    were likely garbage and so the new context could then hang the GPU.
    
    Simply mark the page as being written when copying into the shmemfs
    file, and it the new contents will be retained across swapout.
    
    Fixes: be1cb55a07bf ("drm/i915/gt: Keep a no-frills swappable copy of the default context state")
    Cc: Sudeep Dutt <sudeep.dutt at intel.com>
    Cc: Matthew Auld <matthew.auld at intel.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Cc: Ramalingam C <ramalingam.c at intel.com>
    Signed-off-by: CQ Tang <cq.tang at intel.com>
    Signed-off-by: Venkata Ramana Nayana <venkata.ramana.nayana at intel.com>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: <stable at vger.kernel.org> # v5.8+
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127120718.454037-161-matthew.auld@intel.com
    (cherry picked from commit a9d71f76ccfd309f3bd5f7c9b60e91a4decae792)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/shmem_utils.c b/drivers/gpu/drm/i915/gt/shmem_utils.c
index f011ea42487e..463af675fadd 100644
--- a/drivers/gpu/drm/i915/gt/shmem_utils.c
+++ b/drivers/gpu/drm/i915/gt/shmem_utils.c
@@ -103,10 +103,13 @@ static int __shmem_rw(struct file *file, loff_t off,
 			return PTR_ERR(page);
 
 		vaddr = kmap(page);
-		if (write)
+		if (write) {
 			memcpy(vaddr + offset_in_page(off), ptr, this);
-		else
+			set_page_dirty(page);
+		} else {
 			memcpy(ptr, vaddr + offset_in_page(off), this);
+		}
+		mark_page_accessed(page);
 		kunmap(page);
 		put_page(page);
 
commit 2bfdf302465a5eab941e551e2869a96bb473f66f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Nov 26 14:04:06 2020 +0000

    drm/i915/gt: Split the breadcrumb spinlock between global and contexts
    
    As we funnel more and more contexts into the breadcrumbs on an engine,
    the hold time of b->irq_lock grows. As we may then contend with the
    b->irq_lock during request submission, this increases the burden upon
    the engine->active.lock and so directly impacts both our execution
    latency and client latency. If we split the b->irq_lock by introducing a
    per-context spinlock to manage the signalers within a context, we then
    only need the b->irq_lock for enabling/disabling the interrupt and can
    avoid taking the lock for walking the list of contexts within the signal
    worker. Even with the current setup, this greatly reduces the number of
    times we have to take and fight for b->irq_lock.
    
    Furthermore, this closes the race between enabling the signaling context
    while it is in the process of being signaled and removed:
    
    <4>[  416.208555] list_add corruption. prev->next should be next (ffff8881951d5910), but was dead000000000100. (prev=ffff8882781bb870).
    <4>[  416.208573] WARNING: CPU: 7 PID: 0 at lib/list_debug.c:28 __list_add_valid+0x4d/0x70
    <4>[  416.208575] Modules linked in: i915(+) vgem snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio mei_hdcp x86_pkg_temp_thermal coretemp ax88179_178a usbnet mii crct10dif_pclmul snd_intel_dspcfg crc32_pclmul snd_hda_codec snd_hwdep ghash_clmulni_intel snd_hda_core e1000e snd_pcm ptp pps_core mei_me mei prime_numbers intel_lpss_pci [last unloaded: i915]
    <4>[  416.208611] CPU: 7 PID: 0 Comm: swapper/7 Tainted: G     U            5.8.0-CI-CI_DRM_8852+ #1
    <4>[  416.208614] Hardware name: Intel Corporation Ice Lake Client Platform/IceLake Y LPDDR4x T4 RVP TLC, BIOS ICLSFWR1.R00.3212.A00.1905212112 05/21/2019
    <4>[  416.208627] RIP: 0010:__list_add_valid+0x4d/0x70
    <4>[  416.208631] Code: c3 48 89 d1 48 c7 c7 60 18 33 82 48 89 c2 e8 ea e0 b6 ff 0f 0b 31 c0 c3 48 89 c1 4c 89 c6 48 c7 c7 b0 18 33 82 e8 d3 e0 b6 ff <0f> 0b 31 c0 c3 48 89 f2 4c 89 c1 48 89 fe 48 c7 c7 00 19 33 82 e8
    <4>[  416.208633] RSP: 0018:ffffc90000280e18 EFLAGS: 00010086
    <4>[  416.208636] RAX: 0000000000000000 RBX: ffff888250a44880 RCX: 0000000000000105
    <4>[  416.208639] RDX: 0000000000000105 RSI: ffffffff82320c5b RDI: 00000000ffffffff
    <4>[  416.208641] RBP: ffff8882781bb870 R08: 0000000000000000 R09: 0000000000000001
    <4>[  416.208643] R10: 00000000054d2957 R11: 000000006abbd991 R12: ffff8881951d58c8
    <4>[  416.208646] R13: ffff888286073880 R14: ffff888286073848 R15: ffff8881951d5910
    <4>[  416.208669] FS:  0000000000000000(0000) GS:ffff88829c180000(0000) knlGS:0000000000000000
    <4>[  416.208671] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    <4>[  416.208673] CR2: 0000556231326c48 CR3: 0000000005610001 CR4: 0000000000760ee0
    <4>[  416.208675] PKRU: 55555554
    <4>[  416.208677] Call Trace:
    <4>[  416.208679]  <IRQ>
    <4>[  416.208751]  i915_request_enable_breadcrumb+0x278/0x400 [i915]
    <4>[  416.208839]  __i915_request_submit+0xca/0x2a0 [i915]
    <4>[  416.208892]  __execlists_submission_tasklet+0x480/0x1830 [i915]
    <4>[  416.208942]  execlists_submission_tasklet+0xc4/0x130 [i915]
    <4>[  416.208947]  tasklet_action_common.isra.17+0x6c/0x1c0
    <4>[  416.208954]  __do_softirq+0xdf/0x498
    <4>[  416.208960]  ? handle_fasteoi_irq+0x150/0x150
    <4>[  416.208964]  asm_call_on_stack+0xf/0x20
    <4>[  416.208966]  </IRQ>
    <4>[  416.208969]  do_softirq_own_stack+0xa1/0xc0
    <4>[  416.208972]  irq_exit_rcu+0xb5/0xc0
    <4>[  416.208976]  common_interrupt+0xf7/0x260
    <4>[  416.208980]  asm_common_interrupt+0x1e/0x40
    <4>[  416.208985] RIP: 0010:cpuidle_enter_state+0xb6/0x410
    <4>[  416.208987] Code: 00 31 ff e8 9c 3e 89 ff 80 7c 24 0b 00 74 12 9c 58 f6 c4 02 0f 85 31 03 00 00 31 ff e8 e3 6c 90 ff e8 fe a4 94 ff fb 45 85 ed <0f> 88 c7 02 00 00 49 63 c5 4c 2b 24 24 48 8d 14 40 48 8d 14 90 48
    <4>[  416.208989] RSP: 0018:ffffc90000143e70 EFLAGS: 00000206
    <4>[  416.208991] RAX: 0000000000000007 RBX: ffffe8ffffda8070 RCX: 0000000000000000
    <4>[  416.208993] RDX: 0000000000000000 RSI: ffffffff8238b4ee RDI: ffffffff8233184f
    <4>[  416.208995] RBP: ffffffff826b4e00 R08: 0000000000000000 R09: 0000000000000000
    <4>[  416.208997] R10: 0000000000000001 R11: 0000000000000000 R12: 00000060e7f24a8f
    <4>[  416.208998] R13: 0000000000000003 R14: 0000000000000003 R15: 0000000000000003
    <4>[  416.209012]  cpuidle_enter+0x24/0x40
    <4>[  416.209016]  do_idle+0x22f/0x2d0
    <4>[  416.209022]  cpu_startup_entry+0x14/0x20
    <4>[  416.209025]  start_secondary+0x158/0x1a0
    <4>[  416.209030]  secondary_startup_64+0xa4/0xb0
    <4>[  416.209039] irq event stamp: 10186977
    <4>[  416.209042] hardirqs last  enabled at (10186976): [<ffffffff810b9363>] tasklet_action_common.isra.17+0xe3/0x1c0
    <4>[  416.209044] hardirqs last disabled at (10186977): [<ffffffff81a5e5ed>] _raw_spin_lock_irqsave+0xd/0x50
    <4>[  416.209047] softirqs last  enabled at (10186968): [<ffffffff810b9a1a>] irq_enter_rcu+0x6a/0x70
    <4>[  416.209049] softirqs last disabled at (10186969): [<ffffffff81c00f4f>] asm_call_on_stack+0xf/0x20
    
    <4>[  416.209317] list_del corruption, ffff8882781bb870->next is LIST_POISON1 (dead000000000100)
    <4>[  416.209317] WARNING: CPU: 7 PID: 46 at lib/list_debug.c:47 __list_del_entry_valid+0x4e/0x90
    <4>[  416.209317] Modules linked in: i915(+) vgem snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio mei_hdcp x86_pkg_temp_thermal coretemp ax88179_178a usbnet mii crct10dif_pclmul snd_intel_dspcfg crc32_pclmul snd_hda_codec snd_hwdep ghash_clmulni_intel snd_hda_core e1000e snd_pcm ptp pps_core mei_me mei prime_numbers intel_lpss_pci [last unloaded: i915]
    <4>[  416.209317] CPU: 7 PID: 46 Comm: ksoftirqd/7 Tainted: G     U  W         5.8.0-CI-CI_DRM_8852+ #1
    <4>[  416.209317] Hardware name: Intel Corporation Ice Lake Client Platform/IceLake Y LPDDR4x T4 RVP TLC, BIOS ICLSFWR1.R00.3212.A00.1905212112 05/21/2019
    <4>[  416.209317] RIP: 0010:__list_del_entry_valid+0x4e/0x90
    <4>[  416.209317] Code: 2e 48 8b 32 48 39 fe 75 3a 48 8b 50 08 48 39 f2 75 48 b8 01 00 00 00 c3 48 89 fe 48 89 c2 48 c7 c7 38 19 33 82 e8 62 e0 b6 ff <0f> 0b 31 c0 c3 48 89 fe 48 c7 c7 70 19 33 82 e8 4e e0 b6 ff 0f 0b
    <4>[  416.209317] RSP: 0018:ffffc90000280de8 EFLAGS: 00010086
    <4>[  416.209317] RAX: 0000000000000000 RBX: ffff8882781bb848 RCX: 0000000000010104
    <4>[  416.209317] RDX: 0000000000010104 RSI: ffffffff8238b4ee RDI: 00000000ffffffff
    <4>[  416.209317] RBP: ffff8882781bb880 R08: 0000000000000000 R09: 0000000000000001
    <4>[  416.209317] R10: 000000009fb6666e R11: 00000000feca9427 R12: ffffc90000280e18
    <4>[  416.209317] R13: ffff8881951d5930 R14: dead0000000000d8 R15: ffff8882781bb880
    <4>[  416.209317] FS:  0000000000000000(0000) GS:ffff88829c180000(0000) knlGS:0000000000000000
    <4>[  416.209317] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    <4>[  416.209317] CR2: 0000556231326c48 CR3: 0000000005610001 CR4: 0000000000760ee0
    <4>[  416.209317] PKRU: 55555554
    <4>[  416.209317] Call Trace:
    <4>[  416.209317]  <IRQ>
    <4>[  416.209317]  remove_signaling_context.isra.13+0xd/0x70 [i915]
    <4>[  416.209513]  signal_irq_work+0x1f7/0x4b0 [i915]
    
    This is caused by virtual engines where although we take the breadcrumb
    lock on each of the active engines, they may be different engines on
    different requests, It turns out that the b->irq_lock was not a
    sufficient proxy for the engine->active.lock in the case of more than
    one request, so introduce an explicit lock around ce->signals.
    
    v2: ce->signal_lock is acquired with only RCU protection and so must be
    treated carefully and not cleared during reallocation. We also then need
    to confirm that the ce we lock is the same as we found in the breadcrumb
    list.
    
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2276
    Fixes: c18636f76344 ("drm/i915: Remove requirement for holding i915_request.lock for breadcrumbs")
    Fixes: 2854d866327a ("drm/i915/gt: Replace intel_engine_transfer_stale_breadcrumbs")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201126140407.31952-4-chris@chris-wilson.co.uk
    (cherry picked from commit c744d50363b714783bbc88d986cc16def13710f7)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index cf6e05ea4d8f..a24cc1ff08a0 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -101,18 +101,37 @@ static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b)
 	intel_gt_pm_put_async(b->irq_engine->gt);
 }
 
+static void intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b)
+{
+	spin_lock(&b->irq_lock);
+	if (b->irq_armed)
+		__intel_breadcrumbs_disarm_irq(b);
+	spin_unlock(&b->irq_lock);
+}
+
 static void add_signaling_context(struct intel_breadcrumbs *b,
 				  struct intel_context *ce)
 {
-	intel_context_get(ce);
-	list_add_tail(&ce->signal_link, &b->signalers);
+	lockdep_assert_held(&ce->signal_lock);
+
+	spin_lock(&b->signalers_lock);
+	list_add_rcu(&ce->signal_link, &b->signalers);
+	spin_unlock(&b->signalers_lock);
 }
 
-static void remove_signaling_context(struct intel_breadcrumbs *b,
+static bool remove_signaling_context(struct intel_breadcrumbs *b,
 				     struct intel_context *ce)
 {
-	list_del(&ce->signal_link);
-	intel_context_put(ce);
+	lockdep_assert_held(&ce->signal_lock);
+
+	if (!list_empty(&ce->signals))
+		return false;
+
+	spin_lock(&b->signalers_lock);
+	list_del_rcu(&ce->signal_link);
+	spin_unlock(&b->signalers_lock);
+
+	return true;
 }
 
 static inline bool __request_completed(const struct i915_request *rq)
@@ -175,6 +194,8 @@ static void add_retire(struct intel_breadcrumbs *b, struct intel_timeline *tl)
 
 static bool __signal_request(struct i915_request *rq)
 {
+	GEM_BUG_ON(test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags));
+
 	if (!__dma_fence_signal(&rq->fence)) {
 		i915_request_put(rq);
 		return false;
@@ -195,15 +216,12 @@ static void signal_irq_work(struct irq_work *work)
 	struct intel_breadcrumbs *b = container_of(work, typeof(*b), irq_work);
 	const ktime_t timestamp = ktime_get();
 	struct llist_node *signal, *sn;
-	struct intel_context *ce, *cn;
-	struct list_head *pos, *next;
+	struct intel_context *ce;
 
 	signal = NULL;
 	if (unlikely(!llist_empty(&b->signaled_requests)))
 		signal = llist_del_all(&b->signaled_requests);
 
-	spin_lock(&b->irq_lock);
-
 	/*
 	 * Keep the irq armed until the interrupt after all listeners are gone.
 	 *
@@ -229,47 +247,44 @@ static void signal_irq_work(struct irq_work *work)
 	 * interrupt draw less ire from other users of the system and tools
 	 * like powertop.
 	 */
-	if (!signal && b->irq_armed && list_empty(&b->signalers))
-		__intel_breadcrumbs_disarm_irq(b);
+	if (!signal && READ_ONCE(b->irq_armed) && list_empty(&b->signalers))
+		intel_breadcrumbs_disarm_irq(b);
 
-	list_for_each_entry_safe(ce, cn, &b->signalers, signal_link) {
-		GEM_BUG_ON(list_empty(&ce->signals));
+	rcu_read_lock();
+	list_for_each_entry_rcu(ce, &b->signalers, signal_link) {
+		struct i915_request *rq;
 
-		list_for_each_safe(pos, next, &ce->signals) {
-			struct i915_request *rq =
-				list_entry(pos, typeof(*rq), signal_link);
+		list_for_each_entry_rcu(rq, &ce->signals, signal_link) {
+			bool release;
 
-			GEM_BUG_ON(!check_signal_order(ce, rq));
 			if (!__request_completed(rq))
 				break;
 
+			if (!test_and_clear_bit(I915_FENCE_FLAG_SIGNAL,
+						&rq->fence.flags))
+				break;
+
 			/*
 			 * Queue for execution after dropping the signaling
 			 * spinlock as the callback chain may end up adding
 			 * more signalers to the same context or engine.
 			 */
-			clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
+			spin_lock(&ce->signal_lock);
+			list_del_rcu(&rq->signal_link);
+			release = remove_signaling_context(b, ce);
+			spin_unlock(&ce->signal_lock);
+
 			if (__signal_request(rq))
 				/* We own signal_node now, xfer to local list */
 				signal = slist_add(&rq->signal_node, signal);
-		}
 
-		/*
-		 * We process the list deletion in bulk, only using a list_add
-		 * (not list_move) above but keeping the status of
-		 * rq->signal_link known with the I915_FENCE_FLAG_SIGNAL bit.
-		 */
-		if (!list_is_first(pos, &ce->signals)) {
-			/* Advance the list to the first incomplete request */
-			__list_del_many(&ce->signals, pos);
-			if (&ce->signals == pos) { /* now empty */
+			if (release) {
 				add_retire(b, ce->timeline);
-				remove_signaling_context(b, ce);
+				intel_context_put(ce);
 			}
 		}
 	}
-
-	spin_unlock(&b->irq_lock);
+	rcu_read_unlock();
 
 	llist_for_each_safe(signal, sn, signal) {
 		struct i915_request *rq =
@@ -298,14 +313,15 @@ intel_breadcrumbs_create(struct intel_engine_cs *irq_engine)
 	if (!b)
 		return NULL;
 
-	spin_lock_init(&b->irq_lock);
+	b->irq_engine = irq_engine;
+
+	spin_lock_init(&b->signalers_lock);
 	INIT_LIST_HEAD(&b->signalers);
 	init_llist_head(&b->signaled_requests);
 
+	spin_lock_init(&b->irq_lock);
 	init_irq_work(&b->irq_work, signal_irq_work);
 
-	b->irq_engine = irq_engine;
-
 	return b;
 }
 
@@ -347,9 +363,9 @@ void intel_breadcrumbs_free(struct intel_breadcrumbs *b)
 	kfree(b);
 }
 
-static void insert_breadcrumb(struct i915_request *rq,
-			      struct intel_breadcrumbs *b)
+static void insert_breadcrumb(struct i915_request *rq)
 {
+	struct intel_breadcrumbs *b = READ_ONCE(rq->engine)->breadcrumbs;
 	struct intel_context *ce = rq->context;
 	struct list_head *pos;
 
@@ -371,6 +387,7 @@ static void insert_breadcrumb(struct i915_request *rq,
 	}
 
 	if (list_empty(&ce->signals)) {
+		intel_context_get(ce);
 		add_signaling_context(b, ce);
 		pos = &ce->signals;
 	} else {
@@ -396,8 +413,9 @@ static void insert_breadcrumb(struct i915_request *rq,
 				break;
 		}
 	}
-	list_add(&rq->signal_link, pos);
+	list_add_rcu(&rq->signal_link, pos);
 	GEM_BUG_ON(!check_signal_order(ce, rq));
+	GEM_BUG_ON(test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags));
 	set_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
 
 	/*
@@ -410,7 +428,7 @@ static void insert_breadcrumb(struct i915_request *rq,
 
 bool i915_request_enable_breadcrumb(struct i915_request *rq)
 {
-	struct intel_breadcrumbs *b;
+	struct intel_context *ce = rq->context;
 
 	/* Serialises with i915_request_retire() using rq->lock */
 	if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags))
@@ -425,67 +443,30 @@ bool i915_request_enable_breadcrumb(struct i915_request *rq)
 	if (!test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags))
 		return true;
 
-	/*
-	 * rq->engine is locked by rq->engine->active.lock. That however
-	 * is not known until after rq->engine has been dereferenced and
-	 * the lock acquired. Hence we acquire the lock and then validate
-	 * that rq->engine still matches the lock we hold for it.
-	 *
-	 * Here, we are using the breadcrumb lock as a proxy for the
-	 * rq->engine->active.lock, and we know that since the breadcrumb
-	 * will be serialised within i915_request_submit/i915_request_unsubmit,
-	 * the engine cannot change while active as long as we hold the
-	 * breadcrumb lock on that engine.
-	 *
-	 * From the dma_fence_enable_signaling() path, we are outside of the
-	 * request submit/unsubmit path, and so we must be more careful to
-	 * acquire the right lock.
-	 */
-	b = READ_ONCE(rq->engine)->breadcrumbs;
-	spin_lock(&b->irq_lock);
-	while (unlikely(b != READ_ONCE(rq->engine)->breadcrumbs)) {
-		spin_unlock(&b->irq_lock);
-		b = READ_ONCE(rq->engine)->breadcrumbs;
-		spin_lock(&b->irq_lock);
-	}
-
-	/*
-	 * Now that we are finally serialised with request submit/unsubmit,
-	 * [with b->irq_lock] and with i915_request_retire() [via checking
-	 * SIGNALED with rq->lock] confirm the request is indeed active. If
-	 * it is no longer active, the breadcrumb will be attached upon
-	 * i915_request_submit().
-	 */
+	spin_lock(&ce->signal_lock);
 	if (test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags))
-		insert_breadcrumb(rq, b);
-
-	spin_unlock(&b->irq_lock);
+		insert_breadcrumb(rq);
+	spin_unlock(&ce->signal_lock);
 
 	return true;
 }
 
 void i915_request_cancel_breadcrumb(struct i915_request *rq)
 {
-	struct intel_breadcrumbs *b = rq->engine->breadcrumbs;
+	struct intel_context *ce = rq->context;
+	bool release;
 
-	/*
-	 * We must wait for b->irq_lock so that we know the interrupt handler
-	 * has released its reference to the intel_context and has completed
-	 * the DMA_FENCE_FLAG_SIGNALED_BIT/I915_FENCE_FLAG_SIGNAL dance (if
-	 * required).
-	 */
-	spin_lock(&b->irq_lock);
-	if (test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags)) {
-		struct intel_context *ce = rq->context;
+	if (!test_and_clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags))
+		return;
 
-		list_del(&rq->signal_link);
-		if (list_empty(&ce->signals))
-			remove_signaling_context(b, ce);
+	spin_lock(&ce->signal_lock);
+	list_del_rcu(&rq->signal_link);
+	release = remove_signaling_context(rq->engine->breadcrumbs, ce);
+	spin_unlock(&ce->signal_lock);
+	if (release)
+		intel_context_put(ce);
 
-		clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
-		i915_request_put(rq);
-	}
-	spin_unlock(&b->irq_lock);
+	i915_request_put(rq);
 }
 
 static void print_signals(struct intel_breadcrumbs *b, struct drm_printer *p)
@@ -495,18 +476,17 @@ static void print_signals(struct intel_breadcrumbs *b, struct drm_printer *p)
 
 	drm_printf(p, "Signals:\n");
 
-	spin_lock_irq(&b->irq_lock);
-	list_for_each_entry(ce, &b->signalers, signal_link) {
-		list_for_each_entry(rq, &ce->signals, signal_link) {
+	rcu_read_lock();
+	list_for_each_entry_rcu(ce, &b->signalers, signal_link) {
+		list_for_each_entry_rcu(rq, &ce->signals, signal_link)
 			drm_printf(p, "\t[%llx:%llx%s] @ %dms\n",
 				   rq->fence.context, rq->fence.seqno,
 				   i915_request_completed(rq) ? "!" :
 				   i915_request_started(rq) ? "*" :
 				   "",
 				   jiffies_to_msecs(jiffies - rq->emitted_jiffies));
-		}
 	}
-	spin_unlock_irq(&b->irq_lock);
+	rcu_read_unlock();
 }
 
 void intel_engine_print_breadcrumbs(struct intel_engine_cs *engine,
diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
index 3fa19820b37a..a74bb3062bd8 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
@@ -29,18 +29,16 @@
  * the overhead of waking that client is much preferred.
  */
 struct intel_breadcrumbs {
-	spinlock_t irq_lock; /* protects the lists used in hardirq context */
-
 	/* Not all breadcrumbs are attached to physical HW */
 	struct intel_engine_cs *irq_engine;
 
+	spinlock_t signalers_lock; /* protects the list of signalers */
 	struct list_head signalers;
 	struct llist_head signaled_requests;
 
+	spinlock_t irq_lock; /* protects the interrupt from hardirq context */
 	struct irq_work irq_work; /* for use from inside irq_lock */
-
 	unsigned int irq_enabled;
-
 	bool irq_armed;
 };
 
diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c
index d3a835212167..349e7fa1488d 100644
--- a/drivers/gpu/drm/i915/gt/intel_context.c
+++ b/drivers/gpu/drm/i915/gt/intel_context.c
@@ -379,7 +379,8 @@ intel_context_init(struct intel_context *ce, struct intel_engine_cs *engine)
 
 	ce->vm = i915_vm_get(engine->gt->vm);
 
-	INIT_LIST_HEAD(&ce->signal_link);
+	/* NB ce->signal_link/lock is used under RCU */
+	spin_lock_init(&ce->signal_lock);
 	INIT_LIST_HEAD(&ce->signals);
 
 	mutex_init(&ce->pin_mutex);
diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h
index 20cb5835d1c3..52fa9c132746 100644
--- a/drivers/gpu/drm/i915/gt/intel_context_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
@@ -25,6 +25,7 @@ DECLARE_EWMA(runtime, 3, 8);
 struct i915_gem_context;
 struct i915_gem_ww_ctx;
 struct i915_vma;
+struct intel_breadcrumbs;
 struct intel_context;
 struct intel_ring;
 
@@ -63,8 +64,15 @@ struct intel_context {
 	struct i915_address_space *vm;
 	struct i915_gem_context __rcu *gem_context;
 
-	struct list_head signal_link;
-	struct list_head signals;
+	/*
+	 * @signal_lock protects the list of requests that need signaling,
+	 * @signals. While there are any requests that need signaling,
+	 * we add the context to the breadcrumbs worker, and remove it
+	 * upon completion/cancellation of the last request.
+	 */
+	struct list_head signal_link; /* Accessed under RCU */
+	struct list_head signals; /* Guarded by signal_lock */
+	spinlock_t signal_lock; /* protects signals, the list of requests */
 
 	struct i915_vma *state;
 	struct intel_ring *ring;
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h
index 874af6db6103..620b6fab2c5c 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -177,10 +177,8 @@ struct i915_request {
 	struct intel_ring *ring;
 	struct intel_timeline __rcu *timeline;
 
-	union {
-		struct list_head signal_link;
-		struct llist_node signal_node;
-	};
+	struct list_head signal_link;
+	struct llist_node signal_node;
 
 	/*
 	 * The rcu epoch of when this request was allocated. Used to judiciously
commit 9261a1db80bc81dd445cd6dcfb466b632ad9faa8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Nov 26 14:04:05 2020 +0000

    drm/i915/gt: Protect context lifetime with RCU
    
    Allow a brief period for continued access to a dead intel_context by
    deferring the release of the struct until after an RCU grace period.
    As we are using a dedicated slab cache for the contexts, we can defer
    the release of the slab pages via RCU, with the caveat that individual
    structs may be reused from the freelist within an RCU grace period. To
    handle that, we have to avoid clearing members of the zombie struct.
    
    This is required for a later patch to handle locking around virtual
    requests in the signaler, as those requests may want to move between
    engines and be destroyed while we are holding b->irq_lock on a physical
    engine.
    
    v2: Drop mutex_reinit(), if we never mark the mutex as destroyed we
    don't need to reset the debug code, at the loss of having the mutex
    debug code spot us attempting to destroy a locked mutex.
    v3: As the intended use will remain strongly referenced counted, with
    very little inflight access across reuse, drop the ctor.
    v4: Drop the unrequired change to remove the temporary reference around
    dropping the active context, and add back some more missing ctor
    operations.
    v5: The ctor is back. Tvrtko spotted that ce->signal_lock [introduced
    later] maybe accessed under RCU and so needs special care not to be
    reinitialised.
    v6: Don't mix SLAB_TYPESAFE_BY_RCU and RCU list iteration.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201126140407.31952-3-chris@chris-wilson.co.uk
    (cherry picked from commit 14d1eaf08845c534963c83f754afe0cb14cb2512)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c
index 92a3f25c4006..d3a835212167 100644
--- a/drivers/gpu/drm/i915/gt/intel_context.c
+++ b/drivers/gpu/drm/i915/gt/intel_context.c
@@ -25,11 +25,18 @@ static struct intel_context *intel_context_alloc(void)
 	return kmem_cache_zalloc(global.slab_ce, GFP_KERNEL);
 }
 
-void intel_context_free(struct intel_context *ce)
+static void rcu_context_free(struct rcu_head *rcu)
 {
+	struct intel_context *ce = container_of(rcu, typeof(*ce), rcu);
+
 	kmem_cache_free(global.slab_ce, ce);
 }
 
+void intel_context_free(struct intel_context *ce)
+{
+	call_rcu(&ce->rcu, rcu_context_free);
+}
+
 struct intel_context *
 intel_context_create(struct intel_engine_cs *engine)
 {
@@ -356,8 +363,7 @@ static int __intel_context_active(struct i915_active *active)
 }
 
 void
-intel_context_init(struct intel_context *ce,
-		   struct intel_engine_cs *engine)
+intel_context_init(struct intel_context *ce, struct intel_engine_cs *engine)
 {
 	GEM_BUG_ON(!engine->cops);
 	GEM_BUG_ON(!engine->gt->vm);
diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h
index 552cb57a2e8c..20cb5835d1c3 100644
--- a/drivers/gpu/drm/i915/gt/intel_context_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
@@ -44,7 +44,16 @@ struct intel_context_ops {
 };
 
 struct intel_context {
-	struct kref ref;
+	/*
+	 * Note: Some fields may be accessed under RCU.
+	 *
+	 * Unless otherwise noted a field can safely be assumed to be protected
+	 * by strong reference counting.
+	 */
+	union {
+		struct kref ref; /* no kref_get_unless_zero()! */
+		struct rcu_head rcu;
+	};
 
 	struct intel_engine_cs *engine;
 	struct intel_engine_cs *inflight;
commit 3413f04141aa440c71da187755e8e22f5093ce83
Author: Xuan Zhuo <xuanzhuo at linux.alibaba.com>
Date:   Tue Dec 1 21:56:58 2020 +0800

    xsk: Change the tx writeable condition
    
    Modify the tx writeable condition from the queue is not full to the
    number of present tx queues is less than the half of the total number
    of queues. Because the tx queue not full is a very short time, this will
    cause a large number of EPOLLOUT events, and cause a large number of
    process wake up.
    
    Fixes: 35fcde7f8deb ("xsk: support for Tx")
    Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Link: https://lore.kernel.org/bpf/508fef55188d4e1160747ead64c6dcda36735880.1606555939.git.xuanzhuo@linux.alibaba.com

diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index 9bbfd8adbb73..62504471fd20 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -211,6 +211,14 @@ static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len,
 	return 0;
 }
 
+static bool xsk_tx_writeable(struct xdp_sock *xs)
+{
+	if (xskq_cons_present_entries(xs->tx) > xs->tx->nentries / 2)
+		return false;
+
+	return true;
+}
+
 static bool xsk_is_bound(struct xdp_sock *xs)
 {
 	if (READ_ONCE(xs->state) == XSK_BOUND) {
@@ -296,7 +304,8 @@ void xsk_tx_release(struct xsk_buff_pool *pool)
 	rcu_read_lock();
 	list_for_each_entry_rcu(xs, &pool->xsk_tx_list, tx_list) {
 		__xskq_cons_release(xs->tx);
-		xs->sk.sk_write_space(&xs->sk);
+		if (xsk_tx_writeable(xs))
+			xs->sk.sk_write_space(&xs->sk);
 	}
 	rcu_read_unlock();
 }
@@ -436,7 +445,8 @@ static int xsk_generic_xmit(struct sock *sk)
 
 out:
 	if (sent_frame)
-		sk->sk_write_space(sk);
+		if (xsk_tx_writeable(xs))
+			sk->sk_write_space(sk);
 
 	mutex_unlock(&xs->mutex);
 	return err;
@@ -493,7 +503,7 @@ static __poll_t xsk_poll(struct file *file, struct socket *sock,
 
 	if (xs->rx && !xskq_prod_is_empty(xs->rx))
 		mask |= EPOLLIN | EPOLLRDNORM;
-	if (xs->tx && !xskq_cons_is_full(xs->tx))
+	if (xs->tx && xsk_tx_writeable(xs))
 		mask |= EPOLLOUT | EPOLLWRNORM;
 
 	return mask;
diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h
index cdb9cf3cd136..9e71b9f27679 100644
--- a/net/xdp/xsk_queue.h
+++ b/net/xdp/xsk_queue.h
@@ -264,6 +264,12 @@ static inline bool xskq_cons_is_full(struct xsk_queue *q)
 		q->nentries;
 }
 
+static inline u32 xskq_cons_present_entries(struct xsk_queue *q)
+{
+	/* No barriers needed since data is not accessed */
+	return READ_ONCE(q->ring->producer) - READ_ONCE(q->ring->consumer);
+}
+
 /* Functions for producers */
 
 static inline bool xskq_prod_is_full(struct xsk_queue *q)
commit f5da54187e33dce9bea63170667dbb0ca8d98194
Author: Xuan Zhuo <xuanzhuo at linux.alibaba.com>
Date:   Tue Dec 1 21:56:57 2020 +0800

    xsk: Replace datagram_poll by sock_poll_wait
    
    datagram_poll will judge the current socket status (EPOLLIN, EPOLLOUT)
    based on the traditional socket information (eg: sk_wmem_alloc), but
    this does not apply to xsk. So this patch uses sock_poll_wait instead of
    datagram_poll, and the mask is calculated by xsk_poll.
    
    Fixes: c497176cb2e4 ("xsk: add Rx receive functions and poll support")
    Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Link: https://lore.kernel.org/bpf/e82f4697438cd63edbf271ebe1918db8261b7c09.1606555939.git.xuanzhuo@linux.alibaba.com

diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index b7b039bd9d03..9bbfd8adbb73 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -471,11 +471,13 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len)
 static __poll_t xsk_poll(struct file *file, struct socket *sock,
 			     struct poll_table_struct *wait)
 {
-	__poll_t mask = datagram_poll(file, sock, wait);
+	__poll_t mask = 0;
 	struct sock *sk = sock->sk;
 	struct xdp_sock *xs = xdp_sk(sk);
 	struct xsk_buff_pool *pool;
 
+	sock_poll_wait(file, sock, wait);
+
 	if (unlikely(!xsk_is_bound(xs)))
 		return mask;
 
commit 61e6fe59ede155881a622f5901551b1cc8748f6a
Author: Christian Eggers <ceggers at arri.de>
Date:   Fri Oct 9 13:03:20 2020 +0200

    i2c: imx: Don't generate STOP condition if arbitration has been lost
    
    If arbitration is lost, the master automatically changes to slave mode.
    I2SR_IBB may or may not be reset by hardware. Raising a STOP condition
    by resetting I2CR_MSTA has no effect and will not clear I2SR_IBB.
    
    So calling i2c_imx_bus_busy() is not required and would busy-wait until
    timeout.
    
    Signed-off-by: Christian Eggers <ceggers at arri.de>
    Tested (not extensively) on Vybrid VF500 (Toradex VF50):
    Tested-by: Krzysztof Kozlowski <krzk at kernel.org>
    Acked-by: Oleksij Rempel <o.rempel at pengutronix.de>
    Cc: stable at vger.kernel.org # Requires trivial backporting, simple remove
                               # the 3rd argument from the calls to
                               # i2c_imx_bus_busy().
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index a2abae124342..e6f8d6e45a15 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -615,6 +615,8 @@ static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx, bool atomic)
 		/* Stop I2C transaction */
 		dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
 		temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
+		if (!(temp & I2CR_MSTA))
+			i2c_imx->stopped = 1;
 		temp &= ~(I2CR_MSTA | I2CR_MTX);
 		if (i2c_imx->dma)
 			temp &= ~I2CR_DMAEN;
@@ -778,9 +780,12 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,
 		 */
 		dev_dbg(dev, "<%s> clear MSTA\n", __func__);
 		temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
+		if (!(temp & I2CR_MSTA))
+			i2c_imx->stopped = 1;
 		temp &= ~(I2CR_MSTA | I2CR_MTX);
 		imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
-		i2c_imx_bus_busy(i2c_imx, 0, false);
+		if (!i2c_imx->stopped)
+			i2c_imx_bus_busy(i2c_imx, 0, false);
 	} else {
 		/*
 		 * For i2c master receiver repeat restart operation like:
@@ -905,9 +910,12 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
 				dev_dbg(&i2c_imx->adapter.dev,
 					"<%s> clear MSTA\n", __func__);
 				temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
+				if (!(temp & I2CR_MSTA))
+					i2c_imx->stopped =  1;
 				temp &= ~(I2CR_MSTA | I2CR_MTX);
 				imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
-				i2c_imx_bus_busy(i2c_imx, 0, atomic);
+				if (!i2c_imx->stopped)
+					i2c_imx_bus_busy(i2c_imx, 0, atomic);
 			} else {
 				/*
 				 * For i2c master receiver repeat restart operation like:
commit 1de67a3dee7a279ebe4d892b359fe3696938ec15
Author: Christian Eggers <ceggers at arri.de>
Date:   Fri Oct 9 13:03:19 2020 +0200

    i2c: imx: Check for I2SR_IAL after every byte
    
    Arbitration Lost (IAL) can happen after every single byte transfer. If
    arbitration is lost, the I2C hardware will autonomously switch from
    master mode to slave. If a transfer is not aborted in this state,
    consecutive transfers will not be executed by the hardware and will
    timeout.
    
    Signed-off-by: Christian Eggers <ceggers at arri.de>
    Tested (not extensively) on Vybrid VF500 (Toradex VF50):
    Tested-by: Krzysztof Kozlowski <krzk at kernel.org>
    Acked-by: Oleksij Rempel <o.rempel at pengutronix.de>
    Cc: stable at vger.kernel.org
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 39e98d216016..a2abae124342 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -490,6 +490,16 @@ static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx, bool atomic)
 		dev_dbg(&i2c_imx->adapter.dev, "<%s> Timeout\n", __func__);
 		return -ETIMEDOUT;
 	}
+
+	/* check for arbitration lost */
+	if (i2c_imx->i2csr & I2SR_IAL) {
+		dev_dbg(&i2c_imx->adapter.dev, "<%s> Arbitration lost\n", __func__);
+		i2c_imx_clear_irq(i2c_imx, I2SR_IAL);
+
+		i2c_imx->i2csr = 0;
+		return -EAGAIN;
+	}
+
 	dev_dbg(&i2c_imx->adapter.dev, "<%s> TRX complete\n", __func__);
 	i2c_imx->i2csr = 0;
 	return 0;
commit 384a9565f70a876c2e78e58c5ca0bbf0547e4f6d
Author: Christian Eggers <ceggers at arri.de>
Date:   Fri Oct 9 13:03:18 2020 +0200

    i2c: imx: Fix reset of I2SR_IAL flag
    
    According to the "VFxxx Controller Reference Manual" (and the comment
    block starting at line 97), Vybrid requires writing a one for clearing
    an interrupt flag. Syncing the method for clearing I2SR_IIF in
    i2c_imx_isr().
    
    Signed-off-by: Christian Eggers <ceggers at arri.de>
    Fixes: 4b775022f6fd ("i2c: imx: add struct to hold more configurable quirks")
    Reviewed-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
    Acked-by: Oleksij Rempel <o.rempel at pengutronix.de>
    Cc: stable at vger.kernel.org
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index c98529c76348..39e98d216016 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -412,6 +412,19 @@ static void i2c_imx_dma_free(struct imx_i2c_struct *i2c_imx)
 	dma->chan_using = NULL;
 }
 
+static void i2c_imx_clear_irq(struct imx_i2c_struct *i2c_imx, unsigned int bits)
+{
+	unsigned int temp;
+
+	/*
+	 * i2sr_clr_opcode is the value to clear all interrupts. Here we want to
+	 * clear only <bits>, so we write ~i2sr_clr_opcode with just <bits>
+	 * toggled. This is required because i.MX needs W0C and Vybrid uses W1C.
+	 */
+	temp = ~i2c_imx->hwdata->i2sr_clr_opcode ^ bits;
+	imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR);
+}
+
 static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool atomic)
 {
 	unsigned long orig_jiffies = jiffies;
@@ -424,8 +437,7 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a
 
 		/* check for arbitration lost */
 		if (temp & I2SR_IAL) {
-			temp &= ~I2SR_IAL;
-			imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR);
+			i2c_imx_clear_irq(i2c_imx, I2SR_IAL);
 			return -EAGAIN;
 		}
 
@@ -469,7 +481,7 @@ static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx, bool atomic)
 		 */
 		readb_poll_timeout_atomic(addr, regval, regval & I2SR_IIF, 5, 1000 + 100);
 		i2c_imx->i2csr = regval;
-		imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR);
+		i2c_imx_clear_irq(i2c_imx, I2SR_IIF | I2SR_IAL);
 	} else {
 		wait_event_timeout(i2c_imx->queue, i2c_imx->i2csr & I2SR_IIF, HZ / 10);
 	}
@@ -623,9 +635,7 @@ static irqreturn_t i2c_imx_isr(int irq, void *dev_id)
 	if (temp & I2SR_IIF) {
 		/* save status register */
 		i2c_imx->i2csr = temp;
-		temp &= ~I2SR_IIF;
-		temp |= (i2c_imx->hwdata->i2sr_clr_opcode & I2SR_IIF);
-		imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR);
+		i2c_imx_clear_irq(i2c_imx, I2SR_IIF);
 		wake_up(&i2c_imx->queue);
 		return IRQ_HANDLED;
 	}
commit 3bb61aa61828499a7d0f5e560051625fd02ae7e4
Merge: 2c6ffa9e9b11 9e5344e0ffc3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 2 12:27:37 2020 -0800

    Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
    
    Pull arm64 fixes from Will Deacon:
     "I'm sad to say that we've got an unusually large arm64 fixes pull for
      rc7 which addresses numerous significant instrumentation issues with
      our entry code.
    
      Without these patches, lockdep is hopelessly unreliable in some
      configurations [1,2] and syzkaller is therefore not a lot of use
      because it's so noisy.
    
      Although much of this has always been broken, it appears to have been
      exposed more readily by other changes such as 044d0d6de9f5 ("lockdep:
      Only trace IRQ edges") and general lockdep improvements around IRQ
      tracing and NMIs.
    
      Fixing this properly required moving much of the instrumentation hooks
      from our entry assembly into C, which Mark has been working on for the
      last few weeks. We're not quite ready to move to the recently added
      generic functions yet, but the code here has been deliberately written
      to mimic that closely so we can look at cleaning things up once we
      have a bit more breathing room.
    
      Having said all that, the second version of these patches was posted
      last week and I pushed it into our CI (kernelci and cki) along with a
      commit which forced on PROVE_LOCKING, NOHZ_FULL and
      CONTEXT_TRACKING_FORCE. The result? We found a real bug in the
      md/raid10 code [3].
    
      Oh, and there's also a really silly typo patch that's unrelated.
    
      Summary:
    
       - Fix numerous issues with instrumentation and exception entry
    
       - Fix hideous typo in unused register field definition"
    
    [1] https://lore.kernel.org/r/CACT4Y+aAzoJ48Mh1wNYD17pJqyEcDnrxGfApir=-j171TnQXhw@mail.gmail.com
    [2] https://lore.kernel.org/r/20201119193819.GA2601289@elver.google.com
    [3] https://lore.kernel.org/r/94c76d5e-466a-bc5f-e6c2-a11b65c39f83@redhat.com
    
    * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
      arm64: mte: Fix typo in macro definition
      arm64: entry: fix EL1 debug transitions
      arm64: entry: fix NMI {user, kernel}->kernel transitions
      arm64: entry: fix non-NMI kernel<->kernel transitions
      arm64: ptrace: prepare for EL1 irq/rcu tracking
      arm64: entry: fix non-NMI user<->kernel transitions
      arm64: entry: move el1 irq/nmi logic to C
      arm64: entry: prepare ret_to_user for function call
      arm64: entry: move enter_from_user_mode to entry-common.c
      arm64: entry: mark entry code as noinstr
      arm64: mark idle code as noinstr
      arm64: syscall: exit userspace before unmasking exceptions

commit 2c6ffa9e9b11bdfa267fe05ad1e98d3491b4224f
Merge: bb95d60783f1 2c602741b51d
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 2 12:20:11 2020 -0800

    Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
    
    Pull vdpa fixes from Michael Tsirkin:
     "A couple of fixes that surfaced at the last minute"
    
    * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost:
      vhost_vdpa: return -EFAULT if copy_to_user() fails
      vdpa: mlx5: fix vdpa/vhost dependencies

commit bb95d60783f1ac85883c7ae33cafa85236b6179e
Merge: 8a02ec8f3577 aeedad250499
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 2 12:14:03 2020 -0800

    Merge tag 'sound-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
    
    Pull sound fixes from Takashi Iwai:
     "Here are the pending sound fixes for 5.10: all small device-specific
      fixes, and nothing particular stands out, so far"
    
    * tag 'sound-5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
      ALSA: hda/realtek: Add mute LED quirk to yet another HP x360 model
      ALSA: hda/realtek: Fix bass speaker DAC assignment on Asus Zephyrus G14
      ALSA: hda/generic: Add option to enforce preferred_dacs pairs
      ALSA: usb-audio: US16x08: fix value count for level meters
      ALSA: hda/realtek - Add new codec supported for ALC897
      ASoC: rt5682: change SAR voltage threshold
      ASoC: wm_adsp: fix error return code in wm_adsp_load()
      ALSA: hda/realtek: Enable headset of ASUS UX482EG & B9400CEA with ALC294
      ASoC: qcom: Fix enabling BCLK and LRCLK in LPAIF invalid state
      ALSA: hda/realtek - Fixed Dell AIO wrong sound tone
      ASoC: Intel: bytcr_rt5640: Fix HP Pavilion x2 Detachable quirks

commit 8a02ec8f35779335b81577903832c2b3c495e979
Merge: 509a15421674 05227490c5f0
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Dec 2 12:09:36 2020 -0800

    Merge tag 'trace-v5.10-rc6-bootconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
    
    Pull bootconfig fixes from Steven Rostedt:
     "Have bootconfig size and checksum be little endian
    
      In case the bootconfig is created on one kind of endian machine, and
      then read on the other kind of endian kernel, the size and checksum
      will be incorrect. Instead, have both the size and checksum always be
      little endian and have the tool and the kernel convert it from little
      endian to or from the host endian"
    
    * tag 'trace-v5.10-rc6-bootconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
      docs: bootconfig: Add the endianness of fields
      tools/bootconfig: Store size and checksum in footer as le32
      bootconfig: Load size and checksum in the footer as le32

commit 07500a6085806d97039ebcba8d9b8b29129f0106
Author: Yangbo Lu <yangbo.lu at nxp.com>
Date:   Tue Dec 1 15:52:58 2020 +0800

    dpaa_eth: copy timestamp fields to new skb in A-050385 workaround
    
    The timestamp fields should be copied to new skb too in
    A-050385 workaround for later TX timestamping handling.
    
    Fixes: 3c68b8fffb48 ("dpaa_eth: FMan erratum A050385 workaround")
    Signed-off-by: Yangbo Lu <yangbo.lu at nxp.com>
    Acked-by: Camelia Groza <camelia.groza at nxp.com>
    Link: https://lore.kernel.org/r/20201201075258.1875-1-yangbo.lu@nxp.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index d9c285948fc2..cb7c028b1bf5 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -2120,6 +2120,15 @@ workaround:
 	skb_copy_header(new_skb, skb);
 	new_skb->dev = skb->dev;
 
+	/* Copy relevant timestamp info from the old skb to the new */
+	if (priv->tx_tstamp) {
+		skb_shinfo(new_skb)->tx_flags = skb_shinfo(skb)->tx_flags;
+		skb_shinfo(new_skb)->hwtstamps = skb_shinfo(skb)->hwtstamps;
+		skb_shinfo(new_skb)->tskey = skb_shinfo(skb)->tskey;
+		if (skb->sk)
+			skb_set_owner_w(new_skb, skb->sk);
+	}
+
 	/* We move the headroom when we align it so we have to reset the
 	 * network and transport header offsets relative to the new data
 	 * pointer. The checksum offload relies on these offsets.
@@ -2127,7 +2136,6 @@ workaround:
 	skb_set_network_header(new_skb, skb_network_offset(skb));
 	skb_set_transport_header(new_skb, skb_transport_offset(skb));
 
-	/* TODO: does timestamping need the result in the old skb? */
 	dev_kfree_skb(skb);
 	*s = new_skb;
 
commit 832ba596494b2c9eac7760259eff2d8b7dcad0ee
Author: Antoine Tenart <atenart at kernel.org>
Date:   Mon Nov 30 17:19:11 2020 +0100

    net: ip6_gre: set dev->hard_header_len when using header_ops
    
    syzkaller managed to crash the kernel using an NBMA ip6gre interface. I
    could reproduce it creating an NBMA ip6gre interface and forwarding
    traffic to it:
    
      skbuff: skb_under_panic: text:ffffffff8250e927 len:148 put:44 head:ffff8c03c7a33
      ------------[ cut here ]------------
      kernel BUG at net/core/skbuff.c:109!
      Call Trace:
      skb_push+0x10/0x10
      ip6gre_header+0x47/0x1b0
      neigh_connected_output+0xae/0xf0
    
    ip6gre tunnel provides its own header_ops->create, and sets it
    conditionally when initializing the tunnel in NBMA mode. When
    header_ops->create is used, dev->hard_header_len should reflect the
    length of the header created. Otherwise, when not used,
    dev->needed_headroom should be used.
    
    Fixes: eb95f52fc72d ("net: ipv6_gre: Fix GRO to work on IPv6 over GRE tap")
    Cc: Maria Pasechnik <mariap at mellanox.com>
    Signed-off-by: Antoine Tenart <atenart at kernel.org>
    Link: https://lore.kernel.org/r/20201130161911.464106-1-atenart@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index 931b186d2e48..cf6e1380b527 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -1133,8 +1133,13 @@ static void ip6gre_tnl_link_config_route(struct ip6_tnl *t, int set_mtu,
 			return;
 
 		if (rt->dst.dev) {
-			dev->needed_headroom = rt->dst.dev->hard_header_len +
-					       t_hlen;
+			unsigned short dst_len = rt->dst.dev->hard_header_len +
+						 t_hlen;
+
+			if (t->dev->header_ops)
+				dev->hard_header_len = dst_len;
+			else
+				dev->needed_headroom = dst_len;
 
 			if (set_mtu) {
 				dev->mtu = rt->dst.dev->mtu - t_hlen;
@@ -1159,7 +1164,12 @@ static int ip6gre_calc_hlen(struct ip6_tnl *tunnel)
 	tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
 
 	t_hlen = tunnel->hlen + sizeof(struct ipv6hdr);
-	tunnel->dev->needed_headroom = LL_MAX_HEADER + t_hlen;
+
+	if (tunnel->dev->header_ops)
+		tunnel->dev->hard_header_len = LL_MAX_HEADER + t_hlen;
+	else
+		tunnel->dev->needed_headroom = LL_MAX_HEADER + t_hlen;
+
 	return t_hlen;
 }
 
commit 807982017730cfe853fce49ba26d453e31c84898
Author: Stanislaw Gruszka <stf_xl at wp.pl>
Date:   Thu Nov 26 13:55:20 2020 +0100

    mt76: usb: fix crash on device removal
    
    Currently 'while (q->queued > 0)' loop was removed from mt76u_stop_tx()
    code. This causes crash on device removal as we try to cleanup empty
    queue:
    
    [   96.495571] kernel BUG at include/linux/skbuff.h:2297!
    [   96.498983] invalid opcode: 0000 [#1] SMP PTI
    [   96.501162] CPU: 3 PID: 27 Comm: kworker/3:0 Not tainted 5.10.0-rc5+ #11
    [   96.502754] Hardware name: LENOVO 20DGS08H00/20DGS08H00, BIOS J5ET48WW (1.19 ) 08/27/2015
    [   96.504378] Workqueue: usb_hub_wq hub_event
    [   96.505983] RIP: 0010:skb_pull+0x2d/0x30
    [   96.507576] Code: 00 00 8b 47 70 39 c6 77 1e 29 f0 89 47 70 3b 47 74 72 17 48 8b 87 c8 00 00 00 89 f6 48 01 f0 48 89 87 c8 00 00 00 c3 31 c0 c3 <0f> 0b 90 0f 1f 44 00 00 53 48 89 fb 48 8b bf c8 00 00 00 8b 43 70
    [   96.509296] RSP: 0018:ffffb11b801639b8 EFLAGS: 00010287
    [   96.511038] RAX: 000000001c6939ed RBX: ffffb11b801639f8 RCX: 0000000000000000
    [   96.512964] RDX: ffffb11b801639f8 RSI: 0000000000000018 RDI: ffff90c64e4fb800
    [   96.514710] RBP: ffff90c654551ee0 R08: ffff90c652bce7a8 R09: ffffb11b80163728
    [   96.516450] R10: 0000000000000001 R11: 0000000000000001 R12: ffff90c64e4fb800
    [   96.519749] R13: 0000000000000010 R14: 0000000000000020 R15: ffff90c64e352ce8
    [   96.523455] FS:  0000000000000000(0000) GS:ffff90c96eec0000(0000) knlGS:0000000000000000
    [   96.527171] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   96.530900] CR2: 0000242556f18288 CR3: 0000000146a10002 CR4: 00000000003706e0
    [   96.534678] Call Trace:
    [   96.538418]  mt76x02u_tx_complete_skb+0x1f/0x50 [mt76x02_usb]
    [   96.542231]  mt76_queue_tx_complete+0x23/0x50 [mt76]
    [   96.546028]  mt76u_stop_tx.cold+0x71/0xa2 [mt76_usb]
    [   96.549797]  mt76x0u_stop+0x2f/0x90 [mt76x0u]
    [   96.553638]  drv_stop+0x33/0xd0 [mac80211]
    [   96.557449]  ieee80211_do_stop+0x558/0x860 [mac80211]
    [   96.561262]  ? dev_deactivate_many+0x298/0x2d0
    [   96.565101]  ieee80211_stop+0x16/0x20 [mac80211]
    
    Fix that by adding while loop again. We need loop, not just single
    check, to clean all pending entries.
    
    Additionally move mt76_worker_disable/enable after !mt76_has_tx_pending()
    as we want to tx_worker to run to process tx queues, while we wait for
    exactly that.
    
    I was a bit worried about accessing q->queued without lock, but
    mt76_worker_disable() -> kthread_park() should assure this value will
    be seen updated on other cpus.
    
    Fixes: fe5b5ab52e9d ("mt76: unify queue tx cleanup code")
    Signed-off-by: Stanislaw Gruszka <stf_xl at wp.pl>
    Acked-by: Felix Fietkau <nbd at nbd.name>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/20201126125520.72912-1-stf_xl@wp.pl

diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index 7d3f0a2e5fa0..f1ae9ff835b2 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -1020,8 +1020,6 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 {
 	int ret;
 
-	mt76_worker_disable(&dev->tx_worker);
-
 	ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
 				 HZ / 5);
 	if (!ret) {
@@ -1040,6 +1038,8 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 				usb_kill_urb(q->entry[j].urb);
 		}
 
+		mt76_worker_disable(&dev->tx_worker);
+
 		/* On device removal we maight queue skb's, but mt76u_tx_kick()
 		 * will fail to submit urb, cleanup those skb's manually.
 		 */
@@ -1048,18 +1048,19 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 			if (!q)
 				continue;
 
-			entry = q->entry[q->tail];
-			q->entry[q->tail].done = false;
-
-			mt76_queue_tx_complete(dev, q, &entry);
+			while (q->queued > 0) {
+				entry = q->entry[q->tail];
+				q->entry[q->tail].done = false;
+				mt76_queue_tx_complete(dev, q, &entry);
+			}
 		}
+
+		mt76_worker_enable(&dev->tx_worker);
 	}
 
 	cancel_work_sync(&dev->usb.stat_work);
 	clear_bit(MT76_READING_STATS, &dev->phy.state);
 
-	mt76_worker_enable(&dev->tx_worker);
-
 	mt76_tx_status_check(dev, NULL, true);
 }
 EXPORT_SYMBOL_GPL(mt76u_stop_tx);
commit 9b15596c5006d82b2f82810e8cbf80d8c6e7e7b4
Author: Golan Ben Ami <golan.ben.ami at intel.com>
Date:   Wed Dec 2 14:41:51 2020 +0200

    iwlwifi: pcie: add some missing entries for AX210
    
    Some subsytem device IDs were missing from the list, so some AX210
    devices were not recognized.  Add them.
    
    Signed-off-by: Golan Ben Ami <golan.ben.ami at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201202143859.a06ba7540449.I7390305d088a49c1043c9b489154fe057989c18f@changeid
    Link: https://lore.kernel.org/r/20201121003411.9450-1-ikegami.t@gmail.com

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 466a967da39c..7b5ece380fbf 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -540,6 +540,11 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
 	{IWL_PCI_DEVICE(0x2725, 0x0310, iwlax210_2ax_cfg_ty_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x0510, iwlax210_2ax_cfg_ty_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x0A10, iwlax210_2ax_cfg_ty_gf_a0)},
+	{IWL_PCI_DEVICE(0x2725, 0xE020, iwlax210_2ax_cfg_ty_gf_a0)},
+	{IWL_PCI_DEVICE(0x2725, 0xE024, iwlax210_2ax_cfg_ty_gf_a0)},
+	{IWL_PCI_DEVICE(0x2725, 0x4020, iwlax210_2ax_cfg_ty_gf_a0)},
+	{IWL_PCI_DEVICE(0x2725, 0x6020, iwlax210_2ax_cfg_ty_gf_a0)},
+	{IWL_PCI_DEVICE(0x2725, 0x6024, iwlax210_2ax_cfg_ty_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x00B0, iwlax411_2ax_cfg_sosnj_gf4_a0)},
 	{IWL_PCI_DEVICE(0x2726, 0x0070, iwlax201_cfg_snj_hr_b0)},
 	{IWL_PCI_DEVICE(0x2726, 0x0074, iwlax201_cfg_snj_hr_b0)},
commit 568d3434178b00274615190a19d29c3d235b4e6d
Author: Luca Coelho <luciano.coelho at intel.com>
Date:   Wed Dec 2 14:41:50 2020 +0200

    iwlwifi: pcie: invert values of NO_160 device config entries
    
    The NO_160 flag specifies if the device doesn't have 160 MHz support,
    but we errorneously assumed the opposite.  If the flag was set, we
    were considering that 160 MHz was supported, but it's actually the
    opposite.  Fix it by inverting the bits, i.e. NO_160 is 0x1 and 160
    is 0x0.
    
    Fixes: d6f2134a3831 ("iwlwifi: add mac/rf types and 160MHz to the device tables")
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201202143859.375bec857ccb.I83884286b688965293e9810381808039bd7eedae@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h
index ca4967b81d01..580b07a43856 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h
@@ -491,8 +491,8 @@ struct iwl_cfg {
 #define IWL_CFG_RF_ID_HR		0x7
 #define IWL_CFG_RF_ID_HR1		0x4
 
-#define IWL_CFG_NO_160			0x0
-#define IWL_CFG_160			0x1
+#define IWL_CFG_NO_160			0x1
+#define IWL_CFG_160			0x0
 
 #define IWL_CFG_CORES_BT		0x0
 #define IWL_CFG_CORES_BT_GNSS		0x5
commit 5febcdef30902fa870128b9789b873199f13aff1
Author: Luca Coelho <luciano.coelho at intel.com>
Date:   Wed Dec 2 14:41:49 2020 +0200

    iwlwifi: pcie: add one missing entry for AX210
    
    The 0x0024 subsytem device ID was missing from the list, so some AX210
    devices were not recognized.  Add it.
    
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201202143859.308eab4db42c.I3763196cd3f7bb36f3dcabf02ec4e7c4fe859c0f@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 129021f26791..466a967da39c 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -536,6 +536,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
 
 	{IWL_PCI_DEVICE(0x2725, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x0020, iwlax210_2ax_cfg_ty_gf_a0)},
+	{IWL_PCI_DEVICE(0x2725, 0x0024, iwlax210_2ax_cfg_ty_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x0310, iwlax210_2ax_cfg_ty_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x0510, iwlax210_2ax_cfg_ty_gf_a0)},
 	{IWL_PCI_DEVICE(0x2725, 0x0A10, iwlax210_2ax_cfg_ty_gf_a0)},
commit abfccc3af786bb33210e39638268ea3a7bf80e63
Author: Johannes Berg <johannes.berg at intel.com>
Date:   Sun Nov 29 15:14:38 2020 +0200

    iwlwifi: update MAINTAINERS entry
    
    Reflect the fact that the linuxwifi at intel.com address will disappear,
    and that neither Emmanuel nor myself are really much involved with
    the maintenance these days.
    
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201129151117.a25afe6d2c7f.I8f13a5689dd353825fb2b9bd5b6f0fbce92cb12b@changeid

diff --git a/MAINTAINERS b/MAINTAINERS
index 900ff33789eb..60dd9fe60fe0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9097,10 +9097,7 @@ S:	Supported
 F:	drivers/net/wireless/intel/iwlegacy/
 
 INTEL WIRELESS WIFI LINK (iwlwifi)
-M:	Johannes Berg <johannes.berg at intel.com>
-M:	Emmanuel Grumbach <emmanuel.grumbach at intel.com>
 M:	Luca Coelho <luciano.coelho at intel.com>
-M:	Intel Linux Wireless <linuxwifi at intel.com>
 L:	linux-wireless at vger.kernel.org
 S:	Supported
 W:	https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi
commit 2d586494c4a001312650f0b919d534e429dd1e09
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Sat Nov 28 23:09:16 2020 -0800

    scsi: bnx2i: Requires MMU
    
    The SCSI_BNX2_ISCSI kconfig symbol selects CNIC and CNIC selects UIO, which
    depends on MMU.
    
    Since 'select' does not follow dependency chains, add the same MMU
    dependency to SCSI_BNX2_ISCSI.
    
    Quietens this kconfig warning:
    
    WARNING: unmet direct dependencies detected for CNIC
      Depends on [n]: NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_BROADCOM [=y] && PCI [=y] && (IPV6 [=m] || IPV6 [=m]=n) && MMU [=n]
      Selected by [m]:
      - SCSI_BNX2_ISCSI [=m] && SCSI_LOWLEVEL [=y] && SCSI [=y] && NET [=y] && PCI [=y] && (IPV6 [=m] || IPV6 [=m]=n)
    
    Link: https://lore.kernel.org/r/20201129070916.3919-1-rdunlap@infradead.org
    Fixes: cf4e6363859d ("[SCSI] bnx2i: Add bnx2i iSCSI driver.")
    Cc: linux-scsi at vger.kernel.org
    Cc: Nilesh Javali <njavali at marvell.com>
    Cc: Manish Rangankar <mrangankar at marvell.com>
    Cc: GR-QLogic-Storage-Upstream at marvell.com
    Cc: "James E.J. Bottomley" <jejb at linux.ibm.com>
    Cc: "Martin K. Petersen" <martin.petersen at oracle.com>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/bnx2i/Kconfig b/drivers/scsi/bnx2i/Kconfig
index 75ace2302fed..0cc06c2ce0b8 100644
--- a/drivers/scsi/bnx2i/Kconfig
+++ b/drivers/scsi/bnx2i/Kconfig
@@ -4,6 +4,7 @@ config SCSI_BNX2_ISCSI
 	depends on NET
 	depends on PCI
 	depends on (IPV6 || IPV6=n)
+	depends on MMU
 	select SCSI_ISCSI_ATTRS
 	select NETDEVICES
 	select ETHERNET
commit b1cae1f84a0f609a34ebcaa087fbecef32f69882
Author: Heiko Carstens <hca at linux.ibm.com>
Date:   Wed Dec 2 11:46:01 2020 +0100

    s390: fix irq state tracing
    
    With commit 58c644ba512c ("sched/idle: Fix arch_cpu_idle() vs
    tracing") common code calls arch_cpu_idle() with a lockdep state that
    tells irqs are on.
    
    This doesn't work very well for s390: psw_idle() will enable interrupts
    to wait for an interrupt. As soon as an interrupt occurs the interrupt
    handler will verify if the old context was psw_idle(). If that is the
    case the interrupt enablement bits in the old program status word will
    be cleared.
    
    A subsequent test in both the external as well as the io interrupt
    handler checks if in the old context interrupts were enabled. Due to
    the above patching of the old program status word it is assumed the
    old context had interrupts disabled, and therefore a call to
    TRACE_IRQS_OFF (aka trace_hardirqs_off_caller) is skipped. Which in
    turn makes lockdep incorrectly "think" that interrupts are enabled
    within the interrupt handler.
    
    Fix this by unconditionally calling TRACE_IRQS_OFF when entering
    interrupt handlers. Also call unconditionally TRACE_IRQS_ON when
    leaving interrupts handlers.
    
    This leaves the special psw_idle() case, which now returns with
    interrupts disabled, but has an "irqs on" lockdep state. So callers of
    psw_idle() must adjust the state on their own, if required. This is
    currently only __udelay_disabled().
    
    Fixes: 58c644ba512c ("sched/idle: Fix arch_cpu_idle() vs tracing")
    Acked-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Signed-off-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 26bb0603c5a1..92beb1444644 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -763,12 +763,7 @@ ENTRY(io_int_handler)
 	xc	__PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
 	TSTMSK	__LC_CPU_FLAGS,_CIF_IGNORE_IRQ
 	jo	.Lio_restore
-#if IS_ENABLED(CONFIG_TRACE_IRQFLAGS)
-	tmhh	%r8,0x300
-	jz	1f
 	TRACE_IRQS_OFF
-1:
-#endif
 	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 .Lio_loop:
 	lgr	%r2,%r11		# pass pointer to pt_regs
@@ -791,12 +786,7 @@ ENTRY(io_int_handler)
 	TSTMSK	__LC_CPU_FLAGS,_CIF_WORK
 	jnz	.Lio_work
 .Lio_restore:
-#if IS_ENABLED(CONFIG_TRACE_IRQFLAGS)
-	tm	__PT_PSW(%r11),3
-	jno	0f
 	TRACE_IRQS_ON
-0:
-#endif
 	mvc	__LC_RETURN_PSW(16),__PT_PSW(%r11)
 	tm	__PT_PSW+1(%r11),0x01	# returning to user ?
 	jno	.Lio_exit_kernel
@@ -976,12 +966,7 @@ ENTRY(ext_int_handler)
 	xc	__PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
 	TSTMSK	__LC_CPU_FLAGS,_CIF_IGNORE_IRQ
 	jo	.Lio_restore
-#if IS_ENABLED(CONFIG_TRACE_IRQFLAGS)
-	tmhh	%r8,0x300
-	jz	1f
 	TRACE_IRQS_OFF
-1:
-#endif
 	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 	lgr	%r2,%r11		# pass pointer to pt_regs
 	lghi	%r3,EXT_INTERRUPT
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c
index daca7bad66de..8c0c68e7770e 100644
--- a/arch/s390/lib/delay.c
+++ b/arch/s390/lib/delay.c
@@ -33,7 +33,7 @@ EXPORT_SYMBOL(__delay);
 
 static void __udelay_disabled(unsigned long long usecs)
 {
-	unsigned long cr0, cr0_new, psw_mask, flags;
+	unsigned long cr0, cr0_new, psw_mask;
 	struct s390_idle_data idle;
 	u64 end;
 
@@ -45,9 +45,8 @@ static void __udelay_disabled(unsigned long long usecs)
 	psw_mask = __extract_psw() | PSW_MASK_EXT | PSW_MASK_WAIT;
 	set_clock_comparator(end);
 	set_cpu_flag(CIF_IGNORE_IRQ);
-	local_irq_save(flags);
 	psw_idle(&idle, psw_mask);
-	local_irq_restore(flags);
+	trace_hardirqs_off();
 	clear_cpu_flag(CIF_IGNORE_IRQ);
 	set_clock_comparator(S390_lowcore.clock_comparator);
 	__ctl_load(cr0, 0, 0);
commit a2bd4097b3ec242f4de4924db463a9c94530e03a
Author: Alexander Gordeev <agordeev at linux.ibm.com>
Date:   Thu Nov 26 18:00:37 2020 +0100

    s390/pci: fix CPU address in MSI for directed IRQ
    
    The directed MSIs are delivered to CPUs whose address is
    written to the MSI message address. The current code assumes
    that a CPU logical number (as it is seen by the kernel)
    is also the CPU address.
    
    The above assumption is not correct, as the CPU address
    is rather the value returned by STAP instruction. That
    value does not necessarily match the kernel logical CPU
    number.
    
    Fixes: e979ce7bced2 ("s390/pci: provide support for CPU directed interrupts")
    Cc: <stable at vger.kernel.org> # v5.2+
    Signed-off-by: Alexander Gordeev <agordeev at linux.ibm.com>
    Reviewed-by: Halil Pasic <pasic at linux.ibm.com>
    Reviewed-by: Niklas Schnelle <schnelle at linux.ibm.com>
    Signed-off-by: Niklas Schnelle <schnelle at linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/arch/s390/pci/pci_irq.c b/arch/s390/pci/pci_irq.c
index 743f257cf2cb..75217fb63d7b 100644
--- a/arch/s390/pci/pci_irq.c
+++ b/arch/s390/pci/pci_irq.c
@@ -103,9 +103,10 @@ static int zpci_set_irq_affinity(struct irq_data *data, const struct cpumask *de
 {
 	struct msi_desc *entry = irq_get_msi_desc(data->irq);
 	struct msi_msg msg = entry->msg;
+	int cpu_addr = smp_cpu_get_cpu_address(cpumask_first(dest));
 
 	msg.address_lo &= 0xff0000ff;
-	msg.address_lo |= (cpumask_first(dest) << 8);
+	msg.address_lo |= (cpu_addr << 8);
 	pci_write_msi_msg(data->irq, &msg);
 
 	return IRQ_SET_MASK_OK;
@@ -238,6 +239,7 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
 	unsigned long bit;
 	struct msi_desc *msi;
 	struct msi_msg msg;
+	int cpu_addr;
 	int rc, irq;
 
 	zdev->aisb = -1UL;
@@ -287,9 +289,15 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
 					 handle_percpu_irq);
 		msg.data = hwirq - bit;
 		if (irq_delivery == DIRECTED) {
+			if (msi->affinity)
+				cpu = cpumask_first(&msi->affinity->mask);
+			else
+				cpu = 0;
+			cpu_addr = smp_cpu_get_cpu_address(cpu);
+
 			msg.address_lo = zdev->msi_addr & 0xff0000ff;
-			msg.address_lo |= msi->affinity ?
-				(cpumask_first(&msi->affinity->mask) << 8) : 0;
+			msg.address_lo |= (cpu_addr << 8);
+
 			for_each_possible_cpu(cpu) {
 				airq_iv_set_data(zpci_ibv[cpu], hwirq, irq);
 			}
commit 14718b3e129b058cb716a60c6faf40ef68661c54
Author: Robert Foss <robert.foss at linaro.org>
Date:   Mon Nov 30 11:04:45 2020 +0100

    i2c: qcom: Fix IRQ error misassignement
    
    During cci_isr() errors read from register fields belonging to
    i2c master1 are currently assigned to the status field belonging to
    i2c master0. This patch corrects this error, and always assigns
    master1 errors to the status field of master1.
    
    Fixes: e517526195de ("i2c: Add Qualcomm CCI I2C driver")
    Reported-by: Loic Poulain <loic.poulain at linaro.org>
    Suggested-by: Loic Poulain <loic.poulain at linaro.org>
    Signed-off-by: Robert Foss <robert.foss at linaro.org>
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/i2c-qcom-cci.c b/drivers/i2c/busses/i2c-qcom-cci.c
index f13735beca58..1c259b5188de 100644
--- a/drivers/i2c/busses/i2c-qcom-cci.c
+++ b/drivers/i2c/busses/i2c-qcom-cci.c
@@ -194,9 +194,9 @@ static irqreturn_t cci_isr(int irq, void *dev)
 	if (unlikely(val & CCI_IRQ_STATUS_0_I2C_M1_ERROR)) {
 		if (val & CCI_IRQ_STATUS_0_I2C_M1_Q0_NACK_ERR ||
 			val & CCI_IRQ_STATUS_0_I2C_M1_Q1_NACK_ERR)
-			cci->master[0].status = -ENXIO;
+			cci->master[1].status = -ENXIO;
 		else
-			cci->master[0].status = -EIO;
+			cci->master[1].status = -EIO;
 
 		writel(CCI_HALT_REQ_I2C_M1_Q0Q1, cci->base + CCI_HALT_REQ);
 		ret = IRQ_HANDLED;
commit e9acf0298c664f825e6f1158f2a97341bf9e03ca
Author: Zhihao Cheng <chengzhihao1 at huawei.com>
Date:   Mon Nov 16 22:10:58 2020 +0800

    i2c: qup: Fix error return code in qup_i2c_bam_schedule_desc()
    
    Fix to return the error code from qup_i2c_change_state()
    instaed of 0 in qup_i2c_bam_schedule_desc().
    
    Fixes: fbf9921f8b35d9b2 ("i2c: qup: Fix error handling")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhihao Cheng <chengzhihao1 at huawei.com>
    Reviewed-by: Bjorn Andersson <bjorn.andersson at linaro.org>
    Signed-off-by: Wolfram Sang <wsa at kernel.org>

diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index fbc04b60cfd1..5a47915869ae 100644
--- a/drivers/i2c/busses/i2c-qup.c
+++ b/drivers/i2c/busses/i2c-qup.c
@@ -801,7 +801,8 @@ static int qup_i2c_bam_schedule_desc(struct qup_i2c_dev *qup)
 	if (ret || qup->bus_err || qup->qup_err) {
 		reinit_completion(&qup->xfer);
 
-		if (qup_i2c_change_state(qup, QUP_RUN_STATE)) {
+		ret = qup_i2c_change_state(qup, QUP_RUN_STATE);
+		if (ret) {
 			dev_err(qup->dev, "change to run state timed out");
 			goto desc_err;
 		}
commit cc2ff9730e0fe649ebf064632c9d0e04218e2f25
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Wed Dec 2 08:51:28 2020 +0100

    media: vidtv: fix kernel-doc markups
    
    Some functions has a different name between their prototypes
    and the corresponding kernel-doc markups.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 340c9fb8d583..6651cc91bda1 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -420,7 +420,7 @@ void vidtv_psi_desc_assign(struct vidtv_psi_desc **to,
 			   struct vidtv_psi_desc *desc);
 
 /**
- * vidtv_psi_pmt_desc_assign - Assigns a descriptor loop at some point in a PMT section.
+ * vidtv_pmt_desc_assign - Assigns a descriptor loop at some point in a PMT section.
  * @pmt: The PMT section that will contain the descriptor loop
  * @to: Where in the PMT to assign this descriptor loop to
  * @desc: The descriptor loop that will be assigned.
@@ -434,7 +434,7 @@ void vidtv_pmt_desc_assign(struct vidtv_psi_table_pmt *pmt,
 			   struct vidtv_psi_desc *desc);
 
 /**
- * vidtv_psi_sdt_desc_assign - Assigns a descriptor loop at some point in a SDT.
+ * vidtv_sdt_desc_assign - Assigns a descriptor loop at some point in a SDT.
  * @sdt: The SDT that will contain the descriptor loop
  * @to: Where in the PMT to assign this descriptor loop to
  * @desc: The descriptor loop that will be assigned.
@@ -474,7 +474,7 @@ void vidtv_psi_pmt_stream_assign(struct vidtv_psi_table_pmt *pmt,
 struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc);
 
 /**
- * vidtv_psi_create_sec_for_each_pat_entry - Create a PMT section for each
+ * vidtv_psi_pmt_create_sec_for_each_pat_entry - Create a PMT section for each
  * program found in the PAT
  * @pat: The PAT to look for programs.
  * @pcr_pid: packet ID for the PCR to be used for the program described in this
commit a1ee28117077c3bf24e5ab6324c835eaab629c45
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Sat Nov 28 17:07:21 2020 +1000

    powerpc/64s/powernv: Fix memory corruption when saving SLB entries on MCE
    
    This can be hit by an HPT guest running on an HPT host and bring down
    the host, so it's quite important to fix.
    
    Fixes: 7290f3b3d3e6 ("powerpc/64s/powernv: machine check dump SLB contents")
    Cc: stable at vger.kernel.org # v5.4+
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Acked-by: Mahesh Salgaonkar <mahesh at linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201128070728.825934-2-npiggin@gmail.com

diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
index 46115231a3b2..4426a109ec2f 100644
--- a/arch/powerpc/platforms/powernv/setup.c
+++ b/arch/powerpc/platforms/powernv/setup.c
@@ -211,11 +211,16 @@ static void __init pnv_init(void)
 		add_preferred_console("hvc", 0, NULL);
 
 	if (!radix_enabled()) {
+		size_t size = sizeof(struct slb_entry) * mmu_slb_size;
 		int i;
 
 		/* Allocate per cpu area to save old slb contents during MCE */
-		for_each_possible_cpu(i)
-			paca_ptrs[i]->mce_faulty_slbs = memblock_alloc_node(mmu_slb_size, __alignof__(*paca_ptrs[i]->mce_faulty_slbs), cpu_to_node(i));
+		for_each_possible_cpu(i) {
+			paca_ptrs[i]->mce_faulty_slbs =
+					memblock_alloc_node(size,
+						__alignof__(struct slb_entry),
+						cpu_to_node(i));
+		}
 	}
 }
 
commit 3c0dde35e6aee456abc8d8549ff7ee0963274214
Author: Colin Ian King <colin.king at canonical.com>
Date:   Fri Nov 27 14:28:32 2020 +0100

    media: [next] media: vidtv: fix a read from an object after it has been freed
    
    Currently the call to vidtv_psi_pat_table_destroy frees the object
    m->si.pat however m->si.pat->num_pmt is being accessed after the
    free.  Fix this by destroying m->si.pat after the m->si.pmt_secs[]
    objects have been freed.
    
    Addresses-Coverity: ("Read from pointer after free")
    
    Reported-by: Cengiz Can <cengiz at kernel.wtf> # sent a similar fix about the same time
    
    Fixes: 039b7caed173 ("media: vidtv: add a PID entry for the NIT table")
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index 8ad6c0744d36..7838e6272712 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -504,11 +504,11 @@ void vidtv_channel_si_destroy(struct vidtv_mux *m)
 {
 	u32 i;
 
-	vidtv_psi_pat_table_destroy(m->si.pat);
-
 	for (i = 0; i < m->si.pat->num_pmt; ++i)
 		vidtv_psi_pmt_table_destroy(m->si.pmt_secs[i]);
 
+	vidtv_psi_pat_table_destroy(m->si.pat);
+
 	kfree(m->si.pmt_secs);
 	vidtv_psi_sdt_table_destroy(m->si.sdt);
 	vidtv_psi_nit_table_destroy(m->si.nit);
commit bac63f1239aceb092e94fee3ef112dbaea79b372
Author: Sergey Senozhatsky <senozhatsky at chromium.org>
Date:   Mon Nov 30 16:00:54 2020 +0100

    media: vb2: set cache sync hints when init buffers
    
    We need to set ->need_cache_sync_on_prepare and
    ->need_cache_sync_on_finish when we initialize vb2 buffer.
    
    Currently these flags are set/adjusted only in V4L2's
    vb2_queue_or_prepare_buf(), which means that for the code
    paths that don't use V4L2 vb2 will always tell videobuf2
    core to skip ->prepare() and ->finish() cache syncs/flushes.
    Fix this by setting cache sync hints for new buffers; except
    VB2_MEMORY_DMABUF buffers, for which DMA exporter syncs
    caches.
    
    Fixes: f5f5fa73fbfb ("media: videobuf2: handle V4L2 buffer cache flags")
    Reported-by: Tomasz Figa <tfiga at chromium.org>
    Signed-off-by: Sergey Senozhatsky <senozhatsky at chromium.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 4eab6d81cce1..89e38392509c 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -414,6 +414,17 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
 		vb->index = q->num_buffers + buffer;
 		vb->type = q->type;
 		vb->memory = memory;
+		/*
+		 * We need to set these flags here so that the videobuf2 core
+		 * will call ->prepare()/->finish() cache sync/flush on vb2
+		 * buffers when appropriate. However, we can avoid explicit
+		 * ->prepare() and ->finish() cache sync for DMABUF buffers,
+		 * because DMA exporter takes care of it.
+		 */
+		if (q->memory != VB2_MEMORY_DMABUF) {
+			vb->need_cache_sync_on_prepare = 1;
+			vb->need_cache_sync_on_finish = 1;
+		}
 		for (plane = 0; plane < num_planes; ++plane) {
 			vb->planes[plane].length = plane_sizes[plane];
 			vb->planes[plane].min_length = plane_sizes[plane];
commit 7ee1a01e47403f72b9f38839a737692f6991263e
Author: Baruch Siach <baruch at tkos.co.il>
Date:   Wed Dec 2 09:15:32 2020 +0200

    gpio: mvebu: fix potential user-after-free on probe
    
    When mvebu_pwm_probe() fails IRQ domain is not released. Move pwm probe
    before IRQ domain allocation. Add pwm cleanup code to the failure path.
    
    Fixes: 757642f9a584 ("gpio: mvebu: Add limited PWM support")
    Reported-by: Andrew Lunn <andrew at lunn.ch>
    Signed-off-by: Baruch Siach <baruch at tkos.co.il>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
index 433e2c3f3fd5..2f245594a90a 100644
--- a/drivers/gpio/gpio-mvebu.c
+++ b/drivers/gpio/gpio-mvebu.c
@@ -1197,6 +1197,13 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
 
 	devm_gpiochip_add_data(&pdev->dev, &mvchip->chip, mvchip);
 
+	/* Some MVEBU SoCs have simple PWM support for GPIO lines */
+	if (IS_ENABLED(CONFIG_PWM)) {
+		err = mvebu_pwm_probe(pdev, mvchip, id);
+		if (err)
+			return err;
+	}
+
 	/* Some gpio controllers do not provide irq support */
 	if (!have_irqs)
 		return 0;
@@ -1206,7 +1213,8 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
 	if (!mvchip->domain) {
 		dev_err(&pdev->dev, "couldn't allocate irq domain %s (DT).\n",
 			mvchip->chip.label);
-		return -ENODEV;
+		err = -ENODEV;
+		goto err_pwm;
 	}
 
 	err = irq_alloc_domain_generic_chips(
@@ -1254,14 +1262,12 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
 						 mvchip);
 	}
 
-	/* Some MVEBU SoCs have simple PWM support for GPIO lines */
-	if (IS_ENABLED(CONFIG_PWM))
-		return mvebu_pwm_probe(pdev, mvchip, id);
-
 	return 0;
 
 err_domain:
 	irq_domain_remove(mvchip->domain);
+err_pwm:
+	pwmchip_remove(&mvchip->mvpwm->chip);
 
 	return err;
 }
commit 7d894834a305568a0168c55d4729216f5f8cb4e6
Author: Yanan Wang <wangyanan55 at huawei.com>
Date:   Wed Dec 2 04:10:34 2020 +0800

    KVM: arm64: Add usage of stage 2 fault lookup level in user_mem_abort()
    
    If we get a FSC_PERM fault, just using (logging_active && writable) to
    determine calling kvm_pgtable_stage2_map(). There will be two more cases
    we should consider.
    
    (1) After logging_active is configged back to false from true. When we
    get a FSC_PERM fault with write_fault and adjustment of hugepage is needed,
    we should merge tables back to a block entry. This case is ignored by still
    calling kvm_pgtable_stage2_relax_perms(), which will lead to an endless
    loop and guest panic due to soft lockup.
    
    (2) We use (FSC_PERM && logging_active && writable) to determine
    collapsing a block entry into a table by calling kvm_pgtable_stage2_map().
    But sometimes we may only need to relax permissions when trying to write
    to a page other than a block.
    In this condition,using kvm_pgtable_stage2_relax_perms() will be fine.
    
    The ISS filed bit[1:0] in ESR_EL2 regesiter indicates the stage2 lookup
    level at which a D-abort or I-abort occurred. By comparing granule of
    the fault lookup level with vma_pagesize, we can strictly distinguish
    conditions of calling kvm_pgtable_stage2_relax_perms() or
    kvm_pgtable_stage2_map(), and the above two cases will be well considered.
    
    Suggested-by: Keqian Zhu <zhukeqian1 at huawei.com>
    Signed-off-by: Yanan Wang <wangyanan55 at huawei.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201201201034.116760-4-wangyanan55@huawei.com

diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h
index 22c81f1edda2..85a3e49f92f4 100644
--- a/arch/arm64/include/asm/esr.h
+++ b/arch/arm64/include/asm/esr.h
@@ -104,6 +104,7 @@
 /* Shared ISS fault status code(IFSC/DFSC) for Data/Instruction aborts */
 #define ESR_ELx_FSC		(0x3F)
 #define ESR_ELx_FSC_TYPE	(0x3C)
+#define ESR_ELx_FSC_LEVEL	(0x03)
 #define ESR_ELx_FSC_EXTABT	(0x10)
 #define ESR_ELx_FSC_SERROR	(0x11)
 #define ESR_ELx_FSC_ACCESS	(0x08)
diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
index 5ef2669ccd6c..00bc6f1234ba 100644
--- a/arch/arm64/include/asm/kvm_emulate.h
+++ b/arch/arm64/include/asm/kvm_emulate.h
@@ -350,6 +350,11 @@ static __always_inline u8 kvm_vcpu_trap_get_fault_type(const struct kvm_vcpu *vc
 	return kvm_vcpu_get_esr(vcpu) & ESR_ELx_FSC_TYPE;
 }
 
+static __always_inline u8 kvm_vcpu_trap_get_fault_level(const struct kvm_vcpu *vcpu)
+{
+	return kvm_vcpu_get_esr(vcpu) & ESR_ELx_FSC_LEVEL;
+}
+
 static __always_inline bool kvm_vcpu_abt_issea(const struct kvm_vcpu *vcpu)
 {
 	switch (kvm_vcpu_trap_get_fault(vcpu)) {
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index 1a01da9fdc99..75814a02d189 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -754,10 +754,12 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 	gfn_t gfn;
 	kvm_pfn_t pfn;
 	bool logging_active = memslot_is_logging(memslot);
-	unsigned long vma_pagesize;
+	unsigned long fault_level = kvm_vcpu_trap_get_fault_level(vcpu);
+	unsigned long vma_pagesize, fault_granule;
 	enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R;
 	struct kvm_pgtable *pgt;
 
+	fault_granule = 1UL << ARM64_HW_PGTABLE_LEVEL_SHIFT(fault_level);
 	write_fault = kvm_is_write_fault(vcpu);
 	exec_fault = kvm_vcpu_trap_is_exec_fault(vcpu);
 	VM_BUG_ON(write_fault && exec_fault);
@@ -896,7 +898,12 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 	else if (cpus_have_const_cap(ARM64_HAS_CACHE_DIC))
 		prot |= KVM_PGTABLE_PROT_X;
 
-	if (fault_status == FSC_PERM && !(logging_active && writable)) {
+	/*
+	 * Under the premise of getting a FSC_PERM fault, we just need to relax
+	 * permissions only if vma_pagesize equals fault_granule. Otherwise,
+	 * kvm_pgtable_stage2_map() should be called to change block size.
+	 */
+	if (fault_status == FSC_PERM && vma_pagesize == fault_granule) {
 		ret = kvm_pgtable_stage2_relax_perms(pgt, fault_ipa, prot);
 	} else {
 		ret = kvm_pgtable_stage2_map(pgt, fault_ipa, vma_pagesize,
commit 3a0b870e3448302ca2ba703bea1b79b61c3f33c6
Author: Yanan Wang <wangyanan55 at huawei.com>
Date:   Wed Dec 2 04:10:33 2020 +0800

    KVM: arm64: Fix handling of merging tables into a block entry
    
    When dirty logging is enabled, we collapse block entries into tables
    as necessary. If dirty logging gets canceled, we can end-up merging
    tables back into block entries.
    
    When this happens, we must not only free the non-huge page-table
    pages but also invalidate all the TLB entries that can potentially
    cover the block. Otherwise, we end-up with multiple possible translations
    for the same physical page, which can legitimately result in a TLB
    conflict.
    
    To address this, replease the bogus invalidation by IPA with a full
    VM invalidation. Although this is pretty heavy handed, it happens
    very infrequently and saves a bunch of invalidations by IPA.
    
    Signed-off-by: Yanan Wang <wangyanan55 at huawei.com>
    [maz: fixup commit message]
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201201201034.116760-3-wangyanan55@huawei.com

diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c
index 2beba1dc40ec..bdf8e55ed308 100644
--- a/arch/arm64/kvm/hyp/pgtable.c
+++ b/arch/arm64/kvm/hyp/pgtable.c
@@ -502,7 +502,13 @@ static int stage2_map_walk_table_pre(u64 addr, u64 end, u32 level,
 		return 0;
 
 	kvm_set_invalid_pte(ptep);
-	kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, data->mmu, addr, 0);
+
+	/*
+	 * Invalidate the whole stage-2, as we may have numerous leaf
+	 * entries below us which would otherwise need invalidating
+	 * individually.
+	 */
+	kvm_call_hyp(__kvm_tlb_flush_vmid, data->mmu);
 	data->anchor = ptep;
 	return 0;
 }
commit 5c646b7e1d8bcb12317426287c516dfa4c5171c2
Author: Yanan Wang <wangyanan55 at huawei.com>
Date:   Wed Dec 2 04:10:32 2020 +0800

    KVM: arm64: Fix memory leak on stage2 update of a valid PTE
    
    When installing a new leaf PTE onto an invalid ptep, we need to
    get_page(ptep) to account for the new mapping.
    
    However, simply updating a valid PTE shouldn't result in any
    additional refcounting, as there is new mapping. This otherwise
    results in a page being forever wasted.
    
    Address this by fixing-up the refcount in stage2_map_walker_try_leaf()
    if the PTE was already valid, balancing out the later get_page()
    in stage2_map_walk_leaf().
    
    Signed-off-by: Yanan Wang <wangyanan55 at huawei.com>
    [maz: update commit message, add comment in the code]
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201201201034.116760-2-wangyanan55@huawei.com

diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c
index 0271b4a3b9fe..2beba1dc40ec 100644
--- a/arch/arm64/kvm/hyp/pgtable.c
+++ b/arch/arm64/kvm/hyp/pgtable.c
@@ -470,6 +470,15 @@ static bool stage2_map_walker_try_leaf(u64 addr, u64 end, u32 level,
 	if (!kvm_block_mapping_supported(addr, end, phys, level))
 		return false;
 
+	/*
+	 * If the PTE was already valid, drop the refcount on the table
+	 * early, as it will be bumped-up again in stage2_map_walk_leaf().
+	 * This ensures that the refcount stays constant across a valid to
+	 * valid PTE update.
+	 */
+	if (kvm_pte_valid(*ptep))
+		put_page(virt_to_page(ptep));
+
 	if (kvm_set_valid_leaf_pte(ptep, phys, data->attr, level))
 		goto out;
 
commit 7f57b295f990c0fa07f96d51ca1c82c52dbf79cc
Author: Qinglang Miao <miaoqinglang at huawei.com>
Date:   Fri Nov 27 17:44:45 2020 +0800

    gpio: zynq: fix reference leak in zynq_gpio functions
    
    pm_runtime_get_sync will increment pm usage counter even it
    failed. Forgetting to putting operation will result in a
    reference leak here.
    
    A new function pm_runtime_resume_and_get is introduced in
    [0] to keep usage counter balanced. So We fix the reference
    leak by replacing it with new funtion.
    
    [0] dd8088d5a896 ("PM: runtime: Add  pm_runtime_resume_and_get to deal with usage counter")
    
    Fixes: c2df3de0d07e ("gpio: zynq: properly support runtime PM for GPIO used as interrupts")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Qinglang Miao <miaoqinglang at huawei.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
index 0b5a17ab996f..3521c1dc3ac0 100644
--- a/drivers/gpio/gpio-zynq.c
+++ b/drivers/gpio/gpio-zynq.c
@@ -574,7 +574,7 @@ static int zynq_gpio_irq_reqres(struct irq_data *d)
 	struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
 	int ret;
 
-	ret = pm_runtime_get_sync(chip->parent);
+	ret = pm_runtime_resume_and_get(chip->parent);
 	if (ret < 0)
 		return ret;
 
@@ -942,7 +942,7 @@ static int zynq_gpio_probe(struct platform_device *pdev)
 
 	pm_runtime_set_active(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);
-	ret = pm_runtime_get_sync(&pdev->dev);
+	ret = pm_runtime_resume_and_get(&pdev->dev);
 	if (ret < 0)
 		goto err_pm_dis;
 
commit 6dbbf84603961d4e8eaea46e3530373c8cffee67
Author: Edmond Chung <edmondchung at google.com>
Date:   Mon Nov 30 22:47:53 2020 +0000

    gpiolib: Don't free if pin ranges are not defined
    
    A similar check was added in gpiochip_generic_request, but not in free.
    This has caused an imbalance count of request vs. free calls to the
    pinctrl driver. This patch is targeted to fix that issue.
    
    Fixes: 2ab73c6d8323 ("gpio: Support GPIO controllers without pin-ranges")
    Signed-off-by: Edmond Chung <edmondchung at google.com>
    Signed-off-by: Andrew Chant <achant at google.com>
    Signed-off-by: Will McVicker <willmcvicker at google.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 089ddcaa9bc6..6e3c4d7a7d14 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1806,6 +1806,11 @@ EXPORT_SYMBOL_GPL(gpiochip_generic_request);
  */
 void gpiochip_generic_free(struct gpio_chip *gc, unsigned offset)
 {
+#ifdef CONFIG_PINCTRL
+	if (list_empty(&gc->gpiodev->pin_ranges))
+		return;
+#endif
+
 	pinctrl_gpio_free(gc->gpiodev->base + offset);
 }
 EXPORT_SYMBOL_GPL(gpiochip_generic_free);
commit 60593df667e087b009ee0fc20d92e9c4c096a9b5
Author: Luo Jiaxing <luojiaxing at huawei.com>
Date:   Fri Nov 27 16:50:02 2020 +0800

    gpio: dwapb: fix NULL pointer dereference at dwapb_gpio_suspend()
    
    Following Calltrace is found when running echo freeze > /sys/power/state.
    
    [  272.755506] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
    [  272.755585] Call trace:
    [  272.755587]  dwapb_gpio_suspend+0x18/0x318
    [  272.755588]  pm_generic_suspend+0x2c/0x48
    [  272.755595]  acpi_subsys_suspend+0x60/0x70
    [  272.755599]  dpm_run_callback.isra.18+0x40/0xe0
    [  272.755601]  __device_suspend+0xf4/0x360
    
    The reason is platform_set_drvdata() is deleted, and dwapb_gpio_suspend()
    get *gpio by dev_get_drvdata().
    
    Fixes: feeaefd378ca ("gpio: dwapb: Use resource managed GPIO-chip add data method")
    Signed-off-by: Luo Jiaxing <luojiaxing at huawei.com>
    Acked-by: Serge Semin <fancer.lancer at gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index 2a9046c0fb16..4275c18a097a 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -724,6 +724,8 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
 			return err;
 	}
 
+	platform_set_drvdata(pdev, gpio);
+
 	return 0;
 }
 
commit 0ac22098de6f9fd460ac1b1cbf6dbd324312161c
Author: Zheng Liang <zhengliang6 at huawei.com>
Date:   Tue Nov 24 11:06:06 2020 +0800

    gpio: arizona: disable pm_runtime in case of failure
    
    pm_runtime_enable will increase power disable depth. Thus a
    pairing decrement is needed on the error handling path to keep
    it balanced.
    
    Fixes:27a49ed17e224(gpio: arizona: Add support for GPIOs that)
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zheng Liang <zhengliang6 at huawei.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-arizona.c b/drivers/gpio/gpio-arizona.c
index 5bda38e0780f..2bc173c352ce 100644
--- a/drivers/gpio/gpio-arizona.c
+++ b/drivers/gpio/gpio-arizona.c
@@ -192,6 +192,7 @@ static int arizona_gpio_probe(struct platform_device *pdev)
 	ret = devm_gpiochip_add_data(&pdev->dev, &arizona_gpio->gpio_chip,
 				     arizona_gpio);
 	if (ret < 0) {
+		pm_runtime_disable(&pdev->dev);
 		dev_err(&pdev->dev, "Could not register gpiochip, %d\n",
 			ret);
 		return ret;
commit 2c602741b51daa12f8457f222ce9ce9c4825d067
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Wed Dec 2 09:44:43 2020 +0300

    vhost_vdpa: return -EFAULT if copy_to_user() fails
    
    The copy_to_user() function returns the number of bytes remaining to be
    copied but this should return -EFAULT to the user.
    
    Fixes: 1b48dc03e575 ("vhost: vdpa: report iova range")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Link: https://lore.kernel.org/r/X8c32z5EtDsMyyIL@mwanda
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Jason Wang <jasowang at redhat.com>
    Reviewed-by: Stefano Garzarella <sgarzare at redhat.com>

diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
index f2db99031e2f..29ed4173f04e 100644
--- a/drivers/vhost/vdpa.c
+++ b/drivers/vhost/vdpa.c
@@ -348,7 +348,9 @@ static long vhost_vdpa_get_iova_range(struct vhost_vdpa *v, u32 __user *argp)
 		.last = v->range.last,
 	};
 
-	return copy_to_user(argp, &range, sizeof(range));
+	if (copy_to_user(argp, &range, sizeof(range)))
+		return -EFAULT;
+	return 0;
 }
 
 static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
commit 98701a2a861fa87a5055cf2809758e8725e8b146
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Sat Nov 28 13:39:05 2020 -0800

    vdpa: mlx5: fix vdpa/vhost dependencies
    
    drivers/vdpa/mlx5/ uses vhost_iotlb*() interfaces, so select
    VHOST_IOTLB to make them be built.
    
    However, if VHOST_IOTLB is the only VHOST symbol that is
    set/enabled, the object file still won't be built because
    drivers/Makefile won't descend into drivers/vhost/ to build it,
    so make drivers/Makefile build the needed binary whenever
    VHOST_IOTLB is set, like it does for VHOST_RING.
    
    Fixes these build errors:
    ERROR: modpost: "vhost_iotlb_itree_next" [drivers/vdpa/mlx5/mlx5_vdpa.ko] undefined!
    ERROR: modpost: "vhost_iotlb_itree_first" [drivers/vdpa/mlx5/mlx5_vdpa.ko] undefined!
    
    Fixes: 29064bfdabd5 ("vdpa/mlx5: Add support library for mlx5 VDPA implementation")
    Fixes: aff90770e54c ("vdpa/mlx5: Fix dependency on MLX5_CORE")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: Eli Cohen <eli at mellanox.com>
    Cc: Parav Pandit <parav at mellanox.com>
    Cc: "Michael S. Tsirkin" <mst at redhat.com>
    Cc: Jason Wang <jasowang at redhat.com>
    Cc: virtualization at lists.linux-foundation.org
    Cc: Saeed Mahameed <saeedm at nvidia.com>
    Cc: Leon Romanovsky <leonro at nvidia.com>
    Cc: netdev at vger.kernel.org
    Link: https://lore.kernel.org/r/20201128213905.27409-1-rdunlap@infradead.org
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Jason Wang <jasowang at redhat.com>

diff --git a/drivers/Makefile b/drivers/Makefile
index c0cd1b9075e3..576228037718 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -145,6 +145,7 @@ obj-$(CONFIG_OF)		+= of/
 obj-$(CONFIG_SSB)		+= ssb/
 obj-$(CONFIG_BCMA)		+= bcma/
 obj-$(CONFIG_VHOST_RING)	+= vhost/
+obj-$(CONFIG_VHOST_IOTLB)	+= vhost/
 obj-$(CONFIG_VHOST)		+= vhost/
 obj-$(CONFIG_VLYNQ)		+= vlynq/
 obj-$(CONFIG_GREYBUS)		+= greybus/
diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig
index 358f6048dd3c..6caf539091e5 100644
--- a/drivers/vdpa/Kconfig
+++ b/drivers/vdpa/Kconfig
@@ -32,6 +32,7 @@ config IFCVF
 
 config MLX5_VDPA
 	bool
+	select VHOST_IOTLB
 	help
 	  Support library for Mellanox VDPA drivers. Provides code that is
 	  common for all types of VDPA drivers. The following drivers are planned:
commit 156c9b70dbfb83eeeff39e9202eb5f8bb6d0fd04
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Mon Nov 30 14:33:36 2020 -0800

    selftests/bpf: Drain ringbuf samples at the end of test
    
    Avoid occasional test failures due to the last sample being delayed to
    another ring_buffer__poll() call. Instead, drain samples completely with
    ring_buffer__consume(). This is supposed to fix a rare and non-deterministic
    test failure in libbpf CI.
    
    Fixes: cb1c9ddd5525 ("selftests/bpf: Add BPF ringbuf selftests")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201130223336.904192-2-andrii@kernel.org

diff --git a/tools/testing/selftests/bpf/prog_tests/ringbuf.c b/tools/testing/selftests/bpf/prog_tests/ringbuf.c
index 1a48c6f7f54e..fddbc5db5d6a 100644
--- a/tools/testing/selftests/bpf/prog_tests/ringbuf.c
+++ b/tools/testing/selftests/bpf/prog_tests/ringbuf.c
@@ -220,6 +220,12 @@ void test_ringbuf(void)
 	if (CHECK(bg_ret <= 0, "bg_ret", "epoll_wait result: %ld", bg_ret))
 		goto cleanup;
 
+	/* due to timing variations, there could still be non-notified
+	 * samples, so consume them here to collect all the samples
+	 */
+	err = ring_buffer__consume(ringbuf);
+	CHECK(err < 0, "rb_consume", "failed: %d\b", err);
+
 	/* 3 rounds, 2 samples each */
 	cnt = atomic_xchg(&sample_cnt, 0);
 	CHECK(cnt != 6, "cnt", "exp %d samples, got %d\n", 6, cnt);
commit f6a8250ea1e42ad1f4f3bab01c851ec5fd48f0e7
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Mon Nov 30 14:33:35 2020 -0800

    libbpf: Fix ring_buffer__poll() to return number of consumed samples
    
    Fix ring_buffer__poll() to return the number of non-discarded records
    consumed, just like its documentation states. It's also consistent with
    ring_buffer__consume() return. Fix up selftests with wrong expected results.
    
    Fixes: bf99c936f947 ("libbpf: Add BPF ring buffer support")
    Fixes: cb1c9ddd5525 ("selftests/bpf: Add BPF ringbuf selftests")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201130223336.904192-1-andrii@kernel.org

diff --git a/tools/lib/bpf/ringbuf.c b/tools/lib/bpf/ringbuf.c
index 5c6522c89af1..98537ff2679e 100644
--- a/tools/lib/bpf/ringbuf.c
+++ b/tools/lib/bpf/ringbuf.c
@@ -278,7 +278,7 @@ int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms)
 		err = ringbuf_process_ring(ring);
 		if (err < 0)
 			return err;
-		res += cnt;
+		res += err;
 	}
 	return cnt < 0 ? -errno : res;
 }
diff --git a/tools/testing/selftests/bpf/prog_tests/ringbuf.c b/tools/testing/selftests/bpf/prog_tests/ringbuf.c
index c1650548433c..1a48c6f7f54e 100644
--- a/tools/testing/selftests/bpf/prog_tests/ringbuf.c
+++ b/tools/testing/selftests/bpf/prog_tests/ringbuf.c
@@ -217,7 +217,7 @@ void test_ringbuf(void)
 	if (CHECK(err, "join_bg", "err %d\n", err))
 		goto cleanup;
 
-	if (CHECK(bg_ret != 1, "bg_ret", "epoll_wait result: %ld", bg_ret))
+	if (CHECK(bg_ret <= 0, "bg_ret", "epoll_wait result: %ld", bg_ret))
 		goto cleanup;
 
 	/* 3 rounds, 2 samples each */
diff --git a/tools/testing/selftests/bpf/prog_tests/ringbuf_multi.c b/tools/testing/selftests/bpf/prog_tests/ringbuf_multi.c
index 78e450609803..d37161e59bb2 100644
--- a/tools/testing/selftests/bpf/prog_tests/ringbuf_multi.c
+++ b/tools/testing/selftests/bpf/prog_tests/ringbuf_multi.c
@@ -81,7 +81,7 @@ void test_ringbuf_multi(void)
 
 	/* poll for samples, should get 2 ringbufs back */
 	err = ring_buffer__poll(ringbuf, -1);
-	if (CHECK(err != 4, "poll_res", "expected 4 records, got %d\n", err))
+	if (CHECK(err != 2, "poll_res", "expected 2 records, got %d\n", err))
 		goto cleanup;
 
 	/* expect extra polling to return nothing */
commit 4179b00c04d18ea7013f68d578d80f3c9d13150a
Author: Eric Dumazet <edumazet at google.com>
Date:   Tue Dec 1 01:05:07 2020 -0800

    geneve: pull IP header before ECN decapsulation
    
    IP_ECN_decapsulate() and IP6_ECN_decapsulate() assume
    IP header is already pulled.
    
    geneve does not ensure this yet.
    
    Fixing this generically in IP_ECN_decapsulate() and
    IP6_ECN_decapsulate() is not possible, since callers
    pass a pointer that might be freed by pskb_may_pull()
    
    syzbot reported :
    
    BUG: KMSAN: uninit-value in __INET_ECN_decapsulate include/net/inet_ecn.h:238 [inline]
    BUG: KMSAN: uninit-value in INET_ECN_decapsulate+0x345/0x1db0 include/net/inet_ecn.h:260
    CPU: 1 PID: 8941 Comm: syz-executor.0 Not tainted 5.10.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     <IRQ>
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0x21c/0x280 lib/dump_stack.c:118
     kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:118
     __msan_warning+0x5f/0xa0 mm/kmsan/kmsan_instr.c:197
     __INET_ECN_decapsulate include/net/inet_ecn.h:238 [inline]
     INET_ECN_decapsulate+0x345/0x1db0 include/net/inet_ecn.h:260
     geneve_rx+0x2103/0x2980 include/net/inet_ecn.h:306
     geneve_udp_encap_recv+0x105c/0x1340 drivers/net/geneve.c:377
     udp_queue_rcv_one_skb+0x193a/0x1af0 net/ipv4/udp.c:2093
     udp_queue_rcv_skb+0x282/0x1050 net/ipv4/udp.c:2167
     udp_unicast_rcv_skb net/ipv4/udp.c:2325 [inline]
     __udp4_lib_rcv+0x399d/0x5880 net/ipv4/udp.c:2394
     udp_rcv+0x5c/0x70 net/ipv4/udp.c:2564
     ip_protocol_deliver_rcu+0x572/0xc50 net/ipv4/ip_input.c:204
     ip_local_deliver_finish net/ipv4/ip_input.c:231 [inline]
     NF_HOOK include/linux/netfilter.h:301 [inline]
     ip_local_deliver+0x583/0x8d0 net/ipv4/ip_input.c:252
     dst_input include/net/dst.h:449 [inline]
     ip_rcv_finish net/ipv4/ip_input.c:428 [inline]
     NF_HOOK include/linux/netfilter.h:301 [inline]
     ip_rcv+0x5c3/0x840 net/ipv4/ip_input.c:539
     __netif_receive_skb_one_core net/core/dev.c:5315 [inline]
     __netif_receive_skb+0x1ec/0x640 net/core/dev.c:5429
     process_backlog+0x523/0xc10 net/core/dev.c:6319
     napi_poll+0x420/0x1010 net/core/dev.c:6763
     net_rx_action+0x35c/0xd40 net/core/dev.c:6833
     __do_softirq+0x1a9/0x6fa kernel/softirq.c:298
     asm_call_irq_on_stack+0xf/0x20
     </IRQ>
     __run_on_irqstack arch/x86/include/asm/irq_stack.h:26 [inline]
     run_on_irqstack_cond arch/x86/include/asm/irq_stack.h:77 [inline]
     do_softirq_own_stack+0x6e/0x90 arch/x86/kernel/irq_64.c:77
     do_softirq kernel/softirq.c:343 [inline]
     __local_bh_enable_ip+0x184/0x1d0 kernel/softirq.c:195
     local_bh_enable+0x36/0x40 include/linux/bottom_half.h:32
     rcu_read_unlock_bh include/linux/rcupdate.h:730 [inline]
     __dev_queue_xmit+0x3a9b/0x4520 net/core/dev.c:4167
     dev_queue_xmit+0x4b/0x60 net/core/dev.c:4173
     packet_snd net/packet/af_packet.c:2992 [inline]
     packet_sendmsg+0x86f9/0x99d0 net/packet/af_packet.c:3017
     sock_sendmsg_nosec net/socket.c:651 [inline]
     sock_sendmsg net/socket.c:671 [inline]
     __sys_sendto+0x9dc/0xc80 net/socket.c:1992
     __do_sys_sendto net/socket.c:2004 [inline]
     __se_sys_sendto+0x107/0x130 net/socket.c:2000
     __x64_sys_sendto+0x6e/0x90 net/socket.c:2000
     do_syscall_64+0x9f/0x140 arch/x86/entry/common.c:48
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: 2d07dc79fe04 ("geneve: add initial netdev driver for GENEVE tunnels")
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Reported-by: syzbot <syzkaller at googlegroups.com>
    Link: https://lore.kernel.org/r/20201201090507.4137906-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index 1426bfc009bc..8ae9ce2014a4 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -257,11 +257,21 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
 		skb_dst_set(skb, &tun_dst->dst);
 
 	/* Ignore packet loops (and multicast echo) */
-	if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr)) {
-		geneve->dev->stats.rx_errors++;
-		goto drop;
-	}
+	if (ether_addr_equal(eth_hdr(skb)->h_source, geneve->dev->dev_addr))
+		goto rx_error;
 
+	switch (skb_protocol(skb, true)) {
+	case htons(ETH_P_IP):
+		if (pskb_may_pull(skb, sizeof(struct iphdr)))
+			goto rx_error;
+		break;
+	case htons(ETH_P_IPV6):
+		if (pskb_may_pull(skb, sizeof(struct ipv6hdr)))
+			goto rx_error;
+		break;
+	default:
+		goto rx_error;
+	}
 	oiph = skb_network_header(skb);
 	skb_reset_network_header(skb);
 
@@ -298,6 +308,8 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
 		dev_sw_netstats_rx_add(geneve->dev, len);
 
 	return;
+rx_error:
+	geneve->dev->stats.rx_errors++;
 drop:
 	/* Consume bad packet */
 	kfree_skb(skb);
commit 2867e1eac61016f59b3d730e3f7aa488e186e917
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Mon Nov 30 19:37:05 2020 +0100

    inet_ecn: Fix endianness of checksum update when setting ECT(1)
    
    When adding support for propagating ECT(1) marking in IP headers it seems I
    suffered from endianness-confusion in the checksum update calculation: In
    fact the ECN field is in the *lower* bits of the first 16-bit word of the
    IP header when calculating in network byte order. This means that the
    addition performed to update the checksum field was wrong; let's fix that.
    
    Fixes: b723748750ec ("tunnel: Propagate ECT(1) when decapsulating as recommended by RFC6040")
    Reported-by: Jonathan Morton <chromatix99 at gmail.com>
    Tested-by: Pete Heist <pete at heistp.net>
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Link: https://lore.kernel.org/r/20201130183705.17540-1-toke@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
index e1eaf1780288..563457fec557 100644
--- a/include/net/inet_ecn.h
+++ b/include/net/inet_ecn.h
@@ -107,7 +107,7 @@ static inline int IP_ECN_set_ect1(struct iphdr *iph)
 	if ((iph->tos & INET_ECN_MASK) != INET_ECN_ECT_0)
 		return 0;
 
-	check += (__force u16)htons(0x100);
+	check += (__force u16)htons(0x1);
 
 	iph->check = (__force __sum16)(check + (check>=0xFFFF));
 	iph->tos ^= INET_ECN_MASK;
commit 93416ab0f994f6cf16fa0c695577f8b19d30c533
Author: Gal Pressman <galpress at amazon.com>
Date:   Tue Dec 1 11:17:24 2020 +0200

    RDMA/efa: Use the correct current and new states in modify QP
    
    The local variables cur_state and new_state hold the state that should be
    used for the modify QP operation instead of the ones in the ib_qp_attr
    struct.
    
    Fixes: 40909f664d27 ("RDMA/efa: Add EFA verbs implementation")
    Link: https://lore.kernel.org/r/20201201091724.37016-1-galpress@amazon.com
    Reviewed-by: Firas JahJah <firasj at amazon.com>
    Reviewed-by: Yossi Leybovich <sleybo at amazon.com>
    Signed-off-by: Gal Pressman <galpress at amazon.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/efa/efa_verbs.c b/drivers/infiniband/hw/efa/efa_verbs.c
index 191e0843f090..4e940fc50bba 100644
--- a/drivers/infiniband/hw/efa/efa_verbs.c
+++ b/drivers/infiniband/hw/efa/efa_verbs.c
@@ -940,8 +940,8 @@ int efa_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
 			1);
 		EFA_SET(&params.modify_mask,
 			EFA_ADMIN_MODIFY_QP_CMD_CUR_QP_STATE, 1);
-		params.cur_qp_state = qp_attr->cur_qp_state;
-		params.qp_state = qp_attr->qp_state;
+		params.cur_qp_state = cur_state;
+		params.qp_state = new_state;
 	}
 
 	if (qp_attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) {
commit 0191c271debfc3d171e8b2d81875d7036982d02c
Author: Alok Prasad <palok at marvell.com>
Date:   Fri Nov 27 16:32:51 2020 +0000

    RDMA/qedr: iWARP invalid(zero) doorbell address fix
    
    This patch fixes issue introduced by a previous commit where iWARP
    doorbell address wasn't initialized, causing call trace when any RDMA
    application wants to use this interface:
    
      Illegal doorbell address: 0000000000000000. Legal range for doorbell addresses is [0000000011431e08..00000000ec3799d3]
      WARNING: CPU: 11 PID: 11990 at drivers/net/ethernet/qlogic/qed/qed_dev.c:93 qed_db_rec_sanity.isra.12+0x48/0x70 [qed]
      ...
       hpsa scsi_transport_sas [last unloaded: crc8]
      CPU: 11 PID: 11990 Comm: rping Tainted: G S                5.10.0-rc1 #29
      Hardware name: HP ProLiant DL380 Gen9/ProLiant DL380 Gen9, BIOS P89 01/22/2018
      RIP: 0010:qed_db_rec_sanity.isra.12+0x48/0x70 [qed]
      ...
      RSP: 0018:ffffafc28458fa88 EFLAGS: 00010286
      RAX: 0000000000000000 RBX: ffff8d0d4c620000 RCX: 0000000000000000
      RDX: ffff8d10afde7d50 RSI: ffff8d10afdd8b40 RDI: ffff8d10afdd8b40
      RBP: ffffafc28458fe38 R08: 0000000000000003 R09: 0000000000007fff
      R10: 0000000000000001 R11: ffffafc28458f888 R12: 0000000000000000
      R13: 0000000000000000 R14: ffff8d0d43ccbbd0 R15: ffff8d0d48dae9c0
      FS:  00007fbd5267e740(0000) GS:ffff8d10afdc0000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007fbd4f258fb8 CR3: 0000000108d96003 CR4: 00000000001706e0
      Call Trace:
       qed_db_recovery_add+0x6d/0x1f0 [qed]
       qedr_create_user_qp+0x57e/0xd30 [qedr]
       qedr_create_qp+0x5f3/0xab0 [qedr]
       ? lookup_get_idr_uobject.part.12+0x45/0x90 [ib_uverbs]
       create_qp+0x45d/0xb30 [ib_uverbs]
       ? ib_uverbs_cq_event_handler+0x30/0x30 [ib_uverbs]
       ib_uverbs_create_qp+0xb9/0xe0 [ib_uverbs]
       ib_uverbs_write+0x3f9/0x570 [ib_uverbs]
       ? security_mmap_file+0x62/0xe0
       vfs_write+0xb7/0x200
       ksys_write+0xaf/0xd0
       ? syscall_trace_enter.isra.25+0x152/0x200
       do_syscall_64+0x2d/0x40
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: 06e8d1df46ed ("RDMA/qedr: Add support for user mode XRC-SRQ's")
    Link: https://lore.kernel.org/r/20201127163251.14533-1-palok@marvell.com
    Signed-off-by: Michal Kalderon <mkalderon at marvell.com>
    Signed-off-by: Igor Russkikh <irusskikh at marvell.com>
    Signed-off-by: Alok Prasad <palok at marvell.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c
index 019642ff24a7..511c95bb3d01 100644
--- a/drivers/infiniband/hw/qedr/verbs.c
+++ b/drivers/infiniband/hw/qedr/verbs.c
@@ -1936,6 +1936,15 @@ static int qedr_create_user_qp(struct qedr_dev *dev,
 	}
 
 	if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
+		qp->urq.db_rec_db2_addr = ctx->dpi_addr + uresp.rq_db2_offset;
+
+		/* calculate the db_rec_db2 data since it is constant so no
+		 * need to reflect from user
+		 */
+		qp->urq.db_rec_db2_data.data.icid = cpu_to_le16(qp->icid);
+		qp->urq.db_rec_db2_data.data.value =
+			cpu_to_le16(DQ_TCM_IWARP_POST_RQ_CF_CMD);
+
 		rc = qedr_db_recovery_add(dev, qp->urq.db_rec_db2_addr,
 					  &qp->urq.db_rec_db2_data,
 					  DB_REC_WIDTH_32B,
commit 509a15421674b9e1a3e1916939d0d0efd3e578da
Merge: ef6900acc89e 212253367dc7
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Dec 1 15:43:53 2020 -0800

    Merge tag '5.10-rc6-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
    
    Pull cifs fixes from Steve French:
     "Two smb3 fixes for stable"
    
    * tag '5.10-rc6-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6:
      cifs: fix potential use-after-free in cifs_echo_request()
      cifs: allow syscalls to be restarted in __smb_send_rqst()

commit ef6900acc89ecfc78ceb0eb1605c954dd6f2ca05
Merge: f43691b59fae 68e10d5ff512
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Dec 1 15:30:18 2020 -0800

    Merge tag 'trace-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
    
    Pull tracing fixes from Steven Rostedt:
    
     - Use correct timestamp variable for ring buffer write stamp update
    
     - Fix up before stamp and write stamp when crossing ring buffer sub
       buffers
    
     - Keep a zero delta in ring buffer in slow path if cmpxchg fails
    
     - Fix trace_printk static buffer for archs that care
    
     - Fix ftrace record accounting for ftrace ops with trampolines
    
     - Fix DYNAMIC_FTRACE_WITH_DIRECT_CALLS dependency
    
     - Remove WARN_ON in hwlat tracer that triggers on something that is OK
    
     - Make "my_tramp" trampoline in ftrace direct sample code global
    
     - Fixes in the bootconfig tool for better alignment management
    
    * tag 'trace-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
      ring-buffer: Always check to put back before stamp when crossing pages
      ftrace: Fix DYNAMIC_FTRACE_WITH_DIRECT_CALLS dependency
      ftrace: Fix updating FTRACE_FL_TRAMP
      tracing: Fix alignment of static buffer
      tracing: Remove WARN_ON in start_thread()
      samples/ftrace: Mark my_tramp[12]? global
      ring-buffer: Set the right timestamp in the slow path of __rb_reserve_next()
      ring-buffer: Update write stamp with the correct ts
      docs: bootconfig: Update file format on initrd image
      tools/bootconfig: Align the bootconfig applied initrd image size to 4
      tools/bootconfig: Fix to check the write failure correctly
      tools/bootconfig: Fix errno reference after printf()

commit 0643334902fcdc770e2d9555811200213339a3f6
Author: Hoang Le <hoang.h.le at dektech.com.au>
Date:   Mon Nov 30 09:55:44 2020 +0700

    tipc: fix incompatible mtu of transmission
    
    In commit 682cd3cf946b6
    ("tipc: confgiure and apply UDP bearer MTU on running links"), we
    introduced a function to change UDP bearer MTU and applied this new value
    across existing per-link. However, we did not apply this new MTU value at
    node level. This lead to packet dropped at link level if its size is
    greater than new MTU value.
    
    To fix this issue, we also apply this new MTU value for node level.
    
    Fixes: 682cd3cf946b6 ("tipc: confgiure and apply UDP bearer MTU on running links")
    Acked-by: Jon Maloy <jmaloy at redhat.com>
    Signed-off-by: Hoang Le <hoang.h.le at dektech.com.au>
    Link: https://lore.kernel.org/r/20201130025544.3602-1-hoang.h.le@dektech.com.au
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/tipc/node.c b/net/tipc/node.c
index d269ebe382e1..c95d037fde51 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -2182,6 +2182,8 @@ void tipc_node_apply_property(struct net *net, struct tipc_bearer *b,
 			else if (prop == TIPC_NLA_PROP_MTU)
 				tipc_link_set_mtu(e->link, b->mtu);
 		}
+		/* Update MTU for node link entry */
+		e->mtu = tipc_link_mss(e->link);
 		tipc_node_write_unlock(n);
 		tipc_bearer_xmit(net, bearer_id, &xmitq, &e->maddr, NULL);
 	}
commit 857c4c0a8b2888d806f4308c58f59a6a81a1dee9
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Fri Nov 13 14:52:28 2020 -0800

    dm writecache: remove BUG() and fail gracefully instead
    
    Building on arch/s390/ results in this build error:
    
    cc1: some warnings being treated as errors
    ../drivers/md/dm-writecache.c: In function 'persistent_memory_claim':
    ../drivers/md/dm-writecache.c:323:1: error: no return statement in function returning non-void [-Werror=return-type]
    
    Fix this by replacing the BUG() with an -EOPNOTSUPP return.
    
    Fixes: 48debafe4f2f ("dm: add writecache target")
    Reported-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
index 7d277de26b3a..d5223a0e5cc5 100644
--- a/drivers/md/dm-writecache.c
+++ b/drivers/md/dm-writecache.c
@@ -319,7 +319,7 @@ err1:
 #else
 static int persistent_memory_claim(struct dm_writecache *wc)
 {
-	BUG();
+	return -EOPNOTSUPP;
 }
 #endif
 
commit e7b624183d921b49ef0a96329f21647d38865ee9
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Fri Nov 13 15:19:10 2020 +0100

    dm table: Remove BUG_ON(in_interrupt())
    
    The BUG_ON(in_interrupt()) in dm_table_event() is a historic leftover from
    a rework of the dm table code which changed the calling context.
    
    Issuing a BUG for a wrong calling context is frowned upon and
    in_interrupt() is deprecated and only covering parts of the wrong
    contexts. The sanity check for the context is covered by
    CONFIG_DEBUG_ATOMIC_SLEEP and other debug facilities already.
    
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index ce543b761be7..2073ee8d18f4 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -1247,12 +1247,6 @@ void dm_table_event_callback(struct dm_table *t,
 
 void dm_table_event(struct dm_table *t)
 {
-	/*
-	 * You can no longer call dm_table_event() from interrupt
-	 * context, use a bottom half instead.
-	 */
-	BUG_ON(in_interrupt());
-
 	mutex_lock(&_event_lock);
 	if (t->event_fn)
 		t->event_fn(t->event_context);
commit 89478335718c98557f10470a9bc5c555b9261c4e
Author: Sergei Shtepa <sergei.shtepa at veeam.com>
Date:   Wed Nov 11 15:55:46 2020 +0300

    dm: fix bug with RCU locking in dm_blk_report_zones
    
    The dm_get_live_table() function makes RCU read lock so
    dm_put_live_table() must be called even if dm_table map is not found.
    
    Fixes: e76239a3748c9 ("block: add a report_zones method")
    Cc: stable at vger.kernel.org
    Signed-off-by: Sergei Shtepa <sergei.shtepa at veeam.com>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index c18fc2548518..98866e725f25 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -476,8 +476,10 @@ static int dm_blk_report_zones(struct gendisk *disk, sector_t sector,
 		return -EAGAIN;
 
 	map = dm_get_live_table(md, &srcu_idx);
-	if (!map)
-		return -EIO;
+	if (!map) {
+		ret = -EIO;
+		goto out;
+	}
 
 	do {
 		struct dm_target *tgt;
commit 35d2835d2ac41dc0b3e3469f8e2b08ce9709ace8
Author: Nick Desaulniers <ndesaulniers at google.com>
Date:   Tue Nov 10 18:41:40 2020 -0800

    Revert "dm cache: fix arm link errors with inline"
    
    This reverts commit 43aeaa29573924df76f44eda2bbd94ca36e407b5.
    
    Since commit 0bddd227f3dc ("Documentation: update for gcc 4.9 requirement")
    the minimum supported version of GCC is gcc-4.9. It's now safe to remove
    this code.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/427
    Signed-off-by: Nick Desaulniers <ndesaulniers at google.com>
    Acked-by: Mikulas Patocka <mpatocka at redhat.com>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index 9644424591da..4bc453f5bbaa 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -712,10 +712,6 @@ static bool block_size_is_power_of_two(struct cache *cache)
 	return cache->sectors_per_block_shift >= 0;
 }
 
-/* gcc on ARM generates spurious references to __udivdi3 and __umoddi3 */
-#if defined(CONFIG_ARM) && __GNUC__ == 4 && __GNUC_MINOR__ <= 6
-__always_inline
-#endif
 static dm_block_t block_div(dm_block_t b, uint32_t n)
 {
 	do_div(b, n);
commit 960f4f8a4e60da610af73c1264673f71f5a36efd
Author: Dominique Martinet <asmadeus at codewreck.org>
Date:   Tue Dec 1 16:09:37 2020 +0100

    fs: 9p: add generic splice_write file operation
    
    The default splice operations got removed recently, add it back to 9p
    with iter_file_splice_write like many other filesystems do.
    
    Link: http://lkml.kernel.org/r/1606837496-21717-1-git-send-email-asmadeus@codewreck.org
    Fixes: 36e2c7421f02 ("fs: don't allow splice read/write without explicit ops")
    Signed-off-by: Dominique Martinet <asmadeus at codewreck.org>
    Acked-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index 01026b47018c..be5768949cb1 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -656,6 +656,7 @@ const struct file_operations v9fs_cached_file_operations = {
 	.lock = v9fs_file_lock,
 	.mmap = v9fs_file_mmap,
 	.splice_read = generic_file_splice_read,
+	.splice_write = iter_file_splice_write,
 	.fsync = v9fs_file_fsync,
 };
 
@@ -669,6 +670,7 @@ const struct file_operations v9fs_cached_file_operations_dotl = {
 	.flock = v9fs_file_flock_dotl,
 	.mmap = v9fs_file_mmap,
 	.splice_read = generic_file_splice_read,
+	.splice_write = iter_file_splice_write,
 	.fsync = v9fs_file_fsync_dotl,
 };
 
@@ -681,6 +683,7 @@ const struct file_operations v9fs_file_operations = {
 	.lock = v9fs_file_lock,
 	.mmap = generic_file_readonly_mmap,
 	.splice_read = generic_file_splice_read,
+	.splice_write = iter_file_splice_write,
 	.fsync = v9fs_file_fsync,
 };
 
@@ -694,6 +697,7 @@ const struct file_operations v9fs_file_operations_dotl = {
 	.flock = v9fs_file_flock_dotl,
 	.mmap = generic_file_readonly_mmap,
 	.splice_read = generic_file_splice_read,
+	.splice_write = iter_file_splice_write,
 	.fsync = v9fs_file_fsync_dotl,
 };
 
@@ -706,6 +710,7 @@ const struct file_operations v9fs_mmap_file_operations = {
 	.lock = v9fs_file_lock,
 	.mmap = v9fs_mmap_file_mmap,
 	.splice_read = generic_file_splice_read,
+	.splice_write = iter_file_splice_write,
 	.fsync = v9fs_file_fsync,
 };
 
@@ -719,5 +724,6 @@ const struct file_operations v9fs_mmap_file_operations_dotl = {
 	.flock = v9fs_file_flock_dotl,
 	.mmap = v9fs_mmap_file_mmap,
 	.splice_read = generic_file_splice_read,
+	.splice_write = iter_file_splice_write,
 	.fsync = v9fs_file_fsync_dotl,
 };
commit f43691b59fae581ca83349539c686ecf4a01e42d
Merge: b65054597872 ad89653f79f1
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Dec 1 12:11:09 2020 -0800

    Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
    
    Pull vhost fixes from Michael Tsirkin:
     "A couple of minor fixes"
    
    * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost:
      vhost-vdpa: fix page pinning leakage in error path (rework)
      vringh: fix vringh_iov_push_*() documentation
      vhost scsi: fix lun reset completion handling

commit 14483cbf040fcb38113497161088a1ce8ce5d713
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Sat Nov 28 23:08:43 2020 -0800

    net: broadcom CNIC: requires MMU
    
    The CNIC kconfig symbol selects UIO and UIO depends on MMU.
    Since 'select' does not follow dependency chains, add the same MMU
    dependency to CNIC.
    
    Quietens this kconfig warning:
    
    WARNING: unmet direct dependencies detected for UIO
      Depends on [n]: MMU [=n]
      Selected by [m]:
      - CNIC [=m] && NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_BROADCOM [=y] && PCI [=y] && (IPV6 [=m] || IPV6 [=m]=n)
    
    Fixes: adfc5217e9db ("broadcom: Move the Broadcom drivers")
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
    Cc: Rasesh Mody <rmody at marvell.com>
    Cc: GR-Linux-NIC-Dev at marvell.com
    Cc: "David S. Miller" <davem at davemloft.net>
    Cc: Jakub Kicinski <kuba at kernel.org>
    Cc: netdev at vger.kernel.org
    Link: https://lore.kernel.org/r/20201129070843.3859-1-rdunlap@infradead.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig
index 7fb42f388d59..7b79528d6eed 100644
--- a/drivers/net/ethernet/broadcom/Kconfig
+++ b/drivers/net/ethernet/broadcom/Kconfig
@@ -88,6 +88,7 @@ config BNX2
 config CNIC
 	tristate "QLogic CNIC support"
 	depends on PCI && (IPV6 || IPV6=n)
+	depends on MMU
 	select BNX2
 	select UIO
 	help
commit de7b3f8164cfdf99879ed7ca1d53bace25700929
Merge: 237f977ab920 ba246c175116
Author: David S. Miller <davem at davemloft.net>
Date:   Tue Dec 1 10:09:04 2020 -0800

    Merge branch 'ibmvnic-Bug-fixes-for-queue-descriptor-processing'
    
    Thomas Falcon says:
    
    ====================
    ibmvnic: Bug fixes for queue descriptor processing
    
    This series resolves a few issues in the ibmvnic driver's
    RX buffer and TX completion processing. The first patch
    includes memory barriers to synchronize queue descriptor
    reads. The second patch fixes a memory leak that could
    occur if the device returns a TX completion with an error
    code in the descriptor, in which case the respective socket
    buffer and other relevant data structures may not be freed
    or updated properly.
    
    v3: Correct length of Fixes tags, requested by Jakub Kicinski
    
    v2: Provide more detailed comments explaining specifically what
        reads are being ordered, suggested by Michael Ellerman
    ====================
    
    Signed-off-by: David S. Miller <davem at davemloft.net>

commit ba246c175116e2e8fa4fdfa5f8e958e086a9a818
Author: Thomas Falcon <tlfalcon at linux.ibm.com>
Date:   Tue Dec 1 09:52:11 2020 -0600

    ibmvnic: Fix TX completion error handling
    
    TX completions received with an error return code are not
    being processed properly. When an error code is seen, do not
    proceed to the next completion before cleaning up the existing
    entry's data structures.
    
    Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Thomas Falcon <tlfalcon at linux.ibm.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 0e34c36c3e86..da9450f18717 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -3128,11 +3128,9 @@ restart_loop:
 
 		next = ibmvnic_next_scrq(adapter, scrq);
 		for (i = 0; i < next->tx_comp.num_comps; i++) {
-			if (next->tx_comp.rcs[i]) {
+			if (next->tx_comp.rcs[i])
 				dev_err(dev, "tx error %x\n",
 					next->tx_comp.rcs[i]);
-				continue;
-			}
 			index = be32_to_cpu(next->tx_comp.correlators[i]);
 			if (index & IBMVNIC_TSO_POOL_MASK) {
 				tx_pool = &adapter->tso_pool[pool];
commit b71ec952234610b4f90ef17a2fdcb124d5320070
Author: Thomas Falcon <tlfalcon at linux.ibm.com>
Date:   Tue Dec 1 09:52:10 2020 -0600

    ibmvnic: Ensure that SCRQ entry reads are correctly ordered
    
    Ensure that received Subordinate Command-Response Queue (SCRQ)
    entries are properly read in order by the driver. These queues
    are used in the ibmvnic device to process RX buffer and TX completion
    descriptors. dma_rmb barriers have been added after checking for a
    pending descriptor to ensure the correct descriptor entry is checked
    and after reading the SCRQ descriptor to ensure the entire
    descriptor is read before processing.
    
    Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Thomas Falcon <tlfalcon at linux.ibm.com>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index bca1becd33f0..0e34c36c3e86 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2404,6 +2404,12 @@ restart_poll:
 
 		if (!pending_scrq(adapter, adapter->rx_scrq[scrq_num]))
 			break;
+		/* The queue entry at the current index is peeked at above
+		 * to determine that there is a valid descriptor awaiting
+		 * processing. We want to be sure that the current slot
+		 * holds a valid descriptor before reading its contents.
+		 */
+		dma_rmb();
 		next = ibmvnic_next_scrq(adapter, adapter->rx_scrq[scrq_num]);
 		rx_buff =
 		    (struct ibmvnic_rx_buff *)be64_to_cpu(next->
@@ -3113,6 +3119,13 @@ restart_loop:
 		unsigned int pool = scrq->pool_index;
 		int num_entries = 0;
 
+		/* The queue entry at the current index is peeked at above
+		 * to determine that there is a valid descriptor awaiting
+		 * processing. We want to be sure that the current slot
+		 * holds a valid descriptor before reading its contents.
+		 */
+		dma_rmb();
+
 		next = ibmvnic_next_scrq(adapter, scrq);
 		for (i = 0; i < next->tx_comp.num_comps; i++) {
 			if (next->tx_comp.rcs[i]) {
@@ -3513,6 +3526,11 @@ static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter,
 	}
 	spin_unlock_irqrestore(&scrq->lock, flags);
 
+	/* Ensure that the entire buffer descriptor has been
+	 * loaded before reading its contents
+	 */
+	dma_rmb();
+
 	return entry;
 }
 
commit 7e7986f9d3ba69a7375a41080a1f8c8012cb0923
Author: Mike Snitzer <snitzer at redhat.com>
Date:   Tue Dec 1 11:07:09 2020 -0500

    block: use gcd() to fix chunk_sectors limit stacking
    
    commit 22ada802ede8 ("block: use lcm_not_zero() when stacking
    chunk_sectors") broke chunk_sectors limit stacking. chunk_sectors must
    reflect the most limited of all devices in the IO stack.
    
    Otherwise malformed IO may result. E.g.: prior to this fix,
    ->chunk_sectors = lcm_not_zero(8, 128) would result in
    blk_max_size_offset() splitting IO at 128 sectors rather than the
    required more restrictive 8 sectors.
    
    And since commit 07d098e6bbad ("block: allow 'chunk_sectors' to be
    non-power-of-2") care must be taken to properly stack chunk_sectors to
    be compatible with the possibility that a non-power-of-2 chunk_sectors
    may be stacked. This is why gcd() is used instead of reverting back
    to using min_not_zero().
    
    Fixes: 22ada802ede8 ("block: use lcm_not_zero() when stacking chunk_sectors")
    Fixes: 07d098e6bbad ("block: allow 'chunk_sectors' to be non-power-of-2")
    Reported-by: John Dorminy <jdorminy at redhat.com>
    Reported-by: Bruce Johnston <bjohnsto at redhat.com>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>
    Reviewed-by: John Dorminy <jdorminy at redhat.com>
    Cc: stable at vger.kernel.org
    Reviewed-by: Martin K. Petersen <martin.petersen at oracle.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/block/blk-settings.c b/block/blk-settings.c
index 9741d1d83e98..659cdb8a07fe 100644
--- a/block/blk-settings.c
+++ b/block/blk-settings.c
@@ -547,7 +547,10 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
 
 	t->io_min = max(t->io_min, b->io_min);
 	t->io_opt = lcm_not_zero(t->io_opt, b->io_opt);
-	t->chunk_sectors = lcm_not_zero(t->chunk_sectors, b->chunk_sectors);
+
+	/* Set non-power-of-2 compatible chunk_sectors boundary */
+	if (b->chunk_sectors)
+		t->chunk_sectors = gcd(t->chunk_sectors, b->chunk_sectors);
 
 	/* Physical block size a multiple of the logical block size? */
 	if (t->physical_block_size & (t->logical_block_size - 1)) {
commit 8c3b55a299c325830a987de21dab6a89ecb71164
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Dec 1 09:55:29 2020 -0800

    Input: atmel_mxt_ts - fix lost interrupts
    
    After commit 74d905d2d38a devices requiring the workaround for edge
    triggered interrupts stopped working.
    
    The hardware needs the quirk to be used before even proceeding to
    check if the quirk is needed because mxt_acquire_irq() is called
    before mxt_check_retrigen() is called and at this point pending IRQs
    need to be checked, and if the workaround is not active, all
    interrupts will be lost from this point.
    
    Solve this by switching the calls around.
    
    Reported-by: Andre Müller <andre.muller at web.de>
    Tested-by: Andre Müller <andre.muller at web.de>
    Suggested-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>
    Fixes: 74d905d2d38a ("Input: atmel_mxt_ts - only read messages in mxt_acquire_irq() when necessary")
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201201123026.1416743-1-linus.walleij@linaro.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 6b71b0aff115..99a33cd5e675 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -2183,11 +2183,11 @@ static int mxt_initialize(struct mxt_data *data)
 		msleep(MXT_FW_RESET_TIME);
 	}
 
-	error = mxt_acquire_irq(data);
+	error = mxt_check_retrigen(data);
 	if (error)
 		return error;
 
-	error = mxt_check_retrigen(data);
+	error = mxt_acquire_irq(data);
 	if (error)
 		return error;
 
commit 1a16af33ba88ef25e206a13366379179cae79d23
Author: David Gow <davidgow at google.com>
Date:   Sat Nov 21 16:15:49 2020 -0800

    fpga: Specify HAS_IOMEM dependency for FPGA_DFL
    
    Because dfl.c uses the 'devm_ioremap', 'devm_iounmap',
    'devm_ioremap_resource', and 'devm_platform_ioremap_resource'
    functions, it should depend on HAS_IOMEM.
    
    This fixes make allyesconfig under UML (ARCH=um), which doesn't provide
    HAS_IOMEM.
    
    [mdf at kernel.org: Removed "drivers: " in commit message]
    Fixes: 89eb35e810a8 ("fpga: dfl: map feature mmio resources in their own feature drivers")
    Signed-off-by: David Gow <davidgow at google.com>
    Signed-off-by: Moritz Fischer <mdf at kernel.org>
    Link: https://lore.kernel.org/r/20201122001549.107023-2-mdf@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig
index 7cd5a29fc437..5645226ca3ce 100644
--- a/drivers/fpga/Kconfig
+++ b/drivers/fpga/Kconfig
@@ -142,6 +142,7 @@ config FPGA_DFL
 	tristate "FPGA Device Feature List (DFL) support"
 	select FPGA_BRIDGE
 	select FPGA_REGION
+	depends on HAS_IOMEM
 	help
 	  Device Feature List (DFL) defines a feature list structure that
 	  creates a linked list of feature headers within the MMIO space
commit cf03f316ad20dac16b5adae3f6dedd7d188c7f65
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Tue Dec 1 14:54:09 2020 +0100

    fs: 9p: add generic splice_read file operations
    
    The v9fs file operations were missing the splice_read operations, which
    breaks sendfile() of files on such a filesystem. I discovered this while
    trying to load an eBPF program using iproute2 inside a 'virtme' environment
    which uses 9pfs for the virtual file system. iproute2 relies on sendfile()
    with an AF_ALG socket to hash files, which was erroring out in the virtual
    environment.
    
    Since generic_file_splice_read() seems to just implement splice_read in
    terms of the read_iter operation, I simply added the generic implementation
    to the file operations, which fixed the error I was seeing. A quick grep
    indicates that this is what most other file systems do as well.
    
    Link: http://lkml.kernel.org/r/20201201135409.55510-1-toke@redhat.com
    Fixes: 36e2c7421f02 ("fs: don't allow splice read/write without explicit ops")
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Dominique Martinet <asmadeus at codewreck.org>

diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index b177fd3b1eb3..01026b47018c 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -655,6 +655,7 @@ const struct file_operations v9fs_cached_file_operations = {
 	.release = v9fs_dir_release,
 	.lock = v9fs_file_lock,
 	.mmap = v9fs_file_mmap,
+	.splice_read = generic_file_splice_read,
 	.fsync = v9fs_file_fsync,
 };
 
@@ -667,6 +668,7 @@ const struct file_operations v9fs_cached_file_operations_dotl = {
 	.lock = v9fs_file_lock_dotl,
 	.flock = v9fs_file_flock_dotl,
 	.mmap = v9fs_file_mmap,
+	.splice_read = generic_file_splice_read,
 	.fsync = v9fs_file_fsync_dotl,
 };
 
@@ -678,6 +680,7 @@ const struct file_operations v9fs_file_operations = {
 	.release = v9fs_dir_release,
 	.lock = v9fs_file_lock,
 	.mmap = generic_file_readonly_mmap,
+	.splice_read = generic_file_splice_read,
 	.fsync = v9fs_file_fsync,
 };
 
@@ -690,6 +693,7 @@ const struct file_operations v9fs_file_operations_dotl = {
 	.lock = v9fs_file_lock_dotl,
 	.flock = v9fs_file_flock_dotl,
 	.mmap = generic_file_readonly_mmap,
+	.splice_read = generic_file_splice_read,
 	.fsync = v9fs_file_fsync_dotl,
 };
 
@@ -701,6 +705,7 @@ const struct file_operations v9fs_mmap_file_operations = {
 	.release = v9fs_dir_release,
 	.lock = v9fs_file_lock,
 	.mmap = v9fs_mmap_file_mmap,
+	.splice_read = generic_file_splice_read,
 	.fsync = v9fs_file_fsync,
 };
 
@@ -713,5 +718,6 @@ const struct file_operations v9fs_mmap_file_operations_dotl = {
 	.lock = v9fs_file_lock_dotl,
 	.flock = v9fs_file_flock_dotl,
 	.mmap = v9fs_mmap_file_mmap,
+	.splice_read = generic_file_splice_read,
 	.fsync = v9fs_file_fsync_dotl,
 };
commit fae3a13d2a3d49a89391889808428cf1e72afbd7
Author: Babu Moger <babu.moger at amd.com>
Date:   Mon Nov 30 09:57:20 2020 -0600

    x86/resctrl: Fix AMD L3 QOS CDP enable/disable
    
    When the AMD QoS feature CDP (code and data prioritization) is enabled
    or disabled, the CDP bit in MSR 0000_0C81 is written on one of the CPUs
    in an L3 domain (core complex). That is not correct - the CDP bit needs
    to be updated on all the logical CPUs in the domain.
    
    This was not spelled out clearly in the spec earlier. The specification
    has been updated and the updated document, "AMD64 Technology Platform
    Quality of Service Extensions Publication # 56375 Revision: 1.02 Issue
    Date: October 2020" is available now. Refer the section: Code and Data
    Prioritization.
    
    Fix the issue by adding a new flag arch_has_per_cpu_cfg in rdt_cache
    data structure.
    
    The documentation can be obtained at:
    https://developer.amd.com/wp-content/resources/56375.pdf
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537
    
     [ bp: Massage commit message. ]
    
    Fixes: 4d05bf71f157 ("x86/resctrl: Introduce AMD QOS feature")
    Signed-off-by: Babu Moger <babu.moger at amd.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Reinette Chatre <reinette.chatre at intel.com>
    Link: https://lkml.kernel.org/r/160675180380.15628.3309402017215002347.stgit@bmoger-ubuntu

diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
index e5f4ee8f4c3b..e8b5f1cf1ae8 100644
--- a/arch/x86/kernel/cpu/resctrl/core.c
+++ b/arch/x86/kernel/cpu/resctrl/core.c
@@ -570,6 +570,8 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r)
 
 	if (d) {
 		cpumask_set_cpu(cpu, &d->cpu_mask);
+		if (r->cache.arch_has_per_cpu_cfg)
+			rdt_domain_reconfigure_cdp(r);
 		return;
 	}
 
@@ -923,6 +925,7 @@ static __init void rdt_init_res_defs_intel(void)
 		    r->rid == RDT_RESOURCE_L2CODE) {
 			r->cache.arch_has_sparse_bitmaps = false;
 			r->cache.arch_has_empty_bitmaps = false;
+			r->cache.arch_has_per_cpu_cfg = false;
 		} else if (r->rid == RDT_RESOURCE_MBA) {
 			r->msr_base = MSR_IA32_MBA_THRTL_BASE;
 			r->msr_update = mba_wrmsr_intel;
@@ -943,6 +946,7 @@ static __init void rdt_init_res_defs_amd(void)
 		    r->rid == RDT_RESOURCE_L2CODE) {
 			r->cache.arch_has_sparse_bitmaps = true;
 			r->cache.arch_has_empty_bitmaps = true;
+			r->cache.arch_has_per_cpu_cfg = true;
 		} else if (r->rid == RDT_RESOURCE_MBA) {
 			r->msr_base = MSR_IA32_MBA_BW_BASE;
 			r->msr_update = mba_wrmsr_amd;
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
index 80fa997fae60..f65d3c0dbc41 100644
--- a/arch/x86/kernel/cpu/resctrl/internal.h
+++ b/arch/x86/kernel/cpu/resctrl/internal.h
@@ -360,6 +360,8 @@ struct msr_param {
  *			executing entities
  * @arch_has_sparse_bitmaps:	True if a bitmap like f00f is valid.
  * @arch_has_empty_bitmaps:	True if the '0' bitmap is valid.
+ * @arch_has_per_cpu_cfg:	True if QOS_CFG register for this cache
+ *				level has CPU scope.
  */
 struct rdt_cache {
 	unsigned int	cbm_len;
@@ -369,6 +371,7 @@ struct rdt_cache {
 	unsigned int	shareable_bits;
 	bool		arch_has_sparse_bitmaps;
 	bool		arch_has_empty_bitmaps;
+	bool		arch_has_per_cpu_cfg;
 };
 
 /**
diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index 6f4ca4bea625..f3418428682b 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -1909,8 +1909,13 @@ static int set_cache_qos_cfg(int level, bool enable)
 
 	r_l = &rdt_resources_all[level];
 	list_for_each_entry(d, &r_l->domains, list) {
-		/* Pick one CPU from each domain instance to update MSR */
-		cpumask_set_cpu(cpumask_any(&d->cpu_mask), cpu_mask);
+		if (r_l->cache.arch_has_per_cpu_cfg)
+			/* Pick all the CPUs in the domain instance */
+			for_each_cpu(cpu, &d->cpu_mask)
+				cpumask_set_cpu(cpu, cpu_mask);
+		else
+			/* Pick one CPU from each domain instance to update MSR */
+			cpumask_set_cpu(cpumask_any(&d->cpu_mask), cpu_mask);
 	}
 	cpu = get_cpu();
 	/* Update QOS_CFG MSR on this cpu if it's in cpu_mask. */
commit 45ba1c0ba3e589ad3ef0d0603c822eb27ea16563
Author: Hans Verkuil <hverkuil-cisco at xs4all.nl>
Date:   Fri Nov 27 12:52:30 2020 +0100

    media: pulse8-cec: add support for FW v10 and up
    
    Starting with firmware version 10 the GET/SET_HDMI_VERSION message
    was removed and GET/SET_AUTO_POWER_ON was added.
    
    The removal of GET/SET_HDMI_VERSION caused the probe of the
    Pulse-Eight to fail. Add a version check to handle this gracefully.
    
    Also show (but do not set) the Auto Power On value.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Reported-by: Maxime Ripard <mripard at kernel.org>
    Tested-by: Maxime Ripard <mripard at kernel.org>
    Cc: <stable at vger.kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/cec/usb/pulse8/pulse8-cec.c b/drivers/media/cec/usb/pulse8/pulse8-cec.c
index 5d3a3f775bc8..04b13cdc38d2 100644
--- a/drivers/media/cec/usb/pulse8/pulse8-cec.c
+++ b/drivers/media/cec/usb/pulse8/pulse8-cec.c
@@ -88,13 +88,15 @@ enum pulse8_msgcodes {
 	MSGCODE_SET_PHYSICAL_ADDRESS,	/* 0x20 */
 	MSGCODE_GET_DEVICE_TYPE,
 	MSGCODE_SET_DEVICE_TYPE,
-	MSGCODE_GET_HDMI_VERSION,
+	MSGCODE_GET_HDMI_VERSION,	/* Removed in FW >= 10 */
 	MSGCODE_SET_HDMI_VERSION,
 	MSGCODE_GET_OSD_NAME,
 	MSGCODE_SET_OSD_NAME,
 	MSGCODE_WRITE_EEPROM,
 	MSGCODE_GET_ADAPTER_TYPE,	/* 0x28 */
 	MSGCODE_SET_ACTIVE_SOURCE,
+	MSGCODE_GET_AUTO_POWER_ON,	/* New for FW >= 10 */
+	MSGCODE_SET_AUTO_POWER_ON,
 
 	MSGCODE_FRAME_EOM = 0x80,
 	MSGCODE_FRAME_ACK = 0x40,
@@ -143,6 +145,8 @@ static const char * const pulse8_msgnames[] = {
 	"WRITE_EEPROM",
 	"GET_ADAPTER_TYPE",
 	"SET_ACTIVE_SOURCE",
+	"GET_AUTO_POWER_ON",
+	"SET_AUTO_POWER_ON",
 };
 
 static const char *pulse8_msgname(u8 cmd)
@@ -579,12 +583,14 @@ static int pulse8_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
 	if (err)
 		goto unlock;
 
-	cmd[0] = MSGCODE_SET_HDMI_VERSION;
-	cmd[1] = adap->log_addrs.cec_version;
-	err = pulse8_send_and_wait(pulse8, cmd, 2,
-				   MSGCODE_COMMAND_ACCEPTED, 0);
-	if (err)
-		goto unlock;
+	if (pulse8->vers < 10) {
+		cmd[0] = MSGCODE_SET_HDMI_VERSION;
+		cmd[1] = adap->log_addrs.cec_version;
+		err = pulse8_send_and_wait(pulse8, cmd, 2,
+					   MSGCODE_COMMAND_ACCEPTED, 0);
+		if (err)
+			goto unlock;
+	}
 
 	if (adap->log_addrs.osd_name[0]) {
 		size_t osd_len = strlen(adap->log_addrs.osd_name);
@@ -691,6 +697,14 @@ static int pulse8_setup(struct pulse8 *pulse8, struct serio *serio,
 	dev_dbg(pulse8->dev, "Autonomous mode: %s",
 		data[0] ? "on" : "off");
 
+	if (pulse8->vers >= 10) {
+		cmd[0] = MSGCODE_GET_AUTO_POWER_ON;
+		err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
+		if (!err)
+			dev_dbg(pulse8->dev, "Auto Power On: %s",
+				data[0] ? "on" : "off");
+	}
+
 	cmd[0] = MSGCODE_GET_DEVICE_TYPE;
 	err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
 	if (err)
@@ -752,12 +766,15 @@ static int pulse8_setup(struct pulse8 *pulse8, struct serio *serio,
 	dev_dbg(pulse8->dev, "Physical address: %x.%x.%x.%x\n",
 		cec_phys_addr_exp(*pa));
 
-	cmd[0] = MSGCODE_GET_HDMI_VERSION;
-	err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
-	if (err)
-		return err;
-	log_addrs->cec_version = data[0];
-	dev_dbg(pulse8->dev, "CEC version: %d\n", log_addrs->cec_version);
+	log_addrs->cec_version = CEC_OP_CEC_VERSION_1_4;
+	if (pulse8->vers < 10) {
+		cmd[0] = MSGCODE_GET_HDMI_VERSION;
+		err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
+		if (err)
+			return err;
+		log_addrs->cec_version = data[0];
+		dev_dbg(pulse8->dev, "CEC version: %d\n", log_addrs->cec_version);
+	}
 
 	cmd[0] = MSGCODE_GET_OSD_NAME;
 	err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 0);
commit 024e01dead12c2b9fbe31216f2099401ebb78a4a
Author: Hans Verkuil <hverkuil-cisco at xs4all.nl>
Date:   Fri Nov 27 10:36:32 2020 +0100

    media: pulse8-cec: fix duplicate free at disconnect or probe error
    
    Commit 601282d65b96 ("media: pulse8-cec: use adap_free callback") used
    the adap_free callback to clean up on disconnect. What I forgot was that
    in the probe it will call cec_delete_adapter() followed by kfree(pulse8)
    if an error occurs. But by using the adap_free callback,
    cec_delete_adapter() is already freeing the pulse8 struct.
    
    This wasn't noticed since normally the probe works fine, but Pulse-Eight
    published a new firmware version that caused a probe error, so now it
    hits this bug. This affects firmware version 12, but probably any
    version >= 10.
    
    Commit aa9eda76129c ("media: pulse8-cec: close serio in disconnect, not
    adap_free") made this worse by adding the line 'pulse8->serio = NULL'
    right after the call to cec_unregister_adapter in the disconnect()
    function. Unfortunately, cec_unregister_adapter will typically call
    cec_delete_adapter (unless a filehandle to the cec device is still
    open), which frees the pulse8 struct. So now it will also crash on a
    simple unplug of the Pulse-Eight device.
    
    With this fix both the unplug issue and a probe() error situation are
    handled correctly again.
    
    It will still fail to probe() with a v12 firmware, that's something
    to look at separately.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Reported-by: Maxime Ripard <mripard at kernel.org>
    Tested-by: Maxime Ripard <mripard at kernel.org>
    Fixes: aa9eda76129c ("media: pulse8-cec: close serio in disconnect, not adap_free")
    Fixes: 601282d65b96 ("media: pulse8-cec: use adap_free callback")
    Cc: <stable at vger.kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/cec/usb/pulse8/pulse8-cec.c b/drivers/media/cec/usb/pulse8/pulse8-cec.c
index e4d8446b87da..5d3a3f775bc8 100644
--- a/drivers/media/cec/usb/pulse8/pulse8-cec.c
+++ b/drivers/media/cec/usb/pulse8/pulse8-cec.c
@@ -650,7 +650,6 @@ static void pulse8_disconnect(struct serio *serio)
 	struct pulse8 *pulse8 = serio_get_drvdata(serio);
 
 	cec_unregister_adapter(pulse8->adap);
-	pulse8->serio = NULL;
 	serio_set_drvdata(serio, NULL);
 	serio_close(serio);
 }
@@ -830,8 +829,10 @@ static int pulse8_connect(struct serio *serio, struct serio_driver *drv)
 	pulse8->adap = cec_allocate_adapter(&pulse8_cec_adap_ops, pulse8,
 					    dev_name(&serio->dev), caps, 1);
 	err = PTR_ERR_OR_ZERO(pulse8->adap);
-	if (err < 0)
-		goto free_device;
+	if (err < 0) {
+		kfree(pulse8);
+		return err;
+	}
 
 	pulse8->dev = &serio->dev;
 	serio_set_drvdata(serio, pulse8);
@@ -874,8 +875,6 @@ close_serio:
 	serio_close(serio);
 delete_adap:
 	cec_delete_adapter(pulse8->adap);
-free_device:
-	kfree(pulse8);
 	return err;
 }
 
commit d904eb0b351fe5545d9ba5b85844342f49025923
Author: Sean Young <sean at mess.org>
Date:   Sun Nov 29 18:01:26 2020 +0100

    media: mtk-cir: fix calculation of chk period
    
    Since commit 528222d853f9 ("media: rc: harmonize infrared durations to
    microseconds"), the calculation of the chk period is wrong. As a result,
    all reported IR will have incorrect timings.
    
    Now that the calculations are done in microseconds rather than nanoseconds,
    we can fold the calculations in a simpler form with less rounding error.
    
    Tested-by: Frank Wunderlich <frank-w at public-files.de>
    Fixes: 528222d853f9 ("media: rc: harmonize infrared durations to microseconds")
    Signed-off-by: Sean Young <sean at mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/rc/mtk-cir.c b/drivers/media/rc/mtk-cir.c
index 5051a5e5244b..65a136c0fac2 100644
--- a/drivers/media/rc/mtk-cir.c
+++ b/drivers/media/rc/mtk-cir.c
@@ -151,15 +151,12 @@ static inline u32 mtk_chk_period(struct mtk_ir *ir)
 {
 	u32 val;
 
-	/* Period of raw software sampling in ns */
-	val = DIV_ROUND_CLOSEST(1000000000ul,
-				clk_get_rate(ir->bus) / ir->data->div);
-
 	/*
 	 * Period for software decoder used in the
 	 * unit of raw software sampling
 	 */
-	val = DIV_ROUND_CLOSEST(MTK_IR_SAMPLE, val);
+	val = DIV_ROUND_CLOSEST(clk_get_rate(ir->bus),
+				USEC_PER_SEC * ir->data->div / MTK_IR_SAMPLE);
 
 	dev_dbg(ir->dev, "@pwm clk  = \t%lu\n",
 		clk_get_rate(ir->bus) / ir->data->div);
@@ -412,7 +409,7 @@ static int mtk_ir_probe(struct platform_device *pdev)
 	mtk_irq_enable(ir, MTK_IRINT_EN);
 
 	dev_info(dev, "Initialized MT7623 IR driver, sample period = %dus\n",
-		 DIV_ROUND_CLOSEST(MTK_IR_SAMPLE, 1000));
+		 MTK_IR_SAMPLE);
 
 	return 0;
 
commit d5750cd3c5486e9c0fa11100df01de8ca0c13fa7
Author: Nathan Chancellor <natechancellor at gmail.com>
Date:   Thu Nov 19 13:46:58 2020 -0700

    kbuild: Disable CONFIG_LD_ORPHAN_WARN for ld.lld 10.0.1
    
    ld.lld 10.0.1 spews a bunch of various warnings about .rela sections,
    along with a few others. Newer versions of ld.lld do not have these
    warnings. As a result, do not add '--orphan-handling=warn' to
    LDFLAGS_vmlinux if ld.lld's version is not new enough.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1187
    Link: https://github.com/ClangBuiltLinux/linux/issues/1193
    Reported-by: Arvind Sankar <nivedita at alum.mit.edu>
    Reported-by: kernelci.org bot <bot at kernelci.org>
    Reported-by: Mark Brown <broonie at kernel.org>
    Reviewed-by: Kees Cook <keescook at chromium.org>
    Signed-off-by: Nathan Chancellor <natechancellor at gmail.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index a008b70f3c16..286ed8e6b924 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4274,6 +4274,7 @@ B:	https://github.com/ClangBuiltLinux/linux/issues
 C:	irc://chat.freenode.net/clangbuiltlinux
 F:	Documentation/kbuild/llvm.rst
 F:	scripts/clang-tools/
+F:	scripts/lld-version.sh
 K:	\b(?i:clang|llvm)\b
 
 CLEANCACHE API
diff --git a/init/Kconfig b/init/Kconfig
index 92c58b45abb8..b9037d6c5ab3 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -47,6 +47,10 @@ config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
 
+config LLD_VERSION
+	int
+	default $(shell,$(srctree)/scripts/lld-version.sh $(LD))
+
 config CC_CAN_LINK
 	bool
 	default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT
@@ -1351,6 +1355,7 @@ config LD_DEAD_CODE_DATA_ELIMINATION
 config LD_ORPHAN_WARN
 	def_bool y
 	depends on ARCH_WANT_LD_ORPHAN_WARN
+	depends on !LD_IS_LLD || LLD_VERSION >= 110000
 	depends on $(ld-option,--orphan-handling=warn)
 
 config SYSCTL
diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh
new file mode 100755
index 000000000000..d70edb4d8a4f
--- /dev/null
+++ b/scripts/lld-version.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+#
+# Usage: $ ./scripts/lld-version.sh ld.lld
+#
+# Print the linker version of `ld.lld' in a 5 or 6-digit form
+# such as `100001' for ld.lld 10.0.1 etc.
+
+linker_string="$($* --version)"
+
+if ! ( echo $linker_string | grep -q LLD ); then
+	echo 0
+	exit 1
+fi
+
+VERSION=$(echo $linker_string | cut -d ' ' -f 2)
+MAJOR=$(echo $VERSION | cut -d . -f 1)
+MINOR=$(echo $VERSION | cut -d . -f 2)
+PATCHLEVEL=$(echo $VERSION | cut -d . -f 3)
+printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
commit 59612b24f78a0b61fe078ec9dff2e48e9cec52c0
Author: Nathan Chancellor <natechancellor at gmail.com>
Date:   Thu Nov 19 13:46:56 2020 -0700

    kbuild: Hoist '--orphan-handling' into Kconfig
    
    Currently, '--orphan-handling=warn' is spread out across four different
    architectures in their respective Makefiles, which makes it a little
    unruly to deal with in case it needs to be disabled for a specific
    linker version (in this case, ld.lld 10.0.1).
    
    To make it easier to control this, hoist this warning into Kconfig and
    the main Makefile so that disabling it is simpler, as the warning will
    only be enabled in a couple places (main Makefile and a couple of
    compressed boot folders that blow away LDFLAGS_vmlinx) and making it
    conditional is easier due to Kconfig syntax. One small additional
    benefit of this is saving a call to ld-option on incremental builds
    because we will have already evaluated it for CONFIG_LD_ORPHAN_WARN.
    
    To keep the list of supported architectures the same, introduce
    CONFIG_ARCH_WANT_LD_ORPHAN_WARN, which an architecture can select to
    gain this automatically after all of the sections are specified and size
    asserted. A special thanks to Kees Cook for the help text on this
    config.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1187
    Acked-by: Kees Cook <keescook at chromium.org>
    Acked-by: Michael Ellerman <mpe at ellerman.id.au> (powerpc)
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Tested-by: Nick Desaulniers <ndesaulniers at google.com>
    Signed-off-by: Nathan Chancellor <natechancellor at gmail.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/Makefile b/Makefile
index ae1592c1f5d6..8327725e5d76 100644
--- a/Makefile
+++ b/Makefile
@@ -986,6 +986,12 @@ ifeq ($(CONFIG_RELR),y)
 LDFLAGS_vmlinux	+= --pack-dyn-relocs=relr
 endif
 
+# We never want expected sections to be placed heuristically by the
+# linker. All sections should be explicitly named in the linker script.
+ifdef CONFIG_LD_ORPHAN_WARN
+LDFLAGS_vmlinux += --orphan-handling=warn
+endif
+
 # Align the bit size of userspace programs with the kernel
 KBUILD_USERCFLAGS  += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
 KBUILD_USERLDFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
diff --git a/arch/Kconfig b/arch/Kconfig
index 56b6ccc0e32d..ba4e966484ab 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -1028,6 +1028,15 @@ config HAVE_STATIC_CALL_INLINE
 	bool
 	depends on HAVE_STATIC_CALL
 
+config ARCH_WANT_LD_ORPHAN_WARN
+	bool
+	help
+	  An arch should select this symbol once all linker sections are explicitly
+	  included, size-asserted, or discarded in the linker scripts. This is
+	  important because we never want expected sections to be placed heuristically
+	  by the linker, since the locations of such sections can change between linker
+	  versions.
+
 source "kernel/gcov/Kconfig"
 
 source "scripts/gcc-plugins/Kconfig"
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index fe2f17eb2b50..002e0cf025f5 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -35,6 +35,7 @@ config ARM
 	select ARCH_USE_CMPXCHG_LOCKREF
 	select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
 	select ARCH_WANT_IPC_PARSE_VERSION
+	select ARCH_WANT_LD_ORPHAN_WARN
 	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 	select BUILDTIME_TABLE_SORT if MMU
 	select CLONE_BACKWARDS
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 4d76eab2b22d..e15f76ca2887 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -16,10 +16,6 @@ LDFLAGS_vmlinux	+= --be8
 KBUILD_LDFLAGS_MODULE	+= --be8
 endif
 
-# We never want expected sections to be placed heuristically by the
-# linker. All sections should be explicitly named in the linker script.
-LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
-
 GZFLAGS		:=-9
 #KBUILD_CFLAGS	+=-pipe
 
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 47f001ca5499..e1567418a2b1 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -129,7 +129,9 @@ LDFLAGS_vmlinux += --no-undefined
 # Delete all temporary local symbols
 LDFLAGS_vmlinux += -X
 # Report orphan sections
-LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
+ifdef CONFIG_LD_ORPHAN_WARN
+LDFLAGS_vmlinux += --orphan-handling=warn
+endif
 # Next argument is a linker script
 LDFLAGS_vmlinux += -T
 
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 1515f6f153a0..a6b5b7ef40ae 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -81,6 +81,7 @@ config ARM64
 	select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
 	select ARCH_WANT_FRAME_POINTERS
 	select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
+	select ARCH_WANT_LD_ORPHAN_WARN
 	select ARCH_HAS_UBSAN_SANITIZE_ALL
 	select ARM_AMBA
 	select ARM_ARCH_TIMER
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 5789c2d18d43..6a87d592bd00 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -28,10 +28,6 @@ LDFLAGS_vmlinux	+= --fix-cortex-a53-843419
   endif
 endif
 
-# We never want expected sections to be placed heuristically by the
-# linker. All sections should be explicitly named in the linker script.
-LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
-
 ifeq ($(CONFIG_ARM64_USE_LSE_ATOMICS), y)
   ifneq ($(CONFIG_ARM64_LSE_ATOMICS), y)
 $(warning LSE atomics not supported by binutils)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index e9f13fe08492..5181872f9452 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -152,6 +152,7 @@ config PPC
 	select ARCH_USE_QUEUED_SPINLOCKS	if PPC_QUEUED_SPINLOCKS
 	select ARCH_WANT_IPC_PARSE_VERSION
 	select ARCH_WANT_IRQS_OFF_ACTIVATE_MM
+	select ARCH_WANT_LD_ORPHAN_WARN
 	select ARCH_WEAK_RELEASE_ACQUIRE
 	select BINFMT_ELF
 	select BUILDTIME_TABLE_SORT
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index a4d56f0a41d9..d9eb0da845e1 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -123,7 +123,6 @@ endif
 LDFLAGS_vmlinux-y := -Bstatic
 LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie
 LDFLAGS_vmlinux	:= $(LDFLAGS_vmlinux-y)
-LDFLAGS_vmlinux += $(call ld-option,--orphan-handling=warn)
 
 ifdef CONFIG_PPC64
 ifeq ($(call cc-option-yn,-mcmodel=medium),y)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f6946b81f74a..fbf26e0f7a6a 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -100,6 +100,7 @@ config X86
 	select ARCH_WANT_DEFAULT_BPF_JIT	if X86_64
 	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
 	select ARCH_WANT_HUGE_PMD_SHARE
+	select ARCH_WANT_LD_ORPHAN_WARN
 	select ARCH_WANTS_THP_SWAP		if X86_64
 	select BUILDTIME_TABLE_SORT
 	select CLKEVT_I8253
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 154259f18b8b..1bf21746f4ce 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -209,9 +209,6 @@ ifdef CONFIG_X86_64
 LDFLAGS_vmlinux += -z max-page-size=0x200000
 endif
 
-# We never want expected sections to be placed heuristically by the
-# linker. All sections should be explicitly named in the linker script.
-LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
 
 archscripts: scripts_basic
 	$(Q)$(MAKE) $(build)=arch/x86/tools relocs
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
index ee249088cbfe..40b8fd375d52 100644
--- a/arch/x86/boot/compressed/Makefile
+++ b/arch/x86/boot/compressed/Makefile
@@ -61,7 +61,9 @@ KBUILD_LDFLAGS += $(call ld-option,--no-ld-generated-unwind-info)
 # Compressed kernel should be built as PIE since it may be loaded at any
 # address by the bootloader.
 LDFLAGS_vmlinux := -pie $(call ld-option, --no-dynamic-linker)
-LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
+ifdef CONFIG_LD_ORPHAN_WARN
+LDFLAGS_vmlinux += --orphan-handling=warn
+endif
 LDFLAGS_vmlinux += -T
 
 hostprogs	:= mkpiggy
diff --git a/init/Kconfig b/init/Kconfig
index c9446911cf41..92c58b45abb8 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1348,6 +1348,11 @@ config LD_DEAD_CODE_DATA_ELIMINATION
 	  present. This option is not well tested yet, so use at your
 	  own risk.
 
+config LD_ORPHAN_WARN
+	def_bool y
+	depends on ARCH_WANT_LD_ORPHAN_WARN
+	depends on $(ld-option,--orphan-handling=warn)
+
 config SYSCTL
 	bool
 
commit f54db39fbe40731c40aefdd3bc26e7d56d668c64
Author: Greg Kurz <groug at kaod.org>
Date:   Mon Nov 30 13:19:27 2020 +0100

    KVM: PPC: Book3S HV: XIVE: Fix vCPU id sanity check
    
    Commit 062cfab7069f ("KVM: PPC: Book3S HV: XIVE: Make VP block size
    configurable") updated kvmppc_xive_vcpu_id_valid() in a way that
    allows userspace to trigger an assertion in skiboot and crash the host:
    
    [  696.186248988,3] XIVE[ IC 08  ] eq_blk != vp_blk (0 vs. 1) for target 0x4300008c/0
    [  696.186314757,0] Assert fail: hw/xive.c:2370:0
    [  696.186342458,0] Aborting!
    xive-kvCPU 0043 Backtrace:
     S: 0000000031e2b8f0 R: 0000000030013840   .backtrace+0x48
     S: 0000000031e2b990 R: 000000003001b2d0   ._abort+0x4c
     S: 0000000031e2ba10 R: 000000003001b34c   .assert_fail+0x34
     S: 0000000031e2ba90 R: 0000000030058984   .xive_eq_for_target.part.20+0xb0
     S: 0000000031e2bb40 R: 0000000030059fdc   .xive_setup_silent_gather+0x2c
     S: 0000000031e2bc20 R: 000000003005a334   .opal_xive_set_vp_info+0x124
     S: 0000000031e2bd20 R: 00000000300051a4   opal_entry+0x134
     --- OPAL call token: 0x8a caller R1: 0xc000001f28563850 ---
    
    XIVE maintains the interrupt context state of non-dispatched vCPUs in
    an internal VP structure. We allocate a bunch of those on startup to
    accommodate all possible vCPUs. Each VP has an id, that we derive from
    the vCPU id for efficiency:
    
    static inline u32 kvmppc_xive_vp(struct kvmppc_xive *xive, u32 server)
    {
            return xive->vp_base + kvmppc_pack_vcpu_id(xive->kvm, server);
    }
    
    The KVM XIVE device used to allocate KVM_MAX_VCPUS VPs. This was
    limitting the number of concurrent VMs because the VP space is
    limited on the HW. Since most of the time, VMs run with a lot less
    vCPUs, commit 062cfab7069f ("KVM: PPC: Book3S HV: XIVE: Make VP
    block size configurable") gave the possibility for userspace to
    tune the size of the VP block through the KVM_DEV_XIVE_NR_SERVERS
    attribute.
    
    The check in kvmppc_pack_vcpu_id() was changed from
    
            cpu < KVM_MAX_VCPUS * xive->kvm->arch.emul_smt_mode
    
    to
    
            cpu < xive->nr_servers * xive->kvm->arch.emul_smt_mode
    
    The previous check was based on the fact that the VP block had
    KVM_MAX_VCPUS entries and that kvmppc_pack_vcpu_id() guarantees
    that packed vCPU ids are below KVM_MAX_VCPUS. We've changed the
    size of the VP block, but kvmppc_pack_vcpu_id() has nothing to
    do with it and it certainly doesn't ensure that the packed vCPU
    ids are below xive->nr_servers. kvmppc_xive_vcpu_id_valid() might
    thus return true when the VM was configured with a non-standard
    VSMT mode, even if the packed vCPU id is higher than what we
    expect. We end up using an unallocated VP id, which confuses
    OPAL. The assert in OPAL is probably abusive and should be
    converted to a regular error that the kernel can handle, but
    we shouldn't really use broken VP ids in the first place.
    
    Fix kvmppc_xive_vcpu_id_valid() so that it checks the packed
    vCPU id is below xive->nr_servers, which is explicitly what we
    want.
    
    Fixes: 062cfab7069f ("KVM: PPC: Book3S HV: XIVE: Make VP block size configurable")
    Cc: stable at vger.kernel.org # v5.5+
    Signed-off-by: Greg Kurz <groug at kaod.org>
    Reviewed-by: Cédric Le Goater <clg at kaod.org>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/160673876747.695514.1809676603724514920.stgit@bahia.lan

diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index 85215e79db42..a0ebc29f30b2 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -1214,12 +1214,9 @@ void kvmppc_xive_cleanup_vcpu(struct kvm_vcpu *vcpu)
 static bool kvmppc_xive_vcpu_id_valid(struct kvmppc_xive *xive, u32 cpu)
 {
 	/* We have a block of xive->nr_servers VPs. We just need to check
-	 * raw vCPU ids are below the expected limit for this guest's
-	 * core stride ; kvmppc_pack_vcpu_id() will pack them down to an
-	 * index that can be safely used to compute a VP id that belongs
-	 * to the VP block.
+	 * packed vCPU ids are below that.
 	 */
-	return cpu < xive->nr_servers * xive->kvm->arch.emul_smt_mode;
+	return kvmppc_pack_vcpu_id(xive->kvm, cpu) < xive->nr_servers;
 }
 
 int kvmppc_xive_compute_vp_id(struct kvmppc_xive *xive, u32 cpu, u32 *vp)
commit d0c6707ca4235b78d06bcd62f0e24fbeac3e6d10
Author: Heinrich Schuchardt <xypron.glpk at gmx.de>
Date:   Sun Nov 29 20:45:12 2020 +0100

    arm64: dts: allwinner: H5: NanoPi Neo Plus2: phy-mode rgmii-id
    
    Since commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx
    delay config") network is broken on the NanoPi Neo Plus2.
    
    This patch changes the phy-mode to use internal delays both for RX and TX
    as has been done for other boards affected by the same commit.
    
    Fixes: bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx delay config")
    Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Andrew Lunn <andrew at lunn.ch>
    Link: https://lore.kernel.org/r/20201129194512.1475586-1-xypron.glpk@gmx.de

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts
index 4f9ba53ffaae..9d93fe153689 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts
@@ -96,7 +96,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit c2b111e59a7be1534bbd62b3f8f933f714c5ba71
Author: Heinrich Schuchardt <xypron.glpk at gmx.de>
Date:   Sun Nov 29 17:26:27 2020 +0100

    arm64: dts: allwinner: A64 Sopine: phy-mode rgmii-id
    
    Since commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx
    delay config") iSCSI booting fails on the Pine A64 LTS.
    
    This patch changes the phy-mode to use internal delays both for RX and TX
    as has been done for other boards affected by the same commit.
    
    Fixes: bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx delay config")
    Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201129162627.1244808-1-xypron.glpk@gmx.de

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
index 9ebb9e07fae3..d4069749d721 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
@@ -79,7 +79,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-handle = <&ext_rgmii_phy>;
 	phy-supply = <&reg_dc1sw>;
 	status = "okay";
commit c98fff7332dbd6e028969f8c2bda3d7bc7a024d8
Author: Bjørn Mork <bjorn at mork.no>
Date:   Tue Dec 1 11:03:18 2020 +0100

    USB: serial: option: fix Quectel BG96 matching
    
    This is a partial revert of commit 2bb70f0a4b23 ("USB: serial:
    option: support dynamic Quectel USB compositions")
    
    The Quectel BG96 is different from most other modern Quectel modems,
    having serial functions with 3 endpoints using ff/ff/ff and ff/fe/ff
    class/subclass/protocol. Including it in the change to accommodate
    dynamic function mapping was incorrect.
    
    Revert to interface number matching for the BG96, assuming static
    layout of the RMNET function on interface 4. This restores support
    for the serial functions on interfaces 2 and 3.
    
    Full lsusb output for the BG96:
    
    Bus 002 Device 003: ID 2c7c:0296
    Device Descriptor:
     bLength                18
     bDescriptorType         1
     bcdUSB               2.00
     bDeviceClass            0 (Defined at Interface level)
     bDeviceSubClass         0
     bDeviceProtocol         0
     bMaxPacketSize0        64
     idVendor           0x2c7c
     idProduct          0x0296
     bcdDevice            0.00
     iManufacturer           3 Qualcomm, Incorporated
     iProduct                2 Qualcomm CDMA Technologies MSM
     iSerial                 4 d1098243
     bNumConfigurations      1
     Configuration Descriptor:
       bLength                 9
       bDescriptorType         2
       wTotalLength          145
       bNumInterfaces          5
       bConfigurationValue     1
       iConfiguration          1 Qualcomm Configuration
       bmAttributes         0xe0
         Self Powered
         Remote Wakeup
       MaxPower              500mA
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        0
         bAlternateSetting       0
         bNumEndpoints           2
         bInterfaceClass       255 Vendor Specific Class
         bInterfaceSubClass    255 Vendor Specific Subclass
         bInterfaceProtocol    255 Vendor Specific Protocol
         iInterface              0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x81  EP 1 IN
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x01  EP 1 OUT
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        1
         bAlternateSetting       0
         bNumEndpoints           2
         bInterfaceClass       255 Vendor Specific Class
         bInterfaceSubClass    255 Vendor Specific Subclass
         bInterfaceProtocol    255 Vendor Specific Protocol
         iInterface              0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x82  EP 2 IN
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x02  EP 2 OUT
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        2
         bAlternateSetting       0
         bNumEndpoints           3
         bInterfaceClass       255 Vendor Specific Class
         bInterfaceSubClass    255 Vendor Specific Subclass
         bInterfaceProtocol    255 Vendor Specific Protocol
         iInterface              0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x83  EP 3 IN
           bmAttributes            3
             Transfer Type            Interrupt
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0040  1x 64 bytes
           bInterval               5
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x84  EP 4 IN
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x03  EP 3 OUT
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        3
         bAlternateSetting       0
         bNumEndpoints           3
         bInterfaceClass       255 Vendor Specific Class
         bInterfaceSubClass    254
         bInterfaceProtocol    255
         iInterface              0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x85  EP 5 IN
           bmAttributes            3
             Transfer Type            Interrupt
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0040  1x 64 bytes
           bInterval               5
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x86  EP 6 IN
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x04  EP 4 OUT
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        4
         bAlternateSetting       0
         bNumEndpoints           3
         bInterfaceClass       255 Vendor Specific Class
         bInterfaceSubClass    255 Vendor Specific Subclass
         bInterfaceProtocol    255 Vendor Specific Protocol
         iInterface              0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x87  EP 7 IN
           bmAttributes            3
             Transfer Type            Interrupt
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0040  1x 64 bytes
           bInterval               5
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x88  EP 8 IN
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x05  EP 5 OUT
           bmAttributes            2
             Transfer Type            Bulk
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0200  1x 512 bytes
           bInterval               0
    Device Qualifier (for other device speed):
     bLength                10
     bDescriptorType         6
     bcdUSB               2.00
     bDeviceClass            0 (Defined at Interface level)
     bDeviceSubClass         0
     bDeviceProtocol         0
     bMaxPacketSize0        64
     bNumConfigurations      1
    Device Status:     0x0000
     (Bus Powered)
    
    Cc: Sebastian Sjoholm <sebastian.sjoholm at gmail.com>
    Fixes: 2bb70f0a4b23 ("USB: serial: option: support dynamic Quectel USB compositions")
    Signed-off-by: Bjørn Mork <bjorn at mork.no>
    Cc: stable at vger.kernel.org
    Signed-off-by: Johan Hovold <johan at kernel.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 653da1d2945c..56d6f6d83bd7 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1106,9 +1106,8 @@ static const struct usb_device_id option_ids[] = {
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0xff, 0xff),
 	  .driver_info = NUMEP2 },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0, 0) },
-	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96, 0xff, 0xff, 0xff),
-	  .driver_info = NUMEP2 },
-	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96, 0xff, 0, 0) },
+	{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
+	  .driver_info = RSVD(4) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff),
 	  .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
commit 2aab1561439032be2e98811dd0ddbeb5b2ae4c61
Author: Sanjay Govind <sanjay.govind9 at gmail.com>
Date:   Mon Nov 30 23:41:48 2020 -0800

    Input: xpad - support Ardwiino Controllers
    
    This commit adds support for Ardwiino Controllers
    
    Signed-off-by: Sanjay Govind <sanjay.govind9 at gmail.com>
    Link: https://lore.kernel.org/r/20201201071922.131666-1-sanjay.govind9@gmail.com
    Cc: stable at vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index c77cdb3b62b5..8c73377ac82c 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -241,6 +241,7 @@ static const struct xpad_device {
 	{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
 	{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
 	{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
+	{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
 	{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 	{ 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 },
 	{ 0x12ab, 0x0303, "Mortal Kombat Klassic FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
@@ -418,6 +419,7 @@ static const struct usb_device_id xpad_table[] = {
 	XPAD_XBOXONE_VENDOR(0x0f0d),		/* Hori Controllers */
 	XPAD_XBOX360_VENDOR(0x1038),		/* SteelSeries Controllers */
 	XPAD_XBOX360_VENDOR(0x11c9),		/* Nacon GC100XF */
+	XPAD_XBOX360_VENDOR(0x1209),		/* Ardwiino Controllers */
 	XPAD_XBOX360_VENDOR(0x12ab),		/* X-Box 360 dance pads */
 	XPAD_XBOX360_VENDOR(0x1430),		/* RedOctane X-Box 360 controllers */
 	XPAD_XBOX360_VENDOR(0x146b),		/* BigBen Interactive Controllers */
commit a48491c65b513e5cdc3e7a886a4db915f848a5f5
Author: Po-Hsu Lin <po-hsu.lin at canonical.com>
Date:   Mon Nov 30 22:39:40 2020 -0800

    Input: i8042 - add ByteSpeed touchpad to noloop table
    
    It looks like the C15B laptop got another vendor: ByteSpeed LLC.
    
    Avoid AUX loopback on this touchpad as well, thus input subsystem will
    be able to recognize a Synaptics touchpad in the AUX port.
    
    BugLink: https://bugs.launchpad.net/bugs/1906128
    Signed-off-by: Po-Hsu Lin <po-hsu.lin at canonical.com>
    Link: https://lore.kernel.org/r/20201201054723.5939-1-po-hsu.lin@canonical.com
    Cc: stable at vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index a4c9b9652560..7ecb65176c1a 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -219,6 +219,10 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
 			DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
 			DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
 		},
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
+		},
 	},
 	{ }
 };
commit 85dad327d9b58b4c9ce08189a2707167de392d23
Author: Sreekanth Reddy <sreekanth.reddy at broadcom.com>
Date:   Mon Nov 30 13:57:33 2020 +0530

    scsi: mpt3sas: Increase IOCInit request timeout to 30s
    
    Currently the IOCInit request message timeout is set to 10s. This is not
    sufficient in some scenarios such as during HBA FW downgrade operations.
    
    Increase the IOCInit request timeout to 30s.
    
    Link: https://lore.kernel.org/r/20201130082733.26120-1-sreekanth.reddy@broadcom.com
    Signed-off-by: Sreekanth Reddy <sreekanth.reddy at broadcom.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index e4cc92bc4d94..bb940cbcbb5d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -6459,7 +6459,7 @@ _base_send_ioc_init(struct MPT3SAS_ADAPTER *ioc)
 
 	r = _base_handshake_req_reply_wait(ioc,
 	    sizeof(Mpi2IOCInitRequest_t), (u32 *)&mpi_request,
-	    sizeof(Mpi2IOCInitReply_t), (u16 *)&mpi_reply, 10);
+	    sizeof(Mpi2IOCInitReply_t), (u16 *)&mpi_reply, 30);
 
 	if (r != 0) {
 		ioc_err(ioc, "%s: handshake failed (r=%d)\n", __func__, r);
commit 42f687038bcc34aa919e0e4c29b04e4cda3f6a79
Author: Suganath Prabu S <suganath-prabu.subramani at broadcom.com>
Date:   Wed Nov 25 15:18:38 2020 +0530

    scsi: mpt3sas: Fix ioctl timeout
    
    Commit c1a6c5ac4278 ("scsi: mpt3sas: For NVME device, issue a protocol
    level reset") modified the ioctl path 'timeout' variable type to u8 from
    unsigned long, limiting the maximum timeout value that the driver can
    support to 255 seconds.
    
    If the management application is requesting a higher value the resulting
    timeout will be zero. The operation times out immediately and the ioctl
    request fails.
    
    Change datatype back to unsigned long.
    
    Link: https://lore.kernel.org/r/20201125094838.4340-1-suganath-prabu.subramani@broadcom.com
    Fixes: c1a6c5ac4278 ("scsi: mpt3sas: For NVME device, issue a protocol level reset")
    Cc: <stable at vger.kernel.org> #v4.18+
    Signed-off-by: Suganath Prabu S <suganath-prabu.subramani at broadcom.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
index 0f2b681449e6..edd26a2570fa 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
@@ -664,7 +664,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
 	Mpi26NVMeEncapsulatedRequest_t *nvme_encap_request = NULL;
 	struct _pcie_device *pcie_device = NULL;
 	u16 smid;
-	u8 timeout;
+	unsigned long timeout;
 	u8 issue_reset;
 	u32 sz, sz_arg;
 	void *psge;
commit 3b8c72d076c42bf27284cda7b2b2b522810686f8
Author: Andrea Parri (Microsoft) <parri.andrea at gmail.com>
Date:   Wed Nov 18 15:53:48 2020 +0100

    scsi: storvsc: Validate length of incoming packet in storvsc_on_channel_callback()
    
    Check that the packet is of the expected size at least, don't copy data
    past the packet.
    
    Link: https://lore.kernel.org/r/20201118145348.109879-1-parri.andrea@gmail.com
    Cc: "James E.J. Bottomley" <jejb at linux.ibm.com>
    Cc: "Martin K. Petersen" <martin.petersen at oracle.com>
    Cc: linux-scsi at vger.kernel.org
    Reported-by: Saruhan Karademir <skarade at microsoft.com>
    Signed-off-by: Andrea Parri (Microsoft) <parri.andrea at gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index ded00a89bfc4..99c8ff81de74 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1246,6 +1246,11 @@ static void storvsc_on_channel_callback(void *context)
 		request = (struct storvsc_cmd_request *)
 			((unsigned long)desc->trans_id);
 
+		if (hv_pkt_datalen(desc) < sizeof(struct vstor_packet) - vmscsi_size_delta) {
+			dev_err(&device->device, "Invalid packet len\n");
+			continue;
+		}
+
 		if (request == &stor_device->init_request ||
 		    request == &stor_device->reset_request) {
 			memcpy(&request->vstor_packet, packet,
commit 05227490c5f0f1bbd3693a7a70b3fb5b09d2a996
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Nov 20 11:29:22 2020 +0900

    docs: bootconfig: Add the endianness of fields
    
    Add a description about the endianness of the size and the checksum
    fields. Those must be stored as le32 instead of u32. This will allow
    us to apply bootconfig to the cross build initrd without caring
    the endianness.
    
    Link: https://lkml.kernel.org/r/160583936246.547349.10964204130590955409.stgit@devnote2
    
    Reported-by: Steven Rostedt <rostedt at goodmis.org>
    Suggested-by: Linus Torvalds <torvalds at linux-foundation.org>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin-guide/bootconfig.rst
index 363599683784..9b90efcc3a35 100644
--- a/Documentation/admin-guide/bootconfig.rst
+++ b/Documentation/admin-guide/bootconfig.rst
@@ -140,7 +140,9 @@ Since the boot configuration file is loaded with initrd, it will be added
 to the end of the initrd (initramfs) image file with padding, size,
 checksum and 12-byte magic word as below.
 
-[initrd][bootconfig][padding][size(u32)][checksum(u32)][#BOOTCONFIG\n]
+[initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n]
+
+The size and checksum fields are unsigned 32bit little endian value.
 
 When the boot configuration is added to the initrd image, the total
 file size is aligned to 4 bytes. To fill the gap, null characters
commit e86843580d1bb1ce12544bca3115cf11d51603ff
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Nov 20 11:29:13 2020 +0900

    tools/bootconfig: Store size and checksum in footer as le32
    
    Store the size and the checksum fields in the footer as le32
    instead of u32. This will allow us to apply bootconfig to the
    cross build initrd without caring the endianness.
    
    Link: https://lkml.kernel.org/r/160583935332.547349.5897811300636587426.stgit@devnote2
    
    Reported-by: Steven Rostedt <rostedt at goodmis.org>
    Suggested-by: Linus Torvalds <torvalds at linux-foundation.org>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index 4a445b6304bb..7362bef1a368 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -10,6 +10,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
+#include <endian.h>
 
 #include <linux/kernel.h>
 #include <linux/bootconfig.h>
@@ -183,9 +184,11 @@ static int load_xbc_from_initrd(int fd, char **buf)
 
 	if (read(fd, &size, sizeof(u32)) < 0)
 		return pr_errno("Failed to read size", -errno);
+	size = le32toh(size);
 
 	if (read(fd, &csum, sizeof(u32)) < 0)
 		return pr_errno("Failed to read checksum", -errno);
+	csum = le32toh(csum);
 
 	/* Wrong size error  */
 	if (stat.st_size < size + 8 + BOOTCONFIG_MAGIC_LEN) {
@@ -407,10 +410,10 @@ static int apply_xbc(const char *path, const char *xbc_path)
 
 	/* Add a footer */
 	p = data + size;
-	*(u32 *)p = size;
+	*(u32 *)p = htole32(size);
 	p += sizeof(u32);
 
-	*(u32 *)p = csum;
+	*(u32 *)p = htole32(csum);
 	p += sizeof(u32);
 
 	memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
commit 24aed09451270b6a2a78adf8a34918d12ffb7dcf
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Nov 20 11:29:04 2020 +0900

    bootconfig: Load size and checksum in the footer as le32
    
    Load the size and the checksum fields in the footer as le32
    instead of u32. This will allow us to apply bootconfig to the
    cross build initrd without caring the endianness.
    
    Link: https://lkml.kernel.org/r/160583934457.547349.10504070298990791074.stgit@devnote2
    
    Reported-by: Steven Rostedt <rostedt at goodmis.org>
    Suggested-by: Linus Torvalds <torvalds at linux-foundation.org>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/init/main.c b/init/main.c
index 20baced721ad..32b2a8affafd 100644
--- a/init/main.c
+++ b/init/main.c
@@ -288,8 +288,8 @@ static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum)
 
 found:
 	hdr = (u32 *)(data - 8);
-	size = hdr[0];
-	csum = hdr[1];
+	size = le32_to_cpu(hdr[0]);
+	csum = le32_to_cpu(hdr[1]);
 
 	data = ((void *)hdr) - size;
 	if ((unsigned long)data < initrd_start) {
commit 68e10d5ff512b503dcba1246ad5620f32035e135
Author: Steven Rostedt (VMware) <rostedt at goodmis.org>
Date:   Mon Nov 30 23:16:03 2020 -0500

    ring-buffer: Always check to put back before stamp when crossing pages
    
    The current ring buffer logic checks to see if the updating of the event
    buffer was interrupted, and if it is, it will try to fix up the before stamp
    with the write stamp to make them equal again. This logic is flawed, because
    if it is not interrupted, the two are guaranteed to be different, as the
    current event just updated the before stamp before allocation. This
    guarantees that the next event (this one or another interrupting one) will
    think it interrupted the time updates of a previous event and inject an
    absolute time stamp to compensate.
    
    The correct logic is to always update the timestamps when traversing to a
    new sub buffer.
    
    Cc: stable at vger.kernel.org
    Fixes: a389d86f7fd09 ("ring-buffer: Have nested events still record running time stamp")
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 35d91b20d47a..a6268e09160a 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -3234,14 +3234,12 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
 
 	/* See if we shot pass the end of this buffer page */
 	if (unlikely(write > BUF_PAGE_SIZE)) {
-		if (tail != w) {
-			/* before and after may now different, fix it up*/
-			b_ok = rb_time_read(&cpu_buffer->before_stamp, &info->before);
-			a_ok = rb_time_read(&cpu_buffer->write_stamp, &info->after);
-			if (a_ok && b_ok && info->before != info->after)
-				(void)rb_time_cmpxchg(&cpu_buffer->before_stamp,
-						      info->before, info->after);
-		}
+		/* before and after may now different, fix it up*/
+		b_ok = rb_time_read(&cpu_buffer->before_stamp, &info->before);
+		a_ok = rb_time_read(&cpu_buffer->write_stamp, &info->after);
+		if (a_ok && b_ok && info->before != info->after)
+			(void)rb_time_cmpxchg(&cpu_buffer->before_stamp,
+					      info->before, info->after);
 		return rb_move_tail(cpu_buffer, tail, info);
 	}
 
commit 6112ff4e8f393e7e297dff04eff0987f94d37fa1
Author: Jing Xiangfeng <jingxiangfeng at huawei.com>
Date:   Fri Nov 27 11:02:06 2020 +0800

    scsi: storvsc: Fix error return in storvsc_probe()
    
    Return -ENOMEM from the error handling case instead of 0.
    
    Link: https://lore.kernel.org/r/20201127030206.104616-1-jingxiangfeng@huawei.com
    Fixes: 436ad9413353 ("scsi: storvsc: Allow only one remove lun work item to be issued per lun")
    Reviewed-by: Michael Kelley <mikelley at microsoft.com>
    Signed-off-by: Jing Xiangfeng <jingxiangfeng at huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 0c65fbd41035..ded00a89bfc4 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1994,8 +1994,10 @@ static int storvsc_probe(struct hv_device *device,
 			alloc_ordered_workqueue("storvsc_error_wq_%d",
 						WQ_MEM_RECLAIM,
 						host->host_no);
-	if (!host_dev->handle_error_wq)
+	if (!host_dev->handle_error_wq) {
+		ret = -ENOMEM;
 		goto err_out2;
+	}
 	INIT_WORK(&host_dev->host_scan_work, storvsc_host_scan);
 	/* Register the HBA and start the scsi bus scan */
 	ret = scsi_add_host(host, &device->device);
commit 237f977ab920490502f5fe39af4390f26db2cd40
Merge: a5e74021e84b 13a84cf37a4c
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Nov 30 19:03:48 2020 -0800

    Merge tag 'linux-can-fixes-for-5.10-20201130' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
    
    Marc Kleine-Budde says:
    
    ====================
    pull-request: can 2020-11-30
    
    The first patch is by me an target the tcan4x5x bindings for the m_can driver.
    It fixes the error path in the tcan4x5x_can_probe() function.
    
    The next two patches are by Jeroen Hofstee and makes the lost of arbitration
    error counters of sja1000 and the sun4i drivers consistent with the other
    drivers.
    
    Zhang Qilong contributes two patch that clean up the error path in the c_can
    and kvaser_pciefd drivers.
    
    * tag 'linux-can-fixes-for-5.10-20201130' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
      can: kvaser_pciefd: kvaser_pciefd_open(): fix error handling
      can: c_can: c_can_power_up(): fix error handling
      can: sun4i_can: sun4i_can_err(): don't count arbitration lose as an error
      can: sja1000: sja1000_err(): don't count arbitration lose as an error
      can: m_can: tcan4x5x_can_probe(): fix error path: remove erroneous clk_disable_unprepare()
    ====================
    
    Link: https://lore.kernel.org/r/20201130125307.218258-1-mkl@pengutronix.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 49a962c075dfa41c78e34784772329bc8784d217
Author: Naveen N. Rao <naveen.n.rao at linux.vnet.ibm.com>
Date:   Thu Nov 26 23:38:39 2020 +0530

    ftrace: Fix DYNAMIC_FTRACE_WITH_DIRECT_CALLS dependency
    
    DYNAMIC_FTRACE_WITH_DIRECT_CALLS should depend on
    DYNAMIC_FTRACE_WITH_REGS since we need ftrace_regs_caller().
    
    Link: https://lkml.kernel.org/r/fc4b257ea8689a36f086d2389a9ed989496ca63a.1606412433.git.naveen.n.rao@linux.vnet.ibm.com
    
    Cc: stable at vger.kernel.org
    Fixes: 763e34e74bb7d5c ("ftrace: Add register_ftrace_direct()")
    Signed-off-by: Naveen N. Rao <naveen.n.rao at linux.vnet.ibm.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index a4020c0b4508..e1bf5228fb69 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -202,7 +202,7 @@ config DYNAMIC_FTRACE_WITH_REGS
 
 config DYNAMIC_FTRACE_WITH_DIRECT_CALLS
 	def_bool y
-	depends on DYNAMIC_FTRACE
+	depends on DYNAMIC_FTRACE_WITH_REGS
 	depends on HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
 
 config FUNCTION_PROFILER
commit 4c75b0ff4e4bf7a45b5aef9639799719c28d0073
Author: Naveen N. Rao <naveen.n.rao at linux.vnet.ibm.com>
Date:   Thu Nov 26 23:38:38 2020 +0530

    ftrace: Fix updating FTRACE_FL_TRAMP
    
    On powerpc, kprobe-direct.tc triggered FTRACE_WARN_ON() in
    ftrace_get_addr_new() followed by the below message:
      Bad trampoline accounting at: 000000004222522f (wake_up_process+0xc/0x20) (f0000001)
    
    The set of steps leading to this involved:
    - modprobe ftrace-direct-too
    - enable_probe
    - modprobe ftrace-direct
    - rmmod ftrace-direct <-- trigger
    
    The problem turned out to be that we were not updating flags in the
    ftrace record properly. From the above message about the trampoline
    accounting being bad, it can be seen that the ftrace record still has
    FTRACE_FL_TRAMP set though ftrace-direct module is going away. This
    happens because we are checking if any ftrace_ops has the
    FTRACE_FL_TRAMP flag set _before_ updating the filter hash.
    
    The fix for this is to look for any _other_ ftrace_ops that also needs
    FTRACE_FL_TRAMP.
    
    Link: https://lkml.kernel.org/r/56c113aa9c3e10c19144a36d9684c7882bf09af5.1606412433.git.naveen.n.rao@linux.vnet.ibm.com
    
    Cc: stable at vger.kernel.org
    Fixes: a124692b698b0 ("ftrace: Enable trampoline when rec count returns back to one")
    Signed-off-by: Naveen N. Rao <naveen.n.rao at linux.vnet.ibm.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 8185f7240095..9c1bba8cc51b 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1629,6 +1629,8 @@ static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec)
 static struct ftrace_ops *
 ftrace_find_tramp_ops_any(struct dyn_ftrace *rec);
 static struct ftrace_ops *
+ftrace_find_tramp_ops_any_other(struct dyn_ftrace *rec, struct ftrace_ops *op_exclude);
+static struct ftrace_ops *
 ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops);
 
 static bool __ftrace_hash_rec_update(struct ftrace_ops *ops,
@@ -1778,7 +1780,7 @@ static bool __ftrace_hash_rec_update(struct ftrace_ops *ops,
 			 * to it.
 			 */
 			if (ftrace_rec_count(rec) == 1 &&
-			    ftrace_find_tramp_ops_any(rec))
+			    ftrace_find_tramp_ops_any_other(rec, ops))
 				rec->flags |= FTRACE_FL_TRAMP;
 			else
 				rec->flags &= ~FTRACE_FL_TRAMP;
@@ -2244,6 +2246,24 @@ ftrace_find_tramp_ops_any(struct dyn_ftrace *rec)
 	return NULL;
 }
 
+static struct ftrace_ops *
+ftrace_find_tramp_ops_any_other(struct dyn_ftrace *rec, struct ftrace_ops *op_exclude)
+{
+	struct ftrace_ops *op;
+	unsigned long ip = rec->ip;
+
+	do_for_each_ftrace_op(op, ftrace_ops_list) {
+
+		if (op == op_exclude || !op->trampoline)
+			continue;
+
+		if (hash_contains_ip(ip, op->func_hash))
+			return op;
+	} while_for_each_ftrace_op(op);
+
+	return NULL;
+}
+
 static struct ftrace_ops *
 ftrace_find_tramp_ops_next(struct dyn_ftrace *rec,
 			   struct ftrace_ops *op)
commit 8fa655a3a0013a0c2a2aada6f39a93ee6fc25549
Author: Minchan Kim <minchan at kernel.org>
Date:   Wed Nov 25 14:56:54 2020 -0800

    tracing: Fix alignment of static buffer
    
    With 5.9 kernel on ARM64, I found ftrace_dump output was broken but
    it had no problem with normal output "cat /sys/kernel/debug/tracing/trace".
    
    With investigation, it seems coping the data into temporal buffer seems to
    break the align binary printf expects if the static buffer is not aligned
    with 4-byte. IIUC, get_arg in bstr_printf expects that args has already
    right align to be decoded and seq_buf_bprintf says ``the arguments are saved
    in a 32bit word array that is defined by the format string constraints``.
    So if we don't keep the align under copy to temporal buffer, the output
    will be broken by shifting some bytes.
    
    This patch fixes it.
    
    Link: https://lkml.kernel.org/r/20201125225654.1618966-1-minchan@kernel.org
    
    Cc: <stable at vger.kernel.org>
    Fixes: 8e99cf91b99bb ("tracing: Do not allocate buffer in trace_find_next_entry() in atomic")
    Signed-off-by: Namhyung Kim <namhyung at kernel.org>
    Signed-off-by: Minchan Kim <minchan at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 410cfeb16db5..7d53c5bdea3e 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3534,7 +3534,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu,
 }
 
 #define STATIC_TEMP_BUF_SIZE	128
-static char static_temp_buf[STATIC_TEMP_BUF_SIZE];
+static char static_temp_buf[STATIC_TEMP_BUF_SIZE] __aligned(4);
 
 /* Find the next real entry, without updating the iterator itself */
 struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
commit 310e3a4b5a4fc718a72201c1e4cf5c64ac6f5442
Author: Vasily Averin <vvs at virtuozzo.com>
Date:   Wed Nov 18 15:05:20 2020 +0300

    tracing: Remove WARN_ON in start_thread()
    
    This patch reverts commit 978defee11a5 ("tracing: Do a WARN_ON()
     if start_thread() in hwlat is called when thread exists")
    
    .start hook can be legally called several times if according
    tracer is stopped
    
    screen window 1
    [root at localhost ~]# echo 1 > /sys/kernel/tracing/events/kmem/kfree/enable
    [root at localhost ~]# echo 1 > /sys/kernel/tracing/options/pause-on-trace
    [root at localhost ~]# less -F /sys/kernel/tracing/trace
    
    screen window 2
    [root at localhost ~]# cat /sys/kernel/debug/tracing/tracing_on
    0
    [root at localhost ~]# echo hwlat >  /sys/kernel/debug/tracing/current_tracer
    [root at localhost ~]# echo 1 > /sys/kernel/debug/tracing/tracing_on
    [root at localhost ~]# cat /sys/kernel/debug/tracing/tracing_on
    0
    [root at localhost ~]# echo 2 > /sys/kernel/debug/tracing/tracing_on
    
    triggers warning in dmesg:
    WARNING: CPU: 3 PID: 1403 at kernel/trace/trace_hwlat.c:371 hwlat_tracer_start+0xc9/0xd0
    
    Link: https://lkml.kernel.org/r/bd4d3e70-400d-9c82-7b73-a2d695e86b58@virtuozzo.com
    
    Cc: Ingo Molnar <mingo at redhat.com>
    Cc: stable at vger.kernel.org
    Fixes: 978defee11a5 ("tracing: Do a WARN_ON() if start_thread() in hwlat is called when thread exists")
    Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/trace_hwlat.c b/kernel/trace/trace_hwlat.c
index c9ad5c6fbaad..d071fc271eef 100644
--- a/kernel/trace/trace_hwlat.c
+++ b/kernel/trace/trace_hwlat.c
@@ -368,7 +368,7 @@ static int start_kthread(struct trace_array *tr)
 	struct task_struct *kthread;
 	int next_cpu;
 
-	if (WARN_ON(hwlat_kthread))
+	if (hwlat_kthread)
 		return 0;
 
 	/* Just pick the first CPU on first iteration */
commit 983df5f2699f83f78643b19d3399b160d1e64f5b
Author: Sami Tolvanen <samitolvanen at google.com>
Date:   Fri Nov 13 10:34:14 2020 -0800

    samples/ftrace: Mark my_tramp[12]? global
    
    my_tramp[12]? are declared as global functions in C, but they are not
    marked global in the inline assembly definition. This mismatch confuses
    Clang's Control-Flow Integrity checking. Fix the definitions by adding
    .globl.
    
    Link: https://lkml.kernel.org/r/20201113183414.1446671-1-samitolvanen@google.com
    
    Fixes: 9d907f1ae80b8 ("ftrace/samples: Add a sample module that implements modify_ftrace_direct()")
    Reviewed-by: Kees Cook <keescook at chromium.org>
    Signed-off-by: Sami Tolvanen <samitolvanen at google.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/samples/ftrace/ftrace-direct-modify.c b/samples/ftrace/ftrace-direct-modify.c
index c13a5bc5095b..5b9a09957c6e 100644
--- a/samples/ftrace/ftrace-direct-modify.c
+++ b/samples/ftrace/ftrace-direct-modify.c
@@ -21,6 +21,7 @@ static unsigned long my_ip = (unsigned long)schedule;
 asm (
 "	.pushsection    .text, \"ax\", @progbits\n"
 "	.type		my_tramp1, @function\n"
+"	.globl		my_tramp1\n"
 "   my_tramp1:"
 "	pushq %rbp\n"
 "	movq %rsp, %rbp\n"
@@ -29,6 +30,7 @@ asm (
 "	.size		my_tramp1, .-my_tramp1\n"
 "	ret\n"
 "	.type		my_tramp2, @function\n"
+"	.globl		my_tramp2\n"
 "   my_tramp2:"
 "	pushq %rbp\n"
 "	movq %rsp, %rbp\n"
diff --git a/samples/ftrace/ftrace-direct-too.c b/samples/ftrace/ftrace-direct-too.c
index d5c5022be664..3f0079c9bd6f 100644
--- a/samples/ftrace/ftrace-direct-too.c
+++ b/samples/ftrace/ftrace-direct-too.c
@@ -16,6 +16,7 @@ extern void my_tramp(void *);
 asm (
 "	.pushsection    .text, \"ax\", @progbits\n"
 "	.type		my_tramp, @function\n"
+"	.globl		my_tramp\n"
 "   my_tramp:"
 "	pushq %rbp\n"
 "	movq %rsp, %rbp\n"
diff --git a/samples/ftrace/ftrace-direct.c b/samples/ftrace/ftrace-direct.c
index 63ca06d42c80..a2729d1ef17f 100644
--- a/samples/ftrace/ftrace-direct.c
+++ b/samples/ftrace/ftrace-direct.c
@@ -14,6 +14,7 @@ extern void my_tramp(void *);
 asm (
 "	.pushsection    .text, \"ax\", @progbits\n"
 "	.type		my_tramp, @function\n"
+"	.globl		my_tramp\n"
 "   my_tramp:"
 "	pushq %rbp\n"
 "	movq %rsp, %rbp\n"
commit a5e74021e84bb5eadf760aaf2c583304f02269be
Author: Sven Eckelmann <sven at narfation.org>
Date:   Thu Nov 26 13:52:47 2020 +0100

    vxlan: Copy needed_tailroom from lowerdev
    
    While vxlan doesn't need any extra tailroom, the lowerdev might need it. In
    that case, copy it over to reduce the chance for additional (re)allocations
    in the transmit path.
    
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Link: https://lore.kernel.org/r/20201126125247.1047977-2-sven@narfation.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 55fa3fbb80f1..032f78261913 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -3800,6 +3800,8 @@ static void vxlan_config_apply(struct net_device *dev,
 		needed_headroom = lowerdev->hard_header_len;
 		needed_headroom += lowerdev->needed_headroom;
 
+		dev->needed_tailroom = lowerdev->needed_tailroom;
+
 		max_mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM :
 					   VXLAN_HEADROOM);
 		if (max_mtu < ETH_MIN_MTU)
commit 0a35dc41fea67ac4495ce7584406bf9557a6e7d0
Author: Sven Eckelmann <sven at narfation.org>
Date:   Thu Nov 26 13:52:46 2020 +0100

    vxlan: Add needed_headroom for lower device
    
    It was observed that sending data via batadv over vxlan (on top of
    wireguard) reduced the performance massively compared to raw ethernet or
    batadv on raw ethernet. A check of perf data showed that the
    vxlan_build_skb was calling all the time pskb_expand_head to allocate
    enough headroom for:
    
      min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len
                    + VXLAN_HLEN + iphdr_len;
    
    But the vxlan_config_apply only requested needed headroom for:
    
      lowerdev->hard_header_len + VXLAN6_HEADROOM or VXLAN_HEADROOM
    
    So it completely ignored the needed_headroom of the lower device. The first
    caller of net_dev_xmit could therefore never make sure that enough headroom
    was allocated for the rest of the transmit path.
    
    Cc: Annika Wickert <annika.wickert at exaring.de>
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Tested-by: Annika Wickert <aw at awlnx.space>
    Link: https://lore.kernel.org/r/20201126125247.1047977-1-sven@narfation.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 1a557aeba32b..55fa3fbb80f1 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -3798,6 +3798,7 @@ static void vxlan_config_apply(struct net_device *dev,
 		dev->gso_max_segs = lowerdev->gso_max_segs;
 
 		needed_headroom = lowerdev->hard_header_len;
+		needed_headroom += lowerdev->needed_headroom;
 
 		max_mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM :
 					   VXLAN_HEADROOM);
commit e3d5e971d2f83d8ddd4b91a50cea4517fb488383
Author: Vinay Kumar Yadav <vinay.yadav at chelsio.com>
Date:   Thu Nov 26 03:19:14 2020 +0530

    chelsio/chtls: fix panic during unload reload chtls
    
    there is kernel panic in inet_twsk_free() while chtls
    module unload when socket is in TIME_WAIT state because
    sk_prot_creator was not preserved on connection socket.
    
    Fixes: cc35c88ae4db ("crypto : chtls - CPL handler definition")
    Signed-off-by: Udai Sharma <udai.sharma at chelsio.com>
    Signed-off-by: Vinay Kumar Yadav <vinay.yadav at chelsio.com>
    Link: https://lore.kernel.org/r/20201125214913.16938-1-vinay.yadav@chelsio.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
index 96d561653496..50e3a70e5a29 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
@@ -1206,6 +1206,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
 	sk_setup_caps(newsk, dst);
 	ctx = tls_get_ctx(lsk);
 	newsk->sk_destruct = ctx->sk_destruct;
+	newsk->sk_prot_creator = lsk->sk_prot_creator;
 	csk->sk = newsk;
 	csk->passive_reap_next = oreq;
 	csk->tx_chan = cxgb4_port_chan(ndev);
commit 19ba8fb810c60b46869acc9f455613de454e0fca
Author: Bernd Bauer <bernd.bauer at anton-paar.com>
Date:   Thu Nov 26 18:56:28 2020 +0100

    ARM: dts: imx6qdl-kontron-samx6i: fix I2C_PM scl pin
    
    Use the correct pin for the i2c scl signal else we can't access the
    SoM eeprom.
    
    Fixes: 2a51f9dae13d ("ARM: dts: imx6qdl-kontron-samx6i: Add iMX6-based Kontron SMARC-sAMX6i module")
    Signed-off-by: Bernd Bauer <bernd.bauer at anton-paar.com>
    [m.felsch at pengutronix.de: Adapt commit message]
    Signed-off-by: Marco Felsch <m.felsch at pengutronix.de>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
index 265f5f3dbff6..24f793ca2886 100644
--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
@@ -551,7 +551,7 @@
 
 	pinctrl_i2c3: i2c3grp {
 		fsl,pins = <
-			MX6QDL_PAD_GPIO_3__I2C3_SCL		0x4001b8b1
+			MX6QDL_PAD_GPIO_5__I2C3_SCL		0x4001b8b1
 			MX6QDL_PAD_GPIO_16__I2C3_SDA		0x4001b8b1
 		>;
 	};
commit 58d6bca5efc73235b0f84c0d53321737177c651e
Author: Fabio Estevam <festevam at gmail.com>
Date:   Mon Nov 30 17:54:47 2020 -0300

    ARM: dts: imx6qdl-wandboard-revd1: Remove PAD_GPIO_6 from enetgrp
    
    Since commit 8ad2d1dcce54 ("ARM: dts: imx6qdl-wandboard: Add OV5645 camera
    support") the PAD_GPIO_6 is used for providing the camera sensor clock.
    
    Remove it from the enetgrp to fix the following IOMXU conflict:
    
    [    9.972414] imx6q-pinctrl 20e0000.pinctrl: pin MX6Q_PAD_GPIO_6 already requested by 2188000.ethernet; cannot claim for 1-003c
    [    9.983857] imx6q-pinctrl 20e0000.pinctrl: pin-140 (1-003c) status -22
    [    9.990514] imx6q-pinctrl 20e0000.pinctrl: could not request pin 140 (MX6Q_PAD_GPIO_6) from group ov5645grp  on device 20e0000.pinctrl
    
    Fixes: 8ad2d1dcce54 ("ARM: dts: imx6qdl-wandboard: Add OV5645 camera support")
    Signed-off-by: Fabio Estevam <festevam at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/boot/dts/imx6qdl-wandboard-revd1.dtsi b/arch/arm/boot/dts/imx6qdl-wandboard-revd1.dtsi
index 93909796885a..b9b698f72b26 100644
--- a/arch/arm/boot/dts/imx6qdl-wandboard-revd1.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-wandboard-revd1.dtsi
@@ -166,7 +166,6 @@
 				MX6QDL_PAD_RGMII_RD2__RGMII_RD2		0x1b030
 				MX6QDL_PAD_RGMII_RD3__RGMII_RD3		0x1b030
 				MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL	0x1b030
-				MX6QDL_PAD_GPIO_6__ENET_IRQ		0x000b1
 			>;
 		};
 
commit 777a7717d60ccdc9b84f35074f848d3f746fc3bf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Nov 26 14:08:41 2020 +0000

    drm/i915/gt: Program mocs:63 for cache eviction on gen9
    
    Ville noticed that the last mocs entry is used unconditionally by the HW
    when it performs cache evictions, and noted that while the value is not
    meant to be writable by the driver, we should program it to a reasonable
    value nevertheless.
    
    As it turns out, we can change the value of mocs:63 and the value we
    were programming into it would cause hard hangs in conjunction with
    atomic operations.
    
    v2: Add details from bspec about how it is used by HW
    
    Suggested-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2707
    Fixes: 3bbaba0ceaa2 ("drm/i915: Added Programming of the MOCS")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Cc: Jason Ekstrand <jason at jlekstrand.net>
    Cc: <stable at vger.kernel.org> # v4.3+
    Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201126140841.1982-1-chris@chris-wilson.co.uk
    (cherry picked from commit 977933b5da7c16f39295c4c1d4259a58ece65dbe)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.c b/drivers/gpu/drm/i915/gt/intel_mocs.c
index 313e51e7d4f7..4f74706967fd 100644
--- a/drivers/gpu/drm/i915/gt/intel_mocs.c
+++ b/drivers/gpu/drm/i915/gt/intel_mocs.c
@@ -131,7 +131,19 @@ static const struct drm_i915_mocs_entry skl_mocs_table[] = {
 	GEN9_MOCS_ENTRIES,
 	MOCS_ENTRY(I915_MOCS_CACHED,
 		   LE_3_WB | LE_TC_2_LLC_ELLC | LE_LRUM(3),
-		   L3_3_WB)
+		   L3_3_WB),
+
+	/*
+	 * mocs:63
+	 * - used by the L3 for all of its evictions.
+	 *   Thus it is expected to allow LLC cacheability to enable coherent
+	 *   flows to be maintained.
+	 * - used to force L3 uncachable cycles.
+	 *   Thus it is expected to make the surface L3 uncacheable.
+	 */
+	MOCS_ENTRY(63,
+		   LE_3_WB | LE_TC_1_LLC | LE_LRUM(3),
+		   L3_1_UC)
 };
 
 /* NOTE: the LE_TGT_CACHE is not used on Broxton */
commit 70e734fed740939704d1b3b76d6f2e6909698586
Author: Robert Karszniewicz <r.karszniewicz at phytec.de>
Date:   Fri Nov 20 18:51:24 2020 +0100

    ARM: imx: Use correct SRC base address
    
    Commit 4a4fb66119eb ("ARM: imx: Add missing of_node_put()") accidentally
    forgot to rename a variable, which caused the wrong address to be used
    and, in our case, the ULL getting falsely identified as ULZ.
    
    Fixes: 4a4fb66119eb ("ARM: imx: Add missing of_node_put()")
    Signed-off-by: Robert Karszniewicz <r.karszniewicz at phytec.de>
    Reviewed-by: Fabio Estevam <festevam at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/mach-imx/anatop.c b/arch/arm/mach-imx/anatop.c
index d841bed8664d..7bb47eb3fc07 100644
--- a/arch/arm/mach-imx/anatop.c
+++ b/arch/arm/mach-imx/anatop.c
@@ -136,7 +136,7 @@ void __init imx_init_revision_from_anatop(void)
 
 			src_np = of_find_compatible_node(NULL, NULL,
 						     "fsl,imx6ul-src");
-			src_base = of_iomap(np, 0);
+			src_base = of_iomap(src_np, 0);
 			of_node_put(src_np);
 			WARN_ON(!src_base);
 			sbmr2 = readl_relaxed(src_base + SRC_SBMR2);
commit dd0ecf544125639e54056d851e4887dbb94b6d2f
Author: Andreas Gruenbacher <agruenba at redhat.com>
Date:   Mon Nov 30 16:07:25 2020 +0100

    gfs2: Fix deadlock between gfs2_{create_inode,inode_lookup} and delete_work_func
    
    In gfs2_create_inode and gfs2_inode_lookup, make sure to cancel any pending
    delete work before taking the inode glock.  Otherwise, gfs2_cancel_delete_work
    may block waiting for delete_work_func to complete, and delete_work_func may
    block trying to acquire the inode glock in gfs2_inode_lookup.
    
    Reported-by: Alexander Aring <aahringo at redhat.com>
    Fixes: a0e3cc65fa29 ("gfs2: Turn gl_delete into a delayed work")
    Cc: stable at vger.kernel.org # v5.8+
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index eed1a1bac6f6..65ae4fc28ede 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -150,6 +150,8 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
 		error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
 		if (unlikely(error))
 			goto fail;
+		if (blktype != GFS2_BLKST_UNLINKED)
+			gfs2_cancel_delete_work(io_gl);
 
 		if (type == DT_UNKNOWN || blktype != GFS2_BLKST_FREE) {
 			/*
@@ -180,8 +182,6 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
 		error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
 		if (unlikely(error))
 			goto fail;
-		if (blktype != GFS2_BLKST_UNLINKED)
-			gfs2_cancel_delete_work(ip->i_iopen_gh.gh_gl);
 		glock_set_object(ip->i_iopen_gh.gh_gl, ip);
 		gfs2_glock_put(io_gl);
 		io_gl = NULL;
@@ -725,13 +725,19 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	flush_delayed_work(&ip->i_gl->gl_work);
 	glock_set_object(ip->i_gl, ip);
 
-	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
+	error = gfs2_glock_get(sdp, ip->i_no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
 	if (error)
 		goto fail_free_inode;
+	gfs2_cancel_delete_work(io_gl);
+	glock_set_object(io_gl, ip);
+
+	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
+	if (error)
+		goto fail_gunlock2;
 
 	error = gfs2_trans_begin(sdp, blocks, 0);
 	if (error)
-		goto fail_free_inode;
+		goto fail_gunlock2;
 
 	if (blocks > 1) {
 		ip->i_eattr = ip->i_no_addr + 1;
@@ -740,18 +746,12 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	init_dinode(dip, ip, symname);
 	gfs2_trans_end(sdp);
 
-	error = gfs2_glock_get(sdp, ip->i_no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
-	if (error)
-		goto fail_free_inode;
-
 	BUG_ON(test_and_set_bit(GLF_INODE_CREATING, &io_gl->gl_flags));
 
 	error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
 	if (error)
 		goto fail_gunlock2;
 
-	gfs2_cancel_delete_work(ip->i_iopen_gh.gh_gl);
-	glock_set_object(ip->i_iopen_gh.gh_gl, ip);
 	gfs2_set_iop(inode);
 	insert_inode_hash(inode);
 
@@ -803,6 +803,7 @@ fail_gunlock3:
 	gfs2_glock_dq_uninit(&ip->i_iopen_gh);
 fail_gunlock2:
 	clear_bit(GLF_INODE_CREATING, &io_gl->gl_flags);
+	glock_clear_object(io_gl, ip);
 	gfs2_glock_put(io_gl);
 fail_free_inode:
 	if (ip->i_gl) {
commit ed1182dc004dbcc7cfe64fb0e8ac520b25431715
Author: Björn Töpel <bjorn.topel at intel.com>
Date:   Fri Nov 27 18:17:26 2020 +0100

    xdp: Handle MEM_TYPE_XSK_BUFF_POOL correctly in xdp_return_buff()
    
    It turns out that it does exist a path where xdp_return_buff() is
    being passed an XDP buffer of type MEM_TYPE_XSK_BUFF_POOL. This path
    is when AF_XDP zero-copy mode is enabled, and a buffer is redirected
    to a DEVMAP with an attached XDP program that drops the buffer.
    
    This change simply puts the handling of MEM_TYPE_XSK_BUFF_POOL back
    into xdp_return_buff().
    
    Fixes: 82c41671ca4f ("xdp: Simplify xdp_return_{frame, frame_rx_napi, buff}")
    Reported-by: Maxim Mikityanskiy <maximmi at nvidia.com>
    Signed-off-by: Björn Töpel <bjorn.topel at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Maxim Mikityanskiy <maximmi at nvidia.com>
    Link: https://lore.kernel.org/bpf/20201127171726.123627-1-bjorn.topel@gmail.com

diff --git a/net/core/xdp.c b/net/core/xdp.c
index 48aba933a5a8..491ad569a79c 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -335,11 +335,10 @@ EXPORT_SYMBOL_GPL(xdp_rxq_info_reg_mem_model);
  * scenarios (e.g. queue full), it is possible to return the xdp_frame
  * while still leveraging this protection.  The @napi_direct boolean
  * is used for those calls sites.  Thus, allowing for faster recycling
- * of xdp_frames/pages in those cases. This path is never used by the
- * MEM_TYPE_XSK_BUFF_POOL memory type, so it's explicitly not part of
- * the switch-statement.
+ * of xdp_frames/pages in those cases.
  */
-static void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct)
+static void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
+			 struct xdp_buff *xdp)
 {
 	struct xdp_mem_allocator *xa;
 	struct page *page;
@@ -361,6 +360,10 @@ static void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct)
 		page = virt_to_page(data); /* Assumes order0 page*/
 		put_page(page);
 		break;
+	case MEM_TYPE_XSK_BUFF_POOL:
+		/* NB! Only valid from an xdp_buff! */
+		xsk_buff_free(xdp);
+		break;
 	default:
 		/* Not possible, checked in xdp_rxq_info_reg_mem_model() */
 		WARN(1, "Incorrect XDP memory type (%d) usage", mem->type);
@@ -370,19 +373,19 @@ static void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct)
 
 void xdp_return_frame(struct xdp_frame *xdpf)
 {
-	__xdp_return(xdpf->data, &xdpf->mem, false);
+	__xdp_return(xdpf->data, &xdpf->mem, false, NULL);
 }
 EXPORT_SYMBOL_GPL(xdp_return_frame);
 
 void xdp_return_frame_rx_napi(struct xdp_frame *xdpf)
 {
-	__xdp_return(xdpf->data, &xdpf->mem, true);
+	__xdp_return(xdpf->data, &xdpf->mem, true, NULL);
 }
 EXPORT_SYMBOL_GPL(xdp_return_frame_rx_napi);
 
 void xdp_return_buff(struct xdp_buff *xdp)
 {
-	__xdp_return(xdp->data, &xdp->rxq->mem, true);
+	__xdp_return(xdp->data, &xdp->rxq->mem, true, xdp);
 }
 
 /* Only called for MEM_TYPE_PAGE_POOL see xdp.h */
commit 271e0c9dce1b02a825b3cc1a7aa1fab7c381d44b
Author: Libo Chen <libo.chen at oracle.com>
Date:   Fri Nov 20 18:12:43 2020 -0800

    ktest.pl: Fix incorrect reboot for grub2bls
    
    This issue was first noticed when I was testing different kernels on
    Oracle Linux 8 which as Fedora 30+ adopts BLS as default. Even though a
    kernel entry was added successfully and the index of that kernel entry was
    retrieved correctly, ktest still wouldn't reboot the system into
    user-specified kernel.
    
    The bug was spotted in subroutine reboot_to where the if-statement never
    checks for REBOOT_TYPE "grub2bls", therefore the desired entry will not be
    set for the next boot.
    
    Add a check for "grub2bls" so that $grub_reboot $grub_number can
    be run before a reboot if REBOOT_TYPE is "grub2bls" then we can boot to
    the correct kernel.
    
    Link: https://lkml.kernel.org/r/20201121021243.1532477-1-libo.chen@oracle.com
    
    Cc: stable at vger.kernel.org
    Fixes: ac2466456eaa ("ktest: introduce grub2bls REBOOT_TYPE option")
    Signed-off-by: Libo Chen <libo.chen at oracle.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index cb16d2aac51c..54188ee16c48 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -2040,7 +2040,7 @@ sub reboot_to {
 
     if ($reboot_type eq "grub") {
 	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
-    } elsif ($reboot_type eq "grub2") {
+    } elsif (($reboot_type eq "grub2") or ($reboot_type eq "grub2bls")) {
 	run_ssh "$grub_reboot $grub_number";
     } elsif ($reboot_type eq "syslinux") {
 	run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
commit 212253367dc7b49ed3fc194ce71b0992eacaecf2
Author: Paulo Alcantara <pc at cjr.nz>
Date:   Sat Nov 28 16:54:02 2020 -0300

    cifs: fix potential use-after-free in cifs_echo_request()
    
    This patch fixes a potential use-after-free bug in
    cifs_echo_request().
    
    For instance,
    
      thread 1
      --------
      cifs_demultiplex_thread()
        clean_demultiplex_info()
          kfree(server)
    
      thread 2 (workqueue)
      --------
      apic_timer_interrupt()
        smp_apic_timer_interrupt()
          irq_exit()
            __do_softirq()
              run_timer_softirq()
                call_timer_fn()
                  cifs_echo_request() <- use-after-free in server ptr
    
    Signed-off-by: Paulo Alcantara (SUSE) <pc at cjr.nz>
    CC: Stable <stable at vger.kernel.org>
    Reviewed-by: Ronnie Sahlberg <lsahlber at redhat.com>
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index c38156f324dd..28c1459fb0fc 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -876,6 +876,8 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
 	list_del_init(&server->tcp_ses_list);
 	spin_unlock(&cifs_tcp_ses_lock);
 
+	cancel_delayed_work_sync(&server->echo);
+
 	spin_lock(&GlobalMid_Lock);
 	server->tcpStatus = CifsExiting;
 	spin_unlock(&GlobalMid_Lock);
commit 6988a619f5b79e4efadea6e19dcfe75fbcd350b5
Author: Paulo Alcantara <pc at cjr.nz>
Date:   Sat Nov 28 15:57:06 2020 -0300

    cifs: allow syscalls to be restarted in __smb_send_rqst()
    
    A customer has reported that several files in their multi-threaded app
    were left with size of 0 because most of the read(2) calls returned
    -EINTR and they assumed no bytes were read.  Obviously, they could
    have fixed it by simply retrying on -EINTR.
    
    We noticed that most of the -EINTR on read(2) were due to real-time
    signals sent by glibc to process wide credential changes (SIGRT_1),
    and its signal handler had been established with SA_RESTART, in which
    case those calls could have been automatically restarted by the
    kernel.
    
    Let the kernel decide to whether or not restart the syscalls when
    there is a signal pending in __smb_send_rqst() by returning
    -ERESTARTSYS.  If it can't, it will return -EINTR anyway.
    
    Signed-off-by: Paulo Alcantara (SUSE) <pc at cjr.nz>
    CC: Stable <stable at vger.kernel.org>
    Reviewed-by: Ronnie Sahlberg <lsahlber at redhat.com>
    Reviewed-by: Pavel Shilovsky <pshilov at microsoft.com>
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index e27e255d40dd..36b2ece43403 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -339,8 +339,8 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
 		return -EAGAIN;
 
 	if (signal_pending(current)) {
-		cifs_dbg(FYI, "signal is pending before sending any data\n");
-		return -EINTR;
+		cifs_dbg(FYI, "signal pending before send request\n");
+		return -ERESTARTSYS;
 	}
 
 	/* cork the socket */
commit 8785f51a17083eee7c37606079c6447afc6ba102
Author: Andrea Righi <andrea.righi at canonical.com>
Date:   Sat Nov 28 10:15:17 2020 +0100

    ring-buffer: Set the right timestamp in the slow path of __rb_reserve_next()
    
    In the slow path of __rb_reserve_next() a nested event(s) can happen
    between evaluating the timestamp delta of the current event and updating
    write_stamp via local_cmpxchg(); in this case the delta is not valid
    anymore and it should be set to 0 (same timestamp as the interrupting
    event), since the event that we are currently processing is not the last
    event in the buffer.
    
    Link: https://lkml.kernel.org/r/X8IVJcp1gRE+FJCJ@xps-13-7390
    
    Cc: Ingo Molnar <mingo at redhat.com>
    Cc: Masami Hiramatsu <mhiramat at kernel.org>
    Cc: stable at vger.kernel.org
    Link: https://lwn.net/Articles/831207
    Fixes: a389d86f7fd0 ("ring-buffer: Have nested events still record running time stamp")
    Signed-off-by: Andrea Righi <andrea.righi at canonical.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index bccaf88d3706..35d91b20d47a 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -3287,11 +3287,11 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
 		ts = rb_time_stamp(cpu_buffer->buffer);
 		barrier();
  /*E*/		if (write == (local_read(&tail_page->write) & RB_WRITE_MASK) &&
-		    info->after < ts) {
+		    info->after < ts &&
+		    rb_time_cmpxchg(&cpu_buffer->write_stamp,
+				    info->after, ts)) {
 			/* Nothing came after this event between C and E */
 			info->delta = ts - info->after;
-			(void)rb_time_cmpxchg(&cpu_buffer->write_stamp,
-					      info->after, ts);
 			info->ts = ts;
 		} else {
 			/*
commit 55ea4cf403800af2ce6b125bc3d853117e0c0456
Author: Steven Rostedt (VMware) <rostedt at goodmis.org>
Date:   Fri Nov 27 11:20:58 2020 -0500

    ring-buffer: Update write stamp with the correct ts
    
    The write stamp, used to calculate deltas between events, was updated with
    the stale "ts" value in the "info" structure, and not with the updated "ts"
    variable. This caused the deltas between events to be inaccurate, and when
    crossing into a new sub buffer, had time go backwards.
    
    Link: https://lkml.kernel.org/r/20201124223917.795844-1-elavila@google.com
    
    Cc: stable at vger.kernel.org
    Fixes: a389d86f7fd09 ("ring-buffer: Have nested events still record running time stamp")
    Reported-by: "J. Avila" <elavila at google.com>
    Tested-by: Daniel Mentz <danielmentz at google.com>
    Tested-by: Will McVicker <willmcvicker at google.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index dc83b3fa9fe7..bccaf88d3706 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -3291,7 +3291,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
 			/* Nothing came after this event between C and E */
 			info->delta = ts - info->after;
 			(void)rb_time_cmpxchg(&cpu_buffer->write_stamp,
-					      info->after, info->ts);
+					      info->after, ts);
 			info->ts = ts;
 		} else {
 			/*
commit 2d280bc8930ba9ed1705cfd548c6c8924949eaf1
Author: Pavel Begunkov <asml.silence at gmail.com>
Date:   Sun Nov 29 18:33:32 2020 +0000

    io_uring: fix recvmsg setup with compat buf-select
    
    __io_compat_recvmsg_copy_hdr() with REQ_F_BUFFER_SELECT reads out iov
    len but never assigns it to iov/fast_iov, leaving sr->len with garbage.
    Hopefully, following io_buffer_select() truncates it to the selected
    buffer size, but the value is still may be under what was specified.
    
    Cc: <stable at vger.kernel.org> # 5.7
    Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 1023f7b44cea..a2a7c65a77aa 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -4499,7 +4499,8 @@ static int __io_compat_recvmsg_copy_hdr(struct io_kiocb *req,
 			return -EFAULT;
 		if (clen < 0)
 			return -EINVAL;
-		sr->len = iomsg->iov[0].iov_len;
+		sr->len = clen;
+		iomsg->iov[0].iov_len = clen;
 		iomsg->iov = NULL;
 	} else {
 		ret = __import_iovec(READ, (struct iovec __user *)uiov, len,
commit 9e5344e0ffc33f4fee899f98b6939a0682b1d9c3
Author: Vincenzo Frascino <vincenzo.frascino at arm.com>
Date:   Mon Nov 30 17:07:09 2020 +0000

    arm64: mte: Fix typo in macro definition
    
    UL in the definition of SYS_TFSR_EL1_TF1 was misspelled causing
    compilation issues when trying to implement in kernel MTE async
    mode.
    
    Fix the macro correcting the typo.
    
    Note: MTE async mode will be introduced with a future series.
    
    Fixes: c058b1c4a5ea ("arm64: mte: system register definitions")
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Signed-off-by: Vincenzo Frascino <vincenzo.frascino at arm.com>
    Acked-by: Catalin Marinas <catalin.marinas at arm.com>
    Link: https://lore.kernel.org/r/20201130170709.22309-1-vincenzo.frascino@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index 174817ba119c..c8ab9900293f 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -983,7 +983,7 @@
 #define SYS_TFSR_EL1_TF0_SHIFT	0
 #define SYS_TFSR_EL1_TF1_SHIFT	1
 #define SYS_TFSR_EL1_TF0	(UL(1) << SYS_TFSR_EL1_TF0_SHIFT)
-#define SYS_TFSR_EL1_TF1	(UK(2) << SYS_TFSR_EL1_TF1_SHIFT)
+#define SYS_TFSR_EL1_TF1	(UL(1) << SYS_TFSR_EL1_TF1_SHIFT)
 
 /* Safe value for MPIDR_EL1: Bit31:RES1, Bit30:U:0, Bit24:MT:0 */
 #define SYS_MPIDR_SAFE_VAL	(BIT(31))
commit 63e2fffa59a9dd91e443b08832656399fd80b7f0
Author: Trond Myklebust <trond.myklebust at hammerspace.com>
Date:   Sun Nov 15 17:37:37 2020 -0500

    pNFS/flexfiles: Fix array overflow when flexfiles mirroring is enabled
    
    If the flexfiles mirroring is enabled, then the read code expects to be
    able to set pgio->pg_mirror_idx to point to the data server that is
    being used for this particular read. However it does not change the
    pg_mirror_count because we only need to send a single read.
    
    Signed-off-by: Trond Myklebust <trond.myklebust at hammerspace.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c
index a163533446fa..24bf5797f88a 100644
--- a/fs/nfs/flexfilelayout/flexfilelayout.c
+++ b/fs/nfs/flexfilelayout/flexfilelayout.c
@@ -838,7 +838,7 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
 	struct nfs_pgio_mirror *pgm;
 	struct nfs4_ff_layout_mirror *mirror;
 	struct nfs4_pnfs_ds *ds;
-	u32 ds_idx, i;
+	u32 ds_idx;
 
 retry:
 	ff_layout_pg_check_layout(pgio, req);
@@ -864,11 +864,9 @@ retry:
 		goto retry;
 	}
 
-	for (i = 0; i < pgio->pg_mirror_count; i++) {
-		mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i);
-		pgm = &pgio->pg_mirrors[i];
-		pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
-	}
+	mirror = FF_LAYOUT_COMP(pgio->pg_lseg, ds_idx);
+	pgm = &pgio->pg_mirrors[0];
+	pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
 
 	pgio->pg_mirror_idx = ds_idx;
 
@@ -985,6 +983,21 @@ out:
 	return 1;
 }
 
+static u32
+ff_layout_pg_set_mirror_write(struct nfs_pageio_descriptor *desc, u32 idx)
+{
+	u32 old = desc->pg_mirror_idx;
+
+	desc->pg_mirror_idx = idx;
+	return old;
+}
+
+static struct nfs_pgio_mirror *
+ff_layout_pg_get_mirror_write(struct nfs_pageio_descriptor *desc, u32 idx)
+{
+	return &desc->pg_mirrors[idx];
+}
+
 static const struct nfs_pageio_ops ff_layout_pg_read_ops = {
 	.pg_init = ff_layout_pg_init_read,
 	.pg_test = pnfs_generic_pg_test,
@@ -998,6 +1011,8 @@ static const struct nfs_pageio_ops ff_layout_pg_write_ops = {
 	.pg_doio = pnfs_generic_pg_writepages,
 	.pg_get_mirror_count = ff_layout_pg_get_mirror_count_write,
 	.pg_cleanup = pnfs_generic_pg_cleanup,
+	.pg_get_mirror = ff_layout_pg_get_mirror_write,
+	.pg_set_mirror = ff_layout_pg_set_mirror_write,
 };
 
 static void ff_layout_reset_write(struct nfs_pgio_header *hdr, bool retry_pnfs)
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 6985cacf4700..78c9c4bdef2b 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -31,13 +31,29 @@
 static struct kmem_cache *nfs_page_cachep;
 static const struct rpc_call_ops nfs_pgio_common_ops;
 
+static struct nfs_pgio_mirror *
+nfs_pgio_get_mirror(struct nfs_pageio_descriptor *desc, u32 idx)
+{
+	if (desc->pg_ops->pg_get_mirror)
+		return desc->pg_ops->pg_get_mirror(desc, idx);
+	return &desc->pg_mirrors[0];
+}
+
 struct nfs_pgio_mirror *
 nfs_pgio_current_mirror(struct nfs_pageio_descriptor *desc)
 {
-	return &desc->pg_mirrors[desc->pg_mirror_idx];
+	return nfs_pgio_get_mirror(desc, desc->pg_mirror_idx);
 }
 EXPORT_SYMBOL_GPL(nfs_pgio_current_mirror);
 
+static u32
+nfs_pgio_set_current_mirror(struct nfs_pageio_descriptor *desc, u32 idx)
+{
+	if (desc->pg_ops->pg_set_mirror)
+		return desc->pg_ops->pg_set_mirror(desc, idx);
+	return desc->pg_mirror_idx;
+}
+
 void nfs_pgheader_init(struct nfs_pageio_descriptor *desc,
 		       struct nfs_pgio_header *hdr,
 		       void (*release)(struct nfs_pgio_header *hdr))
@@ -1259,7 +1275,7 @@ static void nfs_pageio_error_cleanup(struct nfs_pageio_descriptor *desc)
 		return;
 
 	for (midx = 0; midx < desc->pg_mirror_count; midx++) {
-		mirror = &desc->pg_mirrors[midx];
+		mirror = nfs_pgio_get_mirror(desc, midx);
 		desc->pg_completion_ops->error_cleanup(&mirror->pg_list,
 				desc->pg_error);
 	}
@@ -1293,12 +1309,12 @@ int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
 			goto out_failed;
 		}
 
-		desc->pg_mirror_idx = midx;
+		nfs_pgio_set_current_mirror(desc, midx);
 		if (!nfs_pageio_add_request_mirror(desc, dupreq))
 			goto out_cleanup_subreq;
 	}
 
-	desc->pg_mirror_idx = 0;
+	nfs_pgio_set_current_mirror(desc, 0);
 	if (!nfs_pageio_add_request_mirror(desc, req))
 		goto out_failed;
 
@@ -1320,10 +1336,12 @@ out_failed:
 static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc,
 				       u32 mirror_idx)
 {
-	struct nfs_pgio_mirror *mirror = &desc->pg_mirrors[mirror_idx];
-	u32 restore_idx = desc->pg_mirror_idx;
+	struct nfs_pgio_mirror *mirror;
+	u32 restore_idx;
+
+	restore_idx = nfs_pgio_set_current_mirror(desc, mirror_idx);
+	mirror = nfs_pgio_current_mirror(desc);
 
-	desc->pg_mirror_idx = mirror_idx;
 	for (;;) {
 		nfs_pageio_doio(desc);
 		if (desc->pg_error < 0 || !mirror->pg_recoalesce)
@@ -1331,7 +1349,7 @@ static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc,
 		if (!nfs_do_recoalesce(desc))
 			break;
 	}
-	desc->pg_mirror_idx = restore_idx;
+	nfs_pgio_set_current_mirror(desc, restore_idx);
 }
 
 /*
@@ -1405,7 +1423,7 @@ void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *desc, pgoff_t index)
 	u32 midx;
 
 	for (midx = 0; midx < desc->pg_mirror_count; midx++) {
-		mirror = &desc->pg_mirrors[midx];
+		mirror = nfs_pgio_get_mirror(desc, midx);
 		if (!list_empty(&mirror->pg_list)) {
 			prev = nfs_list_entry(mirror->pg_list.prev);
 			if (index != prev->wb_index + 1) {
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index c32c15216da3..f0373a6cb5fb 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -55,6 +55,7 @@ struct nfs_page {
 	unsigned short		wb_nio;		/* Number of I/O attempts */
 };
 
+struct nfs_pgio_mirror;
 struct nfs_pageio_descriptor;
 struct nfs_pageio_ops {
 	void	(*pg_init)(struct nfs_pageio_descriptor *, struct nfs_page *);
@@ -64,6 +65,9 @@ struct nfs_pageio_ops {
 	unsigned int	(*pg_get_mirror_count)(struct nfs_pageio_descriptor *,
 				       struct nfs_page *);
 	void	(*pg_cleanup)(struct nfs_pageio_descriptor *);
+	struct nfs_pgio_mirror *
+		(*pg_get_mirror)(struct nfs_pageio_descriptor *, u32);
+	u32	(*pg_set_mirror)(struct nfs_pageio_descriptor *, u32);
 };
 
 struct nfs_rw_ops {
commit a71464d0b9305dc5db6b01392c7218b81480b00f
Merge: f0992098cadb 5555b7c56bde
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Mon Nov 30 15:25:12 2020 +0100

    Merge tag 'misc-habanalabs-fixes-2020-11-30' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux into char-misc-linus
    
    Oded writes:
    
    This tag contains two bug fixes for v5.10-rc7:
    
    - Memory leak every time a user closes the file-descriptor of the device.
      The driver didn't always free all the VA range structures it maintains
      per user.
    
    - Memory leak every time the driver was removed. The device structure was
      not "put" at the device's teardown function in the driver.
    
    * tag 'misc-habanalabs-fixes-2020-11-30' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux:
      habanalabs: put devices before driver removal
      habanalabs: free host huge va_range if not used

commit d3f31301894d1b70d3dc3e8fa5ef3165878338ff
Merge: 7cc01c445da8 600c0849cf86
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Mon Nov 30 15:23:28 2020 +0100

    Merge tag 'thunderbolt-for-v5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt into usb-linus
    
    Mika writes:
    
    thunderbolt: Fix for v5.10-rc7
    
    This includes a single fix for use-after-free bug after resume from
    hibernation.
    
    * tag 'thunderbolt-for-v5.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt:
      thunderbolt: Fix use-after-free in remove_unplugged_switch()

commit 2a9b3e6ac69a8bf177d8496a11e749e2dc72fa22
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:50 2020 +0000

    arm64: entry: fix EL1 debug transitions
    
    In debug_exception_enter() and debug_exception_exit() we trace hardirqs
    on/off while RCU isn't guaranteed to be watching, and we don't save and
    restore the hardirq state, and so may return with this having changed.
    
    Handle this appropriately with new entry/exit helpers which do the bare
    minimum to ensure this is appropriately maintained, without marking
    debug exceptions as NMIs. These are placed in entry-common.c with the
    other entry/exit helpers.
    
    In future we'll want to reconsider whether some debug exceptions should
    be NMIs, but this will require a significant refactoring, and for now
    this should prevent issues with lockdep and RCU.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marins <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-12-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 6d70be0d3e8f..70e0a7591245 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -150,6 +150,30 @@ static void noinstr el1_inv(struct pt_regs *regs, unsigned long esr)
 	exit_to_kernel_mode(regs);
 }
 
+static void noinstr arm64_enter_el1_dbg(struct pt_regs *regs)
+{
+	regs->lockdep_hardirqs = lockdep_hardirqs_enabled();
+
+	lockdep_hardirqs_off(CALLER_ADDR0);
+	rcu_nmi_enter();
+
+	trace_hardirqs_off_finish();
+}
+
+static void noinstr arm64_exit_el1_dbg(struct pt_regs *regs)
+{
+	bool restore = regs->lockdep_hardirqs;
+
+	if (restore) {
+		trace_hardirqs_on_prepare();
+		lockdep_hardirqs_on_prepare(CALLER_ADDR0);
+	}
+
+	rcu_nmi_exit();
+	if (restore)
+		lockdep_hardirqs_on(CALLER_ADDR0);
+}
+
 static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
@@ -162,7 +186,9 @@ static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
 	if (system_uses_irq_prio_masking())
 		gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 
+	arm64_enter_el1_dbg(regs);
 	do_debug_exception(far, esr, regs);
+	arm64_exit_el1_dbg(regs);
 }
 
 static void noinstr el1_fpac(struct pt_regs *regs, unsigned long esr)
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 1f450b784d2c..795d224f184f 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -789,23 +789,6 @@ void __init hook_debug_fault_code(int nr,
  */
 static void debug_exception_enter(struct pt_regs *regs)
 {
-	if (!user_mode(regs)) {
-		/*
-		 * Tell lockdep we disabled irqs in entry.S. Do nothing if they were
-		 * already disabled to preserve the last enabled/disabled addresses.
-		 */
-		if (interrupts_enabled(regs))
-			trace_hardirqs_off();
-
-		/*
-		 * We might have interrupted pretty much anything.  In
-		 * fact, if we're a debug exception, we can even interrupt
-		 * NMI processing. We don't want this code makes in_nmi()
-		 * to return true, but we need to notify RCU.
-		 */
-		rcu_nmi_enter();
-	}
-
 	preempt_disable();
 
 	/* This code is a bit fragile.  Test it. */
@@ -816,14 +799,6 @@ NOKPROBE_SYMBOL(debug_exception_enter);
 static void debug_exception_exit(struct pt_regs *regs)
 {
 	preempt_enable_no_resched();
-
-	if (user_mode(regs))
-		return;
-
-	rcu_nmi_exit();
-
-	if (interrupts_enabled(regs))
-		trace_hardirqs_on();
 }
 NOKPROBE_SYMBOL(debug_exception_exit);
 
commit f0cd5ac1e4c53cb691b3ed3cda1031e1c42153e2
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:49 2020 +0000

    arm64: entry: fix NMI {user, kernel}->kernel transitions
    
    Exceptions which can be taken at (almost) any time are consdiered to be
    NMIs. On arm64 that includes:
    
    * SDEI events
    * GICv3 Pseudo-NMIs
    * Kernel stack overflows
    * Unexpected/unhandled exceptions
    
    ... but currently debug exceptions (BRKs, breakpoints, watchpoints,
    single-step) are not considered NMIs.
    
    As these can be taken at any time, kernel features (lockdep, RCU,
    ftrace) may not be in a consistent kernel state. For example, we may
    take an NMI from the idle code or partway through an entry/exit path.
    
    While nmi_enter() and nmi_exit() handle most of this state, notably they
    don't save/restore the lockdep state across an NMI being taken and
    handled. When interrupts are enabled and an NMI is taken, lockdep may
    see interrupts become disabled within the NMI code, but not see
    interrupts become enabled when returning from the NMI, leaving lockdep
    believing interrupts are disabled when they are actually disabled.
    
    The x86 code handles this in idtentry_{enter,exit}_nmi(), which will
    shortly be moved to the generic entry code. As we can't use either yet,
    we copy the x86 approach in arm64-specific helpers. All the NMI
    entrypoints are marked as noinstr to prevent any instrumentation
    handling code being invoked before the state has been corrected.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-11-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h
index d579b2e6db7a..0756191f44f6 100644
--- a/arch/arm64/include/asm/exception.h
+++ b/arch/arm64/include/asm/exception.h
@@ -35,6 +35,8 @@ asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs);
 asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs);
 asmlinkage void enter_from_user_mode(void);
 asmlinkage void exit_to_user_mode(void);
+void arm64_enter_nmi(struct pt_regs *regs);
+void arm64_exit_nmi(struct pt_regs *regs);
 void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
 void do_undefinstr(struct pt_regs *regs);
 void do_bti(struct pt_regs *regs);
diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 86622d8dd0d8..6d70be0d3e8f 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -63,10 +63,40 @@ static void noinstr exit_to_kernel_mode(struct pt_regs *regs)
 	}
 }
 
+void noinstr arm64_enter_nmi(struct pt_regs *regs)
+{
+	regs->lockdep_hardirqs = lockdep_hardirqs_enabled();
+
+	__nmi_enter();
+	lockdep_hardirqs_off(CALLER_ADDR0);
+	lockdep_hardirq_enter();
+	rcu_nmi_enter();
+
+	trace_hardirqs_off_finish();
+	ftrace_nmi_enter();
+}
+
+void noinstr arm64_exit_nmi(struct pt_regs *regs)
+{
+	bool restore = regs->lockdep_hardirqs;
+
+	ftrace_nmi_exit();
+	if (restore) {
+		trace_hardirqs_on_prepare();
+		lockdep_hardirqs_on_prepare(CALLER_ADDR0);
+	}
+
+	rcu_nmi_exit();
+	lockdep_hardirq_exit();
+	if (restore)
+		lockdep_hardirqs_on(CALLER_ADDR0);
+	__nmi_exit();
+}
+
 asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs)
 {
 	if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
-		nmi_enter();
+		arm64_enter_nmi(regs);
 	else
 		enter_from_kernel_mode(regs);
 }
@@ -74,7 +104,7 @@ asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs)
 asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs)
 {
 	if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
-		nmi_exit();
+		arm64_exit_nmi(regs);
 	else
 		exit_to_kernel_mode(regs);
 }
diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c
index 7689f2031c0c..793c46d6a447 100644
--- a/arch/arm64/kernel/sdei.c
+++ b/arch/arm64/kernel/sdei.c
@@ -10,6 +10,7 @@
 #include <linux/uaccess.h>
 
 #include <asm/alternative.h>
+#include <asm/exception.h>
 #include <asm/kprobes.h>
 #include <asm/mmu.h>
 #include <asm/ptrace.h>
@@ -223,16 +224,16 @@ static __kprobes unsigned long _sdei_handler(struct pt_regs *regs,
 }
 
 
-asmlinkage __kprobes notrace unsigned long
+asmlinkage noinstr unsigned long
 __sdei_handler(struct pt_regs *regs, struct sdei_registered_event *arg)
 {
 	unsigned long ret;
 
-	nmi_enter();
+	arm64_enter_nmi(regs);
 
 	ret = _sdei_handler(regs, arg);
 
-	nmi_exit();
+	arm64_exit_nmi(regs);
 
 	return ret;
 }
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 580c60afc39a..2059d8f43f55 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -34,6 +34,7 @@
 #include <asm/daifflags.h>
 #include <asm/debug-monitors.h>
 #include <asm/esr.h>
+#include <asm/exception.h>
 #include <asm/extable.h>
 #include <asm/insn.h>
 #include <asm/kprobes.h>
@@ -753,8 +754,10 @@ const char *esr_get_class_string(u32 esr)
  * bad_mode handles the impossible case in the exception vector. This is always
  * fatal.
  */
-asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr)
+asmlinkage void notrace bad_mode(struct pt_regs *regs, int reason, unsigned int esr)
 {
+	arm64_enter_nmi(regs);
+
 	console_verbose();
 
 	pr_crit("Bad mode in %s handler detected on CPU%d, code 0x%08x -- %s\n",
@@ -786,7 +789,7 @@ void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr)
 DEFINE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], overflow_stack)
 	__aligned(16);
 
-asmlinkage void handle_bad_stack(struct pt_regs *regs)
+asmlinkage void noinstr handle_bad_stack(struct pt_regs *regs)
 {
 	unsigned long tsk_stk = (unsigned long)current->stack;
 	unsigned long irq_stk = (unsigned long)this_cpu_read(irq_stack_ptr);
@@ -794,6 +797,8 @@ asmlinkage void handle_bad_stack(struct pt_regs *regs)
 	unsigned int esr = read_sysreg(esr_el1);
 	unsigned long far = read_sysreg(far_el1);
 
+	arm64_enter_nmi(regs);
+
 	console_verbose();
 	pr_emerg("Insufficient stack space to handle exception!");
 
@@ -865,15 +870,15 @@ bool arm64_is_fatal_ras_serror(struct pt_regs *regs, unsigned int esr)
 	}
 }
 
-asmlinkage void do_serror(struct pt_regs *regs, unsigned int esr)
+asmlinkage void noinstr do_serror(struct pt_regs *regs, unsigned int esr)
 {
-	nmi_enter();
+	arm64_enter_nmi(regs);
 
 	/* non-RAS errors are not containable */
 	if (!arm64_is_ras_serror(esr) || arm64_is_fatal_ras_serror(regs, esr))
 		arm64_serror_panic(regs, esr);
 
-	nmi_exit();
+	arm64_exit_nmi(regs);
 }
 
 /* GENERIC_BUG traps */
commit 7cd1ea1010acbede7eb87b6abb6198921fb36957
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:48 2020 +0000

    arm64: entry: fix non-NMI kernel<->kernel transitions
    
    There are periods in kernel mode when RCU is not watching and/or the
    scheduler tick is disabled, but we can still take exceptions such as
    interrupts. The arm64 exception handlers do not account for this, and
    it's possible that RCU is not watching while an exception handler runs.
    
    The x86/generic entry code handles this by ensuring that all (non-NMI)
    kernel exception handlers call irqentry_enter() and irqentry_exit(),
    which handle RCU, lockdep, and IRQ flag tracing. We can't yet move to
    the generic entry code, and already hadnle the user<->kernel transitions
    elsewhere, so we add new kernel<->kernel transition helpers alog the
    lines of the generic entry code.
    
    Since we now track interrupts becoming masked when an exception is
    taken, local_daif_inherit() is modified to track interrupts becoming
    re-enabled when the original context is inherited. To balance the
    entry/exit paths, each handler masks all DAIF exceptions before
    exit_to_kernel_mode().
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-10-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/daifflags.h b/arch/arm64/include/asm/daifflags.h
index ec213b4a1650..1c26d7baa67f 100644
--- a/arch/arm64/include/asm/daifflags.h
+++ b/arch/arm64/include/asm/daifflags.h
@@ -128,6 +128,9 @@ static inline void local_daif_inherit(struct pt_regs *regs)
 {
 	unsigned long flags = regs->pstate & DAIF_MASK;
 
+	if (interrupts_enabled(regs))
+		trace_hardirqs_on();
+
 	/*
 	 * We can't use local_daif_restore(regs->pstate) here as
 	 * system_has_prio_mask_debugging() won't restore the I bit if it can
diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 49d1c1dd9baf..86622d8dd0d8 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -17,12 +17,58 @@
 #include <asm/mmu.h>
 #include <asm/sysreg.h>
 
+/*
+ * This is intended to match the logic in irqentry_enter(), handling the kernel
+ * mode transitions only.
+ */
+static void noinstr enter_from_kernel_mode(struct pt_regs *regs)
+{
+	regs->exit_rcu = false;
+
+	if (!IS_ENABLED(CONFIG_TINY_RCU) && is_idle_task(current)) {
+		lockdep_hardirqs_off(CALLER_ADDR0);
+		rcu_irq_enter();
+		trace_hardirqs_off_finish();
+
+		regs->exit_rcu = true;
+		return;
+	}
+
+	lockdep_hardirqs_off(CALLER_ADDR0);
+	rcu_irq_enter_check_tick();
+	trace_hardirqs_off_finish();
+}
+
+/*
+ * This is intended to match the logic in irqentry_exit(), handling the kernel
+ * mode transitions only, and with preemption handled elsewhere.
+ */
+static void noinstr exit_to_kernel_mode(struct pt_regs *regs)
+{
+	lockdep_assert_irqs_disabled();
+
+	if (interrupts_enabled(regs)) {
+		if (regs->exit_rcu) {
+			trace_hardirqs_on_prepare();
+			lockdep_hardirqs_on_prepare(CALLER_ADDR0);
+			rcu_irq_exit();
+			lockdep_hardirqs_on(CALLER_ADDR0);
+			return;
+		}
+
+		trace_hardirqs_on();
+	} else {
+		if (regs->exit_rcu)
+			rcu_irq_exit();
+	}
+}
+
 asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs)
 {
 	if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
 		nmi_enter();
-
-	trace_hardirqs_off();
+	else
+		enter_from_kernel_mode(regs);
 }
 
 asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs)
@@ -30,36 +76,48 @@ asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs)
 	if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
 		nmi_exit();
 	else
-		trace_hardirqs_on();
+		exit_to_kernel_mode(regs);
 }
 
 static void noinstr el1_abort(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
+	enter_from_kernel_mode(regs);
 	local_daif_inherit(regs);
 	far = untagged_addr(far);
 	do_mem_abort(far, esr, regs);
+	local_daif_mask();
+	exit_to_kernel_mode(regs);
 }
 
 static void noinstr el1_pc(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
+	enter_from_kernel_mode(regs);
 	local_daif_inherit(regs);
 	do_sp_pc_abort(far, esr, regs);
+	local_daif_mask();
+	exit_to_kernel_mode(regs);
 }
 
 static void noinstr el1_undef(struct pt_regs *regs)
 {
+	enter_from_kernel_mode(regs);
 	local_daif_inherit(regs);
 	do_undefinstr(regs);
+	local_daif_mask();
+	exit_to_kernel_mode(regs);
 }
 
 static void noinstr el1_inv(struct pt_regs *regs, unsigned long esr)
 {
+	enter_from_kernel_mode(regs);
 	local_daif_inherit(regs);
 	bad_mode(regs, 0, esr);
+	local_daif_mask();
+	exit_to_kernel_mode(regs);
 }
 
 static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
@@ -79,8 +137,11 @@ static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
 
 static void noinstr el1_fpac(struct pt_regs *regs, unsigned long esr)
 {
+	enter_from_kernel_mode(regs);
 	local_daif_inherit(regs);
 	do_ptrauth_fault(regs, esr);
+	local_daif_mask();
+	exit_to_kernel_mode(regs);
 }
 
 asmlinkage void noinstr el1_sync_handler(struct pt_regs *regs)
commit 1ec2f2c05b2ab845d068bff29bd32dbfc6a6ad4c
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:47 2020 +0000

    arm64: ptrace: prepare for EL1 irq/rcu tracking
    
    Exceptions from EL1 may be taken when RCU isn't watching (e.g. in idle
    sequences), or when the lockdep hardirqs transiently out-of-sync with
    the hardware state (e.g. in the middle of local_irq_enable()). To
    correctly handle these cases, we'll need to save/restore this state
    across some exceptions taken from EL1.
    
    A series of subsequent patches will update EL1 exception handlers to
    handle this. In preparation for this, and to avoid dependencies between
    those patches, this patch adds two new fields to struct pt_regs so that
    exception handlers can track this state.
    
    Note that this is placed in pt_regs as some entry/exit sequences such as
    el1_irq are invoked from assembly, which makes it very difficult to add
    a separate structure as with the irqentry_state used by x86. We can
    separate this once more of the exception logic is moved to C. While the
    fields only need to be bool, they are both made u64 to keep pt_regs
    16-byte aligned.
    
    There should be no functional change as a result of this patch.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-9-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h
index 997cf8c8cd52..28c85b87b8cd 100644
--- a/arch/arm64/include/asm/ptrace.h
+++ b/arch/arm64/include/asm/ptrace.h
@@ -193,6 +193,10 @@ struct pt_regs {
 	/* Only valid when ARM64_HAS_IRQ_PRIO_MASKING is enabled. */
 	u64 pmr_save;
 	u64 stackframe[2];
+
+	/* Only valid for some EL1 exceptions. */
+	u64 lockdep_hardirqs;
+	u64 exit_rcu;
 };
 
 static inline bool in_syscall(struct pt_regs const *regs)
commit 23529049c68423820487304f244144e0d576e85a
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:46 2020 +0000

    arm64: entry: fix non-NMI user<->kernel transitions
    
    When built with PROVE_LOCKING, NO_HZ_FULL, and CONTEXT_TRACKING_FORCE
    will WARN() at boot time that interrupts are enabled when we call
    context_tracking_user_enter(), despite the DAIF flags indicating that
    IRQs are masked.
    
    The problem is that we're not tracking IRQ flag changes accurately, and
    so lockdep believes interrupts are enabled when they are not (and
    vice-versa). We can shuffle things so to make this more accurate. For
    kernel->user transitions there are a number of constraints we need to
    consider:
    
    1) When we call __context_tracking_user_enter() HW IRQs must be disabled
       and lockdep must be up-to-date with this.
    
    2) Userspace should be treated as having IRQs enabled from the PoV of
       both lockdep and tracing.
    
    3) As context_tracking_user_enter() stops RCU from watching, we cannot
       use RCU after calling it.
    
    4) IRQ flag tracing and lockdep have state that must be manipulated
       before RCU is disabled.
    
    ... with similar constraints applying for user->kernel transitions, with
    the ordering reversed.
    
    The generic entry code has enter_from_user_mode() and
    exit_to_user_mode() helpers to handle this. We can't use those directly,
    so we add arm64 copies for now (without the instrumentation markers
    which aren't used on arm64). These replace the existing user_exit() and
    user_exit_irqoff() calls spread throughout handlers, and the exception
    unmasking is left as-is.
    
    Note that:
    
    * The accounting for debug exceptions from userspace now happens in
      el0_dbg() and ret_to_user(), so this is removed from
      debug_exception_enter() and debug_exception_exit(). As
      user_exit_irqoff() wakes RCU, the userspace-specific check is removed.
    
    * The accounting for syscalls now happens in el0_svc(),
      el0_svc_compat(), and ret_to_user(), so this is removed from
      el0_svc_common(). This does not adversely affect the workaround for
      erratum 1463225, as this does not depend on any of the state tracking.
    
    * In ret_to_user() we mask interrupts with local_daif_mask(), and so we
      need to inform lockdep and tracing. Here a trace_hardirqs_off() is
      sufficient and safe as we have not yet exited kernel context and RCU
      is usable.
    
    * As PROVE_LOCKING selects TRACE_IRQFLAGS, the ifdeferry in entry.S only
      needs to check for the latter.
    
    * EL0 SError handling will be dealt with in a subsequent patch, as this
      needs to be treated as an NMI.
    
    Prior to this patch, booting an appropriately-configured kernel would
    result in spats as below:
    
    | DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
    | WARNING: CPU: 2 PID: 1 at kernel/locking/lockdep.c:5280 check_flags.part.54+0x1dc/0x1f0
    | Modules linked in:
    | CPU: 2 PID: 1 Comm: init Not tainted 5.10.0-rc3 #3
    | Hardware name: linux,dummy-virt (DT)
    | pstate: 804003c5 (Nzcv DAIF +PAN -UAO -TCO BTYPE=--)
    | pc : check_flags.part.54+0x1dc/0x1f0
    | lr : check_flags.part.54+0x1dc/0x1f0
    | sp : ffff80001003bd80
    | x29: ffff80001003bd80 x28: ffff66ce801e0000
    | x27: 00000000ffffffff x26: 00000000000003c0
    | x25: 0000000000000000 x24: ffffc31842527258
    | x23: ffffc31842491368 x22: ffffc3184282d000
    | x21: 0000000000000000 x20: 0000000000000001
    | x19: ffffc318432ce000 x18: 0080000000000000
    | x17: 0000000000000000 x16: ffffc31840f18a78
    | x15: 0000000000000001 x14: ffffc3184285c810
    | x13: 0000000000000001 x12: 0000000000000000
    | x11: ffffc318415857a0 x10: ffffc318406614c0
    | x9 : ffffc318415857a0 x8 : ffffc31841f1d000
    | x7 : 647261685f706564 x6 : ffffc3183ff7c66c
    | x5 : ffff66ce801e0000 x4 : 0000000000000000
    | x3 : ffffc3183fe00000 x2 : ffffc31841500000
    | x1 : e956dc24146b3500 x0 : 0000000000000000
    | Call trace:
    |  check_flags.part.54+0x1dc/0x1f0
    |  lock_is_held_type+0x10c/0x188
    |  rcu_read_lock_sched_held+0x70/0x98
    |  __context_tracking_enter+0x310/0x350
    |  context_tracking_enter.part.3+0x5c/0xc8
    |  context_tracking_user_enter+0x6c/0x80
    |  finish_ret_to_user+0x2c/0x13cr
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-8-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h
index d69d53dd7be7..d579b2e6db7a 100644
--- a/arch/arm64/include/asm/exception.h
+++ b/arch/arm64/include/asm/exception.h
@@ -34,6 +34,7 @@ static inline u32 disr_to_esr(u64 disr)
 asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs);
 asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs);
 asmlinkage void enter_from_user_mode(void);
+asmlinkage void exit_to_user_mode(void);
 void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
 void do_undefinstr(struct pt_regs *regs);
 void do_bti(struct pt_regs *regs);
diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 920da254be1d..49d1c1dd9baf 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -119,15 +119,25 @@ asmlinkage void noinstr el1_sync_handler(struct pt_regs *regs)
 
 asmlinkage void noinstr enter_from_user_mode(void)
 {
+	lockdep_hardirqs_off(CALLER_ADDR0);
 	CT_WARN_ON(ct_state() != CONTEXT_USER);
 	user_exit_irqoff();
+	trace_hardirqs_off_finish();
+}
+
+asmlinkage void noinstr exit_to_user_mode(void)
+{
+	trace_hardirqs_on_prepare();
+	lockdep_hardirqs_on_prepare(CALLER_ADDR0);
+	user_enter_irqoff();
+	lockdep_hardirqs_on(CALLER_ADDR0);
 }
 
 static void noinstr el0_da(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	far = untagged_addr(far);
 	do_mem_abort(far, esr, regs);
@@ -145,35 +155,35 @@ static void noinstr el0_ia(struct pt_regs *regs, unsigned long esr)
 	if (!is_ttbr0_addr(far))
 		arm64_apply_bp_hardening();
 
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_mem_abort(far, esr, regs);
 }
 
 static void noinstr el0_fpsimd_acc(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_fpsimd_acc(esr, regs);
 }
 
 static void noinstr el0_sve_acc(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sve_acc(esr, regs);
 }
 
 static void noinstr el0_fpsimd_exc(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_fpsimd_exc(esr, regs);
 }
 
 static void noinstr el0_sys(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sysinstr(esr, regs);
 }
@@ -185,35 +195,35 @@ static void noinstr el0_pc(struct pt_regs *regs, unsigned long esr)
 	if (!is_ttbr0_addr(instruction_pointer(regs)))
 		arm64_apply_bp_hardening();
 
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sp_pc_abort(far, esr, regs);
 }
 
 static void noinstr el0_sp(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sp_pc_abort(regs->sp, esr, regs);
 }
 
 static void noinstr el0_undef(struct pt_regs *regs)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_undefinstr(regs);
 }
 
 static void noinstr el0_bti(struct pt_regs *regs)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_bti(regs);
 }
 
 static void noinstr el0_inv(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	bad_el0_sync(regs, 0, esr);
 }
@@ -226,7 +236,7 @@ static void noinstr el0_dbg(struct pt_regs *regs, unsigned long esr)
 	if (system_uses_irq_prio_masking())
 		gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 
-	user_exit_irqoff();
+	enter_from_user_mode();
 	do_debug_exception(far, esr, regs);
 	local_daif_restore(DAIF_PROCCTX_NOIRQ);
 }
@@ -236,12 +246,13 @@ static void noinstr el0_svc(struct pt_regs *regs)
 	if (system_uses_irq_prio_masking())
 		gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 
+	enter_from_user_mode();
 	do_el0_svc(regs);
 }
 
 static void noinstr el0_fpac(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_ptrauth_fault(regs, esr);
 }
@@ -302,7 +313,7 @@ asmlinkage void noinstr el0_sync_handler(struct pt_regs *regs)
 #ifdef CONFIG_COMPAT
 static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr)
 {
-	user_exit_irqoff();
+	enter_from_user_mode();
 	local_daif_restore(DAIF_PROCCTX);
 	do_cp15instr(esr, regs);
 }
@@ -312,6 +323,7 @@ static void noinstr el0_svc_compat(struct pt_regs *regs)
 	if (system_uses_irq_prio_masking())
 		gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 
+	enter_from_user_mode();
 	do_el0_svc_compat(regs);
 }
 
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 53e30750fc28..d72c818b019c 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -30,18 +30,18 @@
 #include <asm/unistd.h>
 
 /*
- * Context tracking subsystem.  Used to instrument transitions
- * between user and kernel mode.
+ * Context tracking and irqflag tracing need to instrument transitions between
+ * user and kernel mode.
  */
-	.macro ct_user_exit_irqoff
-#ifdef CONFIG_CONTEXT_TRACKING
+	.macro user_exit_irqoff
+#if defined(CONFIG_CONTEXT_TRACKING) || defined(CONFIG_TRACE_IRQFLAGS)
 	bl	enter_from_user_mode
 #endif
 	.endm
 
-	.macro ct_user_enter
-#ifdef CONFIG_CONTEXT_TRACKING
-	bl	context_tracking_user_enter
+	.macro user_enter_irqoff
+#if defined(CONFIG_CONTEXT_TRACKING) || defined(CONFIG_TRACE_IRQFLAGS)
+	bl	exit_to_user_mode
 #endif
 	.endm
 
@@ -298,9 +298,6 @@ alternative_if ARM64_HAS_IRQ_PRIO_MASKING
 alternative_else_nop_endif
 
 	ldp	x21, x22, [sp, #S_PC]		// load ELR, SPSR
-	.if	\el == 0
-	ct_user_enter
-	.endif
 
 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
 alternative_if_not ARM64_HAS_PAN
@@ -700,21 +697,14 @@ SYM_CODE_START_LOCAL_NOALIGN(el0_irq)
 	kernel_entry 0
 el0_irq_naked:
 	gic_prio_irq_setup pmr=x20, tmp=x0
-	ct_user_exit_irqoff
+	user_exit_irqoff
 	enable_da_f
 
-#ifdef CONFIG_TRACE_IRQFLAGS
-	bl	trace_hardirqs_off
-#endif
-
 	tbz	x22, #55, 1f
 	bl	do_el0_irq_bp_hardening
 1:
 	irq_handler
 
-#ifdef CONFIG_TRACE_IRQFLAGS
-	bl	trace_hardirqs_on
-#endif
 	b	ret_to_user
 SYM_CODE_END(el0_irq)
 
@@ -733,7 +723,7 @@ SYM_CODE_START_LOCAL(el0_error)
 el0_error_naked:
 	mrs	x25, esr_el1
 	gic_prio_kentry_setup tmp=x2
-	ct_user_exit_irqoff
+	user_exit_irqoff
 	enable_dbg
 	mov	x0, sp
 	mov	x1, x25
@@ -748,10 +738,14 @@ SYM_CODE_END(el0_error)
 SYM_CODE_START_LOCAL(ret_to_user)
 	disable_daif
 	gic_prio_kentry_setup tmp=x3
+#ifdef CONFIG_TRACE_IRQFLAGS
+	bl	trace_hardirqs_off
+#endif
 	ldr	x19, [tsk, #TSK_TI_FLAGS]
 	and	x2, x19, #_TIF_WORK_MASK
 	cbnz	x2, work_pending
 finish_ret_to_user:
+	user_enter_irqoff
 	/* Ignore asynchronous tag check faults in the uaccess routines */
 	clear_mte_async_tcf
 	enable_step_tsk x19, x2
@@ -767,9 +761,6 @@ work_pending:
 	mov	x0, sp				// 'regs'
 	mov	x1, x19
 	bl	do_notify_resume
-#ifdef CONFIG_TRACE_IRQFLAGS
-	bl	trace_hardirqs_on		// enabled while in userspace
-#endif
 	ldr	x19, [tsk, #TSK_TI_FLAGS]	// re-check for single-step
 	b	finish_ret_to_user
 SYM_CODE_END(ret_to_user)
diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c
index 13fe79f8e2db..f8f758e4a306 100644
--- a/arch/arm64/kernel/syscall.c
+++ b/arch/arm64/kernel/syscall.c
@@ -120,7 +120,6 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
 	 */
 
 	cortex_a76_erratum_1463225_svc_handler();
-	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 
 	if (system_supports_mte() && (flags & _TIF_MTE_ASYNC_FAULT)) {
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 1ee94002801f..1f450b784d2c 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -789,16 +789,14 @@ void __init hook_debug_fault_code(int nr,
  */
 static void debug_exception_enter(struct pt_regs *regs)
 {
-	/*
-	 * Tell lockdep we disabled irqs in entry.S. Do nothing if they were
-	 * already disabled to preserve the last enabled/disabled addresses.
-	 */
-	if (interrupts_enabled(regs))
-		trace_hardirqs_off();
+	if (!user_mode(regs)) {
+		/*
+		 * Tell lockdep we disabled irqs in entry.S. Do nothing if they were
+		 * already disabled to preserve the last enabled/disabled addresses.
+		 */
+		if (interrupts_enabled(regs))
+			trace_hardirqs_off();
 
-	if (user_mode(regs)) {
-		RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
-	} else {
 		/*
 		 * We might have interrupted pretty much anything.  In
 		 * fact, if we're a debug exception, we can even interrupt
@@ -819,8 +817,10 @@ static void debug_exception_exit(struct pt_regs *regs)
 {
 	preempt_enable_no_resched();
 
-	if (!user_mode(regs))
-		rcu_nmi_exit();
+	if (user_mode(regs))
+		return;
+
+	rcu_nmi_exit();
 
 	if (interrupts_enabled(regs))
 		trace_hardirqs_on();
commit 105fc3352077bba5faaf12cf39f7e3aad26fb70b
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:45 2020 +0000

    arm64: entry: move el1 irq/nmi logic to C
    
    In preparation for reworking the EL1 irq/nmi entry code, move the
    existing logic to C. We no longer need the asm_nmi_enter() and
    asm_nmi_exit() wrappers, so these are removed. The new C functions are
    marked noinstr, which prevents compiler instrumentation and runtime
    probing.
    
    In subsequent patches we'll want the new C helpers to be called in all
    cases, so we don't bother wrapping the calls with ifdeferry. Even when
    the new C functions are stubs the trivial calls are unlikely to have a
    measurable impact on the IRQ or NMI paths anyway.
    
    Prototypes are added to <asm/exception.h> as otherwise (in some
    configurations) GCC will complain about the lack of a forward
    declaration. We already do this for existing function, e.g.
    enter_from_user_mode().
    
    The new helpers are marked as noinstr (which prevents all
    instrumentation, tracing, and kprobes). Otherwise, there should be no
    functional change as a result of this patch.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-7-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h
index 99b9383cd036..d69d53dd7be7 100644
--- a/arch/arm64/include/asm/exception.h
+++ b/arch/arm64/include/asm/exception.h
@@ -31,6 +31,8 @@ static inline u32 disr_to_esr(u64 disr)
 	return esr;
 }
 
+asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs);
+asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs);
 asmlinkage void enter_from_user_mode(void);
 void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
 void do_undefinstr(struct pt_regs *regs);
diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 9a685e7686fe..920da254be1d 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -17,6 +17,22 @@
 #include <asm/mmu.h>
 #include <asm/sysreg.h>
 
+asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs)
+{
+	if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
+		nmi_enter();
+
+	trace_hardirqs_off();
+}
+
+asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs)
+{
+	if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
+		nmi_exit();
+	else
+		trace_hardirqs_on();
+}
+
 static void noinstr el1_abort(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 84aec600eeed..53e30750fc28 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -637,16 +637,8 @@ SYM_CODE_START_LOCAL_NOALIGN(el1_irq)
 	gic_prio_irq_setup pmr=x20, tmp=x1
 	enable_da_f
 
-#ifdef CONFIG_ARM64_PSEUDO_NMI
-	test_irqs_unmasked	res=x0, pmr=x20
-	cbz	x0, 1f
-	bl	asm_nmi_enter
-1:
-#endif
-
-#ifdef CONFIG_TRACE_IRQFLAGS
-	bl	trace_hardirqs_off
-#endif
+	mov	x0, sp
+	bl	enter_el1_irq_or_nmi
 
 	irq_handler
 
@@ -665,26 +657,8 @@ alternative_else_nop_endif
 1:
 #endif
 
-#ifdef CONFIG_ARM64_PSEUDO_NMI
-	/*
-	 * When using IRQ priority masking, we can get spurious interrupts while
-	 * PMR is set to GIC_PRIO_IRQOFF. An NMI might also have occurred in a
-	 * section with interrupts disabled. Skip tracing in those cases.
-	 */
-	test_irqs_unmasked	res=x0, pmr=x20
-	cbz	x0, 1f
-	bl	asm_nmi_exit
-1:
-#endif
-
-#ifdef CONFIG_TRACE_IRQFLAGS
-#ifdef CONFIG_ARM64_PSEUDO_NMI
-	test_irqs_unmasked	res=x0, pmr=x20
-	cbnz	x0, 1f
-#endif
-	bl	trace_hardirqs_on
-1:
-#endif
+	mov	x0, sp
+	bl	exit_el1_irq_or_nmi
 
 	kernel_exit 1
 SYM_CODE_END(el1_irq)
diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c
index 9cf2fb87584a..60456a62da11 100644
--- a/arch/arm64/kernel/irq.c
+++ b/arch/arm64/kernel/irq.c
@@ -67,18 +67,3 @@ void __init init_IRQ(void)
 		local_daif_restore(DAIF_PROCCTX_NOIRQ);
 	}
 }
-
-/*
- * Stubs to make nmi_enter/exit() code callable from ASM
- */
-asmlinkage void notrace asm_nmi_enter(void)
-{
-	nmi_enter();
-}
-NOKPROBE_SYMBOL(asm_nmi_enter);
-
-asmlinkage void notrace asm_nmi_exit(void)
-{
-	nmi_exit();
-}
-NOKPROBE_SYMBOL(asm_nmi_exit);
commit 3cb5ed4d76c15fb97c10e5e9f5268d92c68222ca
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:44 2020 +0000

    arm64: entry: prepare ret_to_user for function call
    
    In a subsequent patch ret_to_user will need to make a C function call
    (in some configurations) which may clobber x0-x18 at the start of the
    finish_ret_to_user block, before enable_step_tsk consumes the flags
    loaded into x1.
    
    In preparation for this, let's load the flags into x19, which is
    preserved across C function calls. This avoids a redundant reload of the
    flags and ensures we operate on a consistent shapshot regardless.
    
    There should be no functional change as a result of this patch. At this
    point of the entry/exit paths we only need to preserve x28 (tsk) and the
    sp, and x19 is free for this use.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-6-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index b295fb912b12..84aec600eeed 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -774,13 +774,13 @@ SYM_CODE_END(el0_error)
 SYM_CODE_START_LOCAL(ret_to_user)
 	disable_daif
 	gic_prio_kentry_setup tmp=x3
-	ldr	x1, [tsk, #TSK_TI_FLAGS]
-	and	x2, x1, #_TIF_WORK_MASK
+	ldr	x19, [tsk, #TSK_TI_FLAGS]
+	and	x2, x19, #_TIF_WORK_MASK
 	cbnz	x2, work_pending
 finish_ret_to_user:
 	/* Ignore asynchronous tag check faults in the uaccess routines */
 	clear_mte_async_tcf
-	enable_step_tsk x1, x2
+	enable_step_tsk x19, x2
 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK
 	bl	stackleak_erase
 #endif
@@ -791,11 +791,12 @@ finish_ret_to_user:
  */
 work_pending:
 	mov	x0, sp				// 'regs'
+	mov	x1, x19
 	bl	do_notify_resume
 #ifdef CONFIG_TRACE_IRQFLAGS
 	bl	trace_hardirqs_on		// enabled while in userspace
 #endif
-	ldr	x1, [tsk, #TSK_TI_FLAGS]	// re-check for single-step
+	ldr	x19, [tsk, #TSK_TI_FLAGS]	// re-check for single-step
 	b	finish_ret_to_user
 SYM_CODE_END(ret_to_user)
 
commit 2f911d494f3f028bbe6346e383a354225682cf1b
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:43 2020 +0000

    arm64: entry: move enter_from_user_mode to entry-common.c
    
    In later patches we'll want to extend enter_from_user_mode() and add a
    corresponding exit_to_user_mode(). As these will be common for all
    entries/exits from userspace, it'd be better for these to live in
    entry-common.c with the rest of the entry logic.
    
    This patch moves enter_from_user_mode() into entry-common.c. As with
    other functions in entry-common.c it is marked as noinstr (which
    prevents all instrumentation, tracing, and kprobes) but there are no
    other functional changes.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-5-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 75e99161f79e..9a685e7686fe 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -101,6 +101,12 @@ asmlinkage void noinstr el1_sync_handler(struct pt_regs *regs)
 	}
 }
 
+asmlinkage void noinstr enter_from_user_mode(void)
+{
+	CT_WARN_ON(ct_state() != CONTEXT_USER);
+	user_exit_irqoff();
+}
+
 static void noinstr el0_da(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 8af4e0e85736..580c60afc39a 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -876,13 +876,6 @@ asmlinkage void do_serror(struct pt_regs *regs, unsigned int esr)
 	nmi_exit();
 }
 
-asmlinkage void enter_from_user_mode(void)
-{
-	CT_WARN_ON(ct_state() != CONTEXT_USER);
-	user_exit_irqoff();
-}
-NOKPROBE_SYMBOL(enter_from_user_mode);
-
 /* GENERIC_BUG traps */
 
 int is_valid_bugaddr(unsigned long addr)
commit da192676483232a0a9478c89cdddd412e5167470
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:42 2020 +0000

    arm64: entry: mark entry code as noinstr
    
    Functions in entry-common.c are marked as notrace and NOKPROBE_SYMBOL(),
    but they're still subject to other instrumentation which may rely on
    lockdep/rcu/context-tracking being up-to-date, and may cause nested
    exceptions (e.g. for WARN/BUG or KASAN's use of BRK) which will corrupt
    exceptions registers which have not yet been read.
    
    Prevent this by marking all functions in entry-common.c as noinstr to
    prevent compiler instrumentation. This also blacklists the functions for
    tracing and kprobes, so we don't need to handle that separately.
    Functions elsewhere will be dealt with in subsequent patches.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-4-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 43d4c329775f..75e99161f79e 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -17,7 +17,7 @@
 #include <asm/mmu.h>
 #include <asm/sysreg.h>
 
-static void notrace el1_abort(struct pt_regs *regs, unsigned long esr)
+static void noinstr el1_abort(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
@@ -25,32 +25,28 @@ static void notrace el1_abort(struct pt_regs *regs, unsigned long esr)
 	far = untagged_addr(far);
 	do_mem_abort(far, esr, regs);
 }
-NOKPROBE_SYMBOL(el1_abort);
 
-static void notrace el1_pc(struct pt_regs *regs, unsigned long esr)
+static void noinstr el1_pc(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
 	local_daif_inherit(regs);
 	do_sp_pc_abort(far, esr, regs);
 }
-NOKPROBE_SYMBOL(el1_pc);
 
-static void notrace el1_undef(struct pt_regs *regs)
+static void noinstr el1_undef(struct pt_regs *regs)
 {
 	local_daif_inherit(regs);
 	do_undefinstr(regs);
 }
-NOKPROBE_SYMBOL(el1_undef);
 
-static void notrace el1_inv(struct pt_regs *regs, unsigned long esr)
+static void noinstr el1_inv(struct pt_regs *regs, unsigned long esr)
 {
 	local_daif_inherit(regs);
 	bad_mode(regs, 0, esr);
 }
-NOKPROBE_SYMBOL(el1_inv);
 
-static void notrace el1_dbg(struct pt_regs *regs, unsigned long esr)
+static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
@@ -64,16 +60,14 @@ static void notrace el1_dbg(struct pt_regs *regs, unsigned long esr)
 
 	do_debug_exception(far, esr, regs);
 }
-NOKPROBE_SYMBOL(el1_dbg);
 
-static void notrace el1_fpac(struct pt_regs *regs, unsigned long esr)
+static void noinstr el1_fpac(struct pt_regs *regs, unsigned long esr)
 {
 	local_daif_inherit(regs);
 	do_ptrauth_fault(regs, esr);
 }
-NOKPROBE_SYMBOL(el1_fpac);
 
-asmlinkage void notrace el1_sync_handler(struct pt_regs *regs)
+asmlinkage void noinstr el1_sync_handler(struct pt_regs *regs)
 {
 	unsigned long esr = read_sysreg(esr_el1);
 
@@ -106,9 +100,8 @@ asmlinkage void notrace el1_sync_handler(struct pt_regs *regs)
 		el1_inv(regs, esr);
 	}
 }
-NOKPROBE_SYMBOL(el1_sync_handler);
 
-static void notrace el0_da(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_da(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
@@ -117,9 +110,8 @@ static void notrace el0_da(struct pt_regs *regs, unsigned long esr)
 	far = untagged_addr(far);
 	do_mem_abort(far, esr, regs);
 }
-NOKPROBE_SYMBOL(el0_da);
 
-static void notrace el0_ia(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_ia(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
@@ -135,41 +127,36 @@ static void notrace el0_ia(struct pt_regs *regs, unsigned long esr)
 	local_daif_restore(DAIF_PROCCTX);
 	do_mem_abort(far, esr, regs);
 }
-NOKPROBE_SYMBOL(el0_ia);
 
-static void notrace el0_fpsimd_acc(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_fpsimd_acc(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_fpsimd_acc(esr, regs);
 }
-NOKPROBE_SYMBOL(el0_fpsimd_acc);
 
-static void notrace el0_sve_acc(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_sve_acc(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sve_acc(esr, regs);
 }
-NOKPROBE_SYMBOL(el0_sve_acc);
 
-static void notrace el0_fpsimd_exc(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_fpsimd_exc(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_fpsimd_exc(esr, regs);
 }
-NOKPROBE_SYMBOL(el0_fpsimd_exc);
 
-static void notrace el0_sys(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_sys(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sysinstr(esr, regs);
 }
-NOKPROBE_SYMBOL(el0_sys);
 
-static void notrace el0_pc(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_pc(struct pt_regs *regs, unsigned long esr)
 {
 	unsigned long far = read_sysreg(far_el1);
 
@@ -180,41 +167,36 @@ static void notrace el0_pc(struct pt_regs *regs, unsigned long esr)
 	local_daif_restore(DAIF_PROCCTX);
 	do_sp_pc_abort(far, esr, regs);
 }
-NOKPROBE_SYMBOL(el0_pc);
 
-static void notrace el0_sp(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_sp(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_sp_pc_abort(regs->sp, esr, regs);
 }
-NOKPROBE_SYMBOL(el0_sp);
 
-static void notrace el0_undef(struct pt_regs *regs)
+static void noinstr el0_undef(struct pt_regs *regs)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_undefinstr(regs);
 }
-NOKPROBE_SYMBOL(el0_undef);
 
-static void notrace el0_bti(struct pt_regs *regs)
+static void noinstr el0_bti(struct pt_regs *regs)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_bti(regs);
 }
-NOKPROBE_SYMBOL(el0_bti);
 
-static void notrace el0_inv(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_inv(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	bad_el0_sync(regs, 0, esr);
 }
-NOKPROBE_SYMBOL(el0_inv);
 
-static void notrace el0_dbg(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_dbg(struct pt_regs *regs, unsigned long esr)
 {
 	/* Only watchpoints write FAR_EL1, otherwise its UNKNOWN */
 	unsigned long far = read_sysreg(far_el1);
@@ -226,26 +208,23 @@ static void notrace el0_dbg(struct pt_regs *regs, unsigned long esr)
 	do_debug_exception(far, esr, regs);
 	local_daif_restore(DAIF_PROCCTX_NOIRQ);
 }
-NOKPROBE_SYMBOL(el0_dbg);
 
-static void notrace el0_svc(struct pt_regs *regs)
+static void noinstr el0_svc(struct pt_regs *regs)
 {
 	if (system_uses_irq_prio_masking())
 		gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 
 	do_el0_svc(regs);
 }
-NOKPROBE_SYMBOL(el0_svc);
 
-static void notrace el0_fpac(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_fpac(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_ptrauth_fault(regs, esr);
 }
-NOKPROBE_SYMBOL(el0_fpac);
 
-asmlinkage void notrace el0_sync_handler(struct pt_regs *regs)
+asmlinkage void noinstr el0_sync_handler(struct pt_regs *regs)
 {
 	unsigned long esr = read_sysreg(esr_el1);
 
@@ -297,27 +276,24 @@ asmlinkage void notrace el0_sync_handler(struct pt_regs *regs)
 		el0_inv(regs, esr);
 	}
 }
-NOKPROBE_SYMBOL(el0_sync_handler);
 
 #ifdef CONFIG_COMPAT
-static void notrace el0_cp15(struct pt_regs *regs, unsigned long esr)
+static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr)
 {
 	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
 	do_cp15instr(esr, regs);
 }
-NOKPROBE_SYMBOL(el0_cp15);
 
-static void notrace el0_svc_compat(struct pt_regs *regs)
+static void noinstr el0_svc_compat(struct pt_regs *regs)
 {
 	if (system_uses_irq_prio_masking())
 		gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 
 	do_el0_svc_compat(regs);
 }
-NOKPROBE_SYMBOL(el0_svc_compat);
 
-asmlinkage void notrace el0_sync_compat_handler(struct pt_regs *regs)
+asmlinkage void noinstr el0_sync_compat_handler(struct pt_regs *regs)
 {
 	unsigned long esr = read_sysreg(esr_el1);
 
@@ -360,5 +336,4 @@ asmlinkage void notrace el0_sync_compat_handler(struct pt_regs *regs)
 		el0_inv(regs, esr);
 	}
 }
-NOKPROBE_SYMBOL(el0_sync_compat_handler);
 #endif /* CONFIG_COMPAT */
commit 114e0a684753516ef4b71ccb55a8ebcfa8735edb
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:41 2020 +0000

    arm64: mark idle code as noinstr
    
    Core code disables RCU when calling arch_cpu_idle(), so it's not safe
    for arch_cpu_idle() or its calees to be instrumented, as the
    instrumentation callbacks may attempt to use RCU or other features which
    are unsafe to use in this context.
    
    Mark them noinstr to prevent issues.
    
    The use of local_irq_enable() in arch_cpu_idle() is similarly
    problematic, and the "sched/idle: Fix arch_cpu_idle() vs tracing" patch
    queued in the tip tree addresses that case.
    
    Reported-by: Marco Elver <elver at google.com>
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-3-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index a47a40ec6ad9..0c65a91f8f53 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -72,13 +72,13 @@ EXPORT_SYMBOL_GPL(pm_power_off);
 
 void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
 
-static void __cpu_do_idle(void)
+static void noinstr __cpu_do_idle(void)
 {
 	dsb(sy);
 	wfi();
 }
 
-static void __cpu_do_idle_irqprio(void)
+static void noinstr __cpu_do_idle_irqprio(void)
 {
 	unsigned long pmr;
 	unsigned long daif_bits;
@@ -108,7 +108,7 @@ static void __cpu_do_idle_irqprio(void)
  *	ensure that interrupts are not masked at the PMR (because the core will
  *	not wake up if we block the wake up signal in the interrupt controller).
  */
-void cpu_do_idle(void)
+void noinstr cpu_do_idle(void)
 {
 	if (system_uses_irq_prio_masking())
 		__cpu_do_idle_irqprio();
@@ -119,7 +119,7 @@ void cpu_do_idle(void)
 /*
  * This is our default idle handler.
  */
-void arch_cpu_idle(void)
+void noinstr arch_cpu_idle(void)
 {
 	/*
 	 * This should do all the clock switching and wait for interrupt
commit ca1314d73eed493c49bb1932c60a8605530db2e4
Author: Mark Rutland <mark.rutland at arm.com>
Date:   Mon Nov 30 11:59:40 2020 +0000

    arm64: syscall: exit userspace before unmasking exceptions
    
    In el0_svc_common() we unmask exceptions before we call user_exit(), and
    so there's a window where an IRQ or debug exception can be taken while
    RCU is not watching. In do_debug_exception() we account for this in via
    debug_exception_{enter,exit}(), but in the el1_irq asm we do not and we
    call trace functions which rely on RCU before we have a guarantee that
    RCU is watching.
    
    Let's avoid this by having el0_svc_common() exit userspace before
    unmasking exceptions, matching what we do for all other EL0 entry paths.
    We can use user_exit_irqoff() to avoid the pointless save/restore of IRQ
    flags while we're sure exceptions are masked in DAIF.
    
    The workaround for Cortex-A76 erratum 1463225 may trigger a debug
    exception before this point, but the debug code invoked in this case is
    safe even when RCU is not watching.
    
    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: James Morse <james.morse at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-2-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c
index e4c0dadf0d92..13fe79f8e2db 100644
--- a/arch/arm64/kernel/syscall.c
+++ b/arch/arm64/kernel/syscall.c
@@ -120,8 +120,8 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
 	 */
 
 	cortex_a76_erratum_1463225_svc_handler();
+	user_exit_irqoff();
 	local_daif_restore(DAIF_PROCCTX);
-	user_exit();
 
 	if (system_supports_mte() && (flags & _TIF_MTE_ASYNC_FAULT)) {
 		/*
commit 13a84cf37a4cf1155a41684236c2314eb40cd65c
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Sat Nov 28 21:39:22 2020 +0800

    can: kvaser_pciefd: kvaser_pciefd_open(): fix error handling
    
    If kvaser_pciefd_bus_on() failed, we should call close_candev() to avoid
    reference leak.
    
    Fixes: 26ad340e582d3 ("can: kvaser_pciefd: Add driver for Kvaser PCIEcan devices")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201128133922.3276973-3-zhangqilong3@huawei.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
index 72acd1ba162d..43151dd6cb1c 100644
--- a/drivers/net/can/kvaser_pciefd.c
+++ b/drivers/net/can/kvaser_pciefd.c
@@ -692,8 +692,10 @@ static int kvaser_pciefd_open(struct net_device *netdev)
 		return err;
 
 	err = kvaser_pciefd_bus_on(can);
-	if (err)
+	if (err) {
+		close_candev(netdev);
 		return err;
+	}
 
 	return 0;
 }
commit 44cef0c0ffbd8d61143712ce874be68a273b7884
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Sat Nov 28 21:39:21 2020 +0800

    can: c_can: c_can_power_up(): fix error handling
    
    In the error handling in c_can_power_up(), there are two bugs:
    
    1) c_can_pm_runtime_get_sync() will increase usage counter if device is not
       empty. Forgetting to call c_can_pm_runtime_put_sync() will result in a
       reference leak here.
    
    2) c_can_reset_ram() operation will set start bit when enable is true. We
       should clear it in the error handling.
    
    We fix it by adding c_can_pm_runtime_put_sync() for 1), and
    c_can_reset_ram(enable is false) for 2) in the error handling.
    
    Fixes: 8212003260c60 ("can: c_can: Add d_can suspend resume support")
    Fixes: 52cde85acc23f ("can: c_can: Add d_can raminit support")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201128133922.3276973-2-zhangqilong3@huawei.com
    [mkl: return "0" instead of "ret"]
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index 1ccdbe89585b..1a9e9b9a4bf6 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -1295,12 +1295,22 @@ int c_can_power_up(struct net_device *dev)
 				time_after(time_out, jiffies))
 		cpu_relax();
 
-	if (time_after(jiffies, time_out))
-		return -ETIMEDOUT;
+	if (time_after(jiffies, time_out)) {
+		ret = -ETIMEDOUT;
+		goto err_out;
+	}
 
 	ret = c_can_start(dev);
-	if (!ret)
-		c_can_irq_control(priv, true);
+	if (ret)
+		goto err_out;
+
+	c_can_irq_control(priv, true);
+
+	return 0;
+
+err_out:
+	c_can_reset_ram(priv, false);
+	c_can_pm_runtime_put_sync(priv);
 
 	return ret;
 }
commit c2d095eff797813461a426b97242e3ffc50e4134
Author: Jeroen Hofstee <jhofstee at victronenergy.com>
Date:   Fri Nov 27 10:59:38 2020 +0100

    can: sun4i_can: sun4i_can_err(): don't count arbitration lose as an error
    
    Losing arbitration is normal in a CAN-bus network, it means that a higher
    priority frame is being send and the pending message will be retried later.
    Hence most driver only increment arbitration_lost, but the sun4i driver also
    incremeants tx_error, causing errors to be reported on a normal functioning
    CAN-bus. So stop counting them as errors.
    
    Fixes: 0738eff14d81 ("can: Allwinner A10/A20 CAN Controller support - Kernel module")
    Signed-off-by: Jeroen Hofstee <jhofstee at victronenergy.com>
    Link: https://lore.kernel.org/r/20201127095941.21609-1-jhofstee@victronenergy.com
    [mkl: split into two seperate patches]
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/sun4i_can.c b/drivers/net/can/sun4i_can.c
index e2c6cf4b2228..b3f2f4fe5ee0 100644
--- a/drivers/net/can/sun4i_can.c
+++ b/drivers/net/can/sun4i_can.c
@@ -604,7 +604,6 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
 		netdev_dbg(dev, "arbitration lost interrupt\n");
 		alc = readl(priv->base + SUN4I_REG_STA_ADDR);
 		priv->can.can_stats.arbitration_lost++;
-		stats->tx_errors++;
 		if (likely(skb)) {
 			cf->can_id |= CAN_ERR_LOSTARB;
 			cf->data[0] = (alc >> 8) & 0x1f;
commit bd0ccb92efb09c7da5b55162b283b42a93539ed7
Author: Jeroen Hofstee <jhofstee at victronenergy.com>
Date:   Fri Nov 27 10:59:38 2020 +0100

    can: sja1000: sja1000_err(): don't count arbitration lose as an error
    
    Losing arbitration is normal in a CAN-bus network, it means that a higher
    priority frame is being send and the pending message will be retried later.
    Hence most driver only increment arbitration_lost, but the sja1000 driver also
    incremeants tx_error, causing errors to be reported on a normal functioning
    CAN-bus. So stop counting them as errors.
    
    Fixes: 8935f57e68c4 ("can: sja1000: fix network statistics update")
    Signed-off-by: Jeroen Hofstee <jhofstee at victronenergy.com>
    Link: https://lore.kernel.org/r/20201127095941.21609-1-jhofstee@victronenergy.com
    [mkl: split into two seperate patches]
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
index 9f107798f904..25a4d7d0b349 100644
--- a/drivers/net/can/sja1000/sja1000.c
+++ b/drivers/net/can/sja1000/sja1000.c
@@ -474,7 +474,6 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
 		netdev_dbg(dev, "arbitration lost interrupt\n");
 		alc = priv->read_reg(priv, SJA1000_ALC);
 		priv->can.can_stats.arbitration_lost++;
-		stats->tx_errors++;
 		cf->can_id |= CAN_ERR_LOSTARB;
 		cf->data[0] = alc & 0x1f;
 	}
commit ad1f5e826d91d6c27ecd36a607ad7c7f4d0b0733
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Fri Nov 27 16:17:11 2020 +0100

    can: m_can: tcan4x5x_can_probe(): fix error path: remove erroneous clk_disable_unprepare()
    
    The clocks mcan_class->cclk and mcan_class->hclk are not prepared by any call
    during tcan4x5x_can_probe(), so remove erroneous clk_disable_unprepare() on
    them.
    
    Fixes: 5443c226ba91 ("can: tcan4x5x: Add tcan4x5x driver to the kernel")
    Link: http://lore.kernel.org/r/20201130114252.215334-1-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index e5d7d85e0b6d..7347ab39c5b6 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -489,18 +489,18 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 	spi->bits_per_word = 32;
 	ret = spi_setup(spi);
 	if (ret)
-		goto out_clk;
+		goto out_m_can_class_free_dev;
 
 	priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus,
 					&spi->dev, &tcan4x5x_regmap);
 	if (IS_ERR(priv->regmap)) {
 		ret = PTR_ERR(priv->regmap);
-		goto out_clk;
+		goto out_m_can_class_free_dev;
 	}
 
 	ret = tcan4x5x_power_enable(priv->power, 1);
 	if (ret)
-		goto out_clk;
+		goto out_m_can_class_free_dev;
 
 	ret = tcan4x5x_parse_config(mcan_class);
 	if (ret)
@@ -519,11 +519,6 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 
 out_power:
 	tcan4x5x_power_enable(priv->power, 0);
-out_clk:
-	if (!IS_ERR(mcan_class->cclk)) {
-		clk_disable_unprepare(mcan_class->cclk);
-		clk_disable_unprepare(mcan_class->hclk);
-	}
  out_m_can_class_free_dev:
 	m_can_class_free_dev(mcan_class->net);
 	dev_err(&spi->dev, "Probe failed, err=%d\n", ret);
commit 9ea69a55b3b9a71cded9726af591949c1138f235
Author: Laurent Vivier <lvivier at redhat.com>
Date:   Thu Nov 26 09:28:52 2020 +0100

    powerpc/pseries: Pass MSI affinity to irq_create_mapping()
    
    With virtio multiqueue, normally each queue IRQ is mapped to a CPU.
    
    Commit 0d9f0a52c8b9f ("virtio_scsi: use virtio IRQ affinity") exposed
    an existing shortcoming of the arch code by moving virtio_scsi to
    the automatic IRQ affinity assignment.
    
    The affinity is correctly computed in msi_desc but this is not applied
    to the system IRQs.
    
    It appears the affinity is correctly passed to rtas_setup_msi_irqs() but
    lost at this point and never passed to irq_domain_alloc_descs()
    (see commit 06ee6d571f0e ("genirq: Add affinity hint to irq allocation"))
    because irq_create_mapping() doesn't take an affinity parameter.
    
    Use the new irq_create_mapping_affinity() function, which allows to forward
    the affinity setting from rtas_setup_msi_irqs() to irq_domain_alloc_descs().
    
    With this change, the virtqueues are correctly dispatched between the CPUs
    on pseries.
    
    Fixes: e75eafb9b039 ("genirq/msi: Switch to new irq spreading infrastructure")
    Signed-off-by: Laurent Vivier <lvivier at redhat.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Greg Kurz <groug at kaod.org>
    Acked-by: Michael Ellerman <mpe at ellerman.id.au>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201126082852.1178497-3-lvivier@redhat.com

diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
index 133f6adcb39c..b3ac2455faad 100644
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -458,7 +458,8 @@ again:
 			return hwirq;
 		}
 
-		virq = irq_create_mapping(NULL, hwirq);
+		virq = irq_create_mapping_affinity(NULL, hwirq,
+						   entry->affinity);
 
 		if (!virq) {
 			pr_debug("rtas_msi: Failed mapping hwirq %d\n", hwirq);
commit bb4c6910c8b41623104c2e64a30615682689a54d
Author: Laurent Vivier <lvivier at redhat.com>
Date:   Thu Nov 26 09:28:51 2020 +0100

    genirq/irqdomain: Add an irq_create_mapping_affinity() function
    
    There is currently no way to convey the affinity of an interrupt
    via irq_create_mapping(), which creates issues for devices that
    expect that affinity to be managed by the kernel.
    
    In order to sort this out, rename irq_create_mapping() to
    irq_create_mapping_affinity() with an additional affinity parameter that
    can be passed down to irq_domain_alloc_descs().
    
    irq_create_mapping() is re-implemented as a wrapper around
    irq_create_mapping_affinity().
    
    No functional change.
    
    Fixes: e75eafb9b039 ("genirq/msi: Switch to new irq spreading infrastructure")
    Signed-off-by: Laurent Vivier <lvivier at redhat.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Greg Kurz <groug at kaod.org>
    Cc: Michael Ellerman <mpe at ellerman.id.au>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201126082852.1178497-2-lvivier@redhat.com

diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 71535e87109f..ea5a337e0f8b 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -384,11 +384,19 @@ extern void irq_domain_associate_many(struct irq_domain *domain,
 extern void irq_domain_disassociate(struct irq_domain *domain,
 				    unsigned int irq);
 
-extern unsigned int irq_create_mapping(struct irq_domain *host,
-				       irq_hw_number_t hwirq);
+extern unsigned int irq_create_mapping_affinity(struct irq_domain *host,
+				      irq_hw_number_t hwirq,
+				      const struct irq_affinity_desc *affinity);
 extern unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec);
 extern void irq_dispose_mapping(unsigned int virq);
 
+static inline unsigned int irq_create_mapping(struct irq_domain *host,
+					      irq_hw_number_t hwirq)
+{
+	return irq_create_mapping_affinity(host, hwirq, NULL);
+}
+
+
 /**
  * irq_linear_revmap() - Find a linux irq from a hw irq number.
  * @domain: domain owning this hardware interrupt
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index cf8b374b892d..e4ca69608f3b 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -624,17 +624,19 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain)
 EXPORT_SYMBOL_GPL(irq_create_direct_mapping);
 
 /**
- * irq_create_mapping() - Map a hardware interrupt into linux irq space
+ * irq_create_mapping_affinity() - Map a hardware interrupt into linux irq space
  * @domain: domain owning this hardware interrupt or NULL for default domain
  * @hwirq: hardware irq number in that domain space
+ * @affinity: irq affinity
  *
  * Only one mapping per hardware interrupt is permitted. Returns a linux
  * irq number.
  * If the sense/trigger is to be specified, set_irq_type() should be called
  * on the number returned from that call.
  */
-unsigned int irq_create_mapping(struct irq_domain *domain,
-				irq_hw_number_t hwirq)
+unsigned int irq_create_mapping_affinity(struct irq_domain *domain,
+				       irq_hw_number_t hwirq,
+				       const struct irq_affinity_desc *affinity)
 {
 	struct device_node *of_node;
 	int virq;
@@ -660,7 +662,8 @@ unsigned int irq_create_mapping(struct irq_domain *domain,
 	}
 
 	/* Allocate a virtual interrupt number */
-	virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node), NULL);
+	virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node),
+				      affinity);
 	if (virq <= 0) {
 		pr_debug("-> virq allocation failed\n");
 		return 0;
@@ -676,7 +679,7 @@ unsigned int irq_create_mapping(struct irq_domain *domain,
 
 	return virq;
 }
-EXPORT_SYMBOL_GPL(irq_create_mapping);
+EXPORT_SYMBOL_GPL(irq_create_mapping_affinity);
 
 /**
  * irq_create_strict_mappings() - Map a range of hw irqs to fixed linux irqs
commit fd4e788e971ce763e50762d7b1a0048992949dd0
Author: Tomi Valkeinen <tomi.valkeinen at ti.com>
Date:   Fri Nov 27 10:52:41 2020 +0200

    drm/omap: sdi: fix bridge enable/disable
    
    When the SDI output was converted to DRM bridge, the atomic versions of
    enable and disable funcs were used. This was not intended, as that would
    require implementing other atomic funcs too. This leads to:
    
    WARNING: CPU: 0 PID: 18 at drivers/gpu/drm/drm_bridge.c:708 drm_atomic_helper_commit_modeset_enables+0x134/0x268
    
    and display not working.
    
    Fix this by using the legacy enable/disable funcs.
    
    Fixes: 8bef8a6d5da81b909a190822b96805a47348146f ("drm/omap: sdi: Register a drm_bridge")
    Reported-by: Aaro Koskinen <aaro.koskinen at iki.fi>
    Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
    Tested-by: Ivaylo Dimitrov <ivo.g.dimitrov.75 at gmail.com>
    Tested-by: Aaro Koskinen <aaro.koskinen at iki.fi>
    Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
    Cc: stable at vger.kernel.org # v5.7+
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127085241.848461-1-tomi.valkeinen@ti.com

diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index 033fd30074b0..282e4c837cd9 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -195,8 +195,7 @@ static void sdi_bridge_mode_set(struct drm_bridge *bridge,
 	sdi->pixelclock = adjusted_mode->clock * 1000;
 }
 
-static void sdi_bridge_enable(struct drm_bridge *bridge,
-			      struct drm_bridge_state *bridge_state)
+static void sdi_bridge_enable(struct drm_bridge *bridge)
 {
 	struct sdi_device *sdi = drm_bridge_to_sdi(bridge);
 	struct dispc_clock_info dispc_cinfo;
@@ -259,8 +258,7 @@ err_get_dispc:
 	regulator_disable(sdi->vdds_sdi_reg);
 }
 
-static void sdi_bridge_disable(struct drm_bridge *bridge,
-			       struct drm_bridge_state *bridge_state)
+static void sdi_bridge_disable(struct drm_bridge *bridge)
 {
 	struct sdi_device *sdi = drm_bridge_to_sdi(bridge);
 
@@ -278,8 +276,8 @@ static const struct drm_bridge_funcs sdi_bridge_funcs = {
 	.mode_valid = sdi_bridge_mode_valid,
 	.mode_fixup = sdi_bridge_mode_fixup,
 	.mode_set = sdi_bridge_mode_set,
-	.atomic_enable = sdi_bridge_enable,
-	.atomic_disable = sdi_bridge_disable,
+	.enable = sdi_bridge_enable,
+	.disable = sdi_bridge_disable,
 };
 
 static void sdi_bridge_init(struct sdi_device *sdi)
commit 509920aee72ae23235615a009c5148cdb38794c3
Author: Marc Zyngier <maz at kernel.org>
Date:   Sat Nov 28 10:37:07 2020 +0000

    MAINTAINERS: Move Jason Cooper to CREDITS
    
    Jason's email address has now been bouncing for weeks, and no
    reply was received when trying to reach out on other addresses.
    
    We really hope he is OK. But until we hear of his whereabouts,
    let's move him to the CREDITS file so that people stop Cc-ing
    him.
    
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Acked-by: Gregory CLEMENT <gregory.clement at bootlin.com>
    Acked-by: Andrew Lunn <andrew at lunn.ch>
    Link: https://lore.kernel.org/r/20201128103707.332874-1-maz@kernel.org

diff --git a/CREDITS b/CREDITS
index 748301954ab7..e88d1a783a80 100644
--- a/CREDITS
+++ b/CREDITS
@@ -740,6 +740,11 @@ S: (ask for current address)
 S: Portland, Oregon
 S: USA
 
+N: Jason Cooper
+D: ARM/Marvell SOC co-maintainer
+D: irqchip co-maintainer
+D: MVEBU PCI DRIVER co-maintainer
+
 N: Robin Cornelius
 E: robincornelius at users.sourceforge.net
 D: Ralink rt2x00 WLAN driver
diff --git a/MAINTAINERS b/MAINTAINERS
index 2daa6ee673f7..4f27f43b2e0c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2014,7 +2014,6 @@ M:	Philipp Zabel <philipp.zabel at gmail.com>
 S:	Maintained
 
 ARM/Marvell Dove/MV78xx0/Orion SOC support
-M:	Jason Cooper <jason at lakedaemon.net>
 M:	Andrew Lunn <andrew at lunn.ch>
 M:	Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
 M:	Gregory Clement <gregory.clement at bootlin.com>
@@ -2031,7 +2030,6 @@ F:	arch/arm/plat-orion/
 F:	drivers/soc/dove/
 
 ARM/Marvell Kirkwood and Armada 370, 375, 38x, 39x, XP, 3700, 7K/8K, CN9130 SOC support
-M:	Jason Cooper <jason at lakedaemon.net>
 M:	Andrew Lunn <andrew at lunn.ch>
 M:	Gregory Clement <gregory.clement at bootlin.com>
 M:	Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
@@ -9248,7 +9246,6 @@ F:	kernel/irq/
 
 IRQCHIP DRIVERS
 M:	Thomas Gleixner <tglx at linutronix.de>
-M:	Jason Cooper <jason at lakedaemon.net>
 M:	Marc Zyngier <maz at kernel.org>
 L:	linux-kernel at vger.kernel.org
 S:	Maintained
@@ -13394,7 +13391,6 @@ F:	drivers/pci/controller/mobiveil/pcie-mobiveil*
 
 PCI DRIVER FOR MVEBU (Marvell Armada 370 and Armada XP SOC support)
 M:	Thomas Petazzoni <thomas.petazzoni at bootlin.com>
-M:	Jason Cooper <jason at lakedaemon.net>
 L:	linux-pci at vger.kernel.org
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
commit 5555b7c56bdec7a29c789fec27f84d40f52fbdfa
Author: Ofir Bitton <obitton at habana.ai>
Date:   Sun Nov 29 09:34:12 2020 +0200

    habanalabs: put devices before driver removal
    
    Driver never puts its device and control_device objects, hence
    a memory leak is introduced every driver removal.
    
    Signed-off-by: Ofir Bitton <obitton at habana.ai>
    Reviewed-by: Oded Gabbay <ogabbay at kernel.org>
    Signed-off-by: Oded Gabbay <ogabbay at kernel.org>

diff --git a/drivers/misc/habanalabs/common/device.c b/drivers/misc/habanalabs/common/device.c
index 20572224099a..783bbdcb1e61 100644
--- a/drivers/misc/habanalabs/common/device.c
+++ b/drivers/misc/habanalabs/common/device.c
@@ -231,16 +231,16 @@ delete_cdev_device:
 
 static void device_cdev_sysfs_del(struct hl_device *hdev)
 {
-	/* device_release() won't be called so must free devices explicitly */
-	if (!hdev->cdev_sysfs_created) {
-		kfree(hdev->dev_ctrl);
-		kfree(hdev->dev);
-		return;
-	}
+	if (!hdev->cdev_sysfs_created)
+		goto put_devices;
 
 	hl_sysfs_fini(hdev);
 	cdev_device_del(&hdev->cdev_ctrl, hdev->dev_ctrl);
 	cdev_device_del(&hdev->cdev, hdev->dev);
+
+put_devices:
+	put_device(hdev->dev);
+	put_device(hdev->dev_ctrl);
 }
 
 /*
@@ -1371,9 +1371,9 @@ sw_fini:
 early_fini:
 	device_early_fini(hdev);
 free_dev_ctrl:
-	kfree(hdev->dev_ctrl);
+	put_device(hdev->dev_ctrl);
 free_dev:
-	kfree(hdev->dev);
+	put_device(hdev->dev);
 out_disabled:
 	hdev->disabled = true;
 	if (add_cdev_sysfs_on_err)
commit c8c39fbd01d42c30454e42c16bcd69c17260b90a
Author: Ofir Bitton <obitton at habana.ai>
Date:   Thu Nov 26 13:01:11 2020 +0200

    habanalabs: free host huge va_range if not used
    
    If huge range is not valid, driver uses the host range also for
    huge page allocations, but driver never frees its allocation.
    This introduces a memory leak every time a user closes its context.
    
    Signed-off-by: Ofir Bitton <obitton at habana.ai>
    Reviewed-by: Oded Gabbay <ogabbay at kernel.org>
    Signed-off-by: Oded Gabbay <ogabbay at kernel.org>

diff --git a/drivers/misc/habanalabs/common/memory.c b/drivers/misc/habanalabs/common/memory.c
index 84227819e4d1..bfe223abf142 100644
--- a/drivers/misc/habanalabs/common/memory.c
+++ b/drivers/misc/habanalabs/common/memory.c
@@ -1626,6 +1626,7 @@ static int vm_ctx_init_with_ranges(struct hl_ctx *ctx,
 			goto host_hpage_range_err;
 		}
 	} else {
+		kfree(ctx->host_huge_va_range);
 		ctx->host_huge_va_range = ctx->host_va_range;
 	}
 
commit f0992098cadb4c9c6a00703b66cafe604e178fea
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sun Nov 29 20:35:23 2020 +0100

    speakup: Reject setting the speakup line discipline outside of speakup
    
    Speakup exposing a line discipline allows userland to try to use it,
    while it is deemed to be useless, and thus uselessly exposes potential
    bugs. One of them is simply that in such a case if the line sends data,
    spk_ttyio_receive_buf2 is called and crashes since spk_ttyio_synth
    is NULL.
    
    This change restricts the use of the speakup line discipline to
    speakup drivers, thus avoiding such kind of issues altogether.
    
    Cc: stable at vger.kernel.org
    Reported-by: Shisong Qin <qinshisong1205 at gmail.com>
    Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
    Tested-by: Shisong Qin <qinshisong1205 at gmail.com>
    Link: https://lore.kernel.org/r/20201129193523.hm3f6n5xrn6fiyyc@function
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/accessibility/speakup/spk_ttyio.c b/drivers/accessibility/speakup/spk_ttyio.c
index 669392f31d4e..6284aff434a1 100644
--- a/drivers/accessibility/speakup/spk_ttyio.c
+++ b/drivers/accessibility/speakup/spk_ttyio.c
@@ -47,27 +47,20 @@ static int spk_ttyio_ldisc_open(struct tty_struct *tty)
 {
 	struct spk_ldisc_data *ldisc_data;
 
+	if (tty != speakup_tty)
+		/* Somebody tried to use this line discipline outside speakup */
+		return -ENODEV;
+
 	if (!tty->ops->write)
 		return -EOPNOTSUPP;
 
-	mutex_lock(&speakup_tty_mutex);
-	if (speakup_tty) {
-		mutex_unlock(&speakup_tty_mutex);
-		return -EBUSY;
-	}
-	speakup_tty = tty;
-
 	ldisc_data = kmalloc(sizeof(*ldisc_data), GFP_KERNEL);
-	if (!ldisc_data) {
-		speakup_tty = NULL;
-		mutex_unlock(&speakup_tty_mutex);
+	if (!ldisc_data)
 		return -ENOMEM;
-	}
 
 	init_completion(&ldisc_data->completion);
 	ldisc_data->buf_free = true;
-	speakup_tty->disc_data = ldisc_data;
-	mutex_unlock(&speakup_tty_mutex);
+	tty->disc_data = ldisc_data;
 
 	return 0;
 }
@@ -191,9 +184,25 @@ static int spk_ttyio_initialise_ldisc(struct spk_synth *synth)
 
 	tty_unlock(tty);
 
+	mutex_lock(&speakup_tty_mutex);
+	speakup_tty = tty;
 	ret = tty_set_ldisc(tty, N_SPEAKUP);
 	if (ret)
-		pr_err("speakup: Failed to set N_SPEAKUP on tty\n");
+		speakup_tty = NULL;
+	mutex_unlock(&speakup_tty_mutex);
+
+	if (!ret)
+		/* Success */
+		return 0;
+
+	pr_err("speakup: Failed to set N_SPEAKUP on tty\n");
+
+	tty_lock(tty);
+	if (tty->ops->close)
+		tty->ops->close(tty, NULL);
+	tty_unlock(tty);
+
+	tty_kclose(tty);
 
 	return ret;
 }
commit 7cc01c445da868101b9080082b9c75283c261c82
Merge: b65054597872 6b8137517e70
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Mon Nov 30 09:10:58 2020 +0100

    Merge tag 'usb-fixes-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb into usb-linus
    
    Peter writes:
    
    - Fixed hardware role switch issue at TI platform
    - Fixed scatter-list buffer handling
    - Fixed error goto label issue
    
    * tag 'usb-fixes-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb:
      usb: cdns3: core: fix goto label for error path
      usb: cdns3: gadget: clear trb->length as zero after preparing every trb
      usb: cdns3: Fix hardware based role switch

commit 6b8137517e70f6e96d0251a98930b1f29d0be161
Author: Peter Chen <peter.chen at nxp.com>
Date:   Thu Nov 26 14:02:38 2020 +0800

    usb: cdns3: core: fix goto label for error path
    
    The usb_role_switch_register has been already called, so if the
    devm_request_irq has failed, it needs to call usb_role_switch_unregister.
    
    Fixes: b1234e3b3b26 ("usb: cdns3: add runtime PM support")
    Signed-off-by: Peter Chen <peter.chen at nxp.com>

diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
index 170deb3eacf0..039ab5d2435e 100644
--- a/drivers/usb/cdns3/core.c
+++ b/drivers/usb/cdns3/core.c
@@ -553,7 +553,7 @@ static int cdns3_probe(struct platform_device *pdev)
 
 		if (ret) {
 			dev_err(cdns->dev, "couldn't register wakeup irq handler\n");
-			goto err3;
+			goto err4;
 		}
 	}
 
commit 24fdaeeb294c14ea743ec99ada92380c060a428a
Author: Peter Chen <peter.chen at nxp.com>
Date:   Wed Nov 25 20:35:23 2020 +0800

    usb: cdns3: gadget: clear trb->length as zero after preparing every trb
    
    It clears trb->length as zero before preparing td, but if scatter
    buffer is used for td, there are several trbs within td, it needs to clear
    every trb->length as zero, otherwise, the default value for trb->length
    may not be zero after it begins to use the second round of trb rings.
    
    Fixes: abc6b579048e ("usb: cdns3: gadget: using correct sg operations")
    Signed-off-by: Peter Chen <peter.chen at nxp.com>

diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
index 365f30fb1159..0aa85cc07ff1 100644
--- a/drivers/usb/cdns3/gadget.c
+++ b/drivers/usb/cdns3/gadget.c
@@ -1260,6 +1260,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
 		priv_req->end_trb = priv_ep->enqueue;
 		cdns3_ep_inc_enq(priv_ep);
 		trb = priv_ep->trb_pool + priv_ep->enqueue;
+		trb->length = 0;
 	} while (sg_iter < num_trb);
 
 	trb = priv_req->trb;
commit 6703052fe30fa0d85f1fbbf50171486cb0148d2d
Author: Roger Quadros <rogerq at ti.com>
Date:   Wed Nov 25 14:49:36 2020 +0200

    usb: cdns3: Fix hardware based role switch
    
    Hardware based role switch is broken as the driver always skips it.
    Fix this by registering for  SW role switch only if 'usb-role-switch'
    property is present in the device tree.
    
    Fixes: 50642709f659 ("usb: cdns3: core: quit if it uses role switch class")
    Signed-off-by: Roger Quadros <rogerq at ti.com>
    Signed-off-by: Peter Chen <peter.chen at nxp.com>

diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
index a0f73d4711ae..170deb3eacf0 100644
--- a/drivers/usb/cdns3/core.c
+++ b/drivers/usb/cdns3/core.c
@@ -427,7 +427,6 @@ static irqreturn_t cdns3_wakeup_irq(int irq, void *data)
  */
 static int cdns3_probe(struct platform_device *pdev)
 {
-	struct usb_role_switch_desc sw_desc = { };
 	struct device *dev = &pdev->dev;
 	struct resource	*res;
 	struct cdns3 *cdns;
@@ -529,18 +528,21 @@ static int cdns3_probe(struct platform_device *pdev)
 	if (ret)
 		goto err2;
 
-	sw_desc.set = cdns3_role_set;
-	sw_desc.get = cdns3_role_get;
-	sw_desc.allow_userspace_control = true;
-	sw_desc.driver_data = cdns;
-	if (device_property_read_bool(dev, "usb-role-switch"))
+	if (device_property_read_bool(dev, "usb-role-switch")) {
+		struct usb_role_switch_desc sw_desc = { };
+
+		sw_desc.set = cdns3_role_set;
+		sw_desc.get = cdns3_role_get;
+		sw_desc.allow_userspace_control = true;
+		sw_desc.driver_data = cdns;
 		sw_desc.fwnode = dev->fwnode;
 
-	cdns->role_sw = usb_role_switch_register(dev, &sw_desc);
-	if (IS_ERR(cdns->role_sw)) {
-		ret = PTR_ERR(cdns->role_sw);
-		dev_warn(dev, "Unable to register Role Switch\n");
-		goto err3;
+		cdns->role_sw = usb_role_switch_register(dev, &sw_desc);
+		if (IS_ERR(cdns->role_sw)) {
+			ret = PTR_ERR(cdns->role_sw);
+			dev_warn(dev, "Unable to register Role Switch\n");
+			goto err3;
+		}
 	}
 
 	if (cdns->wakeup_irq) {
@@ -582,7 +584,8 @@ static int cdns3_probe(struct platform_device *pdev)
 	return 0;
 err4:
 	cdns3_drd_exit(cdns);
-	usb_role_switch_unregister(cdns->role_sw);
+	if (cdns->role_sw)
+		usb_role_switch_unregister(cdns->role_sw);
 err3:
 	set_phy_power_off(cdns);
 err2:
commit b65054597872ce3aefbc6a666385eabdf9e288da
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 29 15:50:50 2020 -0800

    Linux 5.10-rc6

diff --git a/Makefile b/Makefile
index 56c0782bde56..43ecedeb3f02 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 10
 SUBLEVEL = 0
-EXTRAVERSION = -rc5
+EXTRAVERSION = -rc6
 NAME = Kleptomaniac Octopus
 
 # *DOCUMENTATION*
commit 7c4bada12d320d8648ba3ede6f9b6f9e10f1126a
Author: Sebastian Reichel <sebastian.reichel at collabora.com>
Date:   Fri Nov 27 21:04:29 2020 +0100

    drm/panel: sony-acx565akm: Fix race condition in probe
    
    The probe routine acquires the reset GPIO using GPIOD_OUT_LOW. Directly
    afterwards it calls acx565akm_detect(), which sets the GPIO value to
    HIGH. If the bootloader initialized the GPIO to HIGH before the probe
    routine was called, there is only a very short time period of a few
    instructions where the reset signal is LOW. Exact time depends on
    compiler optimizations, kernel configuration and alignment of the stars,
    but I expect it to be always way less than 10us. There are no public
    datasheets for the panel, but acx565akm_power_on() has a comment with
    timings and reset period should be at least 10us. So this potentially
    brings the panel into a half-reset state.
    
    The result is, that panel may not work after boot and can get into a
    working state by re-enabling it (e.g. by blanking + unblanking), since
    that does a clean reset cycle. This bug has recently been hit by Ivaylo
    Dimitrov, but there are some older reports which are probably the same
    bug. At least Tony Lindgren, Peter Ujfalusi and Jarkko Nikula have
    experienced it in 2017 describing the blank/unblank procedure as
    possible workaround.
    
    Note, that the bug really goes back in time. It has originally been
    introduced in the predecessor of the omapfb driver in commit 3c45d05be382
    ("OMAPDSS: acx565akm panel: handle gpios in panel driver") in 2012.
    That driver eventually got replaced by a newer one, which had the bug
    from the beginning in commit 84192742d9c2 ("OMAPDSS: Add Sony ACX565AKM
    panel driver") and still exists in fbdev world. That driver has later
    been copied to omapdrm and then was used as a basis for this driver.
    Last but not least the omapdrm specific driver has been removed in
    commit 45f16c82db7e ("drm/omap: displays: Remove unused panel drivers").
    
    Reported-by: Jarkko Nikula <jarkko.nikula at bitmer.com>
    Reported-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Reported-by: Tony Lindgren <tony at atomide.com>
    Reported-by: Aaro Koskinen <aaro.koskinen at iki.fi>
    Reported-by: Ivaylo Dimitrov <ivo.g.dimitrov.75 at gmail.com>
    Cc: Merlijn Wajer <merlijn at wizzup.org>
    Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
    Cc: Tomi Valkeinen <tomi.valkeinen at ti.com>
    Fixes: 1c8fc3f0c5d2 ("drm/panel: Add driver for the Sony ACX565AKM panel")
    Signed-off-by: Sebastian Reichel <sebastian.reichel at collabora.com>
    Tested-by: Ivaylo Dimitrov <ivo.g.dimitrov.75 at gmail.com>
    Tested-by: Aaro Koskinen <aaro.koskinen at iki.fi>
    Tested-by: Jarkko Nikula <jarkko.nikula at bitmer.com>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201127200429.129868-1-sebastian.reichel@collabora.com

diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
index e95fdfb16b6c..ba0b3ead150f 100644
--- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c
@@ -629,7 +629,7 @@ static int acx565akm_probe(struct spi_device *spi)
 	lcd->spi = spi;
 	mutex_init(&lcd->mutex);
 
-	lcd->reset_gpio = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_LOW);
+	lcd->reset_gpio = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_HIGH);
 	if (IS_ERR(lcd->reset_gpio)) {
 		dev_err(&spi->dev, "failed to get reset GPIO\n");
 		return PTR_ERR(lcd->reset_gpio);
commit f91a3aa6bce480fe6e08df540129f4a923222419
Merge: 8b7a51ba2637 6e1d2bc675bd
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 29 11:19:26 2020 -0800

    Merge tag 'locking-urgent-2020-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull locking fixes from Thomas Gleixner:
     "Two more places which invoke tracing from RCU disabled regions in the
      idle path.
    
      Similar to the entry path the low level idle functions have to be
      non-instrumentable"
    
    * tag 'locking-urgent-2020-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      intel_idle: Fix intel_idle() vs tracing
      sched/idle: Fix arch_cpu_idle() vs tracing

commit 8b7a51ba2637ee53ce90624f5f98aaf8ec9b2bcc
Merge: 1214917e008b 7032908cd584
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 29 11:06:57 2020 -0800

    Merge tag 'irq-urgent-2020-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull irq fixes from Thomas Gleixner:
     "Two fixes for irqchip drivers:
    
       - Save and restore the GICV3 ITS state unconditionally on
         suspend/resume to handle firmware which fails to do so.
    
       - Use the correct index into the fwspec parameters to read the irq
         trigger type in the EXIU chip driver"
    
    * tag 'irq-urgent-2020-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      irqchip/gic-v3-its: Unconditionally save/restore the ITS state on suspend
      irqchip/exiu: Fix the index of fwspec for IRQ type

commit 1214917e008bb8989747b8bf9a721f7a6db8f8d7
Merge: 7255a39d24a7 36a237526cd8
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 29 10:18:53 2020 -0800

    Merge tag 'efi-urgent-for-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull EFI fixes from Borislav Petkov:
     "More EFI fixes forwarded from Ard Biesheuvel:
    
       - revert efivarfs kmemleak fix again - it was a false positive
    
       - make CONFIG_EFI_EARLYCON depend on CONFIG_EFI explicitly so it does
         not pull in other dependencies unnecessarily if CONFIG_EFI is not
         set
    
       - defer attempts to load SSDT overrides from EFI vars until after the
         efivar layer is up"
    
    * tag 'efi-urgent-for-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      efi: EFI_EARLYCON should depend on EFI
      efivarfs: revert "fix memory leak in efivarfs_create()"
      efi/efivars: Set generic ops before loading SSDT

commit 7255a39d24a7960da3a55e840ca5cbed5fcb476f
Merge: aae5ab854e38 25bc65d8ddfc
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 29 10:08:17 2020 -0800

    Merge tag 'x86_urgent_for_v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull x86 fixes from Borislav Petkov:
     "A couple of urgent fixes which accumulated this last week:
    
       - Two resctrl fixes to prevent refcount leaks when manipulating the
         resctrl fs (Xiaochen Shen)
    
       - Correct prctl(PR_GET_SPECULATION_CTRL) reporting (Anand K Mistry)
    
       - A fix to not lose already seen MCE severity which determines
         whether the machine can recover (Gabriele Paoloni)"
    
    * tag 'x86_urgent_for_v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      x86/mce: Do not overwrite no_way_out if mce_end() fails
      x86/speculation: Fix prctl() when spectre_v2_user={seccomp,prctl},ibpb
      x86/resctrl: Add necessary kernfs_put() calls to prevent refcount leak
      x86/resctrl: Remove superfluous kernfs_get() calls to prevent refcount leak

commit aec9fe892812ed10d0bffcf309d2a8fc380d8ce6
Author: Paul Kocialkowski <paul.kocialkowski at bootlin.com>
Date:   Tue Nov 10 21:04:30 2020 +0100

    drm/rockchip: Avoid uninitialized use of endpoint id in LVDS
    
    In the Rockchip DRM LVDS component driver, the endpoint id provided to
    drm_of_find_panel_or_bridge is grabbed from the endpoint's reg property.
    
    However, the property may be missing in the case of a single endpoint.
    Initialize the endpoint_id variable to 0 to avoid using an
    uninitialized variable in that case.
    
    Fixes: 34cc0aa25456 ("drm/rockchip: Add support for Rockchip Soc LVDS")
    Signed-off-by: Paul Kocialkowski <paul.kocialkowski at bootlin.com>
    Signed-off-by: Heiko Stuebner <heiko at sntech.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201110200430.1713467-1-paul.kocialkowski@bootlin.com

diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c
index f292c6a6e20f..41edd0a421b2 100644
--- a/drivers/gpu/drm/rockchip/rockchip_lvds.c
+++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c
@@ -544,7 +544,7 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
 	struct device_node  *port, *endpoint;
 	int ret = 0, child_count = 0;
 	const char *name;
-	u32 endpoint_id;
+	u32 endpoint_id = 0;
 
 	lvds->drm_dev = drm_dev;
 	port = of_graph_get_port_by_id(dev->of_node, 1);
commit aae5ab854e38151e69f261dbf0e3b7e396403178
Merge: 45e885c439e8 30aca1bacb39
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 28 15:53:30 2020 -0800

    Merge tag 'riscv-for-linus-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux
    
    Pull RISC-V fixes from Palmer Dabbelt:
     "I've collected a handful of fixes over the past few weeks:
    
       - A fix to un-break the build-id argument to the vDSO build, which is
         necessary for the LLVM linker.
    
       - A fix to initialize the jump label subsystem, without which it (and
         all the stuff that uses it) doesn't actually function.
    
       - A fix to include <asm/barrier.h> from <vdso/processor.h>, without
         which some drivers won't compile"
    
    * tag 'riscv-for-linus-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
      RISC-V: fix barrier() use in <vdso/processor.h>
      RISC-V: Add missing jump label initialization
      riscv: Explicitly specify the build id style in vDSO Makefile again

commit 4d521943f76bd0d1e68ea5e02df7aadd30b2838a
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Mon Oct 26 16:36:20 2020 +0100

    dt-bindings: net: correct interrupt flags in examples
    
    GPIO_ACTIVE_x flags are not correct in the context of interrupt flags.
    These are simple defines so they could be used in DTS but they will not
    have the same meaning:
    1. GPIO_ACTIVE_HIGH = 0 = IRQ_TYPE_NONE
    2. GPIO_ACTIVE_LOW  = 1 = IRQ_TYPE_EDGE_RISING
    
    Correct the interrupt flags, assuming the author of the code wanted same
    logical behavior behind the name "ACTIVE_xxx", this is:
      ACTIVE_LOW  => IRQ_TYPE_LEVEL_LOW
      ACTIVE_HIGH => IRQ_TYPE_LEVEL_HIGH
    
    Fixes: a1a8b4594f8d ("NFC: pn544: i2c: Add DTS Documentation")
    Fixes: 6be88670fc59 ("NFC: nxp-nci_i2c: Add I2C support to NXP NCI driver")
    Fixes: e3b329221567 ("dt-bindings: can: tcan4x5x: Update binding to use interrupt property")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Acked-by: Rob Herring <robh at kernel.org>
    Acked-by: Marc Kleine-Budde <mkl at pengutronix.de> # for tcan4x5x.txt
    Link: https://lore.kernel.org/r/20201026153620.89268-1-krzk@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/Documentation/devicetree/bindings/net/can/tcan4x5x.txt b/Documentation/devicetree/bindings/net/can/tcan4x5x.txt
index 3613c2c8f75d..0968b40aef1e 100644
--- a/Documentation/devicetree/bindings/net/can/tcan4x5x.txt
+++ b/Documentation/devicetree/bindings/net/can/tcan4x5x.txt
@@ -33,7 +33,7 @@ tcan4x5x: tcan4x5x at 0 {
 		spi-max-frequency = <10000000>;
 		bosch,mram-cfg = <0x0 0 0 32 0 0 1 1>;
 		interrupt-parent = <&gpio1>;
-		interrupts = <14 GPIO_ACTIVE_LOW>;
+		interrupts = <14 IRQ_TYPE_LEVEL_LOW>;
 		device-state-gpios = <&gpio3 21 GPIO_ACTIVE_HIGH>;
 		device-wake-gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
 		reset-gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>;
diff --git a/Documentation/devicetree/bindings/net/nfc/nxp-nci.txt b/Documentation/devicetree/bindings/net/nfc/nxp-nci.txt
index cfaf88998918..9e4dc510a40a 100644
--- a/Documentation/devicetree/bindings/net/nfc/nxp-nci.txt
+++ b/Documentation/devicetree/bindings/net/nfc/nxp-nci.txt
@@ -25,7 +25,7 @@ Example (for ARM-based BeagleBone with NPC100 NFC controller on I2C2):
 		clock-frequency = <100000>;
 
 		interrupt-parent = <&gpio1>;
-		interrupts = <29 GPIO_ACTIVE_HIGH>;
+		interrupts = <29 IRQ_TYPE_LEVEL_HIGH>;
 
 		enable-gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
 		firmware-gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>;
diff --git a/Documentation/devicetree/bindings/net/nfc/pn544.txt b/Documentation/devicetree/bindings/net/nfc/pn544.txt
index 92f399ec22b8..2bd82562ce8e 100644
--- a/Documentation/devicetree/bindings/net/nfc/pn544.txt
+++ b/Documentation/devicetree/bindings/net/nfc/pn544.txt
@@ -25,7 +25,7 @@ Example (for ARM-based BeagleBone with PN544 on I2C2):
 		clock-frequency = <400000>;
 
 		interrupt-parent = <&gpio1>;
-		interrupts = <17 GPIO_ACTIVE_HIGH>;
+		interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
 
 		enable-gpios = <&gpio3 21 GPIO_ACTIVE_HIGH>;
 		firmware-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
commit 6548755c55254a3e96294a3385774641d178e011
Merge: bd2d5c54dc7c 98c41f04a67a
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Sat Nov 28 13:26:50 2020 -0800

    Merge branch 'ibmvnic-assorted-bug-fixes'
    
    Dany Madden says:
    
    ====================
    ibmvnic: assorted bug fixes
    
    Assorted fixes for ibmvnic originated from "[PATCH net 00/15] ibmvnic:
    assorted bug fixes" sent by Lijun Pan.
    ====================
    
    Link: https://lore.kernel.org/r/20201126000432.29897-1-drt@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 98c41f04a67abf5e7f7191d55d286e905d1430ef
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:32 2020 -0600

    ibmvnic: reduce wait for completion time
    
    Reduce the wait time for Command Response Queue response from 30 seconds
    to 20 seconds, as recommended by VIOS and Power Hypervisor teams.
    
    Fixes: bd0b672313941 ("ibmvnic: Move login and queue negotiation into ibmvnic_open")
    Fixes: 53da09e92910f ("ibmvnic: Add set_link_state routine for setting adapter link state")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index d48a694b92c9..bca1becd33f0 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -834,7 +834,7 @@ static void release_napi(struct ibmvnic_adapter *adapter)
 static int ibmvnic_login(struct net_device *netdev)
 {
 	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
-	unsigned long timeout = msecs_to_jiffies(30000);
+	unsigned long timeout = msecs_to_jiffies(20000);
 	int retry_count = 0;
 	int retries = 10;
 	bool retry;
@@ -938,7 +938,7 @@ static void release_resources(struct ibmvnic_adapter *adapter)
 static int set_link_state(struct ibmvnic_adapter *adapter, u8 link_state)
 {
 	struct net_device *netdev = adapter->netdev;
-	unsigned long timeout = msecs_to_jiffies(30000);
+	unsigned long timeout = msecs_to_jiffies(20000);
 	union ibmvnic_crq crq;
 	bool resend;
 	int rc;
@@ -5130,7 +5130,7 @@ map_failed:
 static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset)
 {
 	struct device *dev = &adapter->vdev->dev;
-	unsigned long timeout = msecs_to_jiffies(30000);
+	unsigned long timeout = msecs_to_jiffies(20000);
 	u64 old_num_rx_queues, old_num_tx_queues;
 	int rc;
 
commit a86d5c682b798b2dadaa4171c1d124cf3c45a17c
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:31 2020 -0600

    ibmvnic: no reset timeout for 5 seconds after reset
    
    Reset timeout is going off right after adapter reset. This patch ensures
    that timeout is scheduled if it has been 5 seconds since the last reset.
    5 seconds is the default watchdog timeout.
    
    Fixes: ed651a10875f1 ("ibmvnic: Updated reset handling")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 5154e0421175..d48a694b92c9 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2252,6 +2252,7 @@ static void __ibmvnic_reset(struct work_struct *work)
 			rc = do_reset(adapter, rwi, reset_state);
 		}
 		kfree(rwi);
+		adapter->last_reset_time = jiffies;
 
 		if (rc)
 			netdev_dbg(adapter->netdev, "Reset failed, rc=%d\n", rc);
@@ -2355,7 +2356,13 @@ static void ibmvnic_tx_timeout(struct net_device *dev, unsigned int txqueue)
 			   "Adapter is resetting, skip timeout reset\n");
 		return;
 	}
-
+	/* No queuing up reset until at least 5 seconds (default watchdog val)
+	 * after last reset
+	 */
+	if (time_before(jiffies, (adapter->last_reset_time + dev->watchdog_timeo))) {
+		netdev_dbg(dev, "Not yet time to tx timeout.\n");
+		return;
+	}
 	ibmvnic_reset(adapter, VNIC_RESET_TIMEOUT);
 }
 
@@ -5282,7 +5289,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
 	adapter->state = VNIC_PROBED;
 
 	adapter->wait_for_reset = false;
-
+	adapter->last_reset_time = jiffies;
 	return 0;
 
 ibmvnic_register_fail:
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index bffa7f939ee1..21e7ea858cda 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -1087,6 +1087,8 @@ struct ibmvnic_adapter {
 	unsigned long resetting;
 	bool napi_enabled, from_passive_init;
 	bool login_pending;
+	/* last device reset time */
+	unsigned long last_reset_time;
 
 	bool failover_pending;
 	bool force_reset_recovery;
commit c98d9cc4170da7e16a1012563d0f9fbe1c7cfe27
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:30 2020 -0600

    ibmvnic: send_login should check for crq errors
    
    send_login() does not check for the result of ibmvnic_send_crq() of the
    login request. This results in the driver needlessly retrying the login
    10 times even when CRQ is no longer active. Check the return code and
    give up in case of errors in sending the CRQ.
    
    The only time we want to retry is if we get a PARITALSUCCESS response
    from the partner.
    
    Fixes: 032c5e82847a2 ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 13eae1666477..5154e0421175 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -850,10 +850,8 @@ static int ibmvnic_login(struct net_device *netdev)
 		adapter->init_done_rc = 0;
 		reinit_completion(&adapter->init_done);
 		rc = send_login(adapter);
-		if (rc) {
-			netdev_warn(netdev, "Unable to login\n");
+		if (rc)
 			return rc;
-		}
 
 		if (!wait_for_completion_timeout(&adapter->init_done,
 						 timeout)) {
@@ -3729,15 +3727,16 @@ static int send_login(struct ibmvnic_adapter *adapter)
 	struct ibmvnic_login_rsp_buffer *login_rsp_buffer;
 	struct ibmvnic_login_buffer *login_buffer;
 	struct device *dev = &adapter->vdev->dev;
+	struct vnic_login_client_data *vlcd;
 	dma_addr_t rsp_buffer_token;
 	dma_addr_t buffer_token;
 	size_t rsp_buffer_size;
 	union ibmvnic_crq crq;
+	int client_data_len;
 	size_t buffer_size;
 	__be64 *tx_list_p;
 	__be64 *rx_list_p;
-	int client_data_len;
-	struct vnic_login_client_data *vlcd;
+	int rc;
 	int i;
 
 	if (!adapter->tx_scrq || !adapter->rx_scrq) {
@@ -3843,16 +3842,23 @@ static int send_login(struct ibmvnic_adapter *adapter)
 	crq.login.len = cpu_to_be32(buffer_size);
 
 	adapter->login_pending = true;
-	ibmvnic_send_crq(adapter, &crq);
+	rc = ibmvnic_send_crq(adapter, &crq);
+	if (rc) {
+		adapter->login_pending = false;
+		netdev_err(adapter->netdev, "Failed to send login, rc=%d\n", rc);
+		goto buf_rsp_map_failed;
+	}
 
 	return 0;
 
 buf_rsp_map_failed:
 	kfree(login_rsp_buffer);
+	adapter->login_rsp_buf = NULL;
 buf_rsp_alloc_failed:
 	dma_unmap_single(dev, buffer_token, buffer_size, DMA_TO_DEVICE);
 buf_map_failed:
 	kfree(login_buffer);
+	adapter->login_buf = NULL;
 buf_alloc_failed:
 	return -1;
 }
commit 76cdc5c5d99ce4856ad0ac38facc33b52fa64f77
Author: Sukadev Bhattiprolu <sukadev at linux.ibm.com>
Date:   Wed Nov 25 18:04:29 2020 -0600

    ibmvnic: track pending login
    
    If after ibmvnic sends a LOGIN it gets a FAILOVER, it is possible that
    the worker thread will start reset process and free the login response
    buffer before it gets a (now stale) LOGIN_RSP. The ibmvnic tasklet will
    then try to access the login response buffer and crash.
    
    Have ibmvnic track pending logins and discard any stale login responses.
    
    Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index d4d40b349788..13eae1666477 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -3841,6 +3841,8 @@ static int send_login(struct ibmvnic_adapter *adapter)
 	crq.login.cmd = LOGIN;
 	crq.login.ioba = cpu_to_be32(buffer_token);
 	crq.login.len = cpu_to_be32(buffer_size);
+
+	adapter->login_pending = true;
 	ibmvnic_send_crq(adapter, &crq);
 
 	return 0;
@@ -4393,6 +4395,15 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
 	u64 *size_array;
 	int i;
 
+	/* CHECK: Test/set of login_pending does not need to be atomic
+	 * because only ibmvnic_tasklet tests/clears this.
+	 */
+	if (!adapter->login_pending) {
+		netdev_warn(netdev, "Ignoring unexpected login response\n");
+		return 0;
+	}
+	adapter->login_pending = false;
+
 	dma_unmap_single(dev, adapter->login_buf_token, adapter->login_buf_sz,
 			 DMA_TO_DEVICE);
 	dma_unmap_single(dev, adapter->login_rsp_buf_token,
@@ -4764,6 +4775,11 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
 		case IBMVNIC_CRQ_INIT:
 			dev_info(dev, "Partner initialized\n");
 			adapter->from_passive_init = true;
+			/* Discard any stale login responses from prev reset.
+			 * CHECK: should we clear even on INIT_COMPLETE?
+			 */
+			adapter->login_pending = false;
+
 			if (!completion_done(&adapter->init_done)) {
 				complete(&adapter->init_done);
 				adapter->init_done_rc = -EIO;
@@ -5196,6 +5212,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
 	dev_set_drvdata(&dev->dev, netdev);
 	adapter->vdev = dev;
 	adapter->netdev = netdev;
+	adapter->login_pending = false;
 
 	ether_addr_copy(adapter->mac_addr, mac_addr_p);
 	ether_addr_copy(netdev->dev_addr, adapter->mac_addr);
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 47a3fd71c96f..bffa7f939ee1 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -1086,6 +1086,7 @@ struct ibmvnic_adapter {
 	struct delayed_work ibmvnic_delayed_reset;
 	unsigned long resetting;
 	bool napi_enabled, from_passive_init;
+	bool login_pending;
 
 	bool failover_pending;
 	bool force_reset_recovery;
commit f15fde9d47b887b406f5e76490d601cfc26643c9
Author: Sukadev Bhattiprolu <sukadev at linux.ibm.com>
Date:   Wed Nov 25 18:04:28 2020 -0600

    ibmvnic: delay next reset if hard reset fails
    
    If auto-priority failover is enabled, the backing device needs time
    to settle if hard resetting fails for any reason. Add a delay of 60
    seconds before retrying the hard-reset.
    
    Fixes: 2770a7984db5 ("ibmvnic: Introduce hard reset recovery")
    Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 5ce9f70984ee..d4d40b349788 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2241,6 +2241,14 @@ static void __ibmvnic_reset(struct work_struct *work)
 				rc = do_hard_reset(adapter, rwi, reset_state);
 				rtnl_unlock();
 			}
+			if (rc) {
+				/* give backing device time to settle down */
+				netdev_dbg(adapter->netdev,
+					   "[S:%d] Hard reset failed, waiting 60 secs\n",
+					   adapter->state);
+				set_current_state(TASK_UNINTERRUPTIBLE);
+				schedule_timeout(60 * HZ);
+			}
 		} else if (!(rwi->reset_reason == VNIC_RESET_FATAL &&
 				adapter->from_passive_init)) {
 			rc = do_reset(adapter, rwi, reset_state);
commit 0cb4bc66ba5ea2d3b94ec2a00775888130db628a
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:27 2020 -0600

    ibmvnic: restore adapter state on failed reset
    
    In a failed reset, driver could end up in VNIC_PROBED or VNIC_CLOSED
    state and cannot recover in subsequent resets, leaving it offline.
    This patch restores the adapter state to reset_state, the original
    state when reset was called.
    
    Fixes: b27507bb59ed5 ("net/ibmvnic: unlock rtnl_lock in reset so linkwatch_event can run")
    Fixes: 2770a7984db58 ("ibmvnic: Introduce hard reset recovery")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 939a276dae7d..5ce9f70984ee 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1857,7 +1857,7 @@ static int do_change_param_reset(struct ibmvnic_adapter *adapter,
 	if (reset_state == VNIC_OPEN) {
 		rc = __ibmvnic_close(netdev);
 		if (rc)
-			return rc;
+			goto out;
 	}
 
 	release_resources(adapter);
@@ -1875,24 +1875,25 @@ static int do_change_param_reset(struct ibmvnic_adapter *adapter,
 	}
 
 	rc = ibmvnic_reset_init(adapter, true);
-	if (rc)
-		return IBMVNIC_INIT_FAILED;
+	if (rc) {
+		rc = IBMVNIC_INIT_FAILED;
+		goto out;
+	}
 
 	/* If the adapter was in PROBE state prior to the reset,
 	 * exit here.
 	 */
 	if (reset_state == VNIC_PROBED)
-		return 0;
+		goto out;
 
 	rc = ibmvnic_login(netdev);
 	if (rc) {
-		adapter->state = reset_state;
-		return rc;
+		goto out;
 	}
 
 	rc = init_resources(adapter);
 	if (rc)
-		return rc;
+		goto out;
 
 	ibmvnic_disable_irqs(adapter);
 
@@ -1902,8 +1903,10 @@ static int do_change_param_reset(struct ibmvnic_adapter *adapter,
 		return 0;
 
 	rc = __ibmvnic_open(netdev);
-	if (rc)
-		return IBMVNIC_OPEN_FAILED;
+	if (rc) {
+		rc = IBMVNIC_OPEN_FAILED;
+		goto out;
+	}
 
 	/* refresh device's multicast list */
 	ibmvnic_set_multi(netdev);
@@ -1912,7 +1915,10 @@ static int do_change_param_reset(struct ibmvnic_adapter *adapter,
 	for (i = 0; i < adapter->req_rx_queues; i++)
 		napi_schedule(&adapter->napi[i]);
 
-	return 0;
+out:
+	if (rc)
+		adapter->state = reset_state;
+	return rc;
 }
 
 /**
@@ -2015,7 +2021,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
 
 		rc = ibmvnic_login(netdev);
 		if (rc) {
-			adapter->state = reset_state;
 			goto out;
 		}
 
@@ -2083,6 +2088,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
 	rc = 0;
 
 out:
+	/* restore the adapter state if reset failed */
+	if (rc)
+		adapter->state = reset_state;
 	rtnl_unlock();
 
 	return rc;
@@ -2115,43 +2123,46 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter,
 	if (rc) {
 		netdev_err(adapter->netdev,
 			   "Couldn't initialize crq. rc=%d\n", rc);
-		return rc;
+		goto out;
 	}
 
 	rc = ibmvnic_reset_init(adapter, false);
 	if (rc)
-		return rc;
+		goto out;
 
 	/* If the adapter was in PROBE state prior to the reset,
 	 * exit here.
 	 */
 	if (reset_state == VNIC_PROBED)
-		return 0;
+		goto out;
 
 	rc = ibmvnic_login(netdev);
-	if (rc) {
-		adapter->state = VNIC_PROBED;
-		return 0;
-	}
+	if (rc)
+		goto out;
 
 	rc = init_resources(adapter);
 	if (rc)
-		return rc;
+		goto out;
 
 	ibmvnic_disable_irqs(adapter);
 	adapter->state = VNIC_CLOSED;
 
 	if (reset_state == VNIC_CLOSED)
-		return 0;
+		goto out;
 
 	rc = __ibmvnic_open(netdev);
-	if (rc)
-		return IBMVNIC_OPEN_FAILED;
+	if (rc) {
+		rc = IBMVNIC_OPEN_FAILED;
+		goto out;
+	}
 
 	call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev);
 	call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev);
-
-	return 0;
+out:
+	/* restore adapter state if reset failed */
+	if (rc)
+		adapter->state = reset_state;
+	return rc;
 }
 
 static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter)
@@ -2235,13 +2246,7 @@ static void __ibmvnic_reset(struct work_struct *work)
 			rc = do_reset(adapter, rwi, reset_state);
 		}
 		kfree(rwi);
-		if (rc == IBMVNIC_OPEN_FAILED) {
-			if (list_empty(&adapter->rwi_list))
-				adapter->state = VNIC_CLOSED;
-			else
-				adapter->state = reset_state;
-			rc = 0;
-		}
+
 		if (rc)
 			netdev_dbg(adapter->netdev, "Reset failed, rc=%d\n", rc);
 
commit 9281cf2d584083a450fd65fd27cc5f0e692f6e30
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:26 2020 -0600

    ibmvnic: avoid memset null scrq msgs
    
    scrq->msgs could be NULL during device reset, causing Linux to crash.
    So, check before memset scrq->msgs.
    
    Fixes: c8b2ad0a4a901 ("ibmvnic: Sanitize entire SCRQ buffer on reset")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index e9243d8c5abc..939a276dae7d 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2844,15 +2844,26 @@ static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter,
 {
 	int rc;
 
+	if (!scrq) {
+		netdev_dbg(adapter->netdev,
+			   "Invalid scrq reset. irq (%d) or msgs (%p).\n",
+			   scrq->irq, scrq->msgs);
+		return -EINVAL;
+	}
+
 	if (scrq->irq) {
 		free_irq(scrq->irq, scrq);
 		irq_dispose_mapping(scrq->irq);
 		scrq->irq = 0;
 	}
-
-	memset(scrq->msgs, 0, 4 * PAGE_SIZE);
-	atomic_set(&scrq->used, 0);
-	scrq->cur = 0;
+	if (scrq->msgs) {
+		memset(scrq->msgs, 0, 4 * PAGE_SIZE);
+		atomic_set(&scrq->used, 0);
+		scrq->cur = 0;
+	} else {
+		netdev_dbg(adapter->netdev, "Invalid scrq reset\n");
+		return -EINVAL;
+	}
 
 	rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token,
 			   4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq);
commit 18f141bf97d42f65abfdf17fd93fb3a0dac100e7
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:25 2020 -0600

    ibmvnic: stop free_all_rwi on failed reset
    
    When ibmvnic fails to reset, it breaks out of the reset loop and frees
    all of the remaining resets from the workqueue. Doing so prevents the
    adapter from recovering if no reset is scheduled after that. Instead,
    have the driver continue to process resets on the workqueue.
    
    Remove the no longer need free_all_rwi().
    
    Fixes: ed651a10875f1 ("ibmvnic: Updated reset handling")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index b28a979061dc..e9243d8c5abc 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2173,17 +2173,6 @@ static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter)
 	return rwi;
 }
 
-static void free_all_rwi(struct ibmvnic_adapter *adapter)
-{
-	struct ibmvnic_rwi *rwi;
-
-	rwi = get_next_rwi(adapter);
-	while (rwi) {
-		kfree(rwi);
-		rwi = get_next_rwi(adapter);
-	}
-}
-
 static void __ibmvnic_reset(struct work_struct *work)
 {
 	struct ibmvnic_rwi *rwi;
@@ -2252,9 +2241,9 @@ static void __ibmvnic_reset(struct work_struct *work)
 			else
 				adapter->state = reset_state;
 			rc = 0;
-		} else if (rc && rc != IBMVNIC_INIT_FAILED &&
-		    !adapter->force_reset_recovery)
-			break;
+		}
+		if (rc)
+			netdev_dbg(adapter->netdev, "Reset failed, rc=%d\n", rc);
 
 		rwi = get_next_rwi(adapter);
 
@@ -2268,11 +2257,6 @@ static void __ibmvnic_reset(struct work_struct *work)
 		complete(&adapter->reset_done);
 	}
 
-	if (rc) {
-		netdev_dbg(adapter->netdev, "Reset failed\n");
-		free_all_rwi(adapter);
-	}
-
 	clear_bit_unlock(0, &adapter->resetting);
 }
 
commit 31d6b4036098f6b59bcfa20375626b500c7d7417
Author: Dany Madden <drt at linux.ibm.com>
Date:   Wed Nov 25 18:04:24 2020 -0600

    ibmvnic: handle inconsistent login with reset
    
    Inconsistent login with the vnicserver is causing the device to be
    removed. This does not give the device a chance to recover from error
    state. This patch schedules a FATAL reset instead to bring the adapter
    up.
    
    Fixes: 032c5e82847a2 ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 2491ebc97871..b28a979061dc 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -4414,7 +4414,7 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
 	     adapter->req_rx_add_queues !=
 	     be32_to_cpu(login_rsp->num_rxadd_subcrqs))) {
 		dev_err(dev, "FATAL: Inconsistent login and login rsp\n");
-		ibmvnic_remove(adapter->vdev);
+		ibmvnic_reset(adapter, VNIC_RESET_FATAL);
 		return -EIO;
 	}
 	size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) +
commit bd2d5c54dc7c375586840e1f931f95a43c61d96a
Merge: e14038a7ead0 a5d45bc0dc50
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Sat Nov 28 13:20:23 2020 -0800

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
    
    Pablo Neira Ayuso says:
    
    ====================
    Netfilter fixes for net
    
    1) Fix insufficient validation of IPSET_ATTR_IPADDR_IPV6 reported
       by syzbot.
    
    2) Remove spurious reports on nf_tables when lockdep gets disabled,
       from Florian Westphal.
    
    3) Fix memleak in the error path of error path of
       ip_vs_control_net_init(), from Wang Hai.
    
    4) Fix missing control data in flow dissector, otherwise IP address
       matching in hardware offload infra does not work.
    
    5) Fix hardware offload match on prefix IP address when userspace
       does not send a bitwise expression to represent the prefix.
    
    * git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf:
      netfilter: nftables_offload: build mask based from the matching bytes
      netfilter: nftables_offload: set address type in control dissector
      ipvs: fix possible memory leak in ip_vs_control_net_init
      netfilter: nf_tables: avoid false-postive lockdep splat
      netfilter: ipset: prevent uninit-value in hash_ip6_add
    ====================
    
    Link: https://lore.kernel.org/r/20201127190313.24947-1-pablo@netfilter.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit e14038a7ead09faa180eb072adc4a2157a0b475f
Author: Davide Caratti <dcaratti at redhat.com>
Date:   Thu Nov 26 19:47:47 2020 +0100

    selftests: tc-testing: enable CONFIG_NET_SCH_RED as a module
    
    a proper kernel configuration for running kselftest can be obtained with:
    
     $ yes | make kselftest-merge
    
    enable compile support for the 'red' qdisc: otherwise, tdc kselftest fail
    when trying to run tdc test items contained in red.json.
    
    Signed-off-by: Davide Caratti <dcaratti at redhat.com>
    Link: https://lore.kernel.org/r/cfa23f2d4f672401e6cebca3a321dd1901a9ff07.1606416464.git.dcaratti@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/tools/testing/selftests/tc-testing/config b/tools/testing/selftests/tc-testing/config
index c33a7aac27ff..b71828df5a6d 100644
--- a/tools/testing/selftests/tc-testing/config
+++ b/tools/testing/selftests/tc-testing/config
@@ -59,6 +59,7 @@ CONFIG_NET_IFE_SKBPRIO=m
 CONFIG_NET_IFE_SKBTCINDEX=m
 CONFIG_NET_SCH_FIFO=y
 CONFIG_NET_SCH_ETS=m
+CONFIG_NET_SCH_RED=m
 
 #
 ## Network testing
commit 1ebf179037cb46c19da3a9c1e2ca16e7a754b75e
Author: Guillaume Nault <gnault at redhat.com>
Date:   Thu Nov 26 19:09:22 2020 +0100

    ipv4: Fix tos mask in inet_rtm_getroute()
    
    When inet_rtm_getroute() was converted to use the RCU variants of
    ip_route_input() and ip_route_output_key(), the TOS parameters
    stopped being masked with IPTOS_RT_MASK before doing the route lookup.
    
    As a result, "ip route get" can return a different route than what
    would be used when sending real packets.
    
    For example:
    
        $ ip route add 192.0.2.11/32 dev eth0
        $ ip route add unreachable 192.0.2.11/32 tos 2
        $ ip route get 192.0.2.11 tos 2
        RTNETLINK answers: No route to host
    
    But, packets with TOS 2 (ECT(0) if interpreted as an ECN bit) would
    actually be routed using the first route:
    
        $ ping -c 1 -Q 2 192.0.2.11
        PING 192.0.2.11 (192.0.2.11) 56(84) bytes of data.
        64 bytes from 192.0.2.11: icmp_seq=1 ttl=64 time=0.173 ms
    
        --- 192.0.2.11 ping statistics ---
        1 packets transmitted, 1 received, 0% packet loss, time 0ms
        rtt min/avg/max/mdev = 0.173/0.173/0.173/0.000 ms
    
    This patch re-applies IPTOS_RT_MASK in inet_rtm_getroute(), to
    return results consistent with real route lookups.
    
    Fixes: 3765d35ed8b9 ("net: ipv4: Convert inet_rtm_getroute to rcu versions of route lookup")
    Signed-off-by: Guillaume Nault <gnault at redhat.com>
    Reviewed-by: David Ahern <dsahern at kernel.org>
    Link: https://lore.kernel.org/r/b2d237d08317ca55926add9654a48409ac1b8f5b.1606412894.git.gnault@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index dc2a399cd9f4..9f43abeac3a8 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -3222,7 +3222,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 
 	fl4.daddr = dst;
 	fl4.saddr = src;
-	fl4.flowi4_tos = rtm->rtm_tos;
+	fl4.flowi4_tos = rtm->rtm_tos & IPTOS_RT_MASK;
 	fl4.flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0;
 	fl4.flowi4_mark = mark;
 	fl4.flowi4_uid = uid;
@@ -3246,8 +3246,9 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 		fl4.flowi4_iif = iif; /* for rt_fill_info */
 		skb->dev	= dev;
 		skb->mark	= mark;
-		err = ip_route_input_rcu(skb, dst, src, rtm->rtm_tos,
-					 dev, &res);
+		err = ip_route_input_rcu(skb, dst, src,
+					 rtm->rtm_tos & IPTOS_RT_MASK, dev,
+					 &res);
 
 		rt = skb_rtable(skb);
 		if (err == 0 && rt->dst.error)
commit 3771b822422fd999fbcd30c7e8302d251be0bb75
Merge: 28d35ad0838b 9a44bc9449cf
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Sat Nov 28 12:04:56 2020 -0800

    Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
    
    Daniel Borkmann says:
    
    ====================
    pull-request: bpf 2020-11-28
    
    1) Do not reference the skb for xsk's generic TX side since when looped
       back into RX it might crash in generic XDP, from Björn Töpel.
    
    2) Fix umem cleanup on a partially set up xsk socket when being destroyed,
       from Magnus Karlsson.
    
    3) Fix an incorrect netdev reference count when failing xsk_bind() operation,
       from Marek Majtyka.
    
    4) Fix bpftool to set an error code on failed calloc() in build_btf_type_table(),
       from Zhen Lei.
    
    * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
      bpf: Add MAINTAINERS entry for BPF LSM
      bpftool: Fix error return value in build_btf_type_table
      net, xsk: Avoid taking multiple skbuff references
      xsk: Fix incorrect netdev reference count
      xsk: Fix umem cleanup bug at socket destruct
      MAINTAINERS: Update XDP and AF_XDP entries
    ====================
    
    Link: https://lore.kernel.org/r/20201128005104.1205-1-daniel@iogearbox.net
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 28d35ad0838b26038ec42aa129692e4c43663e6b
Merge: 44f64f23bae2 992b03b88e36
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Sat Nov 28 11:56:06 2020 -0800

    Merge tag 'batadv-net-pullrequest-20201127' of git://git.open-mesh.org/linux-merge
    
    Simon Wunderlich says:
    
    ====================
    Here are some batman-adv bugfixes:
    
     - Fix head/tailroom issues for fragments, by Sven Eckelmann (3 patches)
    
    * tag 'batadv-net-pullrequest-20201127' of git://git.open-mesh.org/linux-merge:
      batman-adv: Don't always reallocate the fragmentation skb head
      batman-adv: Reserve needed_*room for fragments
      batman-adv: Consider fragmentation for needed_headroom
    ====================
    
    Link: https://lore.kernel.org/r/20201127173849.19208-1-sw@simonwunderlich.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 44f64f23bae2f0fad25503bc7ab86cd08d04cd47
Author: Antoine Tenart <atenart at kernel.org>
Date:   Mon Nov 23 18:49:02 2020 +0100

    netfilter: bridge: reset skb->pkt_type after NF_INET_POST_ROUTING traversal
    
    Netfilter changes PACKET_OTHERHOST to PACKET_HOST before invoking the
    hooks as, while it's an expected value for a bridge, routing expects
    PACKET_HOST. The change is undone later on after hook traversal. This
    can be seen with pairs of functions updating skb>pkt_type and then
    reverting it to its original value:
    
    For hook NF_INET_PRE_ROUTING:
      setup_pre_routing / br_nf_pre_routing_finish
    
    For hook NF_INET_FORWARD:
      br_nf_forward_ip / br_nf_forward_finish
    
    But the third case where netfilter does this, for hook
    NF_INET_POST_ROUTING, the packet type is changed in br_nf_post_routing
    but never reverted. A comment says:
    
      /* We assume any code from br_dev_queue_push_xmit onwards doesn't care
       * about the value of skb->pkt_type. */
    
    But when having a tunnel (say vxlan) attached to a bridge we have the
    following call trace:
    
      br_nf_pre_routing
      br_nf_pre_routing_ipv6
         br_nf_pre_routing_finish
      br_nf_forward_ip
         br_nf_forward_finish
      br_nf_post_routing           <- pkt_type is updated to PACKET_HOST
         br_nf_dev_queue_xmit      <- but not reverted to its original value
      vxlan_xmit
         vxlan_xmit_one
            skb_tunnel_check_pmtu  <- a check on pkt_type is performed
    
    In this specific case, this creates issues such as when an ICMPv6 PTB
    should be sent back. When CONFIG_BRIDGE_NETFILTER is enabled, the PTB
    isn't sent (as skb_tunnel_check_pmtu checks if pkt_type is PACKET_HOST
    and returns early).
    
    If the comment is right and no one cares about the value of
    skb->pkt_type after br_dev_queue_push_xmit (which isn't true), resetting
    it to its original value should be safe.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Antoine Tenart <atenart at kernel.org>
    Reviewed-by: Florian Westphal <fw at strlen.de>
    Link: https://lore.kernel.org/r/20201123174902.622102-1-atenart@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c
index 04c3f9a82650..8edfb98ae1d5 100644
--- a/net/bridge/br_netfilter_hooks.c
+++ b/net/bridge/br_netfilter_hooks.c
@@ -735,6 +735,11 @@ static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff
 	mtu_reserved = nf_bridge_mtu_reduction(skb);
 	mtu = skb->dev->mtu;
 
+	if (nf_bridge->pkt_otherhost) {
+		skb->pkt_type = PACKET_OTHERHOST;
+		nf_bridge->pkt_otherhost = false;
+	}
+
 	if (nf_bridge->frag_max_size && nf_bridge->frag_max_size < mtu)
 		mtu = nf_bridge->frag_max_size;
 
@@ -835,8 +840,6 @@ static unsigned int br_nf_post_routing(void *priv,
 	else
 		return NF_ACCEPT;
 
-	/* We assume any code from br_dev_queue_push_xmit onwards doesn't care
-	 * about the value of skb->pkt_type. */
 	if (skb->pkt_type == PACKET_OTHERHOST) {
 		skb->pkt_type = PACKET_HOST;
 		nf_bridge->pkt_otherhost = true;
commit 45e885c439e825c19f3a51e46ef8210984bc0a9c
Merge: ca579827c9a7 d1889589a4f5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 28 10:42:30 2020 -0800

    Merge tag 'kbuild-fixes-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
    
    Pull Kbuild fixes from Masahiro Yamada:
    
     - Remove unused OBJSIZE variable.
    
     - Fix rootless deb-pkg build in a setgid directory.
    
    * tag 'kbuild-fixes-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
      builddeb: Fix rootless build in setuid/setgid directory
      kbuild: remove unused OBJSIZE

commit ca579827c9a7ec1b6fbfd2f8b157acaf138be838
Merge: 67f34fa8893e a9ffd0484eb4
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 28 10:35:05 2020 -0800

    Merge tag 'perf-tools-fixes-for-v5.10-2020-11-28' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux
    
    Pull perf tool fixes from Arnaldo Carvalho de Melo:
    
     - Fix die_entrypc() when DW_AT_ranges DWARF attribute not available
    
     - Cope with broken DWARF (missing DW_AT_declaration) generated by some
       recent gcc versions
    
     - Do not generate CGROUP metadata events when not asked to in 'perf
       record'
    
     - Use proper CPU for shadow stats in 'perf stat'
    
     - Update copy of libbpf's hashmap.c, silencing tools/perf build warning
    
     - Fix return value in 'perf diff'
    
    * tag 'perf-tools-fixes-for-v5.10-2020-11-28' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux:
      perf probe: Change function definition check due to broken DWARF
      perf probe: Fix to die_entrypc() returns error correctly
      perf stat: Use proper cpu for shadow stats
      perf record: Synthesize cgroup events only if needed
      perf diff: Fix error return value in __cmd_diff()
      perf tools: Update copy of libbpf's hashmap.c

commit 67f34fa8893e6dfb0e8104c28ee6c5ce23a9e238
Merge: 7b2c800d6695 484cfbe5fb61
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 28 10:09:38 2020 -0800

    Merge tag 'usb-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
    
    Pull USB / PHY driver fixes from Greg KH:
     "Here are a few small USB and PHY driver fixes for 5.10-rc6. They
      include:
    
       - small PHY driver fixes to resolve reported issues
    
       - USB quirks added for "broken" devices
    
       - typec fixes for reported problems
    
       - USB gadget fixes for small issues
    
      Full details are in the shortlog, nothing major in here and all have
      been in linux-next with no reported issues"
    
    * tag 'usb-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
      usb: typec: stusb160x: fix power-opmode property with typec-power-opmode
      USB: core: Change %pK for __user pointers to %px
      USB: core: Fix regression in Hercules audio card
      usb: gadget: Fix memleak in gadgetfs_fill_super
      usb: gadget: f_midi: Fix memleak in f_midi_alloc
      USB: quirks: Add USB_QUIRK_DISCONNECT_SUSPEND quirk for Lenovo A630Z TIO built-in usb-audio card
      usb: typec: qcom-pmic-typec: fix builtin build errors
      phy: mediatek: fix spelling mistake in Kconfig "veriosn" -> "version"
      phy: qualcomm: Fix 28 nm Hi-Speed USB PHY OF dependency
      phy: qualcomm: usb: Fix SuperSpeed PHY OF dependency
      phy: intel: PHY_INTEL_KEEMBAY_EMMC should depend on ARCH_KEEMBAY
      usb: cdns3: gadget: calculate TD_SIZE based on TD
      usb: cdns3: gadget: initialize link_trb as NULL
      phy: cpcap-usb: Use IRQF_ONESHOT
      phy: qcom-qmp: Initialize another pointer to NULL
      phy: tegra: xusb: Fix dangling pointer on probe failure
      phy: usb: Fix incorrect clearing of tca_drv_sel bit in SETUP reg for 7211

commit 7b2c800d6695d91df9208ba416fff59c8b0fc608
Merge: c84e1efae022 c7acb6b9c07b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 28 10:04:36 2020 -0800

    Merge tag 'char-misc-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
    
    Pull char/misc driver fixes from Greg KH:
     "Here are some small misc driver fixes for 5.10-rc6.  They include:
    
       - interconnect fixes for reported problems
    
       - habanalabs bugfix for found issue when doing the switch fallthrough
         patches
    
       - MAINTAINERS file update for coresight reviewers/maintainers
    
      All have been in linux-next with no reported issues"
    
    * tag 'char-misc-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
      MAINTAINERS: Adding help for coresight subsystem
      habanalabs/gaudi: fix missing code in ECC handling
      interconnect: fix memory trashing in of_count_icc_providers()
      interconnect: qcom: qcs404: Remove GPU and display RPM IDs
      interconnect: qcom: msm8916: Remove rpm-ids from non-RPM nodes
      interconnect: qcom: msm8974: Don't boost the NoC rate during boot
      interconnect: qcom: msm8974: Prevent integer overflow in rate

commit aeedad2504997be262c98f6e3228173225a8d868
Author: Takashi Iwai <tiwai at suse.de>
Date:   Sat Nov 28 10:00:15 2020 +0100

    ALSA: hda/realtek: Add mute LED quirk to yet another HP x360 model
    
    HP Spectre x360 Convertible 15" version (SSID 103c:827f) needs the
    same quirk to make the mute LED working like other models.
      System Information
        Manufacturer: HP
        Product Name: HP Spectre x360 Convertible 15-bl1XX
    
      Sound Codec:
        Codec: Realtek ALC295
        Vendor Id: 0x10ec0295
        Subsystem Id: 0x103c827f
        Revision Id: 0x100002
    
    Reported-by: <christoph.plattner at gmx.at>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201128090015.7743-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index c7e8680a7190..8616c5624870 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7934,6 +7934,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
 	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
 	SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
+	SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
 	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
commit c84bfedce60192c08455ee2d25dd13d19274a266
Author: Takashi Iwai <tiwai at suse.de>
Date:   Fri Nov 27 15:11:04 2020 +0100

    ALSA: hda/realtek: Fix bass speaker DAC assignment on Asus Zephyrus G14
    
    ASUS Zephyrus G14 has two speaker pins, and the auto-parser tries to
    assign an individual DAC to each pin as much as possible.
    Unfortunately the third DAC has no volume control unlike the two DACs,
    and this resulted in the inconsistent speaker volumes.
    
    As a workaround, wire both speaker pins to the same DAC by modifying
    the existing quirk (ALC289_FIXUP_ASUS_GA401) applied to this device.
    Since this quirk entry is chained by another, we need to avoid
    applying the DAC assignment change for it.  Luckily, there is another
    quirk entry (ALC289_FIXUP_ASUS_GA502) doing the very same thing, so we
    can chain to the GA502 quirk instead.
    
    Note that this patch uses a new flag of the generic parser,
    obey_preferred_dacs, for enforcing the DACs.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=210359
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201127141104.11041-2-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index fcd1fb18ece9..c7e8680a7190 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6027,6 +6027,21 @@ static void alc274_fixup_bind_dacs(struct hda_codec *codec,
 	codec->power_save_node = 0;
 }
 
+/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
+static void alc289_fixup_asus_ga401(struct hda_codec *codec,
+				    const struct hda_fixup *fix, int action)
+{
+	static const hda_nid_t preferred_pairs[] = {
+		0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
+	};
+	struct alc_spec *spec = codec->spec;
+
+	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
+		spec->gen.preferred_dacs = preferred_pairs;
+		spec->gen.obey_preferred_dacs = 1;
+	}
+}
+
 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
 			      const struct hda_fixup *fix, int action)
@@ -7600,11 +7615,10 @@ static const struct hda_fixup alc269_fixups[] = {
 		.chain_id = ALC269_FIXUP_HEADSET_MIC
 	},
 	[ALC289_FIXUP_ASUS_GA401] = {
-		.type = HDA_FIXUP_PINS,
-		.v.pins = (const struct hda_pintbl[]) {
-			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
-			{ }
-		},
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc289_fixup_asus_ga401,
+		.chained = true,
+		.chain_id = ALC289_FIXUP_ASUS_GA502,
 	},
 	[ALC289_FIXUP_ASUS_GA502] = {
 		.type = HDA_FIXUP_PINS,
@@ -7728,7 +7742,7 @@ static const struct hda_fixup alc269_fixups[] = {
 			{ }
 		},
 		.chained = true,
-		.chain_id = ALC289_FIXUP_ASUS_GA401
+		.chain_id = ALC289_FIXUP_ASUS_GA502
 	},
 	[ALC274_FIXUP_HP_MIC] = {
 		.type = HDA_FIXUP_VERBS,
commit 242d990c158d5b1dabd166516e21992baef5f26a
Author: Takashi Iwai <tiwai at suse.de>
Date:   Fri Nov 27 15:11:03 2020 +0100

    ALSA: hda/generic: Add option to enforce preferred_dacs pairs
    
    The generic parser accepts the preferred_dacs[] pairs as a hint for
    assigning a DAC to each pin, but this hint doesn't work always
    effectively.  Currently it's merely a secondary choice after the trial
    with the path index failed.  This made sometimes it difficult to
    assign DACs without mimicking the connection list and/or the badness
    table.
    
    This patch adds a new flag, obey_preferred_dacs, that changes the
    behavior of the parser.  As its name stands, the parser obeys the
    given preferred_dacs[] pairs by skipping the path index matching and
    giving a high penalty if no DAC is assigned by the pairs.  This mode
    will help for assigning the fixed DACs forcibly from the codec
    driver.
    
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201127141104.11041-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index bbb17481159e..8060cc86dfea 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -1364,16 +1364,20 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
 		struct nid_path *path;
 		hda_nid_t pin = pins[i];
 
-		path = snd_hda_get_path_from_idx(codec, path_idx[i]);
-		if (path) {
-			badness += assign_out_path_ctls(codec, path);
-			continue;
+		if (!spec->obey_preferred_dacs) {
+			path = snd_hda_get_path_from_idx(codec, path_idx[i]);
+			if (path) {
+				badness += assign_out_path_ctls(codec, path);
+				continue;
+			}
 		}
 
 		dacs[i] = get_preferred_dac(codec, pin);
 		if (dacs[i]) {
 			if (is_dac_already_used(codec, dacs[i]))
 				badness += bad->shared_primary;
+		} else if (spec->obey_preferred_dacs) {
+			badness += BAD_NO_PRIMARY_DAC;
 		}
 
 		if (!dacs[i])
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h
index a43f0bb77dae..0886bc81f40b 100644
--- a/sound/pci/hda/hda_generic.h
+++ b/sound/pci/hda/hda_generic.h
@@ -237,6 +237,7 @@ struct hda_gen_spec {
 	unsigned int power_down_unused:1; /* power down unused widgets */
 	unsigned int dac_min_mute:1; /* minimal = mute for DACs */
 	unsigned int suppress_vmaster:1; /* don't create vmaster kctls */
+	unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */
 
 	/* other internal flags */
 	unsigned int no_analog:1; /* digital I/O only */
commit c84e1efae022071a4fcf9f1899bf71777c49943a
Merge: 303bc934722b cef397038167
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 15:00:35 2020 -0800

    Merge tag 'asm-generic-fixes-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic
    
    Pull asm-generic fix from Arnd Bergmann:
     "Add correct MAX_POSSIBLE_PHYSMEM_BITS setting to asm-generic.
    
      This is a single bugfix for a bug that Stefan Agner found on 32-bit
      Arm, but that exists on several other architectures"
    
    * tag 'asm-generic-fixes-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic:
      arch: pgtable: define MAX_POSSIBLE_PHYSMEM_BITS where needed

commit 303bc934722b53163bfb1c25da7db5d35c0e51b6
Merge: 79c0c1f0389d ae597565d13f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 14:48:03 2020 -0800

    Merge tag 'arm-soc-fixes-v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
    
    Pull ARM SoC fixes from Arnd Bergmann:
     "Another set of patches for devicetree files and Arm SoC specific
      drivers:
    
       - A fix for OP-TEE shared memory on non-SMP systems
    
       - multiple code fixes for the OMAP platform, including one regression
         for the CPSW network driver and a few runtime warning fixes
    
       - Some DT patches for the Rockchip RK3399 platform, in particular
         fixing the MMC device ordering that recently became
         nondeterministic with async probe.
    
       - Multiple DT fixes for the Tegra platform, including a regression
         fix for suspend/resume on TX2
    
       - A regression fix for a user-triggered fault in the NXP dpio driver
    
       - A regression fix for a bug caused by an earlier bug fix in the
         xilinx firmware driver
    
       - Two more DTC warning fixes
    
       - Sylvain Lemieux steps down as maintainer for the NXP LPC32xx
         platform"
    
    * tag 'arm-soc-fixes-v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (24 commits)
      arm64: tegra: Fix Tegra234 VDK node names
      arm64: tegra: Wrong AON HSP reg property size
      arm64: tegra: Fix USB_VBUS_EN0 regulator on Jetson TX1
      arm64: tegra: Correct the UART for Jetson Xavier NX
      arm64: tegra: Disable the ACONNECT for Jetson TX2
      optee: add writeback to valid memory type
      firmware: xilinx: Use hash-table for api feature check
      firmware: xilinx: Fix SD DLL node reset issue
      soc: fsl: dpio: Get the cpumask through cpumask_of(cpu)
      ARM: dts: dra76x: m_can: fix order of clocks
      bus: ti-sysc: suppress err msg for timers used as clockevent/source
      MAINTAINERS: Remove myself as LPC32xx maintainers
      arm64: dts: qcom: clear the warnings caused by empty dma-ranges
      arm64: dts: broadcom: clear the warnings caused by empty dma-ranges
      ARM: dts: am437x-l4: fix compatible for cpsw switch dt node
      arm64: dts: rockchip: Reorder LED triggers from mmc devices on rk3399-roc-pc.
      arm64: dts: rockchip: Assign a fixed index to mmc devices on rk3399 boards.
      arm64: dts: rockchip: Remove system-power-controller from pmic on Odroid Go Advance
      arm64: dts: rockchip: fix NanoPi R2S GMAC clock name
      ARM: OMAP2+: Manage MPU state properly for omap_enter_idle_coupled()
      ...

commit 79c0c1f0389db60f3c83ec91585a39d16e036f21
Merge: 80e1e1761d1a d0742c49cab5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 14:38:02 2020 -0800

    Merge tag 'net-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
    
    Pull networking fixes from Jakub Kicinski:
     "Networking fixes for 5.10-rc6, including fixes from the WiFi driver,
      and CAN subtrees.
    
      Current release - regressions:
    
       - gro_cells: reduce number of synchronize_net() calls
    
       - ch_ktls: release a lock before jumping to an error path
    
      Current release - always broken:
    
       - tcp: Allow full IP tos/IPv6 tclass to be reflected in L3 header
    
      Previous release - regressions:
    
       - net/tls: fix missing received data after fast remote close
    
       - vsock/virtio: discard packets only when socket is really closed
    
       - sock: set sk_err to ee_errno on dequeue from errq
    
       - cxgb4: fix the panic caused by non smac rewrite
    
      Previous release - always broken:
    
       - tcp: fix corner cases around setting ECN with BPF selection of
         congestion control
    
       - tcp: fix race condition when creating child sockets from syncookies
         on loopback interface
    
       - usbnet: ipheth: fix connectivity with iOS 14
    
       - tun: honor IOCB_NOWAIT flag
    
       - net/packet: fix packet receive on L3 devices without visible hard
         header
    
       - devlink: Make sure devlink instance and port are in same net
         namespace
    
       - net: openvswitch: fix TTL decrement action netlink message format
    
       - bonding: wait for sysfs kobject destruction before freeing struct
         slave
    
       - net: stmmac: fix upstream patch applied to the wrong context
    
       - bnxt_en: fix return value and unwind in probe error paths
    
      Misc:
    
       - devlink: add extra layer of categorization to the reload stats uAPI
         before it's released"
    
    * tag 'net-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (68 commits)
      sock: set sk_err to ee_errno on dequeue from errq
      mptcp: fix NULL ptr dereference on bad MPJ
      net: openvswitch: fix TTL decrement action netlink message format
      can: af_can: can_rx_unregister(): remove WARN() statement from list operation sanity check
      can: m_can: m_can_dev_setup(): add support for bosch mcan version 3.3.0
      can: m_can: fix nominal bitiming tseg2 min for version >= 3.1
      can: m_can: m_can_open(): remove IRQF_TRIGGER_FALLING from request_threaded_irq()'s flags
      can: mcp251xfd: mcp251xfd_probe(): bail out if no IRQ was given
      can: gs_usb: fix endianess problem with candleLight firmware
      ch_ktls: lock is not freed
      net/tls: Protect from calling tls_dev_del for TLS RX twice
      devlink: Make sure devlink instance and port are in same net namespace
      devlink: Hold rtnl lock while reading netdev attributes
      ptp: clockmatrix: bug fix for idtcm_strverscmp
      enetc: Let the hardware auto-advance the taprio base-time of 0
      gro_cells: reduce number of synchronize_net() calls
      net: stmmac: fix incorrect merge of patch upstream
      ipv6: addrlabel: fix possible memory leak in ip6addrlbl_net_init
      Documentation: netdev-FAQ: suggest how to post co-dependent series
      ibmvnic: enhance resetting status check during module exit
      ...

commit 80e1e1761d1a9eefda4d1545f8b6c0a2e46d4e3f
Merge: 9223e74f9960 e92643db5148
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 14:06:23 2020 -0800

    Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
    
    Pull SCSI fixes from James Bottomley:
     "Three small fixes in the UFS driver: two are for power management
      issues and the third is to fix a slew of problem in the sysfs code"
    
    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
      scsi: ufs: Fix race between shutdown and runtime resume flow
      scsi: ufs: Make sure clk scaling happens only when HBA is runtime ACTIVE
      scsi: ufs: Fix unexpected values from ufshcd_read_desc_param()

commit 9223e74f9960778bd3edd39e15edd5532708b7fb
Merge: d021c3e56d48 af60470347de
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 12:56:04 2020 -0800

    Merge tag 'io_uring-5.10-2020-11-27' of git://git.kernel.dk/linux-block
    
    Pull io_uring fixes from Jens Axboe:
    
     - Out of bounds fix for the cq size cap from earlier this release (Joseph)
    
     - iov_iter type check fix (Pavel)
    
     - Files grab + cancelation fix (Pavel)
    
    * tag 'io_uring-5.10-2020-11-27' of git://git.kernel.dk/linux-block:
      io_uring: fix files grab/cancel race
      io_uring: fix ITER_BVEC check
      io_uring: fix shift-out-of-bounds when round up cq size

commit d021c3e56d48b0a435eab3b3ec99d4e8bf8df2d1
Merge: a17a3ca55e96 47a846536e1b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 12:49:01 2020 -0800

    Merge tag 'block-5.10-2020-11-27' of git://git.kernel.dk/linux-block
    
    Pull block fix from Jens Axboe:
     "Just a single fix, for a crash in the keyslot manager"
    
    * tag 'block-5.10-2020-11-27' of git://git.kernel.dk/linux-block:
      block/keyslot-manager: prevent crash when num_slots=1

commit a17a3ca55e96d20e25e8b1a7cd08192ce2bac3cc
Merge: d41e9b22eb87 a855fbe69229
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 12:42:13 2020 -0800

    Merge tag 'for-5.10-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
    
    Pull btrfs fixes from David Sterba:
     "A few fixes for various warnings that accumulated over past two weeks:
    
       - tree-checker: add missing return values for some errors
    
       - lockdep fixes
          - when reading qgroup config and starting quota rescan
          - reverse order of quota ioctl lock and VFS freeze lock
    
       - avoid accessing potentially stale fs info during device scan,
         reported by syzbot
    
       - add scope NOFS protection around qgroup relation changes
    
       - check for running transaction before flushing qgroups
    
       - fix tracking of new delalloc ranges for some cases"
    
    * tag 'for-5.10-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
      btrfs: fix lockdep splat when enabling and disabling qgroups
      btrfs: do nofs allocations when adding and removing qgroup relations
      btrfs: fix lockdep splat when reading qgroup config on mount
      btrfs: tree-checker: add missing returns after data_ref alignment checks
      btrfs: don't access possibly stale fs_info data for printing duplicate device
      btrfs: tree-checker: add missing return after error in root_item
      btrfs: qgroup: don't commit transaction when we already hold the handle
      btrfs: fix missing delalloc new bit for new delalloc ranges

commit d41e9b22eb871a7a7060964db9ce1ceb1c6e5b57
Merge: 76dc2bfc2e1b 17475e104dcb
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 12:31:04 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
    
    Pull rdma fixes from Jason Gunthorpe:
     "Two security issues and several small bug fixes. Things seem to have
      stabilized for this release here.
    
      Summary:
    
       - Significant out of bounds access security issue in i40iw
    
       - Fix misuse of mmu notifiers in hfi1
    
       - Several errors in the register map/usage in hns
    
       - Missing error returns in mthca"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
      RDMA/hns: Bugfix for memory window mtpt configuration
      RDMA/hns: Fix retry_cnt and rnr_cnt when querying QP
      RDMA/hns: Fix wrong field of SRQ number the device supports
      IB/hfi1: Ensure correct mm is used at all times
      RDMA/i40iw: Address an mmap handler exploit in i40iw
      IB/mthca: fix return value of error branch in mthca_init_cq()

commit 76dc2bfc2e1b40573cd33eb1c2027ef6cb7fed6c
Merge: 87c301ca911a b36bf0a0fe5d
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 12:03:07 2020 -0800

    Merge tag 'mtd/fixes-for-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
    
    Pull mtd fixes from Miquel Raynal:
     "Because of a recent change in the core, NAND controller drivers
      initializing the ECC engine too early in the probe path are broken.
    
      Drivers should wait for the NAND device to be discovered and its
      memory layout known before doing any ECC related initialization, so
      instead of reverting the faulty change which is actually moving in the
      right direction, let's fix the drivers directly: socrates, sharpsl,
      r852, plat_nand, pasemi, tmio, txx9ndfmc, orion, mpc5121, lpc32xx_slc,
      lpc32xx_mlc, fsmc, diskonchip, davinci, cs553x, au1550, ams-delta,
      xway and gpio"
    
    * tag 'mtd/fixes-for-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux:
      mtd: rawnand: socrates: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: sharpsl: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: r852: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: plat_nand: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: pasemi: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: tmio: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: txx9ndfmc: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: orion: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: mpc5121: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: lpc32xx_slc: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: lpc32xx_mlc: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: fsmc: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: diskonchip: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: davinci: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: cs553x: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: au1550: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: ams-delta: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: xway: Move the ECC initialization to ->attach_chip()
      mtd: rawnand: gpio: Move the ECC initialization to ->attach_chip()

commit 87c301ca911a3bee68900ee475fe536eebd9bc41
Merge: f594139d68cc 0abdb0fba073
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 11:29:53 2020 -0800

    Merge tag 'spi-fix-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
    
    Pull spi fixes from Mark Brown:
     "A few fixes for v5.10,  one for the core which fixes some potential
      races for controllers with multiple chip selects when configuration of
      the chip select for one client device races with the addition and
      initial setup of an additional client"
    
    * tag 'spi-fix-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
      spi: dw: Fix spi registration for controllers overriding CS
      spi: imx: fix the unbalanced spi runtime pm management
      spi: spi-nxp-fspi: fix fspi panic by unexpected interrupts
      spi: Take the SPI IO-mutex in the spi_setup() method

commit f594139d68ccdd64fe9c546b17189b298fa7ecd3
Merge: 6910b6768989 44f28934af14
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 11:25:23 2020 -0800

    Merge tag 'media/v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
    
    Pull virtual digital TV driver fixes from Mauro Carvalho Chehab:
     "A series of fixes for the new virtual digital TV driver (vidtv), which
      is meant to help doing tests with the digital TV core and media
      userspace apps and libraries.
    
      They cover a series of issues I found on it, together with a few new
      things in order to make it easier to detect problems at the DVB core"
    
    * tag 'media/v5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (36 commits)
      media: vidtv.rst: add kernel-doc markups
      media: vidtv.rst: update vidtv documentation
      media: vidtv: simplify EIT write function
      media: vidtv: simplify NIT write function
      media: vidtv: simplify SDT write function
      media: vidtv: cleanup PMT write table function
      media: vidtv: cleanup PAT write function
      media: vidtv: cleanup PSI table header function
      media: vidtv: cleanup PSI descriptor write function
      media: vidtv: simplify the crc writing logic
      media: vidtv: simplify PSI write function
      media: vidtv: add date to the current event
      media: vidtv: fix service_id at SDT table
      media: vidtv: fix service type
      media: vidtv: add a PID entry for the NIT table
      media: vidtv: properly fill EIT service_id
      media: vidtv: fix the network ID range
      media: vidtv: improve EIT data
      media: vidtv: cleanup null packet initialization logic
      media: vidtv: pre-initialize mux arrays
      ...

commit 6910b676898934c2abe9f3ff3d60f4d4bc8afda8
Merge: 99c710c46dfc 9595930db4bb
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 11:19:49 2020 -0800

    Merge tag 'drm-fixes-2020-11-27-1' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm fixes from Dave Airlie:
     "Unfortunately this has a bit of thanksgiving stuffing in it, as it a
      bit larger (at least the vc4 patches) than I like at this point in
      time.
    
      The main thing is it has a bunch of regressions fixes for reports in
      the last couple of weeks, ast, nouveau and the amdgpu ttm init fix,
      along with the usual selection of amdgpu and i915 fixes.
    
      The vc4 fixes are a few but they are fixes and the nastiest one is a
      fix for when you have a 2.4Ghz Wifi and a HDMI signal with a clock in
      that range and there isn't enough shielding and interference happen
      between the two, the fix adjusts the mode clock to try and avoid the
      wifi channels in that case.
    
      Hopefully you can merge this between turkey slices, and next week
      should be quieter.
    
      ast:
       - LUT loading regression fix
    
      nouveau:
       - relocations regression fix
    
      amdgpu:
       - ttm init oops fix
       - Runtime pm fix
       - SI UVD suspend/resume fix
       - HDCP fix for headless cards
       - Sienna Cichlid golden register update
    
      i915:
       - Fix Perf/OA workaround register corruption (Lionel)
       - Correct a comment statement in GVT (Yan)
       - Fix GT enable/disable iterrupts, including a race condition that
         prevented GPU to go idle (Chris)
       - Free stale request on destroying the virtual engine (Chris)
    
      exynos:
       - config dependency fix
    
      mediatek:
       - unused var removal
       - horizonal front/back porch formula fix
    
      vc4:
       - wifi and hdmi interference fix
       - mode rejection fixes
       - use after free fix
       - cleanup some code"
    
    * tag 'drm-fixes-2020-11-27-1' of git://anongit.freedesktop.org/drm/drm: (28 commits)
      drm/nouveau: fix relocations applying logic and a double-free
      drm/ast: Reload gamma LUT after changing primary plane's color format
      drm/amdgpu: Fix size calculation when init onchip memory
      drm/amdgpu: update golden setting for sienna_cichlid
      drm/amd/display: Avoid HDCP initialization in devices without output
      drm/i915/gt: Free stale request on destroying the virtual engine
      drm/i915/gt: Don't cancel the interrupt shadow too early
      drm/i915/gt: Track signaled breadcrumbs outside of the breadcrumb spinlock
      drm/amdgpu: fix a page fault
      drm/amdgpu: fix SI UVD firmware validate resume fail
      drm/amd/amdgpu: fix null pointer in runtime pm
      drm/i915/gt: Defer enabling the breadcrumb interrupt to after submission
      drm/i915/gvt: correct a false comment of flag F_UNALIGN
      drm/i915/perf: workaround register corruption in OATAILPTR
      drm/vc4: kms: Don't disable the muxing of an active CRTC
      drm/vc4: kms: Store the unassigned channel list in the state
      drm/exynos: depend on COMMON_CLK to fix compile tests
      drm/mediatek: dsi: Modify horizontal front/back porch byte formula
      drm/vc4: hdmi: Disable Wifi Frequencies
      dt-bindings: display: Add a property to deal with WiFi coexistence
      ...

commit d0742c49cab58ee6e2de40f1958b736aedf779b6
Merge: 985f7337421a d73ff9b7c4ea
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Fri Nov 27 11:13:39 2020 -0800

    Merge tag 'linux-can-fixes-for-5.10-20201127' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
    
    Marc Kleine-Budde says:
    
    ====================
    pull-request: can 2020-11-27
    
    The first patch is by me and target the gs_usb driver and fixes the endianess
    problem with candleLight firmware.
    
    Another patch by me for the mcp251xfd driver add sanity checking to bail out if
    no IRQ is configured.
    
    The next three patches target the m_can driver. A patch by me removes the
    hardcoded IRQF_TRIGGER_FALLING from the request_threaded_irq() as this clashes
    with the trigger level specified in the DT. Further a patch by me fixes the
    nominal bitiming tseg2 min value for modern m_can cores. Pankaj Sharma's patch
    add support for cores version 3.3.x.
    
    The last patch by Oliver Hartkopp is for af_can and converts a WARN() into a
    pr_warn(), which is triggered by the syzkaller. It was able to create a
    situation where the closing of a socket runs simultaneously to the notifier
    call chain for removing the CAN network device in use.
    
    * tag 'linux-can-fixes-for-5.10-20201127' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
      can: af_can: can_rx_unregister(): remove WARN() statement from list operation sanity check
      can: m_can: m_can_dev_setup(): add support for bosch mcan version 3.3.0
      can: m_can: fix nominal bitiming tseg2 min for version >= 3.1
      can: m_can: m_can_open(): remove IRQF_TRIGGER_FALLING from request_threaded_irq()'s flags
      can: mcp251xfd: mcp251xfd_probe(): bail out if no IRQ was given
      can: gs_usb: fix endianess problem with candleLight firmware
    ====================
    
    Link: https://lore.kernel.org/r/20201127100301.512603-1-mkl@pengutronix.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 99c710c46dfc413b9c8a1a40b463ae1eaca539e5
Merge: 3913a2bc8149 c9aa128080cb
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 11:09:13 2020 -0800

    Merge tag 'platform-drivers-x86-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86
    
    Pull x86 platform driver fixes from Hans de Goede:
    
     - thinkpad_acpi fixes: two bug-fixes and three model specific quirks
    
     - fixes for misc other drivers: two bug-fixes and three model specific
       quirks
    
    * tag 'platform-drivers-x86-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
      platform/x86: touchscreen_dmi: Add info for the Irbis TW118 tablet
      platform/x86: touchscreen_dmi: Add info for the Predia Basic tablet
      platform/x86: intel-vbtn: Support for tablet mode on HP Pavilion 13 x360 PC
      platform/x86: toshiba_acpi: Fix the wrong variable assignment
      platform/x86: acer-wmi: add automatic keyboard background light toggle key as KEY_LIGHTS_TOGGLE
      platform/x86: thinkpad_acpi: Whitelist P15 firmware for dual fan control
      platform/x86: thinkpad_acpi: Send tablet mode switch at wakeup time
      platform/x86: thinkpad_acpi: Add BAT1 is primary battery quirk for Thinkpad Yoga 11e 4th gen
      platform/x86: thinkpad_acpi: Do not report SW_TABLET_MODE on Yoga 11e
      platform/x86: thinkpad_acpi: add P1 gen3 second fan support

commit 985f7337421a811cb354ca93882f943c8335a6f5
Author: Willem de Bruijn <willemb at google.com>
Date:   Thu Nov 26 10:12:20 2020 -0500

    sock: set sk_err to ee_errno on dequeue from errq
    
    When setting sk_err, set it to ee_errno, not ee_origin.
    
    Commit f5f99309fa74 ("sock: do not set sk_err in
    sock_dequeue_err_skb") disabled updating sk_err on errq dequeue,
    which is correct for most error types (origins):
    
      -       sk->sk_err = err;
    
    Commit 38b257938ac6 ("sock: reset sk_err when the error queue is
    empty") reenabled the behavior for IMCP origins, which do require it:
    
      +       if (icmp_next)
      +               sk->sk_err = SKB_EXT_ERR(skb_next)->ee.ee_origin;
    
    But read from ee_errno.
    
    Fixes: 38b257938ac6 ("sock: reset sk_err when the error queue is empty")
    Reported-by: Ayush Ranjan <ayushranjan at google.com>
    Signed-off-by: Willem de Bruijn <willemb at google.com>
    Acked-by: Soheil Hassas Yeganeh <soheil at google.com>
    Link: https://lore.kernel.org/r/20201126151220.2819322-1-willemdebruijn.kernel@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 1ba8f0163744..06c526e0d810 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -4549,7 +4549,7 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk)
 	if (skb && (skb_next = skb_peek(q))) {
 		icmp_next = is_icmp_err_skb(skb_next);
 		if (icmp_next)
-			sk->sk_err = SKB_EXT_ERR(skb_next)->ee.ee_origin;
+			sk->sk_err = SKB_EXT_ERR(skb_next)->ee.ee_errno;
 	}
 	spin_unlock_irqrestore(&q->lock, flags);
 
commit d3ab78858f1451351221061a1c365495df196500
Author: Paolo Abeni <pabeni at redhat.com>
Date:   Thu Nov 26 15:17:53 2020 +0100

    mptcp: fix NULL ptr dereference on bad MPJ
    
    If an msk listener receives an MPJ carrying an invalid token, it
    will zero the request socket msk entry. That should later
    cause fallback and subflow reset - as per RFC - at
    subflow_syn_recv_sock() time due to failing hmac validation.
    
    Since commit 4cf8b7e48a09 ("subflow: introduce and use
    mptcp_can_accept_new_subflow()"), we unconditionally dereference
    - in mptcp_can_accept_new_subflow - the subflow request msk
    before performing hmac validation. In the above scenario we
    hit a NULL ptr dereference.
    
    Address the issue doing the hmac validation earlier.
    
    Fixes: 4cf8b7e48a09 ("subflow: introduce and use mptcp_can_accept_new_subflow()")
    Tested-by: Davide Caratti <dcaratti at redhat.com>
    Signed-off-by: Paolo Abeni <pabeni at redhat.com>
    Reviewed-by: Matthieu Baerts <matthieu.baerts at tessares.net>
    Link: https://lore.kernel.org/r/03b2cfa3ac80d8fc18272edc6442a9ddf0b1e34e.1606400227.git.pabeni@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index ac4a1fe3550b..953906e40742 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -543,9 +543,8 @@ create_msk:
 			fallback = true;
 	} else if (subflow_req->mp_join) {
 		mptcp_get_options(skb, &mp_opt);
-		if (!mp_opt.mp_join ||
-		    !mptcp_can_accept_new_subflow(subflow_req->msk) ||
-		    !subflow_hmac_valid(req, &mp_opt)) {
+		if (!mp_opt.mp_join || !subflow_hmac_valid(req, &mp_opt) ||
+		    !mptcp_can_accept_new_subflow(subflow_req->msk)) {
 			SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKMAC);
 			fallback = true;
 		}
commit 3913a2bc814987c1840a5f78dcff865dbfec1e64
Merge: 95e1c7b1dd4a 9a2a0d3ca163
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 11:04:13 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
    
    Pull kvm fixes from Paolo Bonzini:
     "ARM:
       - Fix alignment of the new HYP sections
       - Fix GICR_TYPER access from userspace
    
      S390:
       - do not reset the global diag318 data for per-cpu reset
       - do not mark memory as protected too early
       - fix for destroy page ultravisor call
    
      x86:
       - fix for SEV debugging
       - fix incorrect return code
       - fix for 'noapic' with PIC in userspace and LAPIC in kernel
       - fix for 5-level paging"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
      kvm: x86/mmu: Fix get_mmio_spte() on CPUs supporting 5-level PT
      KVM: x86: Fix split-irqchip vs interrupt injection window request
      KVM: x86: handle !lapic_in_kernel case in kvm_cpu_*_extint
      MAINTAINERS: Update email address for Sean Christopherson
      MAINTAINERS: add uv.c also to KVM/s390
      s390/uv: handle destroy page legacy interface
      KVM: arm64: vgic-v3: Drop the reporting of GICR_TYPER.Last for userspace
      KVM: SVM: fix error return code in svm_create_vcpu()
      KVM: SVM: Fix offset computation bug in __sev_dbg_decrypt().
      KVM: arm64: Correctly align nVHE percpu data
      KVM: s390: remove diag318 reset code
      KVM: s390: pv: Mark mm as protected after the set secure parameters and improve cleanup

commit 69929d4c49e182f8526d42c43b37b460d562d3a0
Author: Eelco Chaudron <echaudro at redhat.com>
Date:   Tue Nov 24 07:34:44 2020 -0500

    net: openvswitch: fix TTL decrement action netlink message format
    
    Currently, the openvswitch module is not accepting the correctly formated
    netlink message for the TTL decrement action. For both setting and getting
    the dec_ttl action, the actions should be nested in the
    OVS_DEC_TTL_ATTR_ACTION attribute as mentioned in the openvswitch.h uapi.
    
    When the original patch was sent, it was tested with a private OVS userspace
    implementation. This implementation was unfortunately not upstreamed and
    reviewed, hence an erroneous version of this patch was sent out.
    
    Leaving the patch as-is would cause problems as the kernel module could
    interpret additional attributes as actions and vice-versa, due to the
    actions not being encapsulated/nested within the actual attribute, but
    being concatinated after it.
    
    Fixes: 744676e77720 ("openvswitch: add TTL decrement action")
    Signed-off-by: Eelco Chaudron <echaudro at redhat.com>
    Link: https://lore.kernel.org/r/160622121495.27296.888010441924340582.stgit@wsfd-netdev64.ntdv.lab.eng.bos.redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
index 8300cc29dec8..8d16744edc31 100644
--- a/include/uapi/linux/openvswitch.h
+++ b/include/uapi/linux/openvswitch.h
@@ -1058,4 +1058,6 @@ enum ovs_dec_ttl_attr {
 	__OVS_DEC_TTL_ATTR_MAX
 };
 
+#define OVS_DEC_TTL_ATTR_MAX (__OVS_DEC_TTL_ATTR_MAX - 1)
+
 #endif /* _LINUX_OPENVSWITCH_H */
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index b87bfc82f44f..5829a020b81c 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -958,14 +958,13 @@ static int dec_ttl_exception_handler(struct datapath *dp, struct sk_buff *skb,
 {
 	/* The first action is always 'OVS_DEC_TTL_ATTR_ARG'. */
 	struct nlattr *dec_ttl_arg = nla_data(attr);
-	int rem = nla_len(attr);
 
 	if (nla_len(dec_ttl_arg)) {
-		struct nlattr *actions = nla_next(dec_ttl_arg, &rem);
+		struct nlattr *actions = nla_data(dec_ttl_arg);
 
 		if (actions)
-			return clone_execute(dp, skb, key, 0, actions, rem,
-					     last, false);
+			return clone_execute(dp, skb, key, 0, nla_data(actions),
+					     nla_len(actions), last, false);
 	}
 	consume_skb(skb);
 	return 0;
diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
index 9d3e50c4d29f..ec0689ddc635 100644
--- a/net/openvswitch/flow_netlink.c
+++ b/net/openvswitch/flow_netlink.c
@@ -2503,28 +2503,42 @@ static int validate_and_copy_dec_ttl(struct net *net,
 				     __be16 eth_type, __be16 vlan_tci,
 				     u32 mpls_label_count, bool log)
 {
-	int start, err;
-	u32 nested = true;
+	const struct nlattr *attrs[OVS_DEC_TTL_ATTR_MAX + 1];
+	int start, action_start, err, rem;
+	const struct nlattr *a, *actions;
+
+	memset(attrs, 0, sizeof(attrs));
+	nla_for_each_nested(a, attr, rem) {
+		int type = nla_type(a);
 
-	if (!nla_len(attr))
-		return ovs_nla_add_action(sfa, OVS_ACTION_ATTR_DEC_TTL,
-					  NULL, 0, log);
+		/* Ignore unknown attributes to be future proof. */
+		if (type > OVS_DEC_TTL_ATTR_MAX)
+			continue;
+
+		if (!type || attrs[type])
+			return -EINVAL;
+
+		attrs[type] = a;
+	}
+
+	actions = attrs[OVS_DEC_TTL_ATTR_ACTION];
+	if (rem || !actions || (nla_len(actions) && nla_len(actions) < NLA_HDRLEN))
+		return -EINVAL;
 
 	start = add_nested_action_start(sfa, OVS_ACTION_ATTR_DEC_TTL, log);
 	if (start < 0)
 		return start;
 
-	err = ovs_nla_add_action(sfa, OVS_DEC_TTL_ATTR_ACTION, &nested,
-				 sizeof(nested), log);
-
-	if (err)
-		return err;
+	action_start = add_nested_action_start(sfa, OVS_DEC_TTL_ATTR_ACTION, log);
+	if (action_start < 0)
+		return start;
 
-	err = __ovs_nla_copy_actions(net, attr, key, sfa, eth_type,
+	err = __ovs_nla_copy_actions(net, actions, key, sfa, eth_type,
 				     vlan_tci, mpls_label_count, log);
 	if (err)
 		return err;
 
+	add_nested_action_end(*sfa, action_start);
 	add_nested_action_end(*sfa, start);
 	return 0;
 }
@@ -3487,20 +3501,42 @@ out:
 static int dec_ttl_action_to_attr(const struct nlattr *attr,
 				  struct sk_buff *skb)
 {
-	int err = 0, rem = nla_len(attr);
-	struct nlattr *start;
+	struct nlattr *start, *action_start;
+	const struct nlattr *a;
+	int err = 0, rem;
 
 	start = nla_nest_start_noflag(skb, OVS_ACTION_ATTR_DEC_TTL);
-
 	if (!start)
 		return -EMSGSIZE;
 
-	err = ovs_nla_put_actions(nla_data(attr), rem, skb);
-	if (err)
-		nla_nest_cancel(skb, start);
-	else
-		nla_nest_end(skb, start);
+	nla_for_each_attr(a, nla_data(attr), nla_len(attr), rem) {
+		switch (nla_type(a)) {
+		case OVS_DEC_TTL_ATTR_ACTION:
+
+			action_start = nla_nest_start_noflag(skb, OVS_DEC_TTL_ATTR_ACTION);
+			if (!action_start) {
+				err = -EMSGSIZE;
+				goto out;
+			}
+
+			err = ovs_nla_put_actions(nla_data(a), nla_len(a), skb);
+			if (err)
+				goto out;
+
+			nla_nest_end(skb, action_start);
+			break;
 
+		default:
+			/* Ignore all other option to be future compatible */
+			break;
+		}
+	}
+
+	nla_nest_end(skb, start);
+	return 0;
+
+out:
+	nla_nest_cancel(skb, start);
 	return err;
 }
 
commit 95e1c7b1dd4a91451040ff0f41c5b5173503a38e
Merge: e4e9458073ae b6b79dd53082
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 10:59:02 2020 -0800

    Merge tag 'powerpc-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
    
    Pull powerpc fixes from Michael Ellerman:
     "Some more powerpc fixes for 5.10:
    
       - regression fix for a boot failure on some 32-bit machines.
    
       - fix for host crashes in the KVM system reset handling.
    
       - fix for a possible oops in the KVM XIVE interrupt handling on
         Power9.
    
       - fix for host crashes triggerable via the KVM emulated MMIO handling
         when running HPT guests.
    
       - a couple of small build fixes.
    
      Thanks to Andreas Schwab, Cédric Le Goater, Christophe Leroy, Erhard
      Furtner, Greg Kurz, Greg Kurz, Németh Márton, Nicholas Piggin, Nick
      Desaulniers, Serge Belyshev, and Stephen Rothwell"
    
    * tag 'powerpc-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
      powerpc/64s: Fix allnoconfig build since uaccess flush
      powerpc/64s/exception: KVM Fix for host DSI being taken in HPT guest MMU context
      powerpc: Drop -me200 addition to build flags
      KVM: PPC: Book3S HV: XIVE: Fix possible oops when accessing ESB page
      powerpc/64s: Fix KVM system reset handling when CONFIG_PPC_PSERIES=y
      powerpc/32s: Use relocation offset when setting early hash table

commit e4e9458073ae7ab0e7c28e7380a26ad1fccf0296
Merge: 6adf33a5e42f ff1712f953e2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 10:44:59 2020 -0800

    Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
    
    Pull arm64 fixes from Will Deacon:
     "The main changes are relating to our handling of access/dirty bits,
      where our low-level page-table helpers could lead to stale young
      mappings and loss of the dirty bit in some cases (the latter has not
      been observed in practice, but could happen when clearing "soft-dirty"
      if we enabled that). These were posted as part of a larger series, but
      the rest of that is less urgent and needs a v2 which I'll get to
      shortly.
    
      In other news, we've now got a set of fixes to resolve the
      lockdep/tracing problems that have been plaguing us for a while, but
      they're still a bit "fresh" and I plan to send them to you next week
      after we've got some more confidence in them (although initial CI
      results look good).
    
      Summary:
    
       - Fix kerneldoc warnings generated by ACPI IORT code
    
       - Fix pte_accessible() so that access flag is ignored
    
       - Fix missing header #include
    
       - Fix loss of software dirty bit across pte_wrprotect() when HW DBM
         is enabled"
    
    * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
      arm64: pgtable: Ensure dirty bit is preserved across pte_wrprotect()
      arm64: pgtable: Fix pte_accessible()
      ACPI/IORT: Fix doc warnings in iort.c
      arm64/fpsimd: add <asm/insn.h> to <asm/kprobes.h> to fix fpsimd build

commit 6adf33a5e42feada39d52eebd389d2019202e993
Merge: 43d6ecd97c0c d76b42e92780
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 10:41:19 2020 -0800

    Merge tag 'iommu-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
    
    Pull iommu fixes from Will Deacon:
     "Here's another round of IOMMU fixes for -rc6 consisting mainly of a
      bunch of independent driver fixes. Thomas agreed for me to take the
      x86 'tboot' fix here, as it fixes a regression introduced by a vt-d
      change.
    
       - Fix intel iommu driver when running on devices without VCCAP_REG
    
       - Fix swiotlb and "iommu=pt" interaction under TXT (tboot)
    
       - Fix missing return value check during device probe()
    
       - Fix probe ordering for Qualcomm SMMU implementation
    
       - Ensure page-sized mappings are used for AMD IOMMU buffers with SNP
         RMP"
    
    * tag 'iommu-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
      iommu/vt-d: Don't read VCCAP register unless it exists
      x86/tboot: Don't disable swiotlb when iommu is forced on
      iommu: Check return of __iommu_attach_device()
      arm-smmu-qcom: Ensure the qcom_scm driver has finished probing
      iommu/amd: Enforce 4k mapping for certain IOMMU data structures

commit 43d6ecd97c0c69acffc918cc18cdabdfcaa55354
Merge: 5b4049d8fc83 739e7116b10b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 10:38:36 2020 -0800

    Merge tag 'printk-for-5.10-rc6-fixup' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux
    
    Pull printk fixes from Petr Mladek:
    
     - do not lose trailing newline in pr_cont() calls
    
     - two trivial fixes for a dead store and a config description
    
    * tag 'printk-for-5.10-rc6-fixup' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux:
      printk: finalize records with trailing newlines
      printk: remove unneeded dead-store assignment
      init/Kconfig: Fix CPU number in LOG_CPU_MAX_BUF_SHIFT description

commit 5b4049d8fc8353c20493f3767a1270a61bcc3822
Merge: 85a2c56cb445 fdeb17c70c9e
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 27 10:36:38 2020 -0800

    Merge tag 'writeback_for_v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
    
    Pull writeback fix from Jan Kara:
     "A fix of possible missing string termination in writeback tracepoints"
    
    * tag 'writeback_for_v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
      trace: fix potenial dangerous pointer

commit a9ffd0484eb4426e6befd07e7be6c01108716302
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Nov 27 14:48:55 2020 +0900

    perf probe: Change function definition check due to broken DWARF
    
    Since some gcc generates a broken DWARF which lacks DW_AT_declaration
    attribute from the subprogram DIE of function prototype.
    (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97060)
    
    So, in addition to the DW_AT_declaration check, we also check the
    subprogram DIE has DW_AT_inline or actual entry pc.
    
    Committer testing:
    
      # cat /etc/fedora-release
      Fedora release 33 (Thirty Three)
      #
    
    Before:
    
      # perf test vfs_getname
      78: Use vfs_getname probe to get syscall args filenames             : FAILED!
      79: Check open filename arg using perf trace + vfs_getname          : FAILED!
      81: Add vfs_getname probe to get syscall args filenames             : FAILED!
      #
    
    After:
    
      # perf test vfs_getname
      78: Use vfs_getname probe to get syscall args filenames             : Ok
      79: Check open filename arg using perf trace + vfs_getname          : Ok
      81: Add vfs_getname probe to get syscall args filenames             : Ok
      #
    
    Reported-by: Thomas Richter <tmricht at linux.ibm.com>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Tested-by: Arnaldo Carvalho de Melo <acme at redhat.com>
    Cc: Sumanth Korikkar <sumanthk at linux.ibm.com>
    Link: http://lore.kernel.org/lkml/160645613571.2824037.7441351537890235895.stgit@devnote2
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index 03c1a39c312a..7b2d471a6419 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -356,9 +356,25 @@ bool die_is_signed_type(Dwarf_Die *tp_die)
 bool die_is_func_def(Dwarf_Die *dw_die)
 {
 	Dwarf_Attribute attr;
+	Dwarf_Addr addr = 0;
+
+	if (dwarf_tag(dw_die) != DW_TAG_subprogram)
+		return false;
+
+	if (dwarf_attr(dw_die, DW_AT_declaration, &attr))
+		return false;
 
-	return (dwarf_tag(dw_die) == DW_TAG_subprogram &&
-		dwarf_attr(dw_die, DW_AT_declaration, &attr) == NULL);
+	/*
+	 * DW_AT_declaration can be lost from function declaration
+	 * by gcc's bug #97060.
+	 * So we need to check this subprogram DIE has DW_AT_inline
+	 * or an entry address.
+	 */
+	if (!dwarf_attr(dw_die, DW_AT_inline, &attr) &&
+	    die_entrypc(dw_die, &addr) < 0)
+		return false;
+
+	return true;
 }
 
 /**
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 2c4061035f77..76dd349aa48d 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1885,8 +1885,7 @@ static int line_range_search_cb(Dwarf_Die *sp_die, void *data)
 	if (lr->file && strtailcmp(lr->file, dwarf_decl_file(sp_die)))
 		return DWARF_CB_OK;
 
-	if (die_is_func_def(sp_die) &&
-	    die_match_name(sp_die, lr->function)) {
+	if (die_match_name(sp_die, lr->function) && die_is_func_def(sp_die)) {
 		lf->fname = dwarf_decl_file(sp_die);
 		dwarf_decl_line(sp_die, &lr->offset);
 		pr_debug("fname: %s, lineno:%d\n", lf->fname, lr->offset);
commit ab4200c17ba6fe71d2da64317aae8a8aa684624c
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Nov 27 14:48:46 2020 +0900

    perf probe: Fix to die_entrypc() returns error correctly
    
    Fix die_entrypc() to return error correctly if the DIE has no
    DW_AT_ranges attribute. Since dwarf_ranges() will treat the case as an
    empty ranges and return 0, we have to check it by ourselves.
    
    Fixes: 91e2f539eeda ("perf probe: Fix to show function entry line as probe-able")
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Cc: Sumanth Korikkar <sumanthk at linux.ibm.com>
    Cc: Thomas Richter <tmricht at linux.ibm.com>
    Link: http://lore.kernel.org/lkml/160645612634.2824037.5284932731175079426.stgit@devnote2
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index aa898014ad12..03c1a39c312a 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -373,6 +373,7 @@ bool die_is_func_def(Dwarf_Die *dw_die)
 int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr)
 {
 	Dwarf_Addr base, end;
+	Dwarf_Attribute attr;
 
 	if (!addr)
 		return -EINVAL;
@@ -380,6 +381,13 @@ int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr)
 	if (dwarf_entrypc(dw_die, addr) == 0)
 		return 0;
 
+	/*
+	 *  Since the dwarf_ranges() will return 0 if there is no
+	 * DW_AT_ranges attribute, we should check it first.
+	 */
+	if (!dwarf_attr(dw_die, DW_AT_ranges, &attr))
+		return -ENOENT;
+
 	return dwarf_ranges(dw_die, 0, &base, addr, &end) < 0 ? -ENOENT : 0;
 }
 
commit c0ee1d5ae8c8650031badcfca6483a28c0f94f38
Author: Namhyung Kim <namhyung at kernel.org>
Date:   Fri Nov 27 13:14:03 2020 +0900

    perf stat: Use proper cpu for shadow stats
    
    Currently perf stat shows some metrics (like IPC) for defined events.
    But when no aggregation mode is used (-A option), it shows incorrect
    values since it used a value from a different cpu.
    
    Before:
    
      $ perf stat -aA -e cycles,instructions sleep 1
    
       Performance counter stats for 'system wide':
    
      CPU0      116,057,380      cycles
      CPU1       86,084,722      cycles
      CPU2       99,423,125      cycles
      CPU3       98,272,994      cycles
      CPU0       53,369,217      instructions      #    0.46  insn per cycle
      CPU1       33,378,058      instructions      #    0.29  insn per cycle
      CPU2       58,150,086      instructions      #    0.50  insn per cycle
      CPU3       40,029,703      instructions      #    0.34  insn per cycle
    
           1.001816971 seconds time elapsed
    
    So the IPC for CPU1 should be 0.38 (= 33,378,058 / 86,084,722)
    but it was 0.29 (= 33,378,058 / 116,057,380) and so on.
    
    After:
    
      $ perf stat -aA -e cycles,instructions sleep 1
    
       Performance counter stats for 'system wide':
    
      CPU0      109,621,384      cycles
      CPU1      159,026,454      cycles
      CPU2       99,460,366      cycles
      CPU3      124,144,142      cycles
      CPU0       44,396,706      instructions      #    0.41  insn per cycle
      CPU1      120,195,425      instructions      #    0.76  insn per cycle
      CPU2       44,763,978      instructions      #    0.45  insn per cycle
      CPU3       69,049,079      instructions      #    0.56  insn per cycle
    
           1.001910444 seconds time elapsed
    
    Fixes: 44d49a600259 ("perf stat: Support metrics in --per-core/socket mode")
    Reported-by: Sam Xi <xyzsam at google.com>
    Signed-off-by: Namhyung Kim <namhyung at kernel.org>
    Reviewed-by: Andi Kleen <ak at linux.intel.com>
    Acked-by: Jiri Olsa <jolsa at redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: Ian Rogers <irogers at google.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Peter Zijlstra <peterz at infradead.org>
    Cc: Stephane Eranian <eranian at google.com>
    Link: http://lore.kernel.org/lkml/20201127041404.390276-1-namhyung@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index 4b57c0c07632..a963b5b8eb72 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -324,13 +324,10 @@ static int first_shadow_cpu(struct perf_stat_config *config,
 	struct evlist *evlist = evsel->evlist;
 	int i;
 
-	if (!config->aggr_get_id)
-		return 0;
-
 	if (config->aggr_mode == AGGR_NONE)
 		return id;
 
-	if (config->aggr_mode == AGGR_GLOBAL)
+	if (!config->aggr_get_id)
 		return 0;
 
 	for (i = 0; i < evsel__nr_cpus(evsel); i++) {
commit aa50d953c169e876413bf237319e728dd41d9fdd
Author: Namhyung Kim <namhyung at kernel.org>
Date:   Fri Nov 27 14:43:56 2020 +0900

    perf record: Synthesize cgroup events only if needed
    
    It didn't check the tool->cgroup_events bit which is set when the
    --all-cgroups option is given.  Without it, samples will not have cgroup
    info so no reason to synthesize.
    
    We can check the PERF_RECORD_CGROUP records after running perf record
    *WITHOUT* the --all-cgroups option:
    
    Before:
    
      $ perf report -D | grep CGROUP
      0 0 0x8430 [0x38]: PERF_RECORD_CGROUP cgroup: 1 /
              CGROUP events:          1
              CGROUP events:          0
              CGROUP events:          0
    
    After:
    
      $ perf report -D | grep CGROUP
              CGROUP events:          0
              CGROUP events:          0
              CGROUP events:          0
    
    Committer testing:
    
    Before:
    
      # perf record -a sleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 2.208 MB perf.data (10003 samples) ]
      # perf report -D | grep "CGROUP events"
                CGROUP events:        146
                CGROUP events:          0
                CGROUP events:          0
      #
    
    After:
    
      # perf record -a sleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 2.208 MB perf.data (10448 samples) ]
      # perf report -D | grep "CGROUP events"
                CGROUP events:          0
                CGROUP events:          0
                CGROUP events:          0
      #
    
    With all-cgroups:
    
      # perf record --all-cgroups -a sleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 2.374 MB perf.data (11526 samples) ]
      # perf report -D | grep "CGROUP events"
                CGROUP events:        146
                CGROUP events:          0
                CGROUP events:          0
      #
    
    Fixes: 8fb4b67939e16 ("perf record: Add --all-cgroups option")
    Signed-off-by: Namhyung Kim <namhyung at kernel.org>
    Tested-by: Arnaldo Carvalho de Melo <acme at redhat.com>
    Acked-by: Jiri Olsa <jolsa at redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: Ian Rogers <irogers at google.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Peter Zijlstra <peterz at infradead.org>
    Cc: Stephane Eranian <eranian at google.com>
    Link: http://lore.kernel.org/lkml/20201127054356.405481-1-namhyung@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
index 8a23391558cf..d9c624377da7 100644
--- a/tools/perf/util/synthetic-events.c
+++ b/tools/perf/util/synthetic-events.c
@@ -563,6 +563,9 @@ int perf_event__synthesize_cgroups(struct perf_tool *tool,
 	char cgrp_root[PATH_MAX];
 	size_t mount_len;  /* length of mount point in the path */
 
+	if (!tool || !tool->cgroup_events)
+		return 0;
+
 	if (cgroupfs_find_mountpoint(cgrp_root, PATH_MAX, "perf_event") < 0) {
 		pr_debug("cannot find cgroup mount point\n");
 		return -1;
commit 9713070028b9ab317f395ee130fa2c4ea741bab4
Author: Zhen Lei <thunder.leizhen at huawei.com>
Date:   Tue Nov 24 18:36:52 2020 +0800

    perf diff: Fix error return value in __cmd_diff()
    
    An appropriate return value should be set on the failed path.
    
    Fixes: 2a09a84c720b436a ("perf diff: Support hot streams comparison")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen at huawei.com>
    Acked-by: Jiri Olsa <jolsa at redhat.com>
    Acked-by: Namhyung Kim <namhyung at kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: Jin Yao <yao.jin at linux.intel.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Peter Zijlstra <peterz at infradead.org>
    Link: http://lore.kernel.org/lkml/20201124103652.438-1-thunder.leizhen@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index 584e2e1a3793..cefc71506409 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -1222,8 +1222,10 @@ static int __cmd_diff(void)
 		if (compute == COMPUTE_STREAM) {
 			d->evlist_streams = evlist__create_streams(
 						d->session->evlist, 5);
-			if (!d->evlist_streams)
+			if (!d->evlist_streams) {
+				ret = -ENOMEM;
 				goto out_delete;
+			}
 		}
 	}
 
commit 3b13eaf0ba1d5ab59368e23ff5e5350f51c1a352
Author: Arnaldo Carvalho de Melo <acme at redhat.com>
Date:   Wed Nov 18 08:32:33 2020 -0300

    perf tools: Update copy of libbpf's hashmap.c
    
    To pick the changes in:
    
      7a078d2d18801bba ("libbpf, hashmap: Fix undefined behavior in hash_bits")
    
    That don't entail any changes in tools/perf.
    
    This addresses this perf build warning:
    
      Warning: Kernel ABI header at 'tools/perf/util/hashmap.h' differs from latest version at 'tools/lib/bpf/hashmap.h'
      diff -u tools/perf/util/hashmap.h tools/lib/bpf/hashmap.h
    
    Not a kernel ABI, its just that this uses the mechanism in place for
    checking kernel ABI files drift.
    
    Cc: Adrian Hunter <adrian.hunter at intel.com>
    Cc: Daniel Borkmann <daniel at iogearbox.net>
    Cc: Ian Rogers <irogers at google.com>
    Cc: Jiri Olsa <jolsa at kernel.org>
    Cc: Namhyung Kim <namhyung at kernel.org>
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/util/hashmap.h b/tools/perf/util/hashmap.h
index d9b385fe808c..10a4c4cd13cf 100644
--- a/tools/perf/util/hashmap.h
+++ b/tools/perf/util/hashmap.h
@@ -15,6 +15,9 @@
 static inline size_t hash_bits(size_t h, int bits)
 {
 	/* shuffle bits and return requested number of upper bits */
+	if (bits == 0)
+		return 0;
+
 #if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__)
 	/* LP64 case */
 	return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits);
@@ -174,17 +177,17 @@ bool hashmap__find(const struct hashmap *map, const void *key, void **value);
  * @key: key to iterate entries for
  */
 #define hashmap__for_each_key_entry(map, cur, _key)			    \
-	for (cur = ({ size_t bkt = hash_bits(map->hash_fn((_key), map->ctx),\
-					     map->cap_bits);		    \
-		     map->buckets ? map->buckets[bkt] : NULL; });	    \
+	for (cur = map->buckets						    \
+		     ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
+		     : NULL;						    \
 	     cur;							    \
 	     cur = cur->next)						    \
 		if (map->equal_fn(cur->key, (_key), map->ctx))
 
 #define hashmap__for_each_key_entry_safe(map, cur, tmp, _key)		    \
-	for (cur = ({ size_t bkt = hash_bits(map->hash_fn((_key), map->ctx),\
-					     map->cap_bits);		    \
-		     cur = map->buckets ? map->buckets[bkt] : NULL; });	    \
+	for (cur = map->buckets						    \
+		     ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
+		     : NULL;						    \
 	     cur && ({ tmp = cur->next; true; });			    \
 	     cur = tmp)							    \
 		if (map->equal_fn(cur->key, (_key), map->ctx))
commit ae597565d13febc73b9066c05935c1003a57a03e
Merge: 454a079b381a 853735e40424
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 27 17:45:45 2020 +0100

    Merge tag 'optee-valid-memory-type-for-v5.11' of git://git.linaro.org/people/jens.wiklander/linux-tee into arm/fixes
    
    Add writeback to valid OP-TEE shared memory types
    
    Allows OP-TEE to work with ARMv7 based single CPU systems by allowing
    writeback cache policy for shared memory.
    
    * tag 'optee-valid-memory-type-for-v5.11' of git://git.linaro.org/people/jens.wiklander/linux-tee:
      optee: add writeback to valid memory type
    
    Link: https://lore.kernel.org/r/20201125120134.GA1642471@jade
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 25bc65d8ddfc17cc1d7a45bd48e9bdc0e729ced3
Author: Gabriele Paoloni <gabriele.paoloni at intel.com>
Date:   Fri Nov 27 16:18:15 2020 +0000

    x86/mce: Do not overwrite no_way_out if mce_end() fails
    
    Currently, if mce_end() fails, no_way_out - the variable denoting
    whether the machine can recover from this MCE - is determined by whether
    the worst severity that was found across the MCA banks associated with
    the current CPU, is of panic severity.
    
    However, at this point no_way_out could have been already set by
    mca_start() after looking at all severities of all CPUs that entered the
    MCE handler. If mce_end() fails, check first if no_way_out is already
    set and, if so, stick to it, otherwise use the local worst value.
    
     [ bp: Massage. ]
    
    Signed-off-by: Gabriele Paoloni <gabriele.paoloni at intel.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Tony Luck <tony.luck at intel.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201127161819.3106432-2-gabriele.paoloni@intel.com

diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c
index 4102b866e7c0..32b7099e3511 100644
--- a/arch/x86/kernel/cpu/mce/core.c
+++ b/arch/x86/kernel/cpu/mce/core.c
@@ -1384,8 +1384,10 @@ noinstr void do_machine_check(struct pt_regs *regs)
 	 * When there's any problem use only local no_way_out state.
 	 */
 	if (!lmce) {
-		if (mce_end(order) < 0)
-			no_way_out = worst >= MCE_PANIC_SEVERITY;
+		if (mce_end(order) < 0) {
+			if (!no_way_out)
+				no_way_out = worst >= MCE_PANIC_SEVERITY;
+		}
 	} else {
 		/*
 		 * If there was a fatal machine check we should have
commit 9a2a0d3ca163fc645991804b8b032f7d59326bb5
Author: Vitaly Kuznetsov <vkuznets at redhat.com>
Date:   Thu Nov 26 12:02:06 2020 +0100

    kvm: x86/mmu: Fix get_mmio_spte() on CPUs supporting 5-level PT
    
    Commit 95fb5b0258b7 ("kvm: x86/mmu: Support MMIO in the TDP MMU") caused
    the following WARNING on an Intel Ice Lake CPU:
    
     get_mmio_spte: detect reserved bits on spte, addr 0xb80a0, dump hierarchy:
     ------ spte 0xb80a0 level 5.
     ------ spte 0xfcd210107 level 4.
     ------ spte 0x1004c40107 level 3.
     ------ spte 0x1004c41107 level 2.
     ------ spte 0x1db00000000b83b6 level 1.
     WARNING: CPU: 109 PID: 10254 at arch/x86/kvm/mmu/mmu.c:3569 kvm_mmu_page_fault.cold.150+0x54/0x22f [kvm]
    ...
     Call Trace:
      ? kvm_io_bus_get_first_dev+0x55/0x110 [kvm]
      vcpu_enter_guest+0xaa1/0x16a0 [kvm]
      ? vmx_get_cs_db_l_bits+0x17/0x30 [kvm_intel]
      ? skip_emulated_instruction+0xaa/0x150 [kvm_intel]
      kvm_arch_vcpu_ioctl_run+0xca/0x520 [kvm]
    
    The guest triggering this crashes. Note, this happens with the traditional
    MMU and EPT enabled, not with the newly introduced TDP MMU. Turns out,
    there was a subtle change in the above mentioned commit. Previously,
    walk_shadow_page_get_mmio_spte() was setting 'root' to 'iterator.level'
    which is returned by shadow_walk_init() and this equals to
    'vcpu->arch.mmu->shadow_root_level'. Now, get_mmio_spte() sets it to
    'int root = vcpu->arch.mmu->root_level'.
    
    The difference between 'root_level' and 'shadow_root_level' on CPUs
    supporting 5-level page tables is that in some case we don't want to
    use 5-level, in particular when 'cpuid_maxphyaddr(vcpu) <= 48'
    kvm_mmu_get_tdp_level() returns '4'. In case upper layer is not used,
    the corresponding SPTE will fail '__is_rsvd_bits_set()' check.
    
    Revert to using 'shadow_root_level'.
    
    Fixes: 95fb5b0258b7 ("kvm: x86/mmu: Support MMIO in the TDP MMU")
    Signed-off-by: Vitaly Kuznetsov <vkuznets at redhat.com>
    Message-Id: <20201126110206.2118959-1-vkuznets at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 5bb1939b65d8..7a6ae9e90bd7 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -3517,7 +3517,7 @@ static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
 {
 	u64 sptes[PT64_ROOT_MAX_LEVEL];
 	struct rsvd_bits_validate *rsvd_check;
-	int root = vcpu->arch.mmu->root_level;
+	int root = vcpu->arch.mmu->shadow_root_level;
 	int leaf;
 	int level;
 	bool reserved = false;
commit 71cc849b7093bb83af966c0e60cb11b7f35cd746
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Fri Nov 27 09:18:20 2020 +0100

    KVM: x86: Fix split-irqchip vs interrupt injection window request
    
    kvm_cpu_accept_dm_intr and kvm_vcpu_ready_for_interrupt_injection are
    a hodge-podge of conditions, hacked together to get something that
    more or less works.  But what is actually needed is much simpler;
    in both cases the fundamental question is, do we have a place to stash
    an interrupt if userspace does KVM_INTERRUPT?
    
    In userspace irqchip mode, that is !vcpu->arch.interrupt.injected.
    Currently kvm_event_needs_reinjection(vcpu) covers it, but it is
    unnecessarily restrictive.
    
    In split irqchip mode it's a bit more complicated, we need to check
    kvm_apic_accept_pic_intr(vcpu) (the IRQ window exit is basically an INTACK
    cycle and thus requires ExtINTs not to be masked) as well as
    !pending_userspace_extint(vcpu).  However, there is no need to
    check kvm_event_needs_reinjection(vcpu), since split irqchip keeps
    pending ExtINT state separate from event injection state, and checking
    kvm_cpu_has_interrupt(vcpu) is wrong too since ExtINT has higher
    priority than APIC interrupts.  In fact the latter fixes a bug:
    when userspace requests an IRQ window vmexit, an interrupt in the
    local APIC can cause kvm_cpu_has_interrupt() to be true and thus
    kvm_vcpu_ready_for_interrupt_injection() to return false.  When this
    happens, vcpu_run does not exit to userspace but the interrupt window
    vmexits keep occurring.  The VM loops without any hope of making progress.
    
    Once we try to fix these with something like
    
         return kvm_arch_interrupt_allowed(vcpu) &&
    -        !kvm_cpu_has_interrupt(vcpu) &&
    -        !kvm_event_needs_reinjection(vcpu) &&
    -        kvm_cpu_accept_dm_intr(vcpu);
    +        (!lapic_in_kernel(vcpu)
    +         ? !vcpu->arch.interrupt.injected
    +         : (kvm_apic_accept_pic_intr(vcpu)
    +            && !pending_userspace_extint(v)));
    
    we realize two things.  First, thanks to the previous patch the complex
    conditional can reuse !kvm_cpu_has_extint(vcpu).  Second, the interrupt
    window request in vcpu_enter_guest()
    
            bool req_int_win =
                    dm_request_for_irq_injection(vcpu) &&
                    kvm_cpu_accept_dm_intr(vcpu);
    
    should be kept in sync with kvm_vcpu_ready_for_interrupt_injection():
    it is unnecessary to ask the processor for an interrupt window
    if we would not be able to return to userspace.  Therefore,
    kvm_cpu_accept_dm_intr(vcpu) is basically !kvm_cpu_has_extint(vcpu)
    ANDed with the existing check for masked ExtINT.  It all makes sense:
    
    - we can accept an interrupt from userspace if there is a place
      to stash it (and, for irqchip split, ExtINTs are not masked).
      Interrupts from userspace _can_ be accepted even if right now
      EFLAGS.IF=0.
    
    - in order to tell userspace we will inject its interrupt ("IRQ
      window open" i.e. kvm_vcpu_ready_for_interrupt_injection), both
      KVM and the vCPU need to be ready to accept the interrupt.
    
    ... and this is what the patch implements.
    
    Reported-by: David Woodhouse <dwmw at amazon.co.uk>
    Analyzed-by: David Woodhouse <dwmw at amazon.co.uk>
    Cc: stable at vger.kernel.org
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
    Reviewed-by: Nikos Tsironis <ntsironis at arrikto.com>
    Reviewed-by: David Woodhouse <dwmw at amazon.co.uk>
    Tested-by: David Woodhouse <dwmw at amazon.co.uk>

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 324ddd7fd0aa..7e5f33a0d0e2 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -1656,6 +1656,7 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
 int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
 int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v);
 int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu);
+int kvm_cpu_has_extint(struct kvm_vcpu *v);
 int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu);
 int kvm_cpu_get_interrupt(struct kvm_vcpu *v);
 void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event);
diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c
index ee94671272e3..814698e5b152 100644
--- a/arch/x86/kvm/irq.c
+++ b/arch/x86/kvm/irq.c
@@ -40,7 +40,7 @@ static int pending_userspace_extint(struct kvm_vcpu *v)
  * check if there is pending interrupt from
  * non-APIC source without intack.
  */
-static int kvm_cpu_has_extint(struct kvm_vcpu *v)
+int kvm_cpu_has_extint(struct kvm_vcpu *v)
 {
 	/*
 	 * FIXME: interrupt.injected represents an interrupt whose
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 078a39d489fe..e545a8a613b1 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4051,21 +4051,23 @@ static int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu,
 
 static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu)
 {
+	/*
+	 * We can accept userspace's request for interrupt injection
+	 * as long as we have a place to store the interrupt number.
+	 * The actual injection will happen when the CPU is able to
+	 * deliver the interrupt.
+	 */
+	if (kvm_cpu_has_extint(vcpu))
+		return false;
+
+	/* Acknowledging ExtINT does not happen if LINT0 is masked.  */
 	return (!lapic_in_kernel(vcpu) ||
 		kvm_apic_accept_pic_intr(vcpu));
 }
 
-/*
- * if userspace requested an interrupt window, check that the
- * interrupt window is open.
- *
- * No need to exit to userspace if we already have an interrupt queued.
- */
 static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu)
 {
 	return kvm_arch_interrupt_allowed(vcpu) &&
-		!kvm_cpu_has_interrupt(vcpu) &&
-		!kvm_event_needs_reinjection(vcpu) &&
 		kvm_cpu_accept_dm_intr(vcpu);
 }
 
commit 72c3bcdcda494cbd600712a32e67702cdee60c07
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Fri Nov 27 08:53:52 2020 +0100

    KVM: x86: handle !lapic_in_kernel case in kvm_cpu_*_extint
    
    Centralize handling of interrupts from the userspace APIC
    in kvm_cpu_has_extint and kvm_cpu_get_extint, since
    userspace APIC interrupts are handled more or less the
    same as ExtINTs are with split irqchip.  This removes
    duplicated code from kvm_cpu_has_injectable_intr and
    kvm_cpu_has_interrupt, and makes the code more similar
    between kvm_cpu_has_{extint,interrupt} on one side
    and kvm_cpu_get_{extint,interrupt} on the other.
    
    Cc: stable at vger.kernel.org
    Reviewed-by: Filippo Sironi <sironi at amazon.de>
    Reviewed-by: David Woodhouse <dwmw at amazon.co.uk>
    Tested-by: David Woodhouse <dwmw at amazon.co.uk>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c
index 99d118ffc67d..ee94671272e3 100644
--- a/arch/x86/kvm/irq.c
+++ b/arch/x86/kvm/irq.c
@@ -41,28 +41,9 @@ static int pending_userspace_extint(struct kvm_vcpu *v)
  * non-APIC source without intack.
  */
 static int kvm_cpu_has_extint(struct kvm_vcpu *v)
-{
-	u8 accept = kvm_apic_accept_pic_intr(v);
-
-	if (accept) {
-		if (irqchip_split(v->kvm))
-			return pending_userspace_extint(v);
-		else
-			return v->kvm->arch.vpic->output;
-	} else
-		return 0;
-}
-
-/*
- * check if there is injectable interrupt:
- * when virtual interrupt delivery enabled,
- * interrupt from apic will handled by hardware,
- * we don't need to check it here.
- */
-int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
 {
 	/*
-	 * FIXME: interrupt.injected represents an interrupt that it's
+	 * FIXME: interrupt.injected represents an interrupt whose
 	 * side-effects have already been applied (e.g. bit from IRR
 	 * already moved to ISR). Therefore, it is incorrect to rely
 	 * on interrupt.injected to know if there is a pending
@@ -75,6 +56,23 @@ int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
 	if (!lapic_in_kernel(v))
 		return v->arch.interrupt.injected;
 
+	if (!kvm_apic_accept_pic_intr(v))
+		return 0;
+
+	if (irqchip_split(v->kvm))
+		return pending_userspace_extint(v);
+	else
+		return v->kvm->arch.vpic->output;
+}
+
+/*
+ * check if there is injectable interrupt:
+ * when virtual interrupt delivery enabled,
+ * interrupt from apic will handled by hardware,
+ * we don't need to check it here.
+ */
+int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
+{
 	if (kvm_cpu_has_extint(v))
 		return 1;
 
@@ -91,20 +89,6 @@ EXPORT_SYMBOL_GPL(kvm_cpu_has_injectable_intr);
  */
 int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
 {
-	/*
-	 * FIXME: interrupt.injected represents an interrupt that it's
-	 * side-effects have already been applied (e.g. bit from IRR
-	 * already moved to ISR). Therefore, it is incorrect to rely
-	 * on interrupt.injected to know if there is a pending
-	 * interrupt in the user-mode LAPIC.
-	 * This leads to nVMX/nSVM not be able to distinguish
-	 * if it should exit from L2 to L1 on EXTERNAL_INTERRUPT on
-	 * pending interrupt or should re-inject an injected
-	 * interrupt.
-	 */
-	if (!lapic_in_kernel(v))
-		return v->arch.interrupt.injected;
-
 	if (kvm_cpu_has_extint(v))
 		return 1;
 
@@ -118,16 +102,21 @@ EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
  */
 static int kvm_cpu_get_extint(struct kvm_vcpu *v)
 {
-	if (kvm_cpu_has_extint(v)) {
-		if (irqchip_split(v->kvm)) {
-			int vector = v->arch.pending_external_vector;
-
-			v->arch.pending_external_vector = -1;
-			return vector;
-		} else
-			return kvm_pic_read_irq(v->kvm); /* PIC */
-	} else
+	if (!kvm_cpu_has_extint(v)) {
+		WARN_ON(!lapic_in_kernel(v));
 		return -1;
+	}
+
+	if (!lapic_in_kernel(v))
+		return v->arch.interrupt.nr;
+
+	if (irqchip_split(v->kvm)) {
+		int vector = v->arch.pending_external_vector;
+
+		v->arch.pending_external_vector = -1;
+		return vector;
+	} else
+		return kvm_pic_read_irq(v->kvm); /* PIC */
 }
 
 /*
@@ -135,13 +124,7 @@ static int kvm_cpu_get_extint(struct kvm_vcpu *v)
  */
 int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
 {
-	int vector;
-
-	if (!lapic_in_kernel(v))
-		return v->arch.interrupt.nr;
-
-	vector = kvm_cpu_get_extint(v);
-
+	int vector = kvm_cpu_get_extint(v);
 	if (vector != -1)
 		return vector;			/* PIC */
 
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 105e7859d1f2..86c33d53c90a 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -2465,7 +2465,7 @@ int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = vcpu->arch.apic;
 	u32 ppr;
 
-	if (!kvm_apic_hw_enabled(apic))
+	if (!kvm_apic_present(vcpu))
 		return -1;
 
 	__apic_update_ppr(apic, &ppr);
commit 545f63948d3a2d5ad5aa2245c5cc75d5a45c19b4
Merge: c2b1209d852f 23bde34771f1
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Fri Nov 27 09:17:13 2020 -0500

    Merge tag 'kvmarm-fixes-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into kvm-master
    
    KVM/arm64 fixes for v5.10, take #4
    
    - Fix alignment of the new HYP sections
    - Fix GICR_TYPER access from userspace

commit 5ef5bee02f1a7ae0706a7236867fddb26d8e8650
Merge: 402d5840b0d4 aa4cb898b80a
Author: Takashi Iwai <tiwai at suse.de>
Date:   Fri Nov 27 15:02:30 2020 +0100

    Merge tag 'asoc-fix-v5.10-rc5' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
    
    ASoC: Fixes for v5.10
    
    A small set of driver specific fixes, plus a new platform quirk from
    Hans.

commit 402d5840b0d40a2a26c8651165d29b534abb6d36
Author: Hector Martin <marcan at marcan.st>
Date:   Fri Nov 27 22:26:35 2020 +0900

    ALSA: usb-audio: US16x08: fix value count for level meters
    
    The level meter control returns 34 integers of info. This fixes:
    
    snd-usb-audio 3-1:1.0: control 2:0:0:Level Meter:0: access overflow
    
    Fixes: d2bb390a2081 ("ALSA: usb-audio: Tascam US-16x08 DSP mixer quirk")
    Cc: stable at vger.kernel.org
    Signed-off-by: Hector Martin <marcan at marcan.st>
    Link: https://lore.kernel.org/r/20201127132635.18947-1-marcan@marcan.st
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/usb/mixer_us16x08.c b/sound/usb/mixer_us16x08.c
index 92b1a6d9c931..bd63a9ce6a70 100644
--- a/sound/usb/mixer_us16x08.c
+++ b/sound/usb/mixer_us16x08.c
@@ -607,7 +607,7 @@ static int snd_us16x08_eq_put(struct snd_kcontrol *kcontrol,
 static int snd_us16x08_meter_info(struct snd_kcontrol *kcontrol,
 	struct snd_ctl_elem_info *uinfo)
 {
-	uinfo->count = 1;
+	uinfo->count = 34;
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 	uinfo->value.integer.max = 0x7FFF;
 	uinfo->value.integer.min = 0;
commit 484cfbe5fb61469a5f5a276258a8b3973164b56f
Author: Amelie Delaunay <amelie.delaunay at st.com>
Date:   Fri Nov 27 14:17:35 2020 +0100

    usb: typec: stusb160x: fix power-opmode property with typec-power-opmode
    
    Device tree property is named typec-power-opmode, not power-opmode.
    
    Fixes: da0cb6310094 ("usb: typec: add support for STUSB160x Type-C controller family")
    Signed-off-by: Amelie Delaunay <amelie.delaunay at st.com>
    Reviewed-by: Heikki Krogerus <heikki.krogerus at linux.intel.com>
    Link: https://lore.kernel.org/r/20201127131735.28280-1-amelie.delaunay@st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/typec/stusb160x.c b/drivers/usb/typec/stusb160x.c
index 2a618f02f4f1..d21750bbbb44 100644
--- a/drivers/usb/typec/stusb160x.c
+++ b/drivers/usb/typec/stusb160x.c
@@ -562,7 +562,7 @@ static int stusb160x_get_fw_caps(struct stusb160x *chip,
 	 * Supported power operation mode can be configured through device tree
 	 * else it is read from chip registers in stusb160x_get_caps.
 	 */
-	ret = fwnode_property_read_string(fwnode, "power-opmode", &cap_str);
+	ret = fwnode_property_read_string(fwnode, "typec-power-opmode", &cap_str);
 	if (!ret) {
 		ret = typec_find_pwr_opmode(cap_str);
 		/* Power delivery not yet supported */
commit 739e7116b10bf8694795ed8365dd7cbe089b662a
Merge: 90574a9c02f1 4ad9921af4f1
Author: Petr Mladek <pmladek at suse.com>
Date:   Fri Nov 27 13:41:23 2020 +0100

    Merge branch 'for-5.10-pr_cont-fixup' into for-linus

commit 454a079b381a1fea3962f89016f55761b251f4bd
Merge: 06ceddef30a5 05d5de6ba7db
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 27 13:18:40 2020 +0100

    Merge tag 'omap-for-v5.10/fixes-rc5-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into arm/fixes
    
    Fixes for omaps for various issues noticed during the -rc cycle:
    
    - Earlier omap4 cpuidle fix was incomplete and needs to use a
      configured idle state instead
    
    - Fix am4 cpsw driver compatible to avoid invalid resource error
      for the legacy driver
    
    - Two kconfig fixes for genpd support that we added for for v5.10
      for proper location of the option and adding missing option
    
    - Fix ti-sysc reset status checking on enabling modules to ignore
      quirky modules with reset status only usable when the quirk is
      activated during reset. Also fix bogus resetdone warning for
      cpsw and modules with no sysst register reset status bit
    
    - Suppress a ti-sysc warning for timers reserved as system timers
    
    - Fix the ordering of clocks for dra7 m_can
    
    * tag 'omap-for-v5.10/fixes-rc5-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
      ARM: dts: dra76x: m_can: fix order of clocks
      bus: ti-sysc: suppress err msg for timers used as clockevent/source
      ARM: dts: am437x-l4: fix compatible for cpsw switch dt node
      ARM: OMAP2+: Manage MPU state properly for omap_enter_idle_coupled()
      bus: ti-sysc: Fix bogus resetdone warning on enable for cpsw
      bus: ti-sysc: Fix reset status check for modules with quirks
      ARM: OMAP2+: Fix missing select PM_GENERIC_DOMAINS_OF
      ARM: OMAP2+: Fix location for select PM_GENERIC_DOMAINS
    
    Link: https://lore.kernel.org/r/pull-1606460270-864284@atomide.com
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit a5d45bc0dc50f9dd83703510e9804d813a9cac32
Author: Pablo Neira Ayuso <pablo at netfilter.org>
Date:   Wed Nov 25 23:50:17 2020 +0100

    netfilter: nftables_offload: build mask based from the matching bytes
    
    Userspace might match on prefix bytes of header fields if they are on
    the byte boundary, this requires that the mask is adjusted accordingly.
    Use NFT_OFFLOAD_MATCH_EXACT() for meta since prefix byte matching is not
    allowed for this type of selector.
    
    The bitwise expression might be optimized out by userspace, hence the
    kernel needs to infer the prefix from the number of payload bytes to
    match on. This patch adds nft_payload_offload_mask() to calculate the
    bitmask to match on the prefix.
    
    Fixes: c9626a2cbdb2 ("netfilter: nf_tables: add hardware offload support")
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/include/net/netfilter/nf_tables_offload.h b/include/net/netfilter/nf_tables_offload.h
index bddd34c5bd79..1d34fe154fe0 100644
--- a/include/net/netfilter/nf_tables_offload.h
+++ b/include/net/netfilter/nf_tables_offload.h
@@ -78,6 +78,9 @@ int nft_flow_rule_offload_commit(struct net *net);
 		offsetof(struct nft_flow_key, __base.__field);		\
 	(__reg)->len		= __len;				\
 	(__reg)->key		= __key;				\
+
+#define NFT_OFFLOAD_MATCH_EXACT(__key, __base, __field, __len, __reg)	\
+	NFT_OFFLOAD_MATCH(__key, __base, __field, __len, __reg)		\
 	memset(&(__reg)->mask, 0xff, (__reg)->len);
 
 int nft_chain_offload_priority(struct nft_base_chain *basechain);
diff --git a/net/netfilter/nft_cmp.c b/net/netfilter/nft_cmp.c
index bc079d68a536..00e563a72d3d 100644
--- a/net/netfilter/nft_cmp.c
+++ b/net/netfilter/nft_cmp.c
@@ -123,11 +123,11 @@ static int __nft_cmp_offload(struct nft_offload_ctx *ctx,
 	u8 *mask = (u8 *)&flow->match.mask;
 	u8 *key = (u8 *)&flow->match.key;
 
-	if (priv->op != NFT_CMP_EQ || reg->len != priv->len)
+	if (priv->op != NFT_CMP_EQ || priv->len > reg->len)
 		return -EOPNOTSUPP;
 
-	memcpy(key + reg->offset, &priv->data, priv->len);
-	memcpy(mask + reg->offset, &reg->mask, priv->len);
+	memcpy(key + reg->offset, &priv->data, reg->len);
+	memcpy(mask + reg->offset, &reg->mask, reg->len);
 
 	flow->match.dissector.used_keys |= BIT(reg->key);
 	flow->match.dissector.offset[reg->key] = reg->base_offset;
@@ -137,7 +137,7 @@ static int __nft_cmp_offload(struct nft_offload_ctx *ctx,
 	    nft_reg_load16(priv->data.data) != ARPHRD_ETHER)
 		return -EOPNOTSUPP;
 
-	nft_offload_update_dependency(ctx, &priv->data, priv->len);
+	nft_offload_update_dependency(ctx, &priv->data, reg->len);
 
 	return 0;
 }
diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c
index b37bd02448d8..bf4b3ad5314c 100644
--- a/net/netfilter/nft_meta.c
+++ b/net/netfilter/nft_meta.c
@@ -724,22 +724,22 @@ static int nft_meta_get_offload(struct nft_offload_ctx *ctx,
 
 	switch (priv->key) {
 	case NFT_META_PROTOCOL:
-		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_BASIC, basic, n_proto,
-				  sizeof(__u16), reg);
+		NFT_OFFLOAD_MATCH_EXACT(FLOW_DISSECTOR_KEY_BASIC, basic, n_proto,
+					sizeof(__u16), reg);
 		nft_offload_set_dependency(ctx, NFT_OFFLOAD_DEP_NETWORK);
 		break;
 	case NFT_META_L4PROTO:
-		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_BASIC, basic, ip_proto,
-				  sizeof(__u8), reg);
+		NFT_OFFLOAD_MATCH_EXACT(FLOW_DISSECTOR_KEY_BASIC, basic, ip_proto,
+					sizeof(__u8), reg);
 		nft_offload_set_dependency(ctx, NFT_OFFLOAD_DEP_TRANSPORT);
 		break;
 	case NFT_META_IIF:
-		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_META, meta,
-				  ingress_ifindex, sizeof(__u32), reg);
+		NFT_OFFLOAD_MATCH_EXACT(FLOW_DISSECTOR_KEY_META, meta,
+					ingress_ifindex, sizeof(__u32), reg);
 		break;
 	case NFT_META_IIFTYPE:
-		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_META, meta,
-				  ingress_iftype, sizeof(__u16), reg);
+		NFT_OFFLOAD_MATCH_EXACT(FLOW_DISSECTOR_KEY_META, meta,
+					ingress_iftype, sizeof(__u16), reg);
 		break;
 	default:
 		return -EOPNOTSUPP;
diff --git a/net/netfilter/nft_payload.c b/net/netfilter/nft_payload.c
index bbf811d030d5..47d4e0e21651 100644
--- a/net/netfilter/nft_payload.c
+++ b/net/netfilter/nft_payload.c
@@ -165,6 +165,34 @@ nla_put_failure:
 	return -1;
 }
 
+static bool nft_payload_offload_mask(struct nft_offload_reg *reg,
+				     u32 priv_len, u32 field_len)
+{
+	unsigned int remainder, delta, k;
+	struct nft_data mask = {};
+	__be32 remainder_mask;
+
+	if (priv_len == field_len) {
+		memset(&reg->mask, 0xff, priv_len);
+		return true;
+	} else if (priv_len > field_len) {
+		return false;
+	}
+
+	memset(&mask, 0xff, field_len);
+	remainder = priv_len % sizeof(u32);
+	if (remainder) {
+		k = priv_len / sizeof(u32);
+		delta = field_len - priv_len;
+		remainder_mask = htonl(~((1 << (delta * BITS_PER_BYTE)) - 1));
+		mask.data[k] = (__force u32)remainder_mask;
+	}
+
+	memcpy(&reg->mask, &mask, field_len);
+
+	return true;
+}
+
 static int nft_payload_offload_ll(struct nft_offload_ctx *ctx,
 				  struct nft_flow_rule *flow,
 				  const struct nft_payload *priv)
@@ -173,21 +201,21 @@ static int nft_payload_offload_ll(struct nft_offload_ctx *ctx,
 
 	switch (priv->offset) {
 	case offsetof(struct ethhdr, h_source):
-		if (priv->len != ETH_ALEN)
+		if (!nft_payload_offload_mask(reg, priv->len, ETH_ALEN))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_ETH_ADDRS, eth_addrs,
 				  src, ETH_ALEN, reg);
 		break;
 	case offsetof(struct ethhdr, h_dest):
-		if (priv->len != ETH_ALEN)
+		if (!nft_payload_offload_mask(reg, priv->len, ETH_ALEN))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_ETH_ADDRS, eth_addrs,
 				  dst, ETH_ALEN, reg);
 		break;
 	case offsetof(struct ethhdr, h_proto):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_BASIC, basic,
@@ -195,14 +223,14 @@ static int nft_payload_offload_ll(struct nft_offload_ctx *ctx,
 		nft_offload_set_dependency(ctx, NFT_OFFLOAD_DEP_NETWORK);
 		break;
 	case offsetof(struct vlan_ethhdr, h_vlan_TCI):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_VLAN, vlan,
 				  vlan_tci, sizeof(__be16), reg);
 		break;
 	case offsetof(struct vlan_ethhdr, h_vlan_encapsulated_proto):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_VLAN, vlan,
@@ -210,7 +238,7 @@ static int nft_payload_offload_ll(struct nft_offload_ctx *ctx,
 		nft_offload_set_dependency(ctx, NFT_OFFLOAD_DEP_NETWORK);
 		break;
 	case offsetof(struct vlan_ethhdr, h_vlan_TCI) + sizeof(struct vlan_hdr):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_CVLAN, vlan,
@@ -218,7 +246,7 @@ static int nft_payload_offload_ll(struct nft_offload_ctx *ctx,
 		break;
 	case offsetof(struct vlan_ethhdr, h_vlan_encapsulated_proto) +
 							sizeof(struct vlan_hdr):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_CVLAN, vlan,
@@ -239,7 +267,8 @@ static int nft_payload_offload_ip(struct nft_offload_ctx *ctx,
 
 	switch (priv->offset) {
 	case offsetof(struct iphdr, saddr):
-		if (priv->len != sizeof(struct in_addr))
+		if (!nft_payload_offload_mask(reg, priv->len,
+					      sizeof(struct in_addr)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV4_ADDRS, ipv4, src,
@@ -247,7 +276,8 @@ static int nft_payload_offload_ip(struct nft_offload_ctx *ctx,
 		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV4_ADDRS);
 		break;
 	case offsetof(struct iphdr, daddr):
-		if (priv->len != sizeof(struct in_addr))
+		if (!nft_payload_offload_mask(reg, priv->len,
+					      sizeof(struct in_addr)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV4_ADDRS, ipv4, dst,
@@ -255,7 +285,7 @@ static int nft_payload_offload_ip(struct nft_offload_ctx *ctx,
 		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV4_ADDRS);
 		break;
 	case offsetof(struct iphdr, protocol):
-		if (priv->len != sizeof(__u8))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__u8)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_BASIC, basic, ip_proto,
@@ -277,7 +307,8 @@ static int nft_payload_offload_ip6(struct nft_offload_ctx *ctx,
 
 	switch (priv->offset) {
 	case offsetof(struct ipv6hdr, saddr):
-		if (priv->len != sizeof(struct in6_addr))
+		if (!nft_payload_offload_mask(reg, priv->len,
+					      sizeof(struct in6_addr)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6, src,
@@ -285,7 +316,8 @@ static int nft_payload_offload_ip6(struct nft_offload_ctx *ctx,
 		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV6_ADDRS);
 		break;
 	case offsetof(struct ipv6hdr, daddr):
-		if (priv->len != sizeof(struct in6_addr))
+		if (!nft_payload_offload_mask(reg, priv->len,
+					      sizeof(struct in6_addr)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6, dst,
@@ -293,7 +325,7 @@ static int nft_payload_offload_ip6(struct nft_offload_ctx *ctx,
 		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV6_ADDRS);
 		break;
 	case offsetof(struct ipv6hdr, nexthdr):
-		if (priv->len != sizeof(__u8))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__u8)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_BASIC, basic, ip_proto,
@@ -335,14 +367,14 @@ static int nft_payload_offload_tcp(struct nft_offload_ctx *ctx,
 
 	switch (priv->offset) {
 	case offsetof(struct tcphdr, source):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_PORTS, tp, src,
 				  sizeof(__be16), reg);
 		break;
 	case offsetof(struct tcphdr, dest):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_PORTS, tp, dst,
@@ -363,14 +395,14 @@ static int nft_payload_offload_udp(struct nft_offload_ctx *ctx,
 
 	switch (priv->offset) {
 	case offsetof(struct udphdr, source):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_PORTS, tp, src,
 				  sizeof(__be16), reg);
 		break;
 	case offsetof(struct udphdr, dest):
-		if (priv->len != sizeof(__be16))
+		if (!nft_payload_offload_mask(reg, priv->len, sizeof(__be16)))
 			return -EOPNOTSUPP;
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_PORTS, tp, dst,
commit 3c78e9e0d33a27ab8050e4492c03c6a1f8d0ed6b
Author: Pablo Neira Ayuso <pablo at netfilter.org>
Date:   Wed Nov 25 23:50:07 2020 +0100

    netfilter: nftables_offload: set address type in control dissector
    
    This patch adds nft_flow_rule_set_addr_type() to set the address type
    from the nft_payload expression accordingly.
    
    If the address type is not set in the control dissector then a rule that
    matches either on source or destination IP address does not work.
    
    After this patch, nft hardware offload generates the flow dissector
    configuration as tc-flower does to match on an IP address.
    
    This patch has been also tested functionally to make sure packets are
    filtered out by the NIC.
    
    This is also getting the code aligned with the existing netfilter flow
    offload infrastructure which is also setting the control dissector.
    
    Fixes: c9626a2cbdb2 ("netfilter: nf_tables: add hardware offload support")
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/include/net/netfilter/nf_tables_offload.h b/include/net/netfilter/nf_tables_offload.h
index ea7d1d78b92d..bddd34c5bd79 100644
--- a/include/net/netfilter/nf_tables_offload.h
+++ b/include/net/netfilter/nf_tables_offload.h
@@ -37,6 +37,7 @@ void nft_offload_update_dependency(struct nft_offload_ctx *ctx,
 
 struct nft_flow_key {
 	struct flow_dissector_key_basic			basic;
+	struct flow_dissector_key_control		control;
 	union {
 		struct flow_dissector_key_ipv4_addrs	ipv4;
 		struct flow_dissector_key_ipv6_addrs	ipv6;
@@ -62,6 +63,9 @@ struct nft_flow_rule {
 
 #define NFT_OFFLOAD_F_ACTION	(1 << 0)
 
+void nft_flow_rule_set_addr_type(struct nft_flow_rule *flow,
+				 enum flow_dissector_key_id addr_type);
+
 struct nft_rule;
 struct nft_flow_rule *nft_flow_rule_create(struct net *net, const struct nft_rule *rule);
 void nft_flow_rule_destroy(struct nft_flow_rule *flow);
diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c
index 9f625724a20f..9ae14270c543 100644
--- a/net/netfilter/nf_tables_offload.c
+++ b/net/netfilter/nf_tables_offload.c
@@ -28,6 +28,23 @@ static struct nft_flow_rule *nft_flow_rule_alloc(int num_actions)
 	return flow;
 }
 
+void nft_flow_rule_set_addr_type(struct nft_flow_rule *flow,
+				 enum flow_dissector_key_id addr_type)
+{
+	struct nft_flow_match *match = &flow->match;
+	struct nft_flow_key *mask = &match->mask;
+	struct nft_flow_key *key = &match->key;
+
+	if (match->dissector.used_keys & BIT(FLOW_DISSECTOR_KEY_CONTROL))
+		return;
+
+	key->control.addr_type = addr_type;
+	mask->control.addr_type = 0xffff;
+	match->dissector.used_keys |= BIT(FLOW_DISSECTOR_KEY_CONTROL);
+	match->dissector.offset[FLOW_DISSECTOR_KEY_CONTROL] =
+		offsetof(struct nft_flow_key, control);
+}
+
 struct nft_flow_rule *nft_flow_rule_create(struct net *net,
 					   const struct nft_rule *rule)
 {
diff --git a/net/netfilter/nft_payload.c b/net/netfilter/nft_payload.c
index dcd3c7b8a367..bbf811d030d5 100644
--- a/net/netfilter/nft_payload.c
+++ b/net/netfilter/nft_payload.c
@@ -244,6 +244,7 @@ static int nft_payload_offload_ip(struct nft_offload_ctx *ctx,
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV4_ADDRS, ipv4, src,
 				  sizeof(struct in_addr), reg);
+		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV4_ADDRS);
 		break;
 	case offsetof(struct iphdr, daddr):
 		if (priv->len != sizeof(struct in_addr))
@@ -251,6 +252,7 @@ static int nft_payload_offload_ip(struct nft_offload_ctx *ctx,
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV4_ADDRS, ipv4, dst,
 				  sizeof(struct in_addr), reg);
+		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV4_ADDRS);
 		break;
 	case offsetof(struct iphdr, protocol):
 		if (priv->len != sizeof(__u8))
@@ -280,6 +282,7 @@ static int nft_payload_offload_ip6(struct nft_offload_ctx *ctx,
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6, src,
 				  sizeof(struct in6_addr), reg);
+		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV6_ADDRS);
 		break;
 	case offsetof(struct ipv6hdr, daddr):
 		if (priv->len != sizeof(struct in6_addr))
@@ -287,6 +290,7 @@ static int nft_payload_offload_ip6(struct nft_offload_ctx *ctx,
 
 		NFT_OFFLOAD_MATCH(FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6, dst,
 				  sizeof(struct in6_addr), reg);
+		nft_flow_rule_set_addr_type(flow, FLOW_DISSECTOR_KEY_IPV6_ADDRS);
 		break;
 	case offsetof(struct ipv6hdr, nexthdr):
 		if (priv->len != sizeof(__u8))
commit 4bc3c8dc9f5f1eff0d3bfa59491383ac11308b6b
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Tue Nov 24 16:07:49 2020 +0800

    ipvs: fix possible memory leak in ip_vs_control_net_init
    
    kmemleak report a memory leak as follows:
    
    BUG: memory leak
    unreferenced object 0xffff8880759ea000 (size 256):
    backtrace:
    [<00000000c0bf2deb>] kmem_cache_zalloc include/linux/slab.h:656 [inline]
    [<00000000c0bf2deb>] __proc_create+0x23d/0x7d0 fs/proc/generic.c:421
    [<000000009d718d02>] proc_create_reg+0x8e/0x140 fs/proc/generic.c:535
    [<0000000097bbfc4f>] proc_create_net_data+0x8c/0x1b0 fs/proc/proc_net.c:126
    [<00000000652480fc>] ip_vs_control_net_init+0x308/0x13a0 net/netfilter/ipvs/ip_vs_ctl.c:4169
    [<000000004c927ebe>] __ip_vs_init+0x211/0x400 net/netfilter/ipvs/ip_vs_core.c:2429
    [<00000000aa6b72d9>] ops_init+0xa8/0x3c0 net/core/net_namespace.c:151
    [<00000000153fd114>] setup_net+0x2de/0x7e0 net/core/net_namespace.c:341
    [<00000000be4e4f07>] copy_net_ns+0x27d/0x530 net/core/net_namespace.c:482
    [<00000000f1c23ec9>] create_new_namespaces+0x382/0xa30 kernel/nsproxy.c:110
    [<00000000098a5757>] copy_namespaces+0x2e6/0x3b0 kernel/nsproxy.c:179
    [<0000000026ce39e9>] copy_process+0x220a/0x5f00 kernel/fork.c:2072
    [<00000000b71f4efe>] _do_fork+0xc7/0xda0 kernel/fork.c:2428
    [<000000002974ee96>] __do_sys_clone3+0x18a/0x280 kernel/fork.c:2703
    [<0000000062ac0a4d>] do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
    [<0000000093f1ce2c>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    In the error path of ip_vs_control_net_init(), remove_proc_entry() needs
    to be called to remove the added proc entry, otherwise a memory leak
    will occur.
    
    Also, add some '#ifdef CONFIG_PROC_FS' because proc_create_net* return NULL
    when PROC is not used.
    
    Fixes: b17fc9963f83 ("IPVS: netns, ip_vs_stats and its procfs")
    Fixes: 61b1ab4583e2 ("IPVS: netns, add basic init per netns.")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Acked-by: Julian Anastasov <ja at ssi.bg>
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index e279ded4e306..d45dbcba8b49 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -4167,12 +4167,18 @@ int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs)
 
 	spin_lock_init(&ipvs->tot_stats.lock);
 
-	proc_create_net("ip_vs", 0, ipvs->net->proc_net, &ip_vs_info_seq_ops,
-			sizeof(struct ip_vs_iter));
-	proc_create_net_single("ip_vs_stats", 0, ipvs->net->proc_net,
-			ip_vs_stats_show, NULL);
-	proc_create_net_single("ip_vs_stats_percpu", 0, ipvs->net->proc_net,
-			ip_vs_stats_percpu_show, NULL);
+#ifdef CONFIG_PROC_FS
+	if (!proc_create_net("ip_vs", 0, ipvs->net->proc_net,
+			     &ip_vs_info_seq_ops, sizeof(struct ip_vs_iter)))
+		goto err_vs;
+	if (!proc_create_net_single("ip_vs_stats", 0, ipvs->net->proc_net,
+				    ip_vs_stats_show, NULL))
+		goto err_stats;
+	if (!proc_create_net_single("ip_vs_stats_percpu", 0,
+				    ipvs->net->proc_net,
+				    ip_vs_stats_percpu_show, NULL))
+		goto err_percpu;
+#endif
 
 	if (ip_vs_control_net_init_sysctl(ipvs))
 		goto err;
@@ -4180,6 +4186,17 @@ int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs)
 	return 0;
 
 err:
+#ifdef CONFIG_PROC_FS
+	remove_proc_entry("ip_vs_stats_percpu", ipvs->net->proc_net);
+
+err_percpu:
+	remove_proc_entry("ip_vs_stats", ipvs->net->proc_net);
+
+err_stats:
+	remove_proc_entry("ip_vs", ipvs->net->proc_net);
+
+err_vs:
+#endif
 	free_percpu(ipvs->tot_stats.cpustats);
 	return -ENOMEM;
 }
@@ -4188,9 +4205,11 @@ void __net_exit ip_vs_control_net_cleanup(struct netns_ipvs *ipvs)
 {
 	ip_vs_trash_cleanup(ipvs);
 	ip_vs_control_net_cleanup_sysctl(ipvs);
+#ifdef CONFIG_PROC_FS
 	remove_proc_entry("ip_vs_stats_percpu", ipvs->net->proc_net);
 	remove_proc_entry("ip_vs_stats", ipvs->net->proc_net);
 	remove_proc_entry("ip_vs", ipvs->net->proc_net);
+#endif
 	free_percpu(ipvs->tot_stats.cpustats);
 }
 
commit 10f78fd0dabbc3856ddd67b09a46abdedb045913
Author: Srikar Dronamraju <srikar at linux.vnet.ibm.com>
Date:   Fri Nov 27 11:07:38 2020 +0530

    powerpc/numa: Fix a regression on memoryless node 0
    
    Commit e75130f20b1f ("powerpc/numa: Offline memoryless cpuless node 0")
    offlines node 0 and expects nodes to be subsequently onlined when CPUs
    or nodes are detected.
    
    Commit 6398eaa26816 ("powerpc/numa: Prefer node id queried from vphn")
    skips onlining node 0 when CPUs are associated with node 0.
    
    On systems with node 0 having CPUs but no memory, this causes node 0 be
    marked offline. This causes issues at boot time when trying to set
    memory node for online CPUs while building the zonelist.
    
    0:mon> t
    [link register   ] c000000000400354 __build_all_zonelists+0x164/0x280
    [c00000000161bda0] c0000000016533c8 node_states+0x20/0xa0 (unreliable)
    [c00000000161bdc0] c000000000400384 __build_all_zonelists+0x194/0x280
    [c00000000161be30] c000000001041800 build_all_zonelists_init+0x4c/0x118
    [c00000000161be80] c0000000004020d0 build_all_zonelists+0x190/0x1b0
    [c00000000161bef0] c000000001003cf8 start_kernel+0x18c/0x6a8
    [c00000000161bf90] c00000000000adb4 start_here_common+0x1c/0x3e8
    0:mon> r
    R00 = c000000000400354   R16 = 000000000b57a0e8
    R01 = c00000000161bda0   R17 = 000000000b57a6b0
    R02 = c00000000161ce00   R18 = 000000000b5afee8
    R03 = 0000000000000000   R19 = 000000000b6448a0
    R04 = 0000000000000000   R20 = fffffffffffffffd
    R05 = 0000000000000000   R21 = 0000000001400000
    R06 = 0000000000000000   R22 = 000000001ec00000
    R07 = 0000000000000001   R23 = c000000001175580
    R08 = 0000000000000000   R24 = c000000001651ed8
    R09 = c0000000017e84d8   R25 = c000000001652480
    R10 = 0000000000000000   R26 = c000000001175584
    R11 = c000000c7fac0d10   R27 = c0000000019568d0
    R12 = c000000000400180   R28 = 0000000000000000
    R13 = c000000002200000   R29 = c00000000164dd78
    R14 = 000000000b579f78   R30 = 0000000000000000
    R15 = 000000000b57a2b8   R31 = c000000001175584
    pc  = c000000000400194 local_memory_node+0x24/0x80
    cfar= c000000000074334 mcount+0xc/0x10
    lr  = c000000000400354 __build_all_zonelists+0x164/0x280
    msr = 8000000002001033   cr  = 44002284
    ctr = c000000000400180   xer = 0000000000000001   trap =  380
    dar = 0000000000001388   dsisr = c00000000161bc90
    0:mon>
    
    Fix this by setting node to be online while onlining CPUs that belong to
    node 0.
    
    Fixes: e75130f20b1f ("powerpc/numa: Offline memoryless cpuless node 0")
    Fixes: 6398eaa26816 ("powerpc/numa: Prefer node id queried from vphn")
    Reported-by: Milan Mohanty <milmohan at in.ibm.com>
    Signed-off-by: Srikar Dronamraju <srikar at linux.vnet.ibm.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201127053738.10085-1-srikar@linux.vnet.ibm.com

diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 63f61d8b55e5..f2bf98bdcea2 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -742,8 +742,7 @@ static int __init parse_numa_properties(void)
 			of_node_put(cpu);
 		}
 
-		if (likely(nid > 0))
-			node_set_online(nid);
+		node_set_online(nid);
 	}
 
 	get_n_mem_cells(&n_mem_addr_cells, &n_mem_size_cells);
commit 4ad9921af4f18490980369f7d60f90ade0195812
Author: John Ogness <john.ogness at linutronix.de>
Date:   Thu Nov 26 12:54:36 2020 +0106

    printk: finalize records with trailing newlines
    
    Any record with a trailing newline (LOG_NEWLINE flag) cannot
    be continued because the newline has been stripped and will
    not be visible if the message is appended. This was already
    handled correctly when committing in log_output() but was
    not handled correctly when committing in log_store().
    
    Fixes: f5f022e53b87 ("printk: reimplement log_cont using record extension")
    Link: https://lore.kernel.org/r/20201126114836.14750-1-john.ogness@linutronix.de
    Reported-by: Kefeng Wang <wangkefeng.wang at huawei.com>
    Signed-off-by: John Ogness <john.ogness at linutronix.de>
    Tested-by: Kefeng Wang <wangkefeng.wang at huawei.com>
    Reviewed-by: Petr Mladek <pmladek at suse.com>
    Signed-off-by: Petr Mladek <pmladek at suse.com>

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index fe64a49344bf..bc1e3b5a97bd 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -528,8 +528,8 @@ static int log_store(u32 caller_id, int facility, int level,
 	if (dev_info)
 		memcpy(&r.info->dev_info, dev_info, sizeof(r.info->dev_info));
 
-	/* insert message */
-	if ((flags & LOG_CONT) || !(flags & LOG_NEWLINE))
+	/* A message without a trailing newline can be continued. */
+	if (!(flags & LOG_NEWLINE))
 		prb_commit(&e);
 	else
 		prb_final_commit(&e);
commit 6d6556c04ebaeaf4e7fa8b791c97e2a7c41b38a3
Author: Giacinto Cifelli <gciofono at gmail.com>
Date:   Wed Nov 25 15:53:04 2020 +0100

    USB: serial: option: add support for Thales Cinterion EXS82
    
    There is a single option port in this modem, and it is used as debug port.
    
    lsusb -v for this device:
    
    Bus 001 Device 002: ID 1e2d:006c
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass          239 Miscellaneous Device
      bDeviceSubClass         2 ?
      bDeviceProtocol         1 Interface Association
      bMaxPacketSize0        64
      idVendor           0x1e2d
      idProduct          0x006c
      bcdDevice            0.00
      iManufacturer           4
      iProduct                3
      iSerial                 5
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength          243
        bNumInterfaces          7
        bConfigurationValue     1
        iConfiguration          2
        bmAttributes         0xe0
          Self Powered
          Remote Wakeup
        MaxPower              500mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol    255 Vendor Specific Protocol
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x01  EP 1 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         1
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass       2 Abstract (modem)
          bFunctionProtocol       1 AT-commands (v.25ter)
          iFunction               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass      2 Abstract (modem)
          bInterfaceProtocol      1 AT-commands (v.25ter)
          iInterface              0
          CDC Header:
            bcdCDC               1.10
          CDC ACM:
            bmCapabilities       0x02
              line coding and serial state
          CDC Call Management:
            bmCapabilities       0x03
              call management
              use DataInterface
            bDataInterface          2
          CDC Union:
            bMasterInterface        1
            bSlaveInterface         2
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x82  EP 2 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               5
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        2
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x83  EP 3 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x02  EP 2 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         3
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass       2 Abstract (modem)
          bFunctionProtocol       1 AT-commands (v.25ter)
          iFunction               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        3
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass      2 Abstract (modem)
          bInterfaceProtocol      1 AT-commands (v.25ter)
          iInterface              0
          CDC Header:
            bcdCDC               1.10
          CDC ACM:
            bmCapabilities       0x02
              line coding and serial state
          CDC Call Management:
            bmCapabilities       0x03
              call management
              use DataInterface
            bDataInterface          4
          CDC Union:
            bMasterInterface        3
            bSlaveInterface         4
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x84  EP 4 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               5
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        4
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x85  EP 5 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x03  EP 3 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         5
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass       2 Abstract (modem)
          bFunctionProtocol       1 AT-commands (v.25ter)
          iFunction               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        5
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass      6 Ethernet Networking
          bInterfaceProtocol      0
          iInterface              0
          CDC Header:
            bcdCDC               1.10
          CDC Ethernet:
            iMacAddress                      1 (??)
            bmEthernetStatistics    0x00000000
            wMaxSegmentSize              16384
            wNumberMCFilters            0x0001
            bNumberPowerFilters              0
          CDC Union:
            bMasterInterface        5
            bSlaveInterface         6
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x86  EP 6 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               5
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        6
          bAlternateSetting       0
          bNumEndpoints           0
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0
          iInterface              0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        6
          bAlternateSetting       1
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x87  EP 7 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x04  EP 4 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
    
    Signed-off-by: Giacinto Cifelli <gciofono at gmail.com>
    Cc: stable at vger.kernel.org
    Signed-off-by: Johan Hovold <johan at kernel.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 2aa31173997f..653da1d2945c 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -419,6 +419,7 @@ static void option_instat_callback(struct urb *urb);
 #define CINTERION_PRODUCT_PH8			0x0053
 #define CINTERION_PRODUCT_AHXX			0x0055
 #define CINTERION_PRODUCT_PLXX			0x0060
+#define CINTERION_PRODUCT_EXS82			0x006c
 #define CINTERION_PRODUCT_PH8_2RMNET		0x0082
 #define CINTERION_PRODUCT_PH8_AUDIO		0x0083
 #define CINTERION_PRODUCT_AHXX_2RMNET		0x0084
@@ -1902,6 +1903,7 @@ static const struct usb_device_id option_ids[] = {
 	{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX_AUDIO, 0xff) },
 	{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_CLS8, 0xff),
 	  .driver_info = RSVD(0) | RSVD(4) },
+	{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EXS82, 0xff) },
 	{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
 	{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
 	{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
commit d73ff9b7c4eacaba0fd956d14882bcae970f8307
Author: Oliver Hartkopp <socketcan at hartkopp.net>
Date:   Thu Nov 26 20:21:40 2020 +0100

    can: af_can: can_rx_unregister(): remove WARN() statement from list operation sanity check
    
    To detect potential bugs in CAN protocol implementations (double removal of
    receiver entries) a WARN() statement has been used if no matching list item was
    found for removal.
    
    The fault injection issued by syzkaller was able to create a situation where
    the closing of a socket runs simultaneously to the notifier call chain for
    removing the CAN network device in use.
    
    This case is very unlikely in real life but it doesn't break anything.
    Therefore we just replace the WARN() statement with pr_warn() to preserve the
    notification for the CAN protocol development.
    
    Reported-by: syzbot+381d06e0c8eaacb8706f at syzkaller.appspotmail.com
    Reported-by: syzbot+d0ddd88c9a7432f041e6 at syzkaller.appspotmail.com
    Reported-by: syzbot+76d62d3b8162883c7d11 at syzkaller.appspotmail.com
    Signed-off-by: Oliver Hartkopp <socketcan at hartkopp.net>
    Link: https://lore.kernel.org/r/20201126192140.14350-1-socketcan@hartkopp.net
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/net/can/af_can.c b/net/can/af_can.c
index 5d124c155904..4c343b43067f 100644
--- a/net/can/af_can.c
+++ b/net/can/af_can.c
@@ -541,10 +541,13 @@ void can_rx_unregister(struct net *net, struct net_device *dev, canid_t can_id,
 
 	/* Check for bugs in CAN protocol implementations using af_can.c:
 	 * 'rcv' will be NULL if no matching list item was found for removal.
+	 * As this case may potentially happen when closing a socket while
+	 * the notifier for removing the CAN netdev is running we just print
+	 * a warning here.
 	 */
 	if (!rcv) {
-		WARN(1, "BUG: receive list entry not found for dev %s, id %03X, mask %03X\n",
-		     DNAME(dev), can_id, mask);
+		pr_warn("can: receive list entry not found for dev %s, id %03X, mask %03X\n",
+			DNAME(dev), can_id, mask);
 		goto out;
 	}
 
commit 5c7d55bded77da6db7c5d249610e3a2eed730b3c
Author: Pankaj Sharma <pankj.sharma at samsung.com>
Date:   Thu Nov 26 10:21:42 2020 +0530

    can: m_can: m_can_dev_setup(): add support for bosch mcan version 3.3.0
    
    Add support for mcan bit timing and control mode according to bosch mcan IP
    version 3.3.0. The mcan version read from the Core Release field of CREL
    register would be 33. Accordingly the properties are to be set for mcan v3.3.0
    
    Signed-off-by: Pankaj Sharma <pankj.sharma at samsung.com>
    Link: https://lore.kernel.org/r/1606366302-5520-1-git-send-email-pankj.sharma@samsung.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index d4030abad935..61a93b192037 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1385,6 +1385,8 @@ static int m_can_dev_setup(struct m_can_classdev *m_can_dev)
 						&m_can_data_bittiming_const_31X;
 		break;
 	case 32:
+	case 33:
+		/* Support both MCAN version v3.2.x and v3.3.0 */
 		m_can_dev->can.bittiming_const = m_can_dev->bit_timing ?
 			m_can_dev->bit_timing : &m_can_bittiming_const_31X;
 
commit e3409e4192535fbcc86a84b7a65d9351f46039ec
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Tue Nov 24 19:47:38 2020 +0100

    can: m_can: fix nominal bitiming tseg2 min for version >= 3.1
    
    At lest the revision 3.3.0 of the bosch m_can IP core specifies that valid
    register values for "Nominal Time segment after sample point (NTSEG2)" are from
    1 to 127. As the hardware uses a value of one more than the programmed value,
    mean tseg2_min is 2.
    
    This patch fixes the tseg2_min value accordingly.
    
    Cc: Dan Murphy <dmurphy at ti.com>
    Cc: Mario Huettel <mario.huettel at gmx.net>
    Acked-by: Sriram Dash <sriram.dash at samsung.com>
    Link: https://lore.kernel.org/r/20201124190751.3972238-1-mkl@pengutronix.de
    Fixes: b03cfc5bb0e1 ("can: m_can: Enable M_CAN version dependent initialization")
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index c62439bdee28..d4030abad935 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1033,7 +1033,7 @@ static const struct can_bittiming_const m_can_bittiming_const_31X = {
 	.name = KBUILD_MODNAME,
 	.tseg1_min = 2,		/* Time segment 1 = prop_seg + phase_seg1 */
 	.tseg1_max = 256,
-	.tseg2_min = 1,		/* Time segment 2 = phase_seg2 */
+	.tseg2_min = 2,		/* Time segment 2 = phase_seg2 */
 	.tseg2_max = 128,
 	.sjw_max = 128,
 	.brp_min = 1,
commit 865f5b671b48d0088ce981cff1e822d9f7da441f
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Fri Nov 27 08:35:12 2020 +0100

    can: m_can: m_can_open(): remove IRQF_TRIGGER_FALLING from request_threaded_irq()'s flags
    
    The threaded IRQ handler is used for the tcan4x5x driver only. The IRQ pin of
    the tcan4x5x controller is active low, so better not use IRQF_TRIGGER_FALLING
    when requesting the IRQ. As this can result in missing interrupts.
    
    Further, if the device tree specified the interrupt as "IRQ_TYPE_LEVEL_LOW",
    unloading and reloading of the driver results in the following error during
    ifup:
    
    | irq: type mismatch, failed to map hwirq-31 for gpio at 20a8000!
    | tcan4x5x spi1.1: m_can device registered (irq=0, version=32)
    | tcan4x5x spi1.1 can2: TCAN4X5X successfully initialized.
    | tcan4x5x spi1.1 can2: failed to request interrupt
    
    This patch fixes the problem by removing the IRQF_TRIGGER_FALLING from the
    request_threaded_irq().
    
    Fixes: f524f829b75a ("can: m_can: Create a m_can platform framework")
    Cc: Dan Murphy <dmurphy at ti.com>
    Cc: Sriram Dash <sriram.dash at samsung.com>
    Cc: Pankaj Sharma <pankj.sharma at samsung.com>
    Link: https://lore.kernel.org/r/20201127093548.509253-1-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index f3fc37e96b08..c62439bdee28 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1653,7 +1653,7 @@ static int m_can_open(struct net_device *dev)
 		INIT_WORK(&cdev->tx_work, m_can_tx_work_queue);
 
 		err = request_threaded_irq(dev->irq, NULL, m_can_isr,
-					   IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
+					   IRQF_ONESHOT,
 					   dev->name, dev);
 	} else {
 		err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
commit e5782a5d5054bf1e03cb7fbd87035037c2a22698
Author: Kailang Yang <kailang at realtek.com>
Date:   Fri Nov 27 14:39:23 2020 +0800

    ALSA: hda/realtek - Add new codec supported for ALC897
    
    Enable new codec supported for ALC897.
    
    Signed-off-by: Kailang Yang <kailang at realtek.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/3b00520f304842aab8291eb8d9191bd8@realtek.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 34ad24d2c970..fcd1fb18ece9 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -446,6 +446,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
 			alc_update_coef_idx(codec, 0x7, 1<<5, 0);
 		break;
 	case 0x10ec0892:
+	case 0x10ec0897:
 		alc_update_coef_idx(codec, 0x7, 1<<5, 0);
 		break;
 	case 0x10ec0899:
@@ -10214,6 +10215,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
 	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
 	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
 	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
+	HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
 	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
 	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
 	HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
commit 992b03b88e36254e26e9a4977ab948683e21bd9f
Author: Sven Eckelmann <sven at narfation.org>
Date:   Thu Nov 26 18:24:49 2020 +0100

    batman-adv: Don't always reallocate the fragmentation skb head
    
    When a packet is fragmented by batman-adv, the original batman-adv header
    is not modified. Only a new fragmentation is inserted between the original
    one and the ethernet header. The code must therefore make sure that it has
    a writable region of this size in the skbuff head.
    
    But it is not useful to always reallocate the skbuff by this size even when
    there would be more than enough headroom still in the skb. The reallocation
    is just to costly during in this codepath.
    
    Fixes: ee75ed88879a ("batman-adv: Fragment and send skbs larger than mtu")
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Signed-off-by: Simon Wunderlich <sw at simonwunderlich.de>

diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
index 8de1fb567fd7..1f1f5b0873b2 100644
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -527,13 +527,14 @@ int batadv_frag_send_packet(struct sk_buff *skb,
 		frag_header.no++;
 	}
 
-	/* Make room for the fragment header. */
-	if (batadv_skb_head_push(skb, header_size) < 0 ||
-	    pskb_expand_head(skb, header_size + ETH_HLEN, 0, GFP_ATOMIC) < 0) {
-		ret = -ENOMEM;
+	/* make sure that there is at least enough head for the fragmentation
+	 * and ethernet headers
+	 */
+	ret = skb_cow_head(skb, ETH_HLEN + header_size);
+	if (ret < 0)
 		goto put_primary_if;
-	}
 
+	skb_push(skb, header_size);
 	memcpy(skb->data, &frag_header, header_size);
 
 	/* Send the last fragment */
commit c5cbfc87558168ef4c3c27ce36eba6b83391db19
Author: Sven Eckelmann <sven at narfation.org>
Date:   Wed Nov 25 13:16:43 2020 +0100

    batman-adv: Reserve needed_*room for fragments
    
    The batadv net_device is trying to propagate the needed_headroom and
    needed_tailroom from the lower devices. This is needed to avoid cost
    intensive reallocations using pskb_expand_head during the transmission.
    
    But the fragmentation code split the skb's without adding extra room at the
    end/beginning of the various fragments. This reduced the performance of
    transmissions over complex scenarios (batadv on vxlan on wireguard) because
    the lower devices had to perform the reallocations at least once.
    
    Fixes: ee75ed88879a ("batman-adv: Fragment and send skbs larger than mtu")
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Signed-off-by: Simon Wunderlich <sw at simonwunderlich.de>

diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
index 9a47ef8b95c4..8de1fb567fd7 100644
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -391,6 +391,7 @@ out:
 
 /**
  * batadv_frag_create() - create a fragment from skb
+ * @net_dev: outgoing device for fragment
  * @skb: skb to create fragment from
  * @frag_head: header to use in new fragment
  * @fragment_size: size of new fragment
@@ -401,22 +402,25 @@ out:
  *
  * Return: the new fragment, NULL on error.
  */
-static struct sk_buff *batadv_frag_create(struct sk_buff *skb,
+static struct sk_buff *batadv_frag_create(struct net_device *net_dev,
+					  struct sk_buff *skb,
 					  struct batadv_frag_packet *frag_head,
 					  unsigned int fragment_size)
 {
+	unsigned int ll_reserved = LL_RESERVED_SPACE(net_dev);
+	unsigned int tailroom = net_dev->needed_tailroom;
 	struct sk_buff *skb_fragment;
 	unsigned int header_size = sizeof(*frag_head);
 	unsigned int mtu = fragment_size + header_size;
 
-	skb_fragment = netdev_alloc_skb(NULL, mtu + ETH_HLEN);
+	skb_fragment = dev_alloc_skb(ll_reserved + mtu + tailroom);
 	if (!skb_fragment)
 		goto err;
 
 	skb_fragment->priority = skb->priority;
 
 	/* Eat the last mtu-bytes of the skb */
-	skb_reserve(skb_fragment, header_size + ETH_HLEN);
+	skb_reserve(skb_fragment, ll_reserved + header_size);
 	skb_split(skb, skb_fragment, skb->len - fragment_size);
 
 	/* Add the header */
@@ -439,11 +443,12 @@ int batadv_frag_send_packet(struct sk_buff *skb,
 			    struct batadv_orig_node *orig_node,
 			    struct batadv_neigh_node *neigh_node)
 {
+	struct net_device *net_dev = neigh_node->if_incoming->net_dev;
 	struct batadv_priv *bat_priv;
 	struct batadv_hard_iface *primary_if = NULL;
 	struct batadv_frag_packet frag_header;
 	struct sk_buff *skb_fragment;
-	unsigned int mtu = neigh_node->if_incoming->net_dev->mtu;
+	unsigned int mtu = net_dev->mtu;
 	unsigned int header_size = sizeof(frag_header);
 	unsigned int max_fragment_size, num_fragments;
 	int ret;
@@ -503,7 +508,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
 			goto put_primary_if;
 		}
 
-		skb_fragment = batadv_frag_create(skb, &frag_header,
+		skb_fragment = batadv_frag_create(net_dev, skb, &frag_header,
 						  max_fragment_size);
 		if (!skb_fragment) {
 			ret = -ENOMEM;
commit 4ca23e2c2074465bff55ea14221175fecdf63c5f
Author: Sven Eckelmann <sven at narfation.org>
Date:   Thu Nov 26 18:15:06 2020 +0100

    batman-adv: Consider fragmentation for needed_headroom
    
    If a batman-adv packets has to be fragmented, then the original batman-adv
    packet header is not stripped away. Instead, only a new header is added in
    front of the packet after it was split.
    
    This size must be considered to avoid cost intensive reallocations during
    the transmission through the various device layers.
    
    Fixes: 7bca68c7844b ("batman-adv: Add lower layer needed_(head|tail)room to own ones")
    Reported-by: Linus Lüssing <linus.luessing at c0d3.blue>
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Signed-off-by: Simon Wunderlich <sw at simonwunderlich.de>

diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index dad99641df2a..33904595fc56 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -554,6 +554,9 @@ static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface)
 	needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
 	needed_headroom += batadv_max_header_len();
 
+	/* fragmentation headers don't strip the unicast/... header */
+	needed_headroom += sizeof(struct batadv_frag_packet);
+
 	soft_iface->needed_headroom = needed_headroom;
 	soft_iface->needed_tailroom = lower_tailroom;
 }
commit 9595930db4bb91433607441a5f26d90e9c6e34eb
Merge: d45618c28521 2be65641642e
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 27 09:39:39 2020 +1000

    Merge tag 'drm-misc-fixes-2020-11-26' of ssh://git.freedesktop.org/git/drm/drm-misc into drm-fixes
    
    A bunch of fixes for vc4 fixing some coexistence issue between wifi and
    HDMI, unsupported modes, and vblank timeouts, a fix for ast to reload
    the gamma LUT after changing the plane format and a double-free fix for
    nouveau
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Maxime Ripard <maxime at cerno.tech>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201126085450.r3i7wvj7pizsa4l6@gilmour

commit d45618c28521ba99ba1e5610ac4a5ca693c37c1e
Merge: 5929dd876bf2 487778f8d22f
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 27 09:37:01 2020 +1000

    Merge tag 'mediatek-drm-fixes-5.10' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-fixes
    
    Mediatek DRM Fixes for Linux 5.10
    
    1. Remove unused variable.
    2. Modify horizontal front/back porch byte formula.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Chun-Kuang Hu <chunkuang.hu at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201123234131.387-1-chunkuang.hu@kernel.org

commit 5929dd876bf2aa34a3071e085a60946a9ce0ab79
Merge: b51c2c67ce02 e2d3d2e904ad
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 27 09:21:10 2020 +1000

    Merge tag 'exynos-drm-fixes-for-v5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-fixes
    
    One bug fix
    . Add COMMON_CLK dependency to fix a build error below,
            /usr/bin/mips-linux-gnu-ld: drivers/gpu/drm/exynos/exynos_mixer.o: in function `mixer_bind':
            exynos_mixer.c:(.text+0x958): undefined reference to `clk_set_parent'
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Inki Dae <inki.dae at samsung.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/1606184478-23384-1-git-send-email-inki.dae@samsung.com

commit 06ceddef30a58ddb4393176c78fd4dccc14dbfde
Merge: 3a18293e4a0f d98bccf10dd0
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Thu Nov 26 22:08:01 2020 +0100

    Merge tag 'tegra-for-5.10-arm64-dt-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into arm/fixes
    
    arm64: tegra: Device tree fixes for v5.10-rc6
    
    This contains a couple of fixes to device trees. Among other things,
    this restores suspend/resume on Jetson TX2 and makes USB OTG work on
    Jetson TX1.
    
    * tag 'tegra-for-5.10-arm64-dt-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
      arm64: tegra: Fix Tegra234 VDK node names
      arm64: tegra: Wrong AON HSP reg property size
      arm64: tegra: Fix USB_VBUS_EN0 regulator on Jetson TX1
      arm64: tegra: Correct the UART for Jetson Xavier NX
      arm64: tegra: Disable the ACONNECT for Jetson TX2
    
    Link: https://lore.kernel.org/r/20201125170306.1095734-1-thierry.reding@gmail.com
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 3a18293e4a0fa75366087c683bb959a8ff55111b
Merge: dbae2736fd9f 2663b3388551
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Thu Nov 26 22:07:21 2020 +0100

    Merge tag 'soc-fsl-fix-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux into arm/fixes
    
    NXP/FSL SoC driver fix for 5.10
    
    DPAA2 DPIO driver
    - Fix non-static cpumask for irq affinity setting
    
    * tag 'soc-fsl-fix-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/leo/linux:
      soc: fsl: dpio: Get the cpumask through cpumask_of(cpu)
    
    Link: https://lore.kernel.org/r/20201125165922.15487-1-leoyang.li@nxp.com
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit dbae2736fd9f131111d3e826396b45c36d1de211
Merge: 4765df4d3a13 acfdd18591ea
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Thu Nov 26 22:06:49 2020 +0100

    Merge tag 'zynqmp-soc-fixes-for-v5.10-rc6' of https://github.com/Xilinx/linux-xlnx into arm/fixes
    
    arm64: soc: ZynqMP SoC fixes for v5.10-rc6
    
    - Fix SD dll reset issue by using proper macro
    - Fix PM feature checking for Xilinx Versal SoC
    
    * tag 'zynqmp-soc-fixes-for-v5.10-rc6' of https://github.com/Xilinx/linux-xlnx: (337 commits)
      firmware: xilinx: Use hash-table for api feature check
      firmware: xilinx: Fix SD DLL node reset issue
      Linux 5.10-rc4
      kvm: mmu: fix is_tdp_mmu_check when the TDP MMU is not in use
      afs: Fix afs_write_end() when called with copied == 0 [ver #3]
      ocfs2: initialize ip_next_orphan
      panic: don't dump stack twice on warn
      hugetlbfs: fix anon huge page migration race
      mm: memcontrol: fix missing wakeup polling thread
      kernel/watchdog: fix watchdog_allowed_mask not used warning
      reboot: fix overflow parsing reboot cpu number
      Revert "kernel/reboot.c: convert simple_strtoul to kstrtoint"
      compiler.h: fix barrier_data() on clang
      mm/gup: use unpin_user_pages() in __gup_longterm_locked()
      mm/slub: fix panic in slab_alloc_node()
      mailmap: fix entry for Dmitry Baryshkov/Eremin-Solenikov
      mm/vmscan: fix NR_ISOLATED_FILE corruption on 64-bit
      mm/compaction: stop isolation if too many pages are isolated and we have pages to migrate
      mm/compaction: count pages and stop correctly during page isolation
      drm/nouveau/kms/nv50-: Use atomic encoder callbacks everywhere
      ...
    
    Link: https://lore.kernel.org/r/fd5ab967-f3cf-95fb-7947-5477ff85f97e@monstr.eu
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 85a2c56cb4454c73f56d3099d96942e7919b292f
Merge: 4df910620beb 05b8955f4353
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 26 11:17:37 2020 -0800

    Merge tag 'pm-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
    
    Pull power management fix from Rafael Wysocki:
     "Fix a recently introduced build issue in the cpufreq SCMI driver
      (Sudeep Holla)"
    
    * tag 'pm-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
      cpufreq: scmi: Fix build for !CONFIG_COMMON_CLK

commit 82e938bd5382b322ce81e6cb8fd030987f2da022
Author: Andreas Gruenbacher <agruenba at redhat.com>
Date:   Wed Nov 25 23:37:18 2020 +0100

    gfs2: Upgrade shared glocks for atime updates
    
    Commit 20f829999c38 ("gfs2: Rework read and page fault locking") lifted
    the glock lock taking from the low-level ->readpage and ->readahead
    address space operations to the higher-level ->read_iter file and
    ->fault vm operations.  The glocks are still taken in LM_ST_SHARED mode
    only.  On filesystems mounted without the noatime option, ->read_iter
    sometimes needs to update the atime as well, though.  Right now, this
    leads to a failed locking mode assertion in gfs2_dirty_inode.
    
    Fix that by introducing a new update_time inode operation.  There, if
    the glock is held non-exclusively, upgrade it to an exclusive lock.
    
    Reported-by: Alexander Aring <aahringo at redhat.com>
    Fixes: 20f829999c38 ("gfs2: Rework read and page fault locking")
    Cc: stable at vger.kernel.org # v5.8+
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 077ccb1b3ccc..eed1a1bac6f6 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -2116,6 +2116,25 @@ loff_t gfs2_seek_hole(struct file *file, loff_t offset)
 	return vfs_setpos(file, ret, inode->i_sb->s_maxbytes);
 }
 
+static int gfs2_update_time(struct inode *inode, struct timespec64 *time,
+			    int flags)
+{
+	struct gfs2_inode *ip = GFS2_I(inode);
+	struct gfs2_glock *gl = ip->i_gl;
+	struct gfs2_holder *gh;
+	int error;
+
+	gh = gfs2_glock_is_locked_by_me(gl);
+	if (gh && !gfs2_glock_is_held_excl(gl)) {
+		gfs2_glock_dq(gh);
+		gfs2_holder_reinit(LM_ST_EXCLUSIVE, 0, gh);
+		error = gfs2_glock_nq(gh);
+		if (error)
+			return error;
+	}
+	return generic_update_time(inode, time, flags);
+}
+
 const struct inode_operations gfs2_file_iops = {
 	.permission = gfs2_permission,
 	.setattr = gfs2_setattr,
@@ -2124,6 +2143,7 @@ const struct inode_operations gfs2_file_iops = {
 	.fiemap = gfs2_fiemap,
 	.get_acl = gfs2_get_acl,
 	.set_acl = gfs2_set_acl,
+	.update_time = gfs2_update_time,
 };
 
 const struct inode_operations gfs2_dir_iops = {
@@ -2143,6 +2163,7 @@ const struct inode_operations gfs2_dir_iops = {
 	.fiemap = gfs2_fiemap,
 	.get_acl = gfs2_get_acl,
 	.set_acl = gfs2_set_acl,
+	.update_time = gfs2_update_time,
 	.atomic_open = gfs2_atomic_open,
 };
 
commit bf3a3cdcad40e5928a22ea0fd200d17fd6d6308d
Author: Qinglang Miao <miaoqinglang at huawei.com>
Date:   Fri Oct 30 09:34:24 2020 +0800

    drm/tegra: sor: Disable clocks on error in tegra_sor_init()
    
    Fix the missing clk_disable_unprepare() before return from
    tegra_sor_init() in the error handling case.
    
    Signed-off-by: Qinglang Miao <miaoqinglang at huawei.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
index 00656d8b98e2..cc2aa2308a51 100644
--- a/drivers/gpu/drm/tegra/sor.c
+++ b/drivers/gpu/drm/tegra/sor.c
@@ -3143,6 +3143,7 @@ static int tegra_sor_init(struct host1x_client *client)
 		if (err < 0) {
 			dev_err(sor->dev, "failed to deassert SOR reset: %d\n",
 				err);
+			clk_disable_unprepare(sor->clk);
 			return err;
 		}
 
@@ -3150,12 +3151,17 @@ static int tegra_sor_init(struct host1x_client *client)
 	}
 
 	err = clk_prepare_enable(sor->clk_safe);
-	if (err < 0)
+	if (err < 0) {
+		clk_disable_unprepare(sor->clk);
 		return err;
+	}
 
 	err = clk_prepare_enable(sor->clk_dp);
-	if (err < 0)
+	if (err < 0) {
+		clk_disable_unprepare(sor->clk_safe);
+		clk_disable_unprepare(sor->clk);
 		return err;
+	}
 
 	return 0;
 }
commit 4df910620bebb5cfe234af16ac8f6474b60215fd
Author: Feng Tang <feng.tang at intel.com>
Date:   Wed Nov 25 13:22:21 2020 +0800

    mm: memcg: relayout structure mem_cgroup to avoid cache interference
    
    0day reported one -22.7% regression for will-it-scale page_fault2
    case [1] on a 4 sockets 144 CPU platform, and bisected to it to be
    caused by Waiman's optimization (commit bd0b230fe1) of saving one
    'struct page_counter' space for 'struct mem_cgroup'.
    
    Initially we thought it was due to the cache alignment change introduced
    by the patch, but further debug shows that it is due to some hot data
    members ('vmstats_local', 'vmstats_percpu', 'vmstats') sit in 2 adjacent
    cacheline (2N and 2N+1 cacheline), and when adjacent cache line prefetch
    is enabled, it triggers an "extended level" of cache false sharing for
    2 adjacent cache lines.
    
    So exchange the 2 member blocks, while keeping mostly the original
    cache alignment, which can restore and even enhance the performance,
    and save 64 bytes of space for 'struct mem_cgroup' (from 2880 to 2816,
    with 0day's default RHEL-8.3 kernel config)
    
    [1]. https://lore.kernel.org/lkml/20201102091543.GM31092@shao2-debian/
    
    Fixes: bd0b230fe145 ("mm/memcg: unify swap and memsw page counters")
    Reported-by: kernel test robot <rong.a.chen at intel.com>
    Signed-off-by: Feng Tang <feng.tang at intel.com>
    Acked-by: Waiman Long <longman at redhat.com>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index a80c59af2c60..922a7f600465 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -282,20 +282,6 @@ struct mem_cgroup {
 
 	MEMCG_PADDING(_pad1_);
 
-	/*
-	 * set > 0 if pages under this cgroup are moving to other cgroup.
-	 */
-	atomic_t		moving_account;
-	struct task_struct	*move_lock_task;
-
-	/* Legacy local VM stats and events */
-	struct memcg_vmstats_percpu __percpu *vmstats_local;
-
-	/* Subtree VM stats and events (batched updates) */
-	struct memcg_vmstats_percpu __percpu *vmstats_percpu;
-
-	MEMCG_PADDING(_pad2_);
-
 	atomic_long_t		vmstats[MEMCG_NR_STAT];
 	atomic_long_t		vmevents[NR_VM_EVENT_ITEMS];
 
@@ -317,6 +303,20 @@ struct mem_cgroup {
 	struct list_head objcg_list; /* list of inherited objcgs */
 #endif
 
+	MEMCG_PADDING(_pad2_);
+
+	/*
+	 * set > 0 if pages under this cgroup are moving to other cgroup.
+	 */
+	atomic_t		moving_account;
+	struct task_struct	*move_lock_task;
+
+	/* Legacy local VM stats and events */
+	struct memcg_vmstats_percpu __percpu *vmstats_local;
+
+	/* Subtree VM stats and events (batched updates) */
+	struct memcg_vmstats_percpu __percpu *vmstats_percpu;
+
 #ifdef CONFIG_CGROUP_WRITEBACK
 	struct list_head cgwb_list;
 	struct wb_domain cgwb_domain;
commit aea656b0d05ec5b8ed5beb2f94c4dd42ea834e9d
Author: Christian König <christian.koenig at amd.com>
Date:   Thu Nov 26 13:35:08 2020 +0100

    drm/nouveau: make sure ret is initialized in nouveau_ttm_io_mem_reserve
    
    This wasn't initialized for pre NV50 hardware.
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Reported-and-Tested-by: Mark Hounschell <markh at compro.net>
    Reviewed-by: Karol Herbst <kherbst at redhat.com>
    Link: https://patchwork.freedesktop.org/series/84298/

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 2ee75646ad6f..d02f3a58adb6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -1215,8 +1215,8 @@ retry:
 			}
 
 			reg->bus.offset = handle;
-			ret = 0;
 		}
+		ret = 0;
 		break;
 	default:
 		ret = -EINVAL;
commit af60470347de6ac2b9f0cc3703975a543a3de075
Author: Pavel Begunkov <asml.silence at gmail.com>
Date:   Wed Nov 25 18:41:28 2020 +0000

    io_uring: fix files grab/cancel race
    
    When one task is in io_uring_cancel_files() and another is doing
    io_prep_async_work() a race may happen. That's because after accounting
    a request inflight in first call to io_grab_identity() it still may fail
    and go to io_identity_cow(), which migh briefly keep dangling
    work.identity and not only.
    
    Grab files last, so io_prep_async_work() won't fail if it did get into
    ->inflight_list.
    
    note: the bug shouldn't exist after making io_uring_cancel_files() not
    poking into other tasks' requests.
    
    Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index ff6deffe5aa9..1023f7b44cea 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1313,22 +1313,6 @@ static bool io_grab_identity(struct io_kiocb *req)
 			return false;
 		req->work.flags |= IO_WQ_WORK_FSIZE;
 	}
-
-	if (!(req->work.flags & IO_WQ_WORK_FILES) &&
-	    (def->work_flags & IO_WQ_WORK_FILES) &&
-	    !(req->flags & REQ_F_NO_FILE_TABLE)) {
-		if (id->files != current->files ||
-		    id->nsproxy != current->nsproxy)
-			return false;
-		atomic_inc(&id->files->count);
-		get_nsproxy(id->nsproxy);
-		req->flags |= REQ_F_INFLIGHT;
-
-		spin_lock_irq(&ctx->inflight_lock);
-		list_add(&req->inflight_entry, &ctx->inflight_list);
-		spin_unlock_irq(&ctx->inflight_lock);
-		req->work.flags |= IO_WQ_WORK_FILES;
-	}
 #ifdef CONFIG_BLK_CGROUP
 	if (!(req->work.flags & IO_WQ_WORK_BLKCG) &&
 	    (def->work_flags & IO_WQ_WORK_BLKCG)) {
@@ -1370,6 +1354,21 @@ static bool io_grab_identity(struct io_kiocb *req)
 		}
 		spin_unlock(&current->fs->lock);
 	}
+	if (!(req->work.flags & IO_WQ_WORK_FILES) &&
+	    (def->work_flags & IO_WQ_WORK_FILES) &&
+	    !(req->flags & REQ_F_NO_FILE_TABLE)) {
+		if (id->files != current->files ||
+		    id->nsproxy != current->nsproxy)
+			return false;
+		atomic_inc(&id->files->count);
+		get_nsproxy(id->nsproxy);
+		req->flags |= REQ_F_INFLIGHT;
+
+		spin_lock_irq(&ctx->inflight_lock);
+		list_add(&req->inflight_entry, &ctx->inflight_list);
+		spin_unlock_irq(&ctx->inflight_lock);
+		req->work.flags |= IO_WQ_WORK_FILES;
+	}
 
 	return true;
 }
commit 17475e104dcb74217c282781817f8f52b46130d3
Author: Yixian Liu <liuyixian at huawei.com>
Date:   Thu Nov 26 18:26:12 2020 +0800

    RDMA/hns: Bugfix for memory window mtpt configuration
    
    When a memory window is bound to a memory region, the local write access
    should be set for its mtpt table.
    
    Fixes: c7c28191408b ("RDMA/hns: Add MW support for hip08")
    Link: https://lore.kernel.org/r/1606386372-21094-1-git-send-email-liweihang@huawei.com
    Signed-off-by: Yixian Liu <liuyixian at huawei.com>
    Signed-off-by: Weihang Li <liweihang at huawei.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index ce4a476c9550..0468028ffe39 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -2936,6 +2936,7 @@ static int hns_roce_v2_mw_write_mtpt(void *mb_buf, struct hns_roce_mw *mw)
 
 	roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_R_INV_EN_S, 1);
 	roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_L_INV_EN_S, 1);
+	roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S, 1);
 
 	roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_PA_S, 0);
 	roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_MR_MW_S, 1);
commit ab6f7248cc446b85fe9e31091670ad7c4293d7fd
Author: Wenpeng Liang <liangwenpeng at huawei.com>
Date:   Thu Nov 26 17:29:37 2020 +0800

    RDMA/hns: Fix retry_cnt and rnr_cnt when querying QP
    
    The maximum number of retransmission should be returned when querying QP,
    not the value of retransmission counter.
    
    Fixes: 99fcf82521d9 ("RDMA/hns: Fix the wrong value of rnr_retry when querying qp")
    Fixes: 926a01dc000d ("RDMA/hns: Add QP operations support for hip08 SoC")
    Link: https://lore.kernel.org/r/1606382977-21431-1-git-send-email-liweihang@huawei.com
    Signed-off-by: Wenpeng Liang <liangwenpeng at huawei.com>
    Signed-off-by: Weihang Li <liweihang at huawei.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index 6d30850696c5..ce4a476c9550 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -4989,11 +4989,11 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
 					      V2_QPC_BYTE_28_AT_M,
 					      V2_QPC_BYTE_28_AT_S);
 	qp_attr->retry_cnt = roce_get_field(context.byte_212_lsn,
-					    V2_QPC_BYTE_212_RETRY_CNT_M,
-					    V2_QPC_BYTE_212_RETRY_CNT_S);
+					    V2_QPC_BYTE_212_RETRY_NUM_INIT_M,
+					    V2_QPC_BYTE_212_RETRY_NUM_INIT_S);
 	qp_attr->rnr_retry = roce_get_field(context.byte_244_rnr_rxack,
-					    V2_QPC_BYTE_244_RNR_CNT_M,
-					    V2_QPC_BYTE_244_RNR_CNT_S);
+					    V2_QPC_BYTE_244_RNR_NUM_INIT_M,
+					    V2_QPC_BYTE_244_RNR_NUM_INIT_S);
 
 done:
 	qp_attr->cur_qp_state = qp_attr->qp_state;
commit ebed7b7ca47f3aa95ebf2185a526227744616ac1
Author: Wenpeng Liang <liangwenpeng at huawei.com>
Date:   Thu Nov 26 17:26:52 2020 +0800

    RDMA/hns: Fix wrong field of SRQ number the device supports
    
    The SRQ capacity is got from the firmware, whose field should be ended at
    bit 19.
    
    Fixes: ba6bb7e97421 ("RDMA/hns: Add interfaces to get pf capabilities from firmware")
    Link: https://lore.kernel.org/r/1606382812-23636-1-git-send-email-liweihang@huawei.com
    Signed-off-by: Wenpeng Liang <liangwenpeng at huawei.com>
    Signed-off-by: Weihang Li <liweihang at huawei.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
index 29c9dd4bcbc6..be7f2fe1e883 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
@@ -1661,7 +1661,7 @@ struct hns_roce_query_pf_caps_d {
 	__le32 rsv_uars_rsv_qps;
 };
 #define V2_QUERY_PF_CAPS_D_NUM_SRQS_S 0
-#define V2_QUERY_PF_CAPS_D_NUM_SRQS_M GENMASK(20, 0)
+#define V2_QUERY_PF_CAPS_D_NUM_SRQS_M GENMASK(19, 0)
 
 #define V2_QUERY_PF_CAPS_D_RQWQE_HOP_NUM_S 20
 #define V2_QUERY_PF_CAPS_D_RQWQE_HOP_NUM_M GENMASK(21, 20)
commit d76b42e92780c3587c1a998a3a943b501c137553
Author: David Woodhouse <dwmw at amazon.co.uk>
Date:   Thu Nov 26 11:13:51 2020 +0000

    iommu/vt-d: Don't read VCCAP register unless it exists
    
    My virtual IOMMU implementation is whining that the guest is reading a
    register that doesn't exist. Only read the VCCAP_REG if the corresponding
    capability is set in ECAP_REG to indicate that it actually exists.
    
    Fixes: 3375303e8287 ("iommu/vt-d: Add custom allocator for IOASID")
    Signed-off-by: David Woodhouse <dwmw at amazon.co.uk>
    Reviewed-by: Liu Yi L <yi.l.liu at intel.com>
    Cc: stable at vger.kernel.org # v5.7+
    Acked-by: Lu Baolu <baolu.lu at linux.intel.com>
    Link: https://lore.kernel.org/r/de32b150ffaa752e0cff8571b17dfb1213fbe71c.camel@infradead.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index 11319e4dce4a..b46dbfa6d0ed 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -986,7 +986,8 @@ static int map_iommu(struct intel_iommu *iommu, u64 phys_addr)
 		warn_invalid_dmar(phys_addr, " returns all ones");
 		goto unmap;
 	}
-	iommu->vccap = dmar_readq(iommu->reg + DMAR_VCCAP_REG);
+	if (ecap_vcs(iommu->ecap))
+		iommu->vccap = dmar_readq(iommu->reg + DMAR_VCCAP_REG);
 
 	/* the registers might be more than one page */
 	map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 4d9b298002f0..30979c2c7082 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -1833,7 +1833,7 @@ static void free_dmar_iommu(struct intel_iommu *iommu)
 		if (ecap_prs(iommu->ecap))
 			intel_svm_finish_prq(iommu);
 	}
-	if (ecap_vcs(iommu->ecap) && vccap_pasid(iommu->vccap))
+	if (vccap_pasid(iommu->vccap))
 		ioasid_unregister_allocator(&iommu->pasid_allocator);
 
 #endif
@@ -3212,7 +3212,7 @@ static void register_pasid_allocator(struct intel_iommu *iommu)
 	 * is active. All vIOMMU allocators will eventually be calling the same
 	 * host allocator.
 	 */
-	if (!ecap_vcs(iommu->ecap) || !vccap_pasid(iommu->vccap))
+	if (!vccap_pasid(iommu->vccap))
 		return;
 
 	pr_info("Register custom PASID allocator\n");
commit c9aa128080cbce92f8715a9328f88d8ca3134279
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Tue Nov 24 12:04:54 2020 +0100

    platform/x86: touchscreen_dmi: Add info for the Irbis TW118 tablet
    
    Add touchscreen info for the Irbis TW118 tablet.
    
    Reported-and-tested-by: russianneuromancer <russianneuromancer at ya.ru>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201124110454.114286-1-hdegoede@redhat.com

diff --git a/drivers/platform/x86/touchscreen_dmi.c b/drivers/platform/x86/touchscreen_dmi.c
index 26cbf7cc8129..5783139d0a11 100644
--- a/drivers/platform/x86/touchscreen_dmi.c
+++ b/drivers/platform/x86/touchscreen_dmi.c
@@ -295,6 +295,21 @@ static const struct ts_dmi_data irbis_tw90_data = {
 	.properties	= irbis_tw90_props,
 };
 
+static const struct property_entry irbis_tw118_props[] = {
+	PROPERTY_ENTRY_U32("touchscreen-min-x", 20),
+	PROPERTY_ENTRY_U32("touchscreen-min-y", 30),
+	PROPERTY_ENTRY_U32("touchscreen-size-x", 1960),
+	PROPERTY_ENTRY_U32("touchscreen-size-y", 1510),
+	PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-irbis-tw118.fw"),
+	PROPERTY_ENTRY_U32("silead,max-fingers", 10),
+	{ }
+};
+
+static const struct ts_dmi_data irbis_tw118_data = {
+	.acpi_name	= "MSSL1680:00",
+	.properties	= irbis_tw118_props,
+};
+
 static const struct property_entry itworks_tw891_props[] = {
 	PROPERTY_ENTRY_U32("touchscreen-min-x", 1),
 	PROPERTY_ENTRY_U32("touchscreen-min-y", 5),
@@ -953,6 +968,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "TW90"),
 		},
 	},
+	{
+		/* Irbis TW118 */
+		.driver_data = (void *)&irbis_tw118_data,
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "IRBIS"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "TW118"),
+		},
+	},
 	{
 		/* I.T.Works TW891 */
 		.driver_data = (void *)&itworks_tw891_data,
commit 0f511edc6ac12f1ccf1c6c2d4412f5ed7ba426a6
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Thu Oct 15 21:49:49 2020 +0200

    platform/x86: touchscreen_dmi: Add info for the Predia Basic tablet
    
    Add touchscreen info for the Predia Basic tablet.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Acked-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Link: https://lore.kernel.org/r/20201015194949.50566-1-hdegoede@redhat.com

diff --git a/drivers/platform/x86/touchscreen_dmi.c b/drivers/platform/x86/touchscreen_dmi.c
index dda60f89c951..26cbf7cc8129 100644
--- a/drivers/platform/x86/touchscreen_dmi.c
+++ b/drivers/platform/x86/touchscreen_dmi.c
@@ -623,6 +623,23 @@ static const struct ts_dmi_data pov_mobii_wintab_p1006w_v10_data = {
 	.properties	= pov_mobii_wintab_p1006w_v10_props,
 };
 
+static const struct property_entry predia_basic_props[] = {
+	PROPERTY_ENTRY_U32("touchscreen-min-x", 3),
+	PROPERTY_ENTRY_U32("touchscreen-min-y", 10),
+	PROPERTY_ENTRY_U32("touchscreen-size-x", 1728),
+	PROPERTY_ENTRY_U32("touchscreen-size-y", 1144),
+	PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
+	PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-predia-basic.fw"),
+	PROPERTY_ENTRY_U32("silead,max-fingers", 10),
+	PROPERTY_ENTRY_BOOL("silead,home-button"),
+	{ }
+};
+
+static const struct ts_dmi_data predia_basic_data = {
+	.acpi_name	= "MSSL1680:00",
+	.properties	= predia_basic_props,
+};
+
 static const struct property_entry schneider_sct101ctm_props[] = {
 	PROPERTY_ENTRY_U32("touchscreen-size-x", 1715),
 	PROPERTY_ENTRY_U32("touchscreen-size-y", 1140),
@@ -1109,6 +1126,16 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
 			DMI_MATCH(DMI_BIOS_DATE, "10/24/2014"),
 		},
 	},
+	{
+		/* Predia Basic tablet) */
+		.driver_data = (void *)&predia_basic_data,
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),
+			/* Above matches are too generic, add bios-version match */
+			DMI_MATCH(DMI_BIOS_VERSION, "Mx.WT107.KUBNGEA"),
+		},
+	},
 	{
 		/* Point of View mobii wintab p800w (v2.1) */
 		.driver_data = (void *)&pov_mobii_wintab_p800w_v21_data,
commit 8b205d3e1bf52ab31cdd5c55f87c87a227793d84
Author: Max Verevkin <me at maxverevkin.tk>
Date:   Tue Nov 24 15:16:52 2020 +0200

    platform/x86: intel-vbtn: Support for tablet mode on HP Pavilion 13 x360 PC
    
    The Pavilion 13 x360 PC has a chassis-type which does not indicate it is
    a convertible, while it is actually a convertible. Add it to the
    dmi_switches_allow_list.
    
    Signed-off-by: Max Verevkin <me at maxverevkin.tk>
    Link: https://lore.kernel.org/r/20201124131652.11165-1-me@maxverevkin.tk
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/platform/x86/intel-vbtn.c b/drivers/platform/x86/intel-vbtn.c
index f5901b0b07cd..0419c8001fe3 100644
--- a/drivers/platform/x86/intel-vbtn.c
+++ b/drivers/platform/x86/intel-vbtn.c
@@ -206,6 +206,12 @@ static const struct dmi_system_id dmi_switches_allow_list[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Stream x360 Convertible PC 11"),
 		},
 	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion 13 x360 PC"),
+		},
+	},
 	{} /* Array terminator */
 };
 
commit 2a72c46ac4d665614faa25e267c3fb27fb729ed7
Author: Kaixu Xia <kaixuxia at tencent.com>
Date:   Sun Nov 22 13:49:37 2020 +0800

    platform/x86: toshiba_acpi: Fix the wrong variable assignment
    
    The commit 78429e55e4057 ("platform/x86: toshiba_acpi: Clean up
    variable declaration") cleans up variable declaration in
    video_proc_write(). Seems it does the variable assignment in the
    wrong place, this results in dead code and changes the source code
    logic. Fix it by doing the assignment at the beginning of the funciton.
    
    Fixes: 78429e55e4057 ("platform/x86: toshiba_acpi: Clean up variable declaration")
    Reported-by: Tosk Robot <tencent_os_robot at tencent.com>
    Signed-off-by: Kaixu Xia <kaixuxia at tencent.com>
    Link: https://lore.kernel.org/r/1606024177-16481-1-git-send-email-kaixuxia@tencent.com
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
index e557d757c647..fa7232ad8c39 100644
--- a/drivers/platform/x86/toshiba_acpi.c
+++ b/drivers/platform/x86/toshiba_acpi.c
@@ -1478,7 +1478,7 @@ static ssize_t video_proc_write(struct file *file, const char __user *buf,
 	struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
 	char *buffer;
 	char *cmd;
-	int lcd_out, crt_out, tv_out;
+	int lcd_out = -1, crt_out = -1, tv_out = -1;
 	int remain = count;
 	int value;
 	int ret;
@@ -1510,7 +1510,6 @@ static ssize_t video_proc_write(struct file *file, const char __user *buf,
 
 	kfree(cmd);
 
-	lcd_out = crt_out = tv_out = -1;
 	ret = get_video_status(dev, &video_out);
 	if (!ret) {
 		unsigned int new_video_out = video_out;
commit 9e7a005ad56aa7d6ea5830c5ffcc60bf35de380b
Author: Timo Witte <timo.witte at gmail.com>
Date:   Tue Aug 4 02:14:23 2020 +0200

    platform/x86: acer-wmi: add automatic keyboard background light toggle key as KEY_LIGHTS_TOGGLE
    
    Got a dmesg message on my AMD Renoir based Acer laptop:
    "acer_wmi: Unknown key number - 0x84" when toggling keyboard
    background light
    
    Signed-off-by: Timo Witte <timo.witte at gmail.com>
    Reviewed-by: "Lee, Chun-Yi" <jlee at suse.com>
    Link: https://lore.kernel.org/r/20200804001423.36778-1-timo.witte@gmail.com
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
index 49f4b73be513..5592a929b593 100644
--- a/drivers/platform/x86/acer-wmi.c
+++ b/drivers/platform/x86/acer-wmi.c
@@ -111,6 +111,7 @@ static const struct key_entry acer_wmi_keymap[] __initconst = {
 	{KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} },	/* Display Switch */
 	{KE_IGNORE, 0x81, {KEY_SLEEP} },
 	{KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} },	/* Touch Pad Toggle */
+	{KE_IGNORE, 0x84, {KEY_KBDILLUMTOGGLE} }, /* Automatic Keyboard background light toggle */
 	{KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} },
 	{KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} },
 	{KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} },
commit 80a8c3185f5047dc7438ed226b72385bf93b4071
Author: Matthias Maier <tamiko at 43-1.org>
Date:   Wed Nov 25 18:04:16 2020 -0600

    platform/x86: thinkpad_acpi: Whitelist P15 firmware for dual fan control
    
    This commit enables dual fan control for the following new Lenovo
    models: P15, P15v.
    
    Signed-off-by: Matthias Maier <tamiko at 43-1.org>
    Link: https://lore.kernel.org/r/20201126000416.2459645-2-tamiko-ibm-acpi-devel@43-1.org
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 0778458ead83..c404706379d9 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -8785,6 +8785,7 @@ static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
 	TPACPI_Q_LNV3('N', '2', 'E', TPACPI_FAN_2CTL),	/* P1 / X1 Extreme (1st gen) */
 	TPACPI_Q_LNV3('N', '2', 'O', TPACPI_FAN_2CTL),	/* P1 / X1 Extreme (2nd gen) */
 	TPACPI_Q_LNV3('N', '2', 'V', TPACPI_FAN_2CTL),	/* P1 / X1 Extreme (3nd gen) */
+	TPACPI_Q_LNV3('N', '3', '0', TPACPI_FAN_2CTL),	/* P15 (1st gen) / P15v (1st gen) */
 };
 
 static int __init fan_init(struct ibm_init_struct *iibm)
commit e40cc1b476d60f22628741e53cf3446a29e6e6b9
Author: Benjamin Berg <bberg at redhat.com>
Date:   Mon Nov 23 14:21:57 2020 +0100

    platform/x86: thinkpad_acpi: Send tablet mode switch at wakeup time
    
    The lid state may change while the machine is suspended. As such, we may
    need to re-check the state at wake-up time (at least when waking up from
    hibernation).
    Add the appropriate call to the resume handler in order to sync the
    SW_TABLET_MODE switch state with the hardware state.
    
    Fixes: dda3ec0aa631 ("platform/x86: thinkpad_acpi: Implement tablet mode using GMMS method")
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=210269
    Signed-off-by: Benjamin Berg <bberg at redhat.com>
    Acked-by: Henrique de Moraes Holschuh <hnh at hmh.eng.br>
    Link: https://lore.kernel.org/r/20201123132157.866303-1-benjamin@sipsolutions.net
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 36d9594bca7f..0778458ead83 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -4235,6 +4235,7 @@ static void hotkey_resume(void)
 		pr_err("error while attempting to reset the event firmware interface\n");
 
 	tpacpi_send_radiosw_update();
+	tpacpi_input_send_tabletsw();
 	hotkey_tablet_mode_notify_change();
 	hotkey_wakeup_reason_notify_change();
 	hotkey_wakeup_hotunplug_complete_notify_change();
commit c986a7024916c92a775fc8d853fba3cae1d5fde4
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Nov 9 11:35:50 2020 +0100

    platform/x86: thinkpad_acpi: Add BAT1 is primary battery quirk for Thinkpad Yoga 11e 4th gen
    
    The Thinkpad Yoga 11e 4th gen with the N3450 / Celeron CPU only has
    one battery which is named BAT1 instead of the expected BAT0, add a
    quirk for this. This fixes not being able to set the charging tresholds
    on this model; and this alsoe fixes the following errors in dmesg:
    
    ACPI: \_SB_.PCI0.LPCB.EC__.HKEY: BCTG evaluated but flagged as error
    thinkpad_acpi: Error probing battery 2
    battery: extension failed to load: ThinkPad Battery Extension
    battery: extension unregistered: ThinkPad Battery Extension
    
    Note that the added quirk is for the "R0K" BIOS versions which are
    used on the Thinkpad Yoga 11e 4th gen's with a Celeron CPU, there
    is a separate "R0L" BIOS for the i3/i5 based versions. This may also
    need the same quirk, but if that really is necessary is unknown.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201109103550.16265-1-hdegoede@redhat.com

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index e479c844c2bc..36d9594bca7f 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -9711,6 +9711,7 @@ static const struct tpacpi_quirk battery_quirk_table[] __initconst = {
 	TPACPI_Q_LNV3('R', '0', 'B', true), /* Thinkpad 11e gen 3 */
 	TPACPI_Q_LNV3('R', '0', 'C', true), /* Thinkpad 13 */
 	TPACPI_Q_LNV3('R', '0', 'J', true), /* Thinkpad 13 gen 2 */
+	TPACPI_Q_LNV3('R', '0', 'K', true), /* Thinkpad 11e gen 4 celeron BIOS */
 };
 
 static int __init tpacpi_battery_init(struct ibm_init_struct *ibm)
commit f2eae1888cf22590c38764b8fa3c989c0283870e
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Fri Nov 6 15:01:30 2020 +0100

    platform/x86: thinkpad_acpi: Do not report SW_TABLET_MODE on Yoga 11e
    
    The Yoga 11e series has 2 accelerometers described by a BOSC0200 ACPI node.
    This setup relies on a Windows service which reads both accelerometers and
    then calculates the angle between the 2 halves to determine laptop / tent /
    tablet mode and then reports the calculated mode back to the EC by calling
    special ACPI methods on the BOSC0200 node.
    
    The bmc150 iio driver does not support this (it involves double
    calculations requiring sqrt and arccos so this really needs to be done
    in userspace), as a result of this on the Yoga 11e the thinkpad_acpi
    code always reports SW_TABLET_MODE=0, starting with GNOME 3.38 reporting
    SW_TABLET_MODE=0 causes GNOME to:
    
    1. Not show the onscreen keyboard when a text-input field is focussed
       with the touchscreen.
    2. Disable accelerometer based auto display-rotation.
    
    This makes sense when in laptop-mode but not when in tablet-mode. But
    since for the Yoga 11e the thinkpad_acpi code always reports
    SW_TABLET_MODE=0, GNOME does not know when the device is in tablet-mode.
    
    Stop reporting the broken (always 0) SW_TABLET_MODE on Yoga 11e models
    to fix this.
    
    Note there are plans for userspace to support 360 degree hinges style
    2-in-1s with 2 accelerometers and figure out the mode by itself, see:
    https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/issues/216
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201106140130.46820-1-hdegoede@redhat.com

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 4d64ba29132b..e479c844c2bc 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -3218,7 +3218,14 @@ static int hotkey_init_tablet_mode(void)
 
 		in_tablet_mode = hotkey_gmms_get_tablet_mode(res,
 							     &has_tablet_mode);
-		if (has_tablet_mode)
+		/*
+		 * The Yoga 11e series has 2 accelerometers described by a
+		 * BOSC0200 ACPI node. This setup relies on a Windows service
+		 * which calls special ACPI methods on this node to report
+		 * the laptop/tent/tablet mode to the EC. The bmc150 iio driver
+		 * does not support this, so skip the hotkey on these models.
+		 */
+		if (has_tablet_mode && !acpi_dev_present("BOSC0200", "1", -1))
 			tp_features.hotkey_tablet = TP_HOTKEY_TABLET_USES_GMMS;
 		type = "GMMS";
 	} else if (acpi_evalf(hkey_handle, &res, "MHKG", "qd")) {
commit 15d89c9f6f4a186ade7aefbe77e7ede9746b6c47
Author: Iakov 'Jake' Kirilenko <jake.kirilenko at gmail.com>
Date:   Thu Nov 5 18:25:56 2020 +0300

    platform/x86: thinkpad_acpi: add P1 gen3 second fan support
    
    Tested on my P1 gen3, works fine with `thinkfan`. Since thinkpad_acpi fan
    control is off by default, it is safe to add 2nd fan control for brave
    overclockers
    
    Signed-off-by: Iakov 'Jake' Kirilenko <jake.kirilenko at gmail.com>
    Link: https://lore.kernel.org/r/20201105152556.34073-1-jake.kirilenko@gmail.com
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index e3810675090a..4d64ba29132b 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -8776,6 +8776,7 @@ static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
 	TPACPI_Q_LNV3('N', '2', 'C', TPACPI_FAN_2CTL),	/* P52 / P72 */
 	TPACPI_Q_LNV3('N', '2', 'E', TPACPI_FAN_2CTL),	/* P1 / X1 Extreme (1st gen) */
 	TPACPI_Q_LNV3('N', '2', 'O', TPACPI_FAN_2CTL),	/* P1 / X1 Extreme (2nd gen) */
+	TPACPI_Q_LNV3('N', '2', 'V', TPACPI_FAN_2CTL),	/* P1 / X1 Extreme (3nd gen) */
 };
 
 static int __init fan_init(struct ibm_init_struct *iibm)
commit 01b0f0eae0812e80efeee4ee17687e5386335e08
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Thu Nov 26 20:25:30 2020 +1000

    powerpc/64s: Trim offlined CPUs from mm_cpumasks
    
    When offlining a CPU, powerpc/64s does not flush TLBs, rather it just
    leaves the CPU set in mm_cpumasks, so it continues to receive TLBIEs
    to manage its TLBs.
    
    However the exit_flush_lazy_tlbs() function expects that after
    returning, all CPUs (except self) have flushed TLBs for that mm, in
    which case TLBIEL can be used for this flush. This breaks for offline
    CPUs because they don't get the IPI to flush their TLB. This can lead
    to stale translations.
    
    Fix this by clearing the CPU from mm_cpumasks, then flushing all TLBs
    before going offline.
    
    These offlined CPU bits stuck in the cpumask also prevents the cpumask
    from being trimmed back to local mode, which means continual broadcast
    IPIs or TLBIEs are needed for TLB flushing. This patch prevents that
    situation too.
    
    A cast of many were involved in working this out, but in particular
    Milton, Aneesh, Paul made key discoveries.
    
    Fixes: 0cef77c7798a7 ("powerpc/64s/radix: flush remote CPUs out of single-threaded mm_cpumask")
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Reviewed-by: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
    Debugged-by: Milton Miller <miltonm at us.ibm.com>
    Debugged-by: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
    Debugged-by: Paul Mackerras <paulus at samba.org>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201126102530.691335-5-npiggin@gmail.com

diff --git a/arch/powerpc/include/asm/book3s/64/mmu.h b/arch/powerpc/include/asm/book3s/64/mmu.h
index e0b52940e43c..750918451dd2 100644
--- a/arch/powerpc/include/asm/book3s/64/mmu.h
+++ b/arch/powerpc/include/asm/book3s/64/mmu.h
@@ -242,6 +242,18 @@ extern void radix_init_pseries(void);
 static inline void radix_init_pseries(void) { };
 #endif
 
+#ifdef CONFIG_HOTPLUG_CPU
+#define arch_clear_mm_cpumask_cpu(cpu, mm)				\
+	do {								\
+		if (cpumask_test_cpu(cpu, mm_cpumask(mm))) {		\
+			atomic_dec(&(mm)->context.active_cpus);		\
+			cpumask_clear_cpu(cpu, mm_cpumask(mm));		\
+		}							\
+	} while (0)
+
+void cleanup_cpu_mmu_context(void);
+#endif
+
 static inline int get_user_context(mm_context_t *ctx, unsigned long ea)
 {
 	int index = ea >> MAX_EA_BITS_PER_CONTEXT;
diff --git a/arch/powerpc/mm/book3s64/mmu_context.c b/arch/powerpc/mm/book3s64/mmu_context.c
index 1c54821de7bf..0c8557220ae2 100644
--- a/arch/powerpc/mm/book3s64/mmu_context.c
+++ b/arch/powerpc/mm/book3s64/mmu_context.c
@@ -17,6 +17,7 @@
 #include <linux/export.h>
 #include <linux/gfp.h>
 #include <linux/slab.h>
+#include <linux/cpu.h>
 
 #include <asm/mmu_context.h>
 #include <asm/pgalloc.h>
@@ -307,3 +308,22 @@ void radix__switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
 	isync();
 }
 #endif
+
+/**
+ * cleanup_cpu_mmu_context - Clean up MMU details for this CPU (newly offlined)
+ *
+ * This clears the CPU from mm_cpumask for all processes, and then flushes the
+ * local TLB to ensure TLB coherency in case the CPU is onlined again.
+ *
+ * KVM guest translations are not necessarily flushed here. If KVM started
+ * using mm_cpumask or the Linux APIs which do, this would have to be resolved.
+ */
+#ifdef CONFIG_HOTPLUG_CPU
+void cleanup_cpu_mmu_context(void)
+{
+	int cpu = smp_processor_id();
+
+	clear_tasks_mm_cpumask(cpu);
+	tlbiel_all();
+}
+#endif
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
index 74ebe664b016..adae2a6712e1 100644
--- a/arch/powerpc/platforms/powermac/smp.c
+++ b/arch/powerpc/platforms/powermac/smp.c
@@ -911,6 +911,8 @@ static int smp_core99_cpu_disable(void)
 
 	mpic_cpu_set_priority(0xf);
 
+	cleanup_cpu_mmu_context();
+
 	return 0;
 }
 
diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c
index 54c4ba45c7ce..cbb67813cd5d 100644
--- a/arch/powerpc/platforms/powernv/smp.c
+++ b/arch/powerpc/platforms/powernv/smp.c
@@ -143,6 +143,9 @@ static int pnv_smp_cpu_disable(void)
 		xive_smp_disable_cpu();
 	else
 		xics_migrate_irqs_away();
+
+	cleanup_cpu_mmu_context();
+
 	return 0;
 }
 
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index f2837e33bf5d..a02012f1b04a 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -90,6 +90,9 @@ static int pseries_cpu_disable(void)
 		xive_smp_disable_cpu();
 	else
 		xics_migrate_irqs_away();
+
+	cleanup_cpu_mmu_context();
+
 	return 0;
 }
 
commit 8ff00399b153440c1c83e20c43020385b416415b
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Thu Nov 26 20:25:29 2020 +1000

    kernel/cpu: add arch override for clear_tasks_mm_cpumask() mm handling
    
    powerpc/64s keeps a counter in the mm which counts bits set in
    mm_cpumask as well as other things. This means it can't use generic code
    to clear bits out of the mask and doesn't adjust the arch specific
    counter.
    
    Add an arch override that allows powerpc/64s to use
    clear_tasks_mm_cpumask().
    
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Reviewed-by: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
    Acked-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201126102530.691335-4-npiggin@gmail.com

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 6ff2578ecf17..2b8d7a5db383 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -815,6 +815,10 @@ void __init cpuhp_threads_init(void)
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
+#ifndef arch_clear_mm_cpumask_cpu
+#define arch_clear_mm_cpumask_cpu(cpu, mm) cpumask_clear_cpu(cpu, mm_cpumask(mm))
+#endif
+
 /**
  * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU
  * @cpu: a CPU id
@@ -850,7 +854,7 @@ void clear_tasks_mm_cpumask(int cpu)
 		t = find_lock_task_mm(p);
 		if (!t)
 			continue;
-		cpumask_clear_cpu(cpu, mm_cpumask(t->mm));
+		arch_clear_mm_cpumask_cpu(cpu, t->mm);
 		task_unlock(t);
 	}
 	rcu_read_unlock();
commit c0b27c517acf8a2b359dd373a7e7e88b01a8308e
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Thu Nov 26 20:25:28 2020 +1000

    powerpc/64s/pseries: Fix hash tlbiel_all_isa300 for guest kernels
    
    tlbiel_all() can not be usable in !HVMODE when running hash presently,
    remove HV privileged flushes when running in guest to make it usable.
    
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Reviewed-by: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201126102530.691335-3-npiggin@gmail.com

diff --git a/arch/powerpc/mm/book3s64/hash_native.c b/arch/powerpc/mm/book3s64/hash_native.c
index 97fa42d7027e..52e170bd95ae 100644
--- a/arch/powerpc/mm/book3s64/hash_native.c
+++ b/arch/powerpc/mm/book3s64/hash_native.c
@@ -92,16 +92,15 @@ static void tlbiel_all_isa300(unsigned int num_sets, unsigned int is)
 	asm volatile("ptesync": : :"memory");
 
 	/*
-	 * Flush the first set of the TLB, and any caching of partition table
-	 * entries. Then flush the remaining sets of the TLB. Hash mode uses
-	 * partition scoped TLB translations.
+	 * Flush the partition table cache if this is HV mode.
 	 */
-	tlbiel_hash_set_isa300(0, is, 0, 2, 0);
-	for (set = 1; set < num_sets; set++)
-		tlbiel_hash_set_isa300(set, is, 0, 0, 0);
+	if (early_cpu_has_feature(CPU_FTR_HVMODE))
+		tlbiel_hash_set_isa300(0, is, 0, 2, 0);
 
 	/*
-	 * Now invalidate the process table cache.
+	 * Now invalidate the process table cache. UPRT=0 HPT modes (what
+	 * current hardware implements) do not use the process table, but
+	 * add the flushes anyway.
 	 *
 	 * From ISA v3.0B p. 1078:
 	 *     The following forms are invalid.
@@ -110,6 +109,14 @@ static void tlbiel_all_isa300(unsigned int num_sets, unsigned int is)
 	 */
 	tlbiel_hash_set_isa300(0, is, 0, 2, 1);
 
+	/*
+	 * Then flush the sets of the TLB proper. Hash mode uses
+	 * partition scoped TLB translations, which may be flushed
+	 * in !HV mode.
+	 */
+	for (set = 0; set < num_sets; set++)
+		tlbiel_hash_set_isa300(set, is, 0, 0, 0);
+
 	ppc_after_tlbiel_barrier();
 
 	asm volatile(PPC_ISA_3_0_INVALIDATE_ERAT "; isync" : : :"memory");
commit 5844cc25fd121074de7895181a2fa1ce100a0fdd
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Thu Nov 26 20:25:27 2020 +1000

    powerpc/64s: Fix hash ISA v3.0 TLBIEL instruction generation
    
    A typo has the R field of the instruction assigned by lucky dip a la
    register allocator.
    
    Fixes: d4748276ae14c ("powerpc/64s: Improve local TLB flush for boot and MCE on POWER9")
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Reviewed-by: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201126102530.691335-2-npiggin@gmail.com

diff --git a/arch/powerpc/mm/book3s64/hash_native.c b/arch/powerpc/mm/book3s64/hash_native.c
index 0203cdf48c54..97fa42d7027e 100644
--- a/arch/powerpc/mm/book3s64/hash_native.c
+++ b/arch/powerpc/mm/book3s64/hash_native.c
@@ -68,7 +68,7 @@ static __always_inline void tlbiel_hash_set_isa300(unsigned int set, unsigned in
 	rs = ((unsigned long)pid << PPC_BITLSHIFT(31));
 
 	asm volatile(PPC_TLBIEL(%0, %1, %2, %3, %4)
-		     : : "r"(rb), "r"(rs), "i"(ric), "i"(prs), "r"(r)
+		     : : "r"(rb), "r"(rs), "i"(ric), "i"(prs), "i"(r)
 		     : "memory");
 }
 
commit aa4cb898b80a28a610e26d1513e6dd42d995c225
Author: Shuming Fan <shumingf at realtek.com>
Date:   Thu Nov 26 17:27:59 2020 +0800

    ASoC: rt5682: change SAR voltage threshold
    
    To fix errors in some 4 poles headset detection cases,
    this patch adjusts the voltage threshold for mic detection.
    
    Signed-off-by: Shuming Fan <shumingf at realtek.com>
    Link: https://lore.kernel.org/r/20201126092759.9427-1-shumingf@realtek.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c
index a9acce7b6cca..d9878173ff89 100644
--- a/sound/soc/codecs/rt5682.c
+++ b/sound/soc/codecs/rt5682.c
@@ -43,6 +43,7 @@ static const struct reg_sequence patch_list[] = {
 	{RT5682_DAC_ADC_DIG_VOL1, 0xa020},
 	{RT5682_I2C_CTRL, 0x000f},
 	{RT5682_PLL2_INTERNAL, 0x8266},
+	{RT5682_SAR_IL_CMD_3, 0x8365},
 };
 
 void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
commit c70582bbf299986234ecf06d128454b4b38ecd2e
Author: Daniel Abrecht <public at danielabrecht.ch>
Date:   Sun Nov 8 21:00:01 2020 +0000

    drm: mxsfb: Implement .format_mod_supported
    
    This will make sure applications which use the IN_FORMATS blob
    to figure out which modifiers they can use will pick up the
    linear modifier which is needed by mxsfb. Such applications
    will not work otherwise if an incompatible implicit modifier
    ends up being selected.
    
    Before commit ae1ed0093281 ("drm: mxsfb: Stop using DRM simple
    display pipeline helper"), the DRM simple display pipeline
    helper took care of this.
    
    Signed-off-by: Daniel Abrecht <public at danielabrecht.ch>
    Fixes: ae1ed0093281 ("drm: mxsfb: Stop using DRM simple display pipeline helper")
    Reviewed-by: Stefan Agner <stefan at agner.ch>
    Signed-off-by: Stefan Agner <stefan at agner.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/2a99ffffc2378209307e0992a6e97e70@nodmarc.danielabrecht.ch

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
index 4d556532281a..9e1224d54729 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
@@ -485,6 +485,13 @@ static void mxsfb_plane_overlay_atomic_update(struct drm_plane *plane,
 	writel(ctrl, mxsfb->base + LCDC_AS_CTRL);
 }
 
+static bool mxsfb_format_mod_supported(struct drm_plane *plane,
+				       uint32_t format,
+				       uint64_t modifier)
+{
+	return modifier == DRM_FORMAT_MOD_LINEAR;
+}
+
 static const struct drm_plane_helper_funcs mxsfb_plane_primary_helper_funcs = {
 	.prepare_fb = drm_gem_fb_prepare_fb,
 	.atomic_check = mxsfb_plane_atomic_check,
@@ -498,6 +505,7 @@ static const struct drm_plane_helper_funcs mxsfb_plane_overlay_helper_funcs = {
 };
 
 static const struct drm_plane_funcs mxsfb_plane_funcs = {
+	.format_mod_supported	= mxsfb_format_mod_supported,
 	.update_plane		= drm_atomic_helper_update_plane,
 	.disable_plane		= drm_atomic_helper_disable_plane,
 	.destroy		= drm_plane_cleanup,
commit 777ee15e88616c275ba59db88d3ece20eae0ca9a
Author: Lucas Stach <l.stach at pengutronix.de>
Date:   Fri Nov 20 22:13:06 2020 +0100

    drm: mxsfb: fix fence synchronization
    
    The conversion away from the simple display pipeline helper missed
    to convert the prepare_fb plane callback, so no fences are attached to
    the atomic state, breaking synchronization with other devices. Fix
    this by plugging in the drm_gem_fb_prepare_fb helper function.
    
    Fixes: ae1ed0093281 ("drm: mxsfb: Stop using DRM simple display pipeline helper")
    Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
    Reviewed-by: Stefan Agner <stefan at agner.ch>
    Signed-off-by: Stefan Agner <stefan at agner.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120211306.325841-1-l.stach@pengutronix.de

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
index b721b8b262ce..4d556532281a 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
@@ -22,6 +22,7 @@
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_plane.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_vblank.h>
@@ -485,11 +486,13 @@ static void mxsfb_plane_overlay_atomic_update(struct drm_plane *plane,
 }
 
 static const struct drm_plane_helper_funcs mxsfb_plane_primary_helper_funcs = {
+	.prepare_fb = drm_gem_fb_prepare_fb,
 	.atomic_check = mxsfb_plane_atomic_check,
 	.atomic_update = mxsfb_plane_primary_atomic_update,
 };
 
 static const struct drm_plane_helper_funcs mxsfb_plane_overlay_helper_funcs = {
+	.prepare_fb = drm_gem_fb_prepare_fb,
 	.atomic_check = mxsfb_plane_atomic_check,
 	.atomic_update = mxsfb_plane_overlay_atomic_update,
 };
commit 1a1c436bad340cea1cff815dd2cbb2c4f6af8d43
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Sat Nov 21 20:14:19 2020 +0100

    can: mcp251xfd: mcp251xfd_probe(): bail out if no IRQ was given
    
    This patch add a check to the mcp251xfd_probe() function to bail out and give
    the user a proper error message if no IRQ is specified. Otherwise the driver
    will probe just fine but ifup will fail with a meaningless "RTNETLINK answers:
    Invalid argument" error message.
    
    Link: https://lore.kernel.org/r/20201123113522.3820052-1-mkl@pengutronix.de
    Reported-by: Niels Petter <petter at ka-long.de>
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
index 9c215f7c5f81..8a39be076e14 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
@@ -2738,6 +2738,10 @@ static int mcp251xfd_probe(struct spi_device *spi)
 	u32 freq;
 	int err;
 
+	if (!spi->irq)
+		return dev_err_probe(&spi->dev, -ENXIO,
+				     "No IRQ specified (maybe node \"interrupts-extended\" in DT missing)!\n");
+
 	rx_int = devm_gpiod_get_optional(&spi->dev, "microchip,rx-int",
 					 GPIOD_IN);
 	if (PTR_ERR(rx_int) == -EPROBE_DEFER)
commit 4ba1cb39fce4464151517a37ce0ac0a1a3f580d6
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Thu Nov 19 14:03:17 2020 +0100

    can: gs_usb: fix endianess problem with candleLight firmware
    
    The firmware on the original USB2CAN by Geschwister Schneider Technologie
    Entwicklungs- und Vertriebs UG exchanges all data between the host and the
    device in host byte order. This is done with the struct
    gs_host_config::byte_order member, which is sent first to indicate the desired
    byte order.
    
    The widely used open source firmware candleLight doesn't support this feature
    and exchanges the data in little endian byte order. This breaks if a device
    with candleLight firmware is used on big endianess systems.
    
    To fix this problem, all u32 (but not the struct gs_host_frame::echo_id, which
    is a transparent cookie) are converted to __le32.
    
    Cc: Maximilian Schneider <max at schneidersoft.net>
    Cc: Hubert Denkmair <hubert at denkmair.de>
    Reported-by: Michael Rausch <mr at netadair.de>
    Link: https://lore.kernel.org/r/b58aace7-61f3-6df7-c6df-69fee2c66906@netadair.de
    Tested-by: Oleksij Rempel <o.rempel at pengutronix.de>
    Fixes: d08e973a77d1 ("can: gs_usb: Added support for the GS_USB CAN devices")
    Link: https://lore.kernel.org/r/20201120103818.3386964-1-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
index 3005157059ca..018ca3b057a3 100644
--- a/drivers/net/can/usb/gs_usb.c
+++ b/drivers/net/can/usb/gs_usb.c
@@ -63,21 +63,27 @@ enum gs_can_identify_mode {
 };
 
 /* data types passed between host and device */
+
+/* The firmware on the original USB2CAN by Geschwister Schneider
+ * Technologie Entwicklungs- und Vertriebs UG exchanges all data
+ * between the host and the device in host byte order. This is done
+ * with the struct gs_host_config::byte_order member, which is sent
+ * first to indicate the desired byte order.
+ *
+ * The widely used open source firmware candleLight doesn't support
+ * this feature and exchanges the data in little endian byte order.
+ */
 struct gs_host_config {
-	u32 byte_order;
+	__le32 byte_order;
 } __packed;
-/* All data exchanged between host and device is exchanged in host byte order,
- * thanks to the struct gs_host_config byte_order member, which is sent first
- * to indicate the desired byte order.
- */
 
 struct gs_device_config {
 	u8 reserved1;
 	u8 reserved2;
 	u8 reserved3;
 	u8 icount;
-	u32 sw_version;
-	u32 hw_version;
+	__le32 sw_version;
+	__le32 hw_version;
 } __packed;
 
 #define GS_CAN_MODE_NORMAL               0
@@ -87,26 +93,26 @@ struct gs_device_config {
 #define GS_CAN_MODE_ONE_SHOT             BIT(3)
 
 struct gs_device_mode {
-	u32 mode;
-	u32 flags;
+	__le32 mode;
+	__le32 flags;
 } __packed;
 
 struct gs_device_state {
-	u32 state;
-	u32 rxerr;
-	u32 txerr;
+	__le32 state;
+	__le32 rxerr;
+	__le32 txerr;
 } __packed;
 
 struct gs_device_bittiming {
-	u32 prop_seg;
-	u32 phase_seg1;
-	u32 phase_seg2;
-	u32 sjw;
-	u32 brp;
+	__le32 prop_seg;
+	__le32 phase_seg1;
+	__le32 phase_seg2;
+	__le32 sjw;
+	__le32 brp;
 } __packed;
 
 struct gs_identify_mode {
-	u32 mode;
+	__le32 mode;
 } __packed;
 
 #define GS_CAN_FEATURE_LISTEN_ONLY      BIT(0)
@@ -117,23 +123,23 @@ struct gs_identify_mode {
 #define GS_CAN_FEATURE_IDENTIFY         BIT(5)
 
 struct gs_device_bt_const {
-	u32 feature;
-	u32 fclk_can;
-	u32 tseg1_min;
-	u32 tseg1_max;
-	u32 tseg2_min;
-	u32 tseg2_max;
-	u32 sjw_max;
-	u32 brp_min;
-	u32 brp_max;
-	u32 brp_inc;
+	__le32 feature;
+	__le32 fclk_can;
+	__le32 tseg1_min;
+	__le32 tseg1_max;
+	__le32 tseg2_min;
+	__le32 tseg2_max;
+	__le32 sjw_max;
+	__le32 brp_min;
+	__le32 brp_max;
+	__le32 brp_inc;
 } __packed;
 
 #define GS_CAN_FLAG_OVERFLOW 1
 
 struct gs_host_frame {
 	u32 echo_id;
-	u32 can_id;
+	__le32 can_id;
 
 	u8 can_dlc;
 	u8 channel;
@@ -329,13 +335,13 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
 		if (!skb)
 			return;
 
-		cf->can_id = hf->can_id;
+		cf->can_id = le32_to_cpu(hf->can_id);
 
 		cf->can_dlc = get_can_dlc(hf->can_dlc);
 		memcpy(cf->data, hf->data, 8);
 
 		/* ERROR frames tell us information about the controller */
-		if (hf->can_id & CAN_ERR_FLAG)
+		if (le32_to_cpu(hf->can_id) & CAN_ERR_FLAG)
 			gs_update_state(dev, cf);
 
 		netdev->stats.rx_packets++;
@@ -418,11 +424,11 @@ static int gs_usb_set_bittiming(struct net_device *netdev)
 	if (!dbt)
 		return -ENOMEM;
 
-	dbt->prop_seg = bt->prop_seg;
-	dbt->phase_seg1 = bt->phase_seg1;
-	dbt->phase_seg2 = bt->phase_seg2;
-	dbt->sjw = bt->sjw;
-	dbt->brp = bt->brp;
+	dbt->prop_seg = cpu_to_le32(bt->prop_seg);
+	dbt->phase_seg1 = cpu_to_le32(bt->phase_seg1);
+	dbt->phase_seg2 = cpu_to_le32(bt->phase_seg2);
+	dbt->sjw = cpu_to_le32(bt->sjw);
+	dbt->brp = cpu_to_le32(bt->brp);
 
 	/* request bit timings */
 	rc = usb_control_msg(interface_to_usbdev(intf),
@@ -503,7 +509,7 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
 
 	cf = (struct can_frame *)skb->data;
 
-	hf->can_id = cf->can_id;
+	hf->can_id = cpu_to_le32(cf->can_id);
 	hf->can_dlc = cf->can_dlc;
 	memcpy(hf->data, cf->data, cf->can_dlc);
 
@@ -573,6 +579,7 @@ static int gs_can_open(struct net_device *netdev)
 	int rc, i;
 	struct gs_device_mode *dm;
 	u32 ctrlmode;
+	u32 flags = 0;
 
 	rc = open_candev(netdev);
 	if (rc)
@@ -640,24 +647,24 @@ static int gs_can_open(struct net_device *netdev)
 
 	/* flags */
 	ctrlmode = dev->can.ctrlmode;
-	dm->flags = 0;
 
 	if (ctrlmode & CAN_CTRLMODE_LOOPBACK)
-		dm->flags |= GS_CAN_MODE_LOOP_BACK;
+		flags |= GS_CAN_MODE_LOOP_BACK;
 	else if (ctrlmode & CAN_CTRLMODE_LISTENONLY)
-		dm->flags |= GS_CAN_MODE_LISTEN_ONLY;
+		flags |= GS_CAN_MODE_LISTEN_ONLY;
 
 	/* Controller is not allowed to retry TX
 	 * this mode is unavailable on atmels uc3c hardware
 	 */
 	if (ctrlmode & CAN_CTRLMODE_ONE_SHOT)
-		dm->flags |= GS_CAN_MODE_ONE_SHOT;
+		flags |= GS_CAN_MODE_ONE_SHOT;
 
 	if (ctrlmode & CAN_CTRLMODE_3_SAMPLES)
-		dm->flags |= GS_CAN_MODE_TRIPLE_SAMPLE;
+		flags |= GS_CAN_MODE_TRIPLE_SAMPLE;
 
 	/* finally start device */
-	dm->mode = GS_CAN_MODE_START;
+	dm->mode = cpu_to_le32(GS_CAN_MODE_START);
+	dm->flags = cpu_to_le32(flags);
 	rc = usb_control_msg(interface_to_usbdev(dev->iface),
 			     usb_sndctrlpipe(interface_to_usbdev(dev->iface), 0),
 			     GS_USB_BREQ_MODE,
@@ -737,9 +744,9 @@ static int gs_usb_set_identify(struct net_device *netdev, bool do_identify)
 		return -ENOMEM;
 
 	if (do_identify)
-		imode->mode = GS_CAN_IDENTIFY_ON;
+		imode->mode = cpu_to_le32(GS_CAN_IDENTIFY_ON);
 	else
-		imode->mode = GS_CAN_IDENTIFY_OFF;
+		imode->mode = cpu_to_le32(GS_CAN_IDENTIFY_OFF);
 
 	rc = usb_control_msg(interface_to_usbdev(dev->iface),
 			     usb_sndctrlpipe(interface_to_usbdev(dev->iface),
@@ -790,6 +797,7 @@ static struct gs_can *gs_make_candev(unsigned int channel,
 	struct net_device *netdev;
 	int rc;
 	struct gs_device_bt_const *bt_const;
+	u32 feature;
 
 	bt_const = kmalloc(sizeof(*bt_const), GFP_KERNEL);
 	if (!bt_const)
@@ -830,14 +838,14 @@ static struct gs_can *gs_make_candev(unsigned int channel,
 
 	/* dev setup */
 	strcpy(dev->bt_const.name, "gs_usb");
-	dev->bt_const.tseg1_min = bt_const->tseg1_min;
-	dev->bt_const.tseg1_max = bt_const->tseg1_max;
-	dev->bt_const.tseg2_min = bt_const->tseg2_min;
-	dev->bt_const.tseg2_max = bt_const->tseg2_max;
-	dev->bt_const.sjw_max = bt_const->sjw_max;
-	dev->bt_const.brp_min = bt_const->brp_min;
-	dev->bt_const.brp_max = bt_const->brp_max;
-	dev->bt_const.brp_inc = bt_const->brp_inc;
+	dev->bt_const.tseg1_min = le32_to_cpu(bt_const->tseg1_min);
+	dev->bt_const.tseg1_max = le32_to_cpu(bt_const->tseg1_max);
+	dev->bt_const.tseg2_min = le32_to_cpu(bt_const->tseg2_min);
+	dev->bt_const.tseg2_max = le32_to_cpu(bt_const->tseg2_max);
+	dev->bt_const.sjw_max = le32_to_cpu(bt_const->sjw_max);
+	dev->bt_const.brp_min = le32_to_cpu(bt_const->brp_min);
+	dev->bt_const.brp_max = le32_to_cpu(bt_const->brp_max);
+	dev->bt_const.brp_inc = le32_to_cpu(bt_const->brp_inc);
 
 	dev->udev = interface_to_usbdev(intf);
 	dev->iface = intf;
@@ -854,28 +862,29 @@ static struct gs_can *gs_make_candev(unsigned int channel,
 
 	/* can setup */
 	dev->can.state = CAN_STATE_STOPPED;
-	dev->can.clock.freq = bt_const->fclk_can;
+	dev->can.clock.freq = le32_to_cpu(bt_const->fclk_can);
 	dev->can.bittiming_const = &dev->bt_const;
 	dev->can.do_set_bittiming = gs_usb_set_bittiming;
 
 	dev->can.ctrlmode_supported = 0;
 
-	if (bt_const->feature & GS_CAN_FEATURE_LISTEN_ONLY)
+	feature = le32_to_cpu(bt_const->feature);
+	if (feature & GS_CAN_FEATURE_LISTEN_ONLY)
 		dev->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY;
 
-	if (bt_const->feature & GS_CAN_FEATURE_LOOP_BACK)
+	if (feature & GS_CAN_FEATURE_LOOP_BACK)
 		dev->can.ctrlmode_supported |= CAN_CTRLMODE_LOOPBACK;
 
-	if (bt_const->feature & GS_CAN_FEATURE_TRIPLE_SAMPLE)
+	if (feature & GS_CAN_FEATURE_TRIPLE_SAMPLE)
 		dev->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
 
-	if (bt_const->feature & GS_CAN_FEATURE_ONE_SHOT)
+	if (feature & GS_CAN_FEATURE_ONE_SHOT)
 		dev->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT;
 
 	SET_NETDEV_DEV(netdev, &intf->dev);
 
-	if (dconf->sw_version > 1)
-		if (bt_const->feature & GS_CAN_FEATURE_IDENTIFY)
+	if (le32_to_cpu(dconf->sw_version) > 1)
+		if (feature & GS_CAN_FEATURE_IDENTIFY)
 			netdev->ethtool_ops = &gs_usb_ethtool_ops;
 
 	kfree(bt_const);
@@ -910,7 +919,7 @@ static int gs_usb_probe(struct usb_interface *intf,
 	if (!hconf)
 		return -ENOMEM;
 
-	hconf->byte_order = 0x0000beef;
+	hconf->byte_order = cpu_to_le32(0x0000beef);
 
 	/* send host config */
 	rc = usb_control_msg(interface_to_usbdev(intf),
commit 05faf1559de52465f1e753e31883aa294e6179c1
Author: Laurentiu Palcu <laurentiu.palcu at oss.nxp.com>
Date:   Thu Nov 5 16:50:18 2020 +0200

    drm/imx/dcss: allow using nearest neighbor interpolation scaling
    
    This patch adds support for using NN interpolation scaling by setting the
    SCALING_FILTER plane property to 1. Otherwise, the default method is used.
    
    Signed-off-by: Laurentiu Palcu <laurentiu.palcu at oss.nxp.com>
    Reviewed-by: Lucas Stach <l.stach at pengutronix.de>
    Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105145018.27255-1-laurentiu.palcu@oss.nxp.com

diff --git a/drivers/gpu/drm/imx/dcss/dcss-dev.h b/drivers/gpu/drm/imx/dcss/dcss-dev.h
index c642ae17837f..1e582270c6ea 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-dev.h
+++ b/drivers/gpu/drm/imx/dcss/dcss-dev.h
@@ -7,6 +7,7 @@
 #define __DCSS_PRV_H__
 
 #include <drm/drm_fourcc.h>
+#include <drm/drm_plane.h>
 #include <linux/io.h>
 #include <video/videomode.h>
 
@@ -165,6 +166,8 @@ void dcss_ss_sync_set(struct dcss_ss *ss, struct videomode *vm,
 /* SCALER */
 int dcss_scaler_init(struct dcss_dev *dcss, unsigned long scaler_base);
 void dcss_scaler_exit(struct dcss_scaler *scl);
+void dcss_scaler_set_filter(struct dcss_scaler *scl, int ch_num,
+			    enum drm_scaling_filter scaling_filter);
 void dcss_scaler_setup(struct dcss_scaler *scl, int ch_num,
 		       const struct drm_format_info *format,
 		       int src_xres, int src_yres, int dst_xres, int dst_yres,
diff --git a/drivers/gpu/drm/imx/dcss/dcss-plane.c b/drivers/gpu/drm/imx/dcss/dcss-plane.c
index 5db093aada2f..03ba88f7f995 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-plane.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-plane.c
@@ -257,7 +257,8 @@ static bool dcss_plane_needs_setup(struct drm_plane_state *state,
 	       state->src_h  != old_state->src_h  ||
 	       fb->format->format != old_fb->format->format ||
 	       fb->modifier  != old_fb->modifier ||
-	       state->rotation != old_state->rotation;
+	       state->rotation != old_state->rotation ||
+	       state->scaling_filter != old_state->scaling_filter;
 }
 
 static void dcss_plane_atomic_update(struct drm_plane *plane,
@@ -313,6 +314,9 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
 	is_rotation_90_or_270 = state->rotation & (DRM_MODE_ROTATE_90 |
 						   DRM_MODE_ROTATE_270);
 
+	dcss_scaler_set_filter(dcss->scaler, dcss_plane->ch_num,
+			       state->scaling_filter);
+
 	dcss_scaler_setup(dcss->scaler, dcss_plane->ch_num,
 			  state->fb->format,
 			  is_rotation_90_or_270 ? src_h : src_w,
@@ -394,6 +398,10 @@ struct dcss_plane *dcss_plane_init(struct drm_device *drm,
 	if (ret)
 		return ERR_PTR(ret);
 
+	drm_plane_create_scaling_filter_property(&dcss_plane->base,
+					BIT(DRM_SCALING_FILTER_DEFAULT) |
+					BIT(DRM_SCALING_FILTER_NEAREST_NEIGHBOR));
+
 	drm_plane_create_rotation_property(&dcss_plane->base,
 					   DRM_MODE_ROTATE_0,
 					   DRM_MODE_ROTATE_0   |
diff --git a/drivers/gpu/drm/imx/dcss/dcss-scaler.c b/drivers/gpu/drm/imx/dcss/dcss-scaler.c
index cd21905de580..47852b9dd5ea 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-scaler.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-scaler.c
@@ -77,6 +77,8 @@ struct dcss_scaler_ch {
 
 	u32 c_vstart;
 	u32 c_hstart;
+
+	bool use_nn_interpolation;
 };
 
 struct dcss_scaler {
@@ -243,6 +245,17 @@ static void dcss_scaler_gaussian_filter(int fc_q, bool use_5_taps,
 	}
 }
 
+static void dcss_scaler_nearest_neighbor_filter(bool use_5_taps,
+						int coef[][PSC_NUM_TAPS])
+{
+	int i, j;
+
+	for (i = 0; i < PSC_STORED_PHASES; i++)
+		for (j = 0; j < PSC_NUM_TAPS; j++)
+			coef[i][j] = j == PSC_NUM_TAPS >> 1 ?
+						(1 << PSC_COEFF_PRECISION) : 0;
+}
+
 /**
  * dcss_scaler_filter_design() - Compute filter coefficients using
  *				 Gaussian filter.
@@ -253,7 +266,8 @@ static void dcss_scaler_gaussian_filter(int fc_q, bool use_5_taps,
  */
 static void dcss_scaler_filter_design(int src_length, int dst_length,
 				      bool use_5_taps, bool phase0_identity,
-				      int coef[][PSC_NUM_TAPS])
+				      int coef[][PSC_NUM_TAPS],
+				      bool nn_interpolation)
 {
 	int fc_q;
 
@@ -263,8 +277,11 @@ static void dcss_scaler_filter_design(int src_length, int dst_length,
 	else
 		fc_q = div_q(dst_length, src_length * PSC_NUM_PHASES);
 
-	/* compute gaussian filter coefficients */
-	dcss_scaler_gaussian_filter(fc_q, use_5_taps, phase0_identity, coef);
+	if (nn_interpolation)
+		dcss_scaler_nearest_neighbor_filter(use_5_taps, coef);
+	else
+		/* compute gaussian filter coefficients */
+		dcss_scaler_gaussian_filter(fc_q, use_5_taps, phase0_identity, coef);
 }
 
 static void dcss_scaler_write(struct dcss_scaler_ch *ch, u32 val, u32 ofs)
@@ -653,12 +670,14 @@ static void dcss_scaler_yuv_coef_set(struct dcss_scaler_ch *ch,
 
 	/* horizontal luma */
 	dcss_scaler_filter_design(src_xres, dst_xres, false,
-				  src_xres == dst_xres, coef);
+				  src_xres == dst_xres, coef,
+				  ch->use_nn_interpolation);
 	dcss_scaler_program_7_coef_set(ch, DCSS_SCALER_COEF_HLUM, coef);
 
 	/* vertical luma */
 	dcss_scaler_filter_design(src_yres, dst_yres, program_5_taps,
-				  src_yres == dst_yres, coef);
+				  src_yres == dst_yres, coef,
+				  ch->use_nn_interpolation);
 
 	if (program_5_taps)
 		dcss_scaler_program_5_coef_set(ch, DCSS_SCALER_COEF_VLUM, coef);
@@ -678,14 +697,14 @@ static void dcss_scaler_yuv_coef_set(struct dcss_scaler_ch *ch,
 	/* horizontal chroma */
 	dcss_scaler_filter_design(src_xres, dst_xres, false,
 				  (src_xres == dst_xres) && (ch->c_hstart == 0),
-				  coef);
+				  coef, ch->use_nn_interpolation);
 
 	dcss_scaler_program_7_coef_set(ch, DCSS_SCALER_COEF_HCHR, coef);
 
 	/* vertical chroma */
 	dcss_scaler_filter_design(src_yres, dst_yres, program_5_taps,
 				  (src_yres == dst_yres) && (ch->c_vstart == 0),
-				  coef);
+				  coef, ch->use_nn_interpolation);
 	if (program_5_taps)
 		dcss_scaler_program_5_coef_set(ch, DCSS_SCALER_COEF_VCHR, coef);
 	else
@@ -700,12 +719,14 @@ static void dcss_scaler_rgb_coef_set(struct dcss_scaler_ch *ch,
 
 	/* horizontal RGB */
 	dcss_scaler_filter_design(src_xres, dst_xres, false,
-				  src_xres == dst_xres, coef);
+				  src_xres == dst_xres, coef,
+				  ch->use_nn_interpolation);
 	dcss_scaler_program_7_coef_set(ch, DCSS_SCALER_COEF_HLUM, coef);
 
 	/* vertical RGB */
 	dcss_scaler_filter_design(src_yres, dst_yres, false,
-				  src_yres == dst_yres, coef);
+				  src_yres == dst_yres, coef,
+				  ch->use_nn_interpolation);
 	dcss_scaler_program_7_coef_set(ch, DCSS_SCALER_COEF_VLUM, coef);
 }
 
@@ -751,6 +772,14 @@ static void dcss_scaler_set_rgb10_order(struct dcss_scaler_ch *ch,
 	ch->sdata_ctrl |= a2r10g10b10_format << A2R10G10B10_FORMAT_POS;
 }
 
+void dcss_scaler_set_filter(struct dcss_scaler *scl, int ch_num,
+			    enum drm_scaling_filter scaling_filter)
+{
+	struct dcss_scaler_ch *ch = &scl->ch[ch_num];
+
+	ch->use_nn_interpolation = scaling_filter == DRM_SCALING_FILTER_NEAREST_NEIGHBOR;
+}
+
 void dcss_scaler_setup(struct dcss_scaler *scl, int ch_num,
 		       const struct drm_format_info *format,
 		       int src_xres, int src_yres, int dst_xres, int dst_yres,
commit 594486b52c8e77378a9b3769be1f2080b891a922
Author: Laurentiu Palcu <laurentiu.palcu at oss.nxp.com>
Date:   Thu Nov 5 16:01:26 2020 +0200

    drm/imx/dcss: fix coccinelle warning
    
    This small patch fixes a warning that I got while running coccinelle:
    
      CHECK   drivers/gpu/drm/imx/dcss/dcss-plane.c
      drivers/gpu/drm/imx/dcss/dcss-plane.c:107:21-23: WARNING !A || A && B is equivalent to !A || B
    
    Fixes: 9021c317b770 ("drm/imx: Add initial support for DCSS on iMX8MQ")
    Signed-off-by: Laurentiu Palcu <laurentiu.palcu at oss.nxp.com>
    Reviewed-by: Lucas Stach <l.stach at pengutronix.de>
    Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105140127.25249-3-laurentiu.palcu@oss.nxp.com

diff --git a/drivers/gpu/drm/imx/dcss/dcss-plane.c b/drivers/gpu/drm/imx/dcss/dcss-plane.c
index 46a188dd02ad..5db093aada2f 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-plane.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-plane.c
@@ -103,8 +103,7 @@ static bool dcss_plane_can_rotate(const struct drm_format_info *format,
 				  bool mod_present, u64 modifier,
 				  unsigned int rotation)
 {
-	bool linear_format = !mod_present ||
-			     (mod_present && modifier == DRM_FORMAT_MOD_LINEAR);
+	bool linear_format = !mod_present || modifier == DRM_FORMAT_MOD_LINEAR;
 	u32 supported_rotation = DRM_MODE_ROTATE_0;
 
 	if (!format->is_yuv && linear_format)
commit 59cb403f38099506ddbe05fd09126f3f0890860b
Author: Laurentiu Palcu <laurentiu.palcu at oss.nxp.com>
Date:   Thu Nov 5 16:01:25 2020 +0200

    drm/imx/dcss: fix rotations for Vivante tiled formats
    
    DCSS supports 90/180/270 degree rotations for Vivante tiled and super-tiled
    formats. Unfortunately, with the current code, they didn't work properly.
    
    This simple patch makes the rotations work by fixing the way the scaler is set
    up for 90/270 degree rotations. In this particular case, the source width and
    height need to be swapped since DPR is sending the buffer to scaler already
    rotated.
    
    Also, make sure to allow full rotations for DRM_FORMAT_MOD_VIVANTE_SUPER_TILED.
    
    Fixes: 9021c317b770 ("drm/imx: Add initial support for DCSS on iMX8MQ")
    Signed-off-by: Laurentiu Palcu <laurentiu.palcu at oss.nxp.com>
    Reviewed-by: Lucas Stach <l.stach at pengutronix.de>
    Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105140127.25249-2-laurentiu.palcu@oss.nxp.com

diff --git a/drivers/gpu/drm/imx/dcss/dcss-plane.c b/drivers/gpu/drm/imx/dcss/dcss-plane.c
index e13652e3a115..46a188dd02ad 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-plane.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-plane.c
@@ -111,7 +111,8 @@ static bool dcss_plane_can_rotate(const struct drm_format_info *format,
 		supported_rotation = DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
 				     DRM_MODE_REFLECT_MASK;
 	else if (!format->is_yuv &&
-		 modifier == DRM_FORMAT_MOD_VIVANTE_TILED)
+		 (modifier == DRM_FORMAT_MOD_VIVANTE_TILED ||
+		  modifier == DRM_FORMAT_MOD_VIVANTE_SUPER_TILED))
 		supported_rotation = DRM_MODE_ROTATE_MASK |
 				     DRM_MODE_REFLECT_MASK;
 	else if (format->is_yuv && linear_format &&
@@ -272,6 +273,7 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
 	u32 src_w, src_h, dst_w, dst_h;
 	struct drm_rect src, dst;
 	bool enable = true;
+	bool is_rotation_90_or_270;
 
 	if (!fb || !state->crtc || !state->visible)
 		return;
@@ -309,8 +311,13 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
 
 	dcss_plane_atomic_set_base(dcss_plane);
 
+	is_rotation_90_or_270 = state->rotation & (DRM_MODE_ROTATE_90 |
+						   DRM_MODE_ROTATE_270);
+
 	dcss_scaler_setup(dcss->scaler, dcss_plane->ch_num,
-			  state->fb->format, src_w, src_h,
+			  state->fb->format,
+			  is_rotation_90_or_270 ? src_h : src_w,
+			  is_rotation_90_or_270 ? src_w : src_h,
 			  dst_w, dst_h,
 			  drm_mode_vrefresh(&crtc_state->mode));
 
commit c7acb6b9c07b4b75dffadc3b6466b1b43b3fda21
Author: Mathieu Poirier <mathieu.poirier at linaro.org>
Date:   Wed Nov 25 15:35:19 2020 -0700

    MAINTAINERS: Adding help for coresight subsystem
    
    With the steady stream of new features coming into the subsystem
    it has been clear for some time now that help is needed.
    
    Suzuki and Leo have worked extensively on various parts of the
    project and have agreed to help.
    
    While at it add the new location for the coresight git tree.
    
    Acked-by: Leo Yan <leo.yan at linaro.org>
    Acked-by : Suzuki K Poulose <suzuki.poulose at arm.com>
    Signed-off-by: Mathieu Poirier <mathieu.poirier at linaro.org>
    Link: https://lore.kernel.org/r/20201125223519.734388-1-mathieu.poirier@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index e451dcce054f..b9c823c08b57 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1723,11 +1723,13 @@ F:	arch/arm/mach-ep93xx/micro9.c
 
 ARM/CORESIGHT FRAMEWORK AND DRIVERS
 M:	Mathieu Poirier <mathieu.poirier at linaro.org>
-R:	Suzuki K Poulose <suzuki.poulose at arm.com>
+M:	Suzuki K Poulose <suzuki.poulose at arm.com>
 R:	Mike Leach <mike.leach at linaro.org>
+R:	Leo Yan <leo.yan at linaro.org>
 L:	coresight at lists.linaro.org (moderated for non-subscribers)
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
+T:	git git://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git
 F:	Documentation/ABI/testing/sysfs-bus-coresight-devices-*
 F:	Documentation/devicetree/bindings/arm/coresight-cpu-debug.txt
 F:	Documentation/devicetree/bindings/arm/coresight-cti.yaml
commit b51c2c67ce028c64a863599dc6b96c382daa0658
Merge: 5ead67bd540e 280ffdb6ddb5
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Nov 26 17:58:04 2020 +1000

    Merge tag 'drm-intel-fixes-2020-11-25' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
    
    - Fix Perf/OA workaround register corruption (Lionel)
    - Correct a comment statement in GVT (Yan)
    - Fix GT enable/disable iterrupts, including a race condition that prevented GPU to go idle (Chris)
    - Free stale request on destroying the virtual engine (Chris)
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201126010623.GA827684@intel.com

commit 5ead67bd540ebad55145e34c8983c2d5cf1efdf0
Merge: 030c5b52d4c1 60734bd54679
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Nov 26 17:31:47 2020 +1000

    Merge tag 'amd-drm-fixes-5.10-2020-11-25' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
    
    amd-drm-fixes-5.10-2020-11-25:
    
    amdgpu:
    - Runtime pm fix
    - SI UVD suspend/resume fix
    - HDCP fix for headless cards
    - Sienna Cichlid golden register update
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    From: Alex Deucher <alexdeucher at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201125151145.4263-1-alexander.deucher@amd.com

commit 44f28934af141149959c4e6495bb60c1903bda32
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 11:27:42 2020 +0100

    media: vidtv.rst: add kernel-doc markups
    
    Fix existing issues at the kernel-doc markups and add them to
    the vidtv.rst file.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/Documentation/driver-api/media/drivers/vidtv.rst b/Documentation/driver-api/media/drivers/vidtv.rst
index 52c201798d78..673bdff919ea 100644
--- a/Documentation/driver-api/media/drivers/vidtv.rst
+++ b/Documentation/driver-api/media/drivers/vidtv.rst
@@ -484,3 +484,30 @@ A nice addition is to simulate some noise when the signal quality is bad by:
 - Updating the error statistics accordingly (e.g. BER, etc).
 
 - Simulating some noise in the encoded data.
+
+Functions and structs used within vidtv
+---------------------------------------
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_bridge.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_channel.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_demod.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_encoder.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_mux.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_pes.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_psi.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_s302m.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_ts.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_tuner.h
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_common.c
+
+.. kernel-doc:: drivers/media/test-drivers/vidtv/vidtv_tuner.c
diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.h b/drivers/media/test-drivers/vidtv/vidtv_bridge.h
index a85068bffd0f..2528adaee27d 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.h
@@ -34,7 +34,7 @@
  * @adapter: Represents a DTV adapter. See 'dvb_register_adapter'.
  * @demux: The demux used by the dvb_dmx_swfilter_packets() call.
  * @dmx_dev: Represents a demux device.
- * @dmx_frontend: The frontends associated with the demux.
+ * @dmx_fe: The frontends associated with the demux.
  * @i2c_adapter: The i2c_adapter associated with the bridge driver.
  * @i2c_client_demod: The i2c_clients associated with the demodulator modules.
  * @i2c_client_tuner: The i2c_clients associated with the tuner modules.
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.h b/drivers/media/test-drivers/vidtv/vidtv_channel.h
index 4bc2a4c0980d..fff2e501d375 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.h
@@ -39,6 +39,7 @@
  * Every stream will have its corresponding encoder polled to produce TS packets
  * These packets may be interleaved by the mux and then delivered to the bridge
  *
+ * @name: name of the channel
  * @transport_stream_id: a number to identify the TS, chosen at will.
  * @service: A _single_ service. Will be concatenated into the SDT.
  * @program_num: The link between PAT, PMT and SDT.
diff --git a/drivers/media/test-drivers/vidtv/vidtv_demod.h b/drivers/media/test-drivers/vidtv/vidtv_demod.h
index ab84044f33ba..2b8404661348 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_demod.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_demod.h
@@ -20,6 +20,9 @@
  * modulation and fec_inner
  * @modulation: see enum fe_modulation
  * @fec: see enum fe_fec_rate
+ * @cnr_ok: S/N threshold to consider the signal as OK. Below that, there's
+ *          a chance of losing sync.
+ * @cnr_good: S/N threshold to consider the signal strong.
  *
  * This struct matches values for 'good' and 'ok' CNRs given the combination
  * of modulation and fec_inner in use. We might simulate some noise if the
@@ -53,13 +56,8 @@ struct vidtv_demod_config {
  * struct vidtv_demod_state - The demodulator state
  * @frontend: The frontend structure allocated by the demod.
  * @config: The config used to init the demod.
- * @poll_snr: The task responsible for periodically checking the simulated
- * signal quality, eventually dropping or reacquiring the TS lock.
  * @status: the demod status.
- * @cold_start: Whether the demod has not been init yet.
- * @poll_snr_thread_running: Whether the task responsible for periodically
- * checking the simulated signal quality is running.
- * @poll_snr_thread_restart: Whether we should restart the poll_snr task.
+ * @tuner_cnr: current S/N ratio for the signal carrier
  */
 struct vidtv_demod_state {
 	struct dvb_frontend frontend;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_encoder.h b/drivers/media/test-drivers/vidtv/vidtv_encoder.h
index 0ac5b1e3f666..50e3cf4eb4eb 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_encoder.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_encoder.h
@@ -103,14 +103,16 @@ enum musical_notes {
  * @encoder_buf_sz: The encoder buffer size, in bytes
  * @encoder_buf_offset: Our byte position in the encoder buffer.
  * @sample_count: How many samples we have encoded in total.
+ * @access_units: encoder payload units, used for clock references
  * @src_buf: The source of raw data to be encoded, encoder might set a
  * default if null.
+ * @src_buf_sz: size of @src_buf.
  * @src_buf_offset: Our position in the source buffer.
  * @is_video_encoder: Whether this a video encoder (as opposed to audio)
  * @ctx: Encoder-specific state.
  * @stream_id: Examples: Audio streams (0xc0-0xdf), Video streams
  * (0xe0-0xef).
- * @es_id: The TS PID to use for the elementary stream in this encoder.
+ * @es_pid: The TS PID to use for the elementary stream in this encoder.
  * @encode: Prepare enough AUs for the given amount of time.
  * @clear: Clear the encoder output.
  * @sync: Attempt to synchronize with this encoder.
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.h b/drivers/media/test-drivers/vidtv/vidtv_mux.h
index e186094c4fb7..ad82eb72b841 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.h
@@ -59,6 +59,7 @@ struct vidtv_mux_timing {
  * @pat: The PAT in use by the muxer.
  * @pmt_secs: The PMT sections in use by the muxer. One for each program in the PAT.
  * @sdt: The SDT in use by the muxer.
+ * @nit: The NIT in use by the muxer.
  * @eit: the EIT in use by the muxer.
  */
 struct vidtv_mux_si {
@@ -86,8 +87,10 @@ struct vidtv_mux_pid_ctx {
 
 /**
  * struct vidtv_mux - A muxer abstraction loosely based in libavcodec/mpegtsenc.c
- * @mux_rate_kbytes_sec: The bit rate for the TS, in kbytes.
+ * @fe: The frontend structure allocated by the muxer.
+ * @dev: pointer to struct device.
  * @timing: Keeps track of timing related information.
+ * @mux_rate_kbytes_sec: The bit rate for the TS, in kbytes.
  * @pid_ctx: A hash table to keep track of per-PID metadata.
  * @on_new_packets_available_cb: A callback to inform of new TS packets ready.
  * @mux_buf: A pointer to a buffer for this muxer. TS packets are stored there
diff --git a/drivers/media/test-drivers/vidtv/vidtv_pes.h b/drivers/media/test-drivers/vidtv/vidtv_pes.h
index 99f45056adc2..963c59155e72 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_pes.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_pes.h
@@ -113,8 +113,10 @@ struct pes_header_write_args {
  * @dest_buf_sz: The size of the dest_buffer
  * @pid: The PID to use for the TS packets.
  * @continuity_counter: Incremented on every new TS packet.
- * @n_pes_h_s_bytes: Padding bytes. Might be used by an encoder if needed, gets
+ * @wrote_pes_header: Flag to indicate that the PES header was written
+ * @n_stuffing_bytes: Padding bytes. Might be used by an encoder if needed, gets
  * discarded by the decoder.
+ * @pcr: counter driven by a 27Mhz clock.
  */
 struct pes_ts_header_write_args {
 	void *dest_buf;
@@ -145,6 +147,7 @@ struct pes_ts_header_write_args {
  * @dts: DTS value to send.
  * @n_pes_h_s_bytes: Padding bytes. Might be used by an encoder if needed, gets
  * discarded by the decoder.
+ * @pcr: counter driven by a 27Mhz clock.
  */
 struct pes_write_args {
 	void *dest_buf;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 7a5901f11a37..340c9fb8d583 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -43,7 +43,7 @@ enum vidtv_psi_stream_types {
 	STREAM_PRIVATE_DATA = 0x06, /* see ISO/IEC 13818-1 2000 p. 48 */
 };
 
-/**
+/*
  * struct vidtv_psi_desc - A generic PSI descriptor type.
  * The descriptor length is an 8-bit field specifying the total number of bytes of the data portion
  * of the descriptor following the byte defining the value of this field.
@@ -55,7 +55,7 @@ struct vidtv_psi_desc {
 	u8 data[];
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_desc_service - Service descriptor.
  * See ETSI EN 300 468 section 6.2.33.
  */
@@ -71,7 +71,7 @@ struct vidtv_psi_desc_service {
 	char *service_name;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_desc_registration - A registration descriptor.
  * See ISO/IEC 13818-1 section 2.6.8
  */
@@ -93,7 +93,7 @@ struct vidtv_psi_desc_registration {
 	u8 additional_identification_info[];
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_desc_network_name - A network name descriptor
  * see ETSI EN 300 468 v1.15.1 section 6.2.27
  */
@@ -110,7 +110,7 @@ struct vidtv_psi_desc_service_list_entry {
 	struct vidtv_psi_desc_service_list_entry *next;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_desc_service_list - A service list descriptor
  * see ETSI EN 300 468 v1.15.1 section 6.2.35
  */
@@ -121,7 +121,7 @@ struct vidtv_psi_desc_service_list {
 	struct vidtv_psi_desc_service_list_entry *service_list;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_desc_short_event - A short event descriptor
  * see ETSI EN 300 468 v1.15.1 section 6.2.37
  */
@@ -142,7 +142,7 @@ struct vidtv_psi_desc_short_event
 				 char *event_name,
 				 char *text);
 
-/**
+/*
  * struct vidtv_psi_table_header - A header that is present for all PSI tables.
  */
 struct vidtv_psi_table_header {
@@ -158,7 +158,7 @@ struct vidtv_psi_table_header {
 	u8  last_section; /* last_section_number */
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_table_pat_program - A single program in the PAT
  * See ISO/IEC 13818-1 : 2000 p.43
  */
@@ -168,7 +168,7 @@ struct vidtv_psi_table_pat_program {
 	struct vidtv_psi_table_pat_program *next;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_table_pat - The Program Allocation Table (PAT)
  * See ISO/IEC 13818-1 : 2000 p.43
  */
@@ -179,7 +179,7 @@ struct vidtv_psi_table_pat {
 	struct vidtv_psi_table_pat_program *program;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_table_sdt_service - Represents a service in the SDT.
  * see ETSI EN 300 468 v1.15.1 section 5.2.3.
  */
@@ -193,7 +193,7 @@ struct vidtv_psi_table_sdt_service {
 	struct vidtv_psi_table_sdt_service *next;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_table_sdt - Represents the Service Description Table
  * see ETSI EN 300 468 v1.15.1 section 5.2.3.
  */
@@ -205,7 +205,7 @@ struct vidtv_psi_table_sdt {
 	struct vidtv_psi_table_sdt_service *service;
 } __packed;
 
-/**
+/*
  * enum service_running_status - Status of a SDT service.
  * see ETSI EN 300 468 v1.15.1 section 5.2.3 table 6.
  */
@@ -213,7 +213,7 @@ enum service_running_status {
 	RUNNING = 0x4,
 };
 
-/**
+/*
  * enum service_type - The type of a SDT service.
  * see ETSI EN 300 468 v1.15.1 section 6.2.33, table 81.
  */
@@ -223,7 +223,7 @@ enum service_type {
 	DIGITAL_RADIO_SOUND_SERVICE = 0X2,
 };
 
-/**
+/*
  * struct vidtv_psi_table_pmt_stream - A single stream in the PMT.
  * See ISO/IEC 13818-1 : 2000 p.46.
  */
@@ -235,7 +235,7 @@ struct vidtv_psi_table_pmt_stream {
 	struct vidtv_psi_table_pmt_stream *next;
 } __packed;
 
-/**
+/*
  * struct vidtv_psi_table_pmt - The Program Map Table (PMT).
  * See ISO/IEC 13818-1 : 2000 p.46.
  */
@@ -477,7 +477,6 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc);
  * vidtv_psi_create_sec_for_each_pat_entry - Create a PMT section for each
  * program found in the PAT
  * @pat: The PAT to look for programs.
- * @s: The stream loop (one or more streams)
  * @pcr_pid: packet ID for the PCR to be used for the program described in this
  * PMT section
  */
@@ -595,9 +594,11 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args *args);
  * @buf: The destination buffer.
  * @offset: The offset into the destination buffer.
  * @pmt: A pointer to the PMT.
+ * @pid: Program ID
  * @buf_sz: The size of the destination buffer.
  * @continuity_counter: A pointer to the CC. Incremented on every new packet.
- *
+ * @pcr_pid: The TS PID used for the PSI packets. All channels will share the
+ * same PCR.
  */
 struct vidtv_psi_pmt_write_args {
 	char *buf;
@@ -713,7 +714,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args *args);
 
 void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit);
 
-/**
+/*
  * struct vidtv_psi_desc_short_event - A short event descriptor
  * see ETSI EN 300 468 v1.15.1 section 6.2.37
  */
@@ -748,7 +749,7 @@ struct vidtv_psi_table_eit
  * struct vidtv_psi_eit_write_args - Arguments for writing an EIT section
  * @buf: The destination buffer.
  * @offset: The offset into the destination buffer.
- * @nit: A pointer to the NIT
+ * @eit: A pointer to the EIT
  * @buf_sz: The size of the destination buffer.
  * @continuity_counter: A pointer to the CC. Incremented on every new packet.
  *
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.h b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
index e990b755bb20..9cc94e4a8924 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
@@ -33,6 +33,9 @@
  * @enc: A pointer to the containing encoder structure.
  * @frame_index: The current frame in a block
  * @au_count: The total number of access units encoded up to now
+ * @last_duration: Duration of the tone currently being played
+ * @note_offset: Position at the music tone array
+ * @last_tone: Tone currently being played
  */
 struct vidtv_s302m_ctx {
 	struct vidtv_encoder *enc;
@@ -43,7 +46,7 @@ struct vidtv_s302m_ctx {
 	enum musical_notes last_tone;
 };
 
-/**
+/*
  * struct vidtv_smpte_s302m_es - s302m MPEG Elementary Stream header.
  *
  * See SMPTE 302M 2007 table 1.
diff --git a/drivers/media/test-drivers/vidtv/vidtv_ts.h b/drivers/media/test-drivers/vidtv/vidtv_ts.h
index 6b989a2c1433..10838a2b8389 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_ts.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_ts.h
@@ -53,7 +53,7 @@ struct vidtv_mpeg_ts {
  * @dest_offset: The byte offset into the buffer.
  * @pid: The TS PID for the PCR packets.
  * @buf_sz: The size of the buffer in bytes.
- * @countinuity_counter: The TS continuity_counter.
+ * @continuity_counter: The TS continuity_counter.
  * @pcr: A sample from the system clock.
  */
 struct pcr_write_args {
@@ -70,7 +70,7 @@ struct pcr_write_args {
  * @dest_buf: The buffer to write into.
  * @dest_offset: The byte offset into the buffer.
  * @buf_sz: The size of the buffer in bytes.
- * @countinuity_counter: The TS continuity_counter.
+ * @continuity_counter: The TS continuity_counter.
  */
 struct null_packet_write_args {
 	void *dest_buf;
commit 020120af21a643c6adaa4f090c3abf275e3edd68
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Thu Nov 19 12:17:49 2020 +0100

    media: vidtv.rst: update vidtv documentation
    
    Update the vidtv documentation with the relevant changes
    after the last patches.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/Documentation/driver-api/media/drivers/vidtv.rst b/Documentation/driver-api/media/drivers/vidtv.rst
index edaceef2808c..52c201798d78 100644
--- a/Documentation/driver-api/media/drivers/vidtv.rst
+++ b/Documentation/driver-api/media/drivers/vidtv.rst
@@ -258,6 +258,42 @@ Using dvb-fe-tool
 The first step to check whether the demod loaded successfully is to run::
 
 	$ dvb-fe-tool
+	Device Dummy demod for DVB-T/T2/C/S/S2 (/dev/dvb/adapter0/frontend0) capabilities:
+	    CAN_FEC_1_2
+	    CAN_FEC_2_3
+	    CAN_FEC_3_4
+	    CAN_FEC_4_5
+	    CAN_FEC_5_6
+	    CAN_FEC_6_7
+	    CAN_FEC_7_8
+	    CAN_FEC_8_9
+	    CAN_FEC_AUTO
+	    CAN_GUARD_INTERVAL_AUTO
+	    CAN_HIERARCHY_AUTO
+	    CAN_INVERSION_AUTO
+	    CAN_QAM_16
+	    CAN_QAM_32
+	    CAN_QAM_64
+	    CAN_QAM_128
+	    CAN_QAM_256
+	    CAN_QAM_AUTO
+	    CAN_QPSK
+	    CAN_TRANSMISSION_MODE_AUTO
+	DVB API Version 5.11, Current v5 delivery system: DVBC/ANNEX_A
+	Supported delivery systems:
+	    DVBT
+	    DVBT2
+	    [DVBC/ANNEX_A]
+	    DVBS
+	    DVBS2
+	Frequency range for the current standard:
+	From:            51.0 MHz
+	To:              2.15 GHz
+	Step:            62.5 kHz
+	Tolerance:       29.5 MHz
+	Symbol rate ranges for the current standard:
+	From:            1.00 MBauds
+	To:              45.0 MBauds
 
 This should return what is currently set up at the demod struct, i.e.::
 
@@ -316,7 +352,7 @@ For this, one should provide a configuration file known as a 'scan file',
 here's an example::
 
 	[Channel]
-	FREQUENCY = 330000000
+	FREQUENCY = 474000000
 	MODULATION = QAM/AUTO
 	SYMBOL_RATE = 6940000
 	INNER_FEC = AUTO
@@ -337,6 +373,14 @@ You can browse scan tables online here: `dvb-scan-tables
 Assuming this channel is named 'channel.conf', you can then run::
 
 	$ dvbv5-scan channel.conf
+	dvbv5-scan ~/vidtv.conf
+	ERROR    command BANDWIDTH_HZ (5) not found during retrieve
+	Cannot calc frequency shift. Either bandwidth/symbol-rate is unavailable (yet).
+	Scanning frequency #1 330000000
+	    (0x00) Signal= -68.00dBm
+	Scanning frequency #2 474000000
+	Lock   (0x1f) Signal= -34.45dBm C/N= 33.74dB UCB= 0
+	Service Beethoven, provider LinuxTV.org: digital television
 
 For more information on dvb-scan, check its documentation online here:
 `dvb-scan Documentation <https://www.linuxtv.org/wiki/index.php/Dvbscan>`_.
@@ -346,23 +390,38 @@ Using dvb-zap
 
 dvbv5-zap is a command line tool that can be used to record MPEG-TS to disk. The
 typical use is to tune into a channel and put it into record mode. The example
-below - which is taken from the documentation - illustrates that::
+below - which is taken from the documentation - illustrates that\ [1]_::
 
-	$ dvbv5-zap -c dvb_channel.conf "trilhas sonoras" -r
-	using demux '/dev/dvb/adapter0/demux0'
+	$ dvbv5-zap -c dvb_channel.conf "beethoven" -o music.ts -P -t 10
+	using demux 'dvb0.demux0'
 	reading channels from file 'dvb_channel.conf'
-	service has pid type 05:  204
-	tuning to 573000000 Hz
-	audio pid 104
-	  dvb_set_pesfilter 104
-	Lock   (0x1f) Quality= Good Signal= 100.00% C/N= -13.80dB UCB= 70 postBER= 3.14x10^-3 PER= 0
-	DVR interface '/dev/dvb/adapter0/dvr0' can now be opened
+	tuning to 474000000 Hz
+	pass all PID's to TS
+	dvb_set_pesfilter 8192
+	dvb_dev_set_bufsize: buffer set to 6160384
+	Lock   (0x1f) Quality= Good Signal= -34.66dBm C/N= 33.41dB UCB= 0 postBER= 0 preBER= 1.05x10^-3 PER= 0
+	Lock   (0x1f) Quality= Good Signal= -34.57dBm C/N= 33.46dB UCB= 0 postBER= 0 preBER= 1.05x10^-3 PER= 0
+	Record to file 'music.ts' started
+	received 24587768 bytes (2401 Kbytes/sec)
+	Lock   (0x1f) Quality= Good Signal= -34.42dBm C/N= 33.89dB UCB= 0 postBER= 0 preBER= 2.44x10^-3 PER= 0
 
-The channel can be watched by playing the contents of the DVR interface, with
-some player that recognizes the MPEG-TS format, such as *mplayer* or *vlc*.
+.. [1] In this example, it records 10 seconds with all program ID's stored
+       at the music.ts file.
+
+
+The channel can be watched by playing the contents of the stream with some
+player that  recognizes the MPEG-TS format, such as ``mplayer`` or ``vlc``.
 
 By playing the contents of the stream one can visually inspect the workings of
-vidtv, e.g.::
+vidtv, e.g., to play a recorded TS file with::
+
+	$ mplayer music.ts
+
+or, alternatively, running this command on one terminal::
+
+	$ dvbv5-zap -c dvb_channel.conf "beethoven" -P -r &
+
+And, on a second terminal, playing the contents from DVR interface with::
 
 	$ mplayer /dev/dvb/adapter0/dvr0
 
commit b087982886e24dd9b50457d4263910ae671be177
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 10:50:58 2020 +0100

    media: vidtv: simplify EIT write function
    
    - pass struct vidtv_psi_eit_write_args as a pointer;
    - avoid initializing struct fields multiple times.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 77d691f4ff92..b51e6a3b8cbe 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -209,7 +209,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	eit_args.offset             = m->mux_buf_offset;
 	eit_args.continuity_counter = &eit_ctx->cc;
 
-	m->mux_buf_offset += vidtv_psi_eit_write_into(eit_args);
+	m->mux_buf_offset += vidtv_psi_eit_write_into(&eit_args);
 
 	nbytes = m->mux_buf_offset - initial_offset;
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index b03e235b0a67..4511a2a98405 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1857,55 +1857,63 @@ struct vidtv_psi_table_eit
 	return eit;
 }
 
-u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
+u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args *args)
 {
-	struct vidtv_psi_table_eit_event *event = args.eit->event;
+	struct header_write_args h_args = {
+		.dest_buf        = args->buf,
+		.dest_offset     = args->offset,
+		.h               = &args->eit->header,
+		.pid             = VIDTV_EIT_PID,
+		.dest_buf_sz     = args->buf_sz,
+	};
+	struct psi_write_args psi_args  = {
+		.dest_buf        = args->buf,
+		.len             = sizeof_field(struct vidtv_psi_table_eit, transport_id) +
+				   sizeof_field(struct vidtv_psi_table_eit, network_id)   +
+				   sizeof_field(struct vidtv_psi_table_eit, last_segment) +
+				   sizeof_field(struct vidtv_psi_table_eit, last_table_id),
+		.pid             = VIDTV_EIT_PID,
+		.new_psi_section = false,
+		.is_crc          = false,
+		.dest_buf_sz     = args->buf_sz,
+	};
+	struct desc_write_args d_args   = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_EIT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct crc32_write_args c_args  = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_EIT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct vidtv_psi_table_eit_event *event = args->eit->event;
 	struct vidtv_psi_desc *event_descriptor;
-	struct header_write_args h_args = {};
-	struct psi_write_args psi_args  = {};
-	struct desc_write_args d_args   = {};
-	struct crc32_write_args c_args  = {};
 	u32 crc = INITIAL_CRC;
 	u32 nbytes  = 0;
 
-	vidtv_psi_eit_table_update_sec_len(args.eit);
+	vidtv_psi_eit_table_update_sec_len(args->eit);
 
-	h_args.dest_buf           = args.buf;
-	h_args.dest_offset        = args.offset;
-	h_args.h                  = &args.eit->header;
-	h_args.pid                = VIDTV_EIT_PID;
-	h_args.continuity_counter = args.continuity_counter;
-	h_args.dest_buf_sz        = args.buf_sz;
+	h_args.continuity_counter = args->continuity_counter;
 	h_args.crc                = &crc;
 
 	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
-	psi_args.dest_buf = args.buf;
-	psi_args.from     = &args.eit->transport_id;
-
-	psi_args.len = sizeof_field(struct vidtv_psi_table_eit, transport_id) +
-		       sizeof_field(struct vidtv_psi_table_eit, network_id)   +
-		       sizeof_field(struct vidtv_psi_table_eit, last_segment) +
-		       sizeof_field(struct vidtv_psi_table_eit, last_table_id);
-
-	psi_args.dest_offset        = args.offset + nbytes;
-	psi_args.pid                = VIDTV_EIT_PID;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.buf_sz;
+	psi_args.from               = &args->eit->transport_id;
+	psi_args.dest_offset        = args->offset + nbytes;
+	psi_args.continuity_counter = args->continuity_counter;
 	psi_args.crc                = &crc;
 
 	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
+	/* skip both pointers at the end */
+	psi_args.len = sizeof(struct vidtv_psi_table_eit_event) -
+		       sizeof(struct vidtv_psi_desc *) -
+		       sizeof(struct vidtv_psi_table_eit_event *);
 	while (event) {
 		/* copy the events, if any */
 		psi_args.from = event;
-		/* skip both pointers at the end */
-		psi_args.len = sizeof(struct vidtv_psi_table_eit_event) -
-			       sizeof(struct vidtv_psi_desc *) -
-			       sizeof(struct vidtv_psi_table_eit_event *);
-		psi_args.dest_offset = args.offset + nbytes;
+		psi_args.dest_offset = args->offset + nbytes;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
@@ -1913,12 +1921,9 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 
 		while (event_descriptor) {
 			/* copy the event descriptors, if any */
-			d_args.dest_buf           = args.buf;
-			d_args.dest_offset        = args.offset + nbytes;
+			d_args.dest_offset        = args->offset + nbytes;
 			d_args.desc               = event_descriptor;
-			d_args.pid                = VIDTV_EIT_PID;
-			d_args.continuity_counter = args.continuity_counter;
-			d_args.dest_buf_sz        = args.buf_sz;
+			d_args.continuity_counter = args->continuity_counter;
 			d_args.crc                = &crc;
 
 			nbytes += vidtv_psi_desc_write_into(&d_args);
@@ -1929,12 +1934,9 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 		event = event->next;
 	}
 
-	c_args.dest_buf           = args.buf;
-	c_args.dest_offset        = args.offset + nbytes;
+	c_args.dest_offset        = args->offset + nbytes;
 	c_args.crc                = cpu_to_be32(crc);
-	c_args.pid                = VIDTV_EIT_PID;
-	c_args.continuity_counter = args.continuity_counter;
-	c_args.dest_buf_sz        = args.buf_sz;
+	c_args.continuity_counter = args->continuity_counter;
 
 	/* Write the CRC at the end */
 	nbytes += table_section_crc32_write_into(&c_args);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 8e366ea44cca..7a5901f11a37 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -773,7 +773,7 @@ struct vidtv_psi_eit_write_args {
  * equal to the size of the EIT, since more space is needed for TS headers during TS
  * encapsulation.
  */
-u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args);
+u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args *args);
 
 void vidtv_psi_eit_table_destroy(struct vidtv_psi_table_eit *eit);
 
commit 5a5b9fb1a1117b2cf71a162309e370850a626dbf
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 10:37:12 2020 +0100

    media: vidtv: simplify NIT write function
    
    - pass struct vidtv_psi_nit_write_args as a pointer;
    - avoid initializing struct fields multiple times.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index ff1c7c586838..77d691f4ff92 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -204,7 +204,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	nit_args.offset             = m->mux_buf_offset;
 	nit_args.continuity_counter = &nit_ctx->cc;
 
-	m->mux_buf_offset += vidtv_psi_nit_write_into(nit_args);
+	m->mux_buf_offset += vidtv_psi_nit_write_into(&nit_args);
 
 	eit_args.offset             = m->mux_buf_offset;
 	eit_args.continuity_counter = &eit_ctx->cc;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index f8cfcd7f42d3..b03e235b0a67 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1647,53 +1647,60 @@ free_nit:
 	return NULL;
 }
 
-u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
+u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args *args)
 {
-	struct vidtv_psi_desc *table_descriptor     = args.nit->descriptor;
-	struct vidtv_psi_table_transport *transport = args.nit->transport;
+	struct header_write_args h_args = {
+		.dest_buf           = args->buf,
+		.dest_offset        = args->offset,
+		.h                  = &args->nit->header,
+		.pid                = VIDTV_NIT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct psi_write_args psi_args  = {
+		.dest_buf           = args->buf,
+		.from               = &args->nit->bitfield,
+		.len                = sizeof_field(struct vidtv_psi_table_nit, bitfield),
+		.pid                = VIDTV_NIT_PID,
+		.new_psi_section    = false,
+		.is_crc             = false,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct desc_write_args d_args   = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_NIT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct crc32_write_args c_args  = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_NIT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct vidtv_psi_desc *table_descriptor     = args->nit->descriptor;
+	struct vidtv_psi_table_transport *transport = args->nit->transport;
 	struct vidtv_psi_desc *transport_descriptor;
-	struct header_write_args h_args = {};
-	struct psi_write_args psi_args  = {};
-	struct desc_write_args d_args   = {};
-	struct crc32_write_args c_args  = {};
 	u32 crc = INITIAL_CRC;
 	u32 nbytes = 0;
 
-	vidtv_psi_nit_table_update_sec_len(args.nit);
+	vidtv_psi_nit_table_update_sec_len(args->nit);
 
-	h_args.dest_buf           = args.buf;
-	h_args.dest_offset        = args.offset;
-	h_args.h                  = &args.nit->header;
-	h_args.pid                = VIDTV_NIT_PID;
-	h_args.continuity_counter = args.continuity_counter;
-	h_args.dest_buf_sz        = args.buf_sz;
+	h_args.continuity_counter = args->continuity_counter;
 	h_args.crc                = &crc;
 
 	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	/* write the bitfield */
-	psi_args.dest_buf = args.buf;
-	psi_args.from     = &args.nit->bitfield;
-	psi_args.len      = sizeof_field(struct vidtv_psi_table_nit, bitfield);
 
-	psi_args.dest_offset        = args.offset + nbytes;
-	psi_args.pid                = VIDTV_NIT_PID;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.buf_sz;
+	psi_args.dest_offset        = args->offset + nbytes;
+	psi_args.continuity_counter = args->continuity_counter;
 	psi_args.crc                = &crc;
 
 	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (table_descriptor) {
 		/* write the descriptors, if any */
-		d_args.dest_buf           = args.buf;
-		d_args.dest_offset        = args.offset + nbytes;
+		d_args.dest_offset        = args->offset + nbytes;
 		d_args.desc               = table_descriptor;
-		d_args.pid                = VIDTV_NIT_PID;
-		d_args.continuity_counter = args.continuity_counter;
-		d_args.dest_buf_sz        = args.buf_sz;
+		d_args.continuity_counter = args->continuity_counter;
 		d_args.crc                = &crc;
 
 		nbytes += vidtv_psi_desc_write_into(&d_args);
@@ -1702,21 +1709,19 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 	}
 
 	/* write the second bitfield */
-	psi_args.dest_buf = args.buf;
-	psi_args.from = &args.nit->bitfield2;
+	psi_args.from = &args->nit->bitfield2;
 	psi_args.len = sizeof_field(struct vidtv_psi_table_nit, bitfield2);
-	psi_args.dest_offset = args.offset + nbytes;
-	psi_args.pid = VIDTV_NIT_PID;
+	psi_args.dest_offset = args->offset + nbytes;
 
 	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
+	psi_args.len  = sizeof_field(struct vidtv_psi_table_transport, transport_id) +
+			sizeof_field(struct vidtv_psi_table_transport, network_id)   +
+			sizeof_field(struct vidtv_psi_table_transport, bitfield);
 	while (transport) {
 		/* write the transport sections, if any */
 		psi_args.from = transport;
-		psi_args.len  = sizeof_field(struct vidtv_psi_table_transport, transport_id) +
-				sizeof_field(struct vidtv_psi_table_transport, network_id)   +
-				sizeof_field(struct vidtv_psi_table_transport, bitfield);
-		psi_args.dest_offset = args.offset + nbytes;
+		psi_args.dest_offset = args->offset + nbytes;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
@@ -1724,12 +1729,9 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 
 		while (transport_descriptor) {
 			/* write the transport descriptors, if any */
-			d_args.dest_buf           = args.buf;
-			d_args.dest_offset        = args.offset + nbytes;
+			d_args.dest_offset        = args->offset + nbytes;
 			d_args.desc               = transport_descriptor;
-			d_args.pid                = VIDTV_NIT_PID;
-			d_args.continuity_counter = args.continuity_counter;
-			d_args.dest_buf_sz        = args.buf_sz;
+			d_args.continuity_counter = args->continuity_counter;
 			d_args.crc                = &crc;
 
 			nbytes += vidtv_psi_desc_write_into(&d_args);
@@ -1740,12 +1742,9 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 		transport = transport->next;
 	}
 
-	c_args.dest_buf           = args.buf;
-	c_args.dest_offset        = args.offset + nbytes;
+	c_args.dest_offset        = args->offset + nbytes;
 	c_args.crc                = cpu_to_be32(crc);
-	c_args.pid                = VIDTV_NIT_PID;
-	c_args.continuity_counter = args.continuity_counter;
-	c_args.dest_buf_sz        = args.buf_sz;
+	c_args.continuity_counter = args->continuity_counter;
 
 	/* Write the CRC32 at the end */
 	nbytes += table_section_crc32_write_into(&c_args);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index e3913fbe7832..8e366ea44cca 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -709,7 +709,7 @@ struct vidtv_psi_nit_write_args {
  * equal to the size of the NIT, since more space is needed for TS headers during TS
  * encapsulation.
  */
-u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args);
+u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args *args);
 
 void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit);
 
commit 6286a4b79b6cc5b4696145a1c3216d0c264efcf7
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 10:20:23 2020 +0100

    media: vidtv: simplify SDT write function
    
    - pass struct vidtv_psi_sdt_write_args as a pointer;
    - avoid initializing struct fields multiple times.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 239e0a242b6e..ff1c7c586838 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -199,7 +199,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	sdt_args.offset             = m->mux_buf_offset;
 	sdt_args.continuity_counter = &sdt_ctx->cc;
 
-	m->mux_buf_offset += vidtv_psi_sdt_write_into(sdt_args);
+	m->mux_buf_offset += vidtv_psi_sdt_write_into(&sdt_args);
 
 	nit_args.offset             = m->mux_buf_offset;
 	nit_args.continuity_counter = &nit_ctx->cc;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 677cf7fac731..f8cfcd7f42d3 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1306,57 +1306,66 @@ struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 network_id,
 	return sdt;
 }
 
-u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
+u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args *args)
 {
-	struct vidtv_psi_table_sdt_service *service = args.sdt->service;
+	struct header_write_args h_args = {
+		.dest_buf           = args->buf,
+		.dest_offset        = args->offset,
+		.h                  = &args->sdt->header,
+		.pid                = VIDTV_SDT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct psi_write_args psi_args  = {
+		.dest_buf = args->buf,
+		.len = sizeof_field(struct vidtv_psi_table_sdt, network_id) +
+		       sizeof_field(struct vidtv_psi_table_sdt, reserved),
+		.pid                = VIDTV_SDT_PID,
+		.new_psi_section    = false,
+		.is_crc             = false,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct desc_write_args d_args   = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_SDT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct crc32_write_args c_args  = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_SDT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct vidtv_psi_table_sdt_service *service = args->sdt->service;
 	struct vidtv_psi_desc *service_desc;
-	struct header_write_args h_args = {};
-	struct psi_write_args psi_args  = {};
-	struct desc_write_args d_args   = {};
-	struct crc32_write_args c_args  = {};
-	u16 sdt_pid = VIDTV_SDT_PID;
 	u32 nbytes  = 0;
 	u32 crc = INITIAL_CRC;
 
 	/* see ETSI EN 300 468 v1.15.1 p. 11 */
 
-	vidtv_psi_sdt_table_update_sec_len(args.sdt);
+	vidtv_psi_sdt_table_update_sec_len(args->sdt);
 
-	h_args.dest_buf           = args.buf;
-	h_args.dest_offset        = args.offset;
-	h_args.h                  = &args.sdt->header;
-	h_args.pid                = sdt_pid;
-	h_args.continuity_counter = args.continuity_counter;
-	h_args.dest_buf_sz        = args.buf_sz;
+	h_args.continuity_counter = args->continuity_counter;
 	h_args.crc                = &crc;
 
 	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
-	psi_args.dest_buf = args.buf;
-	psi_args.from     = &args.sdt->network_id;
-
-	psi_args.len = sizeof_field(struct vidtv_psi_table_sdt, network_id) +
-		       sizeof_field(struct vidtv_psi_table_sdt, reserved);
-
-	psi_args.dest_offset        = args.offset + nbytes;
-	psi_args.pid                = sdt_pid;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.buf_sz;
+	psi_args.from               = &args->sdt->network_id;
+	psi_args.dest_offset        = args->offset + nbytes;
+	psi_args.continuity_counter = args->continuity_counter;
 	psi_args.crc                = &crc;
 
 	/* copy u16 network_id + u8 reserved)*/
 	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
+	/* skip both pointers at the end */
+	psi_args.len = sizeof(struct vidtv_psi_table_sdt_service) -
+		       sizeof(struct vidtv_psi_desc *) -
+		       sizeof(struct vidtv_psi_table_sdt_service *);
+
 	while (service) {
 		/* copy the services, if any */
 		psi_args.from = service;
-		/* skip both pointers at the end */
-		psi_args.len = sizeof(struct vidtv_psi_table_sdt_service) -
-			       sizeof(struct vidtv_psi_desc *) -
-			       sizeof(struct vidtv_psi_table_sdt_service *);
-		psi_args.dest_offset = args.offset + nbytes;
+		psi_args.dest_offset = args->offset + nbytes;
+		psi_args.continuity_counter = args->continuity_counter;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
@@ -1364,12 +1373,9 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 
 		while (service_desc) {
 			/* copy the service descriptors, if any */
-			d_args.dest_buf           = args.buf;
-			d_args.dest_offset        = args.offset + nbytes;
+			d_args.dest_offset        = args->offset + nbytes;
 			d_args.desc               = service_desc;
-			d_args.pid                = sdt_pid;
-			d_args.continuity_counter = args.continuity_counter;
-			d_args.dest_buf_sz        = args.buf_sz;
+			d_args.continuity_counter = args->continuity_counter;
 			d_args.crc                = &crc;
 
 			nbytes += vidtv_psi_desc_write_into(&d_args);
@@ -1380,12 +1386,9 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 		service = service->next;
 	}
 
-	c_args.dest_buf           = args.buf;
-	c_args.dest_offset        = args.offset + nbytes;
+	c_args.dest_offset        = args->offset + nbytes;
 	c_args.crc                = cpu_to_be32(crc);
-	c_args.pid                = sdt_pid;
-	c_args.continuity_counter = args.continuity_counter;
-	c_args.dest_buf_sz        = args.buf_sz;
+	c_args.continuity_counter = args->continuity_counter;
 
 	/* Write the CRC at the end */
 	nbytes += table_section_crc32_write_into(&c_args);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index e1a30455ebbb..e3913fbe7832 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -588,7 +588,7 @@ struct vidtv_psi_sdt_write_args {
  * equal to the size of the SDT, since more space is needed for TS headers during TS
  * encapsulation.
  */
-u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args);
+u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args *args);
 
 /**
  * struct vidtv_psi_pmt_write_args - Arguments for writing a PMT section
commit db9569f67e2ea14f896d1a6303906294bef900ad
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 09:58:31 2020 +0100

    media: vidtv: cleanup PMT write table function
    
    - Pass struct vidtv_psi_pmt_write_args as a pointer;
    - Avoid initializing structs multiple times.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 200a8000603f..239e0a242b6e 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -193,7 +193,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 		pmt_args.continuity_counter = &pmt_ctx->cc;
 
 		/* write each section into buffer */
-		m->mux_buf_offset += vidtv_psi_pmt_write_into(pmt_args);
+		m->mux_buf_offset += vidtv_psi_pmt_write_into(&pmt_args);
 	}
 
 	sdt_args.offset             = m->mux_buf_offset;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 722be777ff01..677cf7fac731 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1159,54 +1159,58 @@ struct vidtv_psi_table_pmt *vidtv_psi_pmt_table_init(u16 program_number,
 	return pmt;
 }
 
-u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
+u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args *args)
 {
-	struct vidtv_psi_desc *table_descriptor   = args.pmt->descriptor;
-	struct vidtv_psi_table_pmt_stream *stream = args.pmt->stream;
+	struct vidtv_psi_desc *table_descriptor   = args->pmt->descriptor;
+	struct vidtv_psi_table_pmt_stream *stream = args->pmt->stream;
 	struct vidtv_psi_desc *stream_descriptor;
-	struct header_write_args h_args = {};
-	struct psi_write_args psi_args  = {};
-	struct desc_write_args d_args   = {};
-	struct crc32_write_args c_args  = {};
+	struct header_write_args h_args = {
+		.dest_buf           = args->buf,
+		.dest_offset        = args->offset,
+		.h                  = &args->pmt->header,
+		.pid                = args->pid,
+		.continuity_counter = args->continuity_counter,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct psi_write_args psi_args  = {
+		.dest_buf = args->buf,
+		.from     = &args->pmt->bitfield,
+		.len      = sizeof_field(struct vidtv_psi_table_pmt, bitfield) +
+			    sizeof_field(struct vidtv_psi_table_pmt, bitfield2),
+		.pid                = args->pid,
+		.new_psi_section    = false,
+		.is_crc             = false,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct desc_write_args d_args   = {
+		.dest_buf           = args->buf,
+		.desc               = table_descriptor,
+		.pid                = args->pid,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct crc32_write_args c_args  = {
+		.dest_buf           = args->buf,
+		.pid                = args->pid,
+		.dest_buf_sz        = args->buf_sz,
+	};
 	u32 crc = INITIAL_CRC;
 	u32 nbytes = 0;
 
-	vidtv_psi_pmt_table_update_sec_len(args.pmt);
+	vidtv_psi_pmt_table_update_sec_len(args->pmt);
 
-	h_args.dest_buf           = args.buf;
-	h_args.dest_offset        = args.offset;
-	h_args.h                  = &args.pmt->header;
-	h_args.pid                = args.pid;
-	h_args.continuity_counter = args.continuity_counter;
-	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc                = &crc;
 
 	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	/* write the two bitfields */
-	psi_args.dest_buf = args.buf;
-	psi_args.from     = &args.pmt->bitfield;
-	psi_args.len      = sizeof_field(struct vidtv_psi_table_pmt, bitfield) +
-			    sizeof_field(struct vidtv_psi_table_pmt, bitfield2);
-
-	psi_args.dest_offset        = args.offset + nbytes;
-	psi_args.pid                = args.pid;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.buf_sz;
-	psi_args.crc                = &crc;
-
+	psi_args.dest_offset        = args->offset + nbytes;
+	psi_args.continuity_counter = args->continuity_counter;
 	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (table_descriptor) {
 		/* write the descriptors, if any */
-		d_args.dest_buf           = args.buf;
-		d_args.dest_offset        = args.offset + nbytes;
-		d_args.desc               = table_descriptor;
-		d_args.pid                = args.pid;
-		d_args.continuity_counter = args.continuity_counter;
-		d_args.dest_buf_sz        = args.buf_sz;
+		d_args.dest_offset        = args->offset + nbytes;
+		d_args.continuity_counter = args->continuity_counter;
 		d_args.crc                = &crc;
 
 		nbytes += vidtv_psi_desc_write_into(&d_args);
@@ -1214,13 +1218,12 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 		table_descriptor = table_descriptor->next;
 	}
 
+	psi_args.len += sizeof_field(struct vidtv_psi_table_pmt_stream, type);
 	while (stream) {
 		/* write the streams, if any */
 		psi_args.from = stream;
-		psi_args.len  = sizeof_field(struct vidtv_psi_table_pmt_stream, type) +
-				sizeof_field(struct vidtv_psi_table_pmt_stream, bitfield) +
-				sizeof_field(struct vidtv_psi_table_pmt_stream, bitfield2);
-		psi_args.dest_offset = args.offset + nbytes;
+		psi_args.dest_offset = args->offset + nbytes;
+		psi_args.continuity_counter = args->continuity_counter;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
@@ -1228,12 +1231,9 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 
 		while (stream_descriptor) {
 			/* write the stream descriptors, if any */
-			d_args.dest_buf           = args.buf;
-			d_args.dest_offset        = args.offset + nbytes;
+			d_args.dest_offset        = args->offset + nbytes;
 			d_args.desc               = stream_descriptor;
-			d_args.pid                = args.pid;
-			d_args.continuity_counter = args.continuity_counter;
-			d_args.dest_buf_sz        = args.buf_sz;
+			d_args.continuity_counter = args->continuity_counter;
 			d_args.crc                = &crc;
 
 			nbytes += vidtv_psi_desc_write_into(&d_args);
@@ -1244,12 +1244,9 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 		stream = stream->next;
 	}
 
-	c_args.dest_buf           = args.buf;
-	c_args.dest_offset        = args.offset + nbytes;
+	c_args.dest_offset        = args->offset + nbytes;
 	c_args.crc                = cpu_to_be32(crc);
-	c_args.pid                = args.pid;
-	c_args.continuity_counter = args.continuity_counter;
-	c_args.dest_buf_sz        = args.buf_sz;
+	c_args.continuity_counter = args->continuity_counter;
 
 	/* Write the CRC32 at the end */
 	nbytes += table_section_crc32_write_into(&c_args);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index b6c0518ef4a4..e1a30455ebbb 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -621,7 +621,7 @@ struct vidtv_psi_pmt_write_args {
  * equal to the size of the PMT section, since more space is needed for TS headers
  * during TS encapsulation.
  */
-u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args);
+u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args *args);
 
 /**
  * vidtv_psi_find_pmt_sec - Finds the PMT section for 'program_num'
commit 7f957515191af5ad78f9905afad5fae584988986
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 09:45:49 2020 +0100

    media: vidtv: cleanup PAT write function
    
    Avoid initializing the structs multiple times and pass the
    PAT struct as a pointer, instead of a var.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 0cf784c09024..200a8000603f 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -173,7 +173,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	pat_args.offset             = m->mux_buf_offset;
 	pat_args.continuity_counter = &pat_ctx->cc;
 
-	m->mux_buf_offset += vidtv_psi_pat_write_into(pat_args);
+	m->mux_buf_offset += vidtv_psi_pat_write_into(&pat_args);
 
 	for (i = 0; i < m->si.pat->num_pmt; ++i) {
 		pmt_pid = vidtv_psi_pmt_get_pid(m->si.pmt_secs[i],
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index c769c7757ef8..722be777ff01 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -961,57 +961,60 @@ struct vidtv_psi_table_pat *vidtv_psi_pat_table_init(u16 transport_stream_id)
 	return pat;
 }
 
-u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
+u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args *args)
 {
-	struct vidtv_psi_table_pat_program *p = args.pat->program;
-	struct header_write_args h_args       = {};
-	struct psi_write_args psi_args        = {};
-	struct crc32_write_args c_args        = {};
-	const u16 pat_pid = VIDTV_PAT_PID;
+	struct vidtv_psi_table_pat_program *p = args->pat->program;
+	struct header_write_args h_args       = {
+		.dest_buf           = args->buf,
+		.dest_offset        = args->offset,
+		.pid                = VIDTV_PAT_PID,
+		.h                  = &args->pat->header,
+		.continuity_counter = args->continuity_counter,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct psi_write_args psi_args        = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_PAT_PID,
+		.new_psi_section    = false,
+		.continuity_counter = args->continuity_counter,
+		.is_crc             = false,
+		.dest_buf_sz        = args->buf_sz,
+	};
+	struct crc32_write_args c_args        = {
+		.dest_buf           = args->buf,
+		.pid                = VIDTV_PAT_PID,
+		.dest_buf_sz        = args->buf_sz,
+	};
 	u32 crc = INITIAL_CRC;
 	u32 nbytes = 0;
 
-	vidtv_psi_pat_table_update_sec_len(args.pat);
+	vidtv_psi_pat_table_update_sec_len(args->pat);
 
-	h_args.dest_buf           = args.buf;
-	h_args.dest_offset        = args.offset;
-	h_args.h                  = &args.pat->header;
-	h_args.pid                = pat_pid;
-	h_args.continuity_counter = args.continuity_counter;
-	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc = &crc;
 
 	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	/* note that the field 'u16 programs' is not really part of the PAT */
 
-	psi_args.dest_buf           = args.buf;
-	psi_args.pid                = pat_pid;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.buf_sz;
-	psi_args.crc                = &crc;
+	psi_args.crc = &crc;
 
 	while (p) {
 		/* copy the PAT programs */
 		psi_args.from = p;
 		/* skip the pointer */
 		psi_args.len = sizeof(*p) -
-			   sizeof(struct vidtv_psi_table_pat_program *);
-		psi_args.dest_offset = args.offset + nbytes;
+			       sizeof(struct vidtv_psi_table_pat_program *);
+		psi_args.dest_offset = args->offset + nbytes;
+		psi_args.continuity_counter = args->continuity_counter;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		p = p->next;
 	}
 
-	c_args.dest_buf           = args.buf;
-	c_args.dest_offset        = args.offset + nbytes;
+	c_args.dest_offset        = args->offset + nbytes;
+	c_args.continuity_counter = args->continuity_counter;
 	c_args.crc                = cpu_to_be32(crc);
-	c_args.pid                = pat_pid;
-	c_args.continuity_counter = args.continuity_counter;
-	c_args.dest_buf_sz        = args.buf_sz;
 
 	/* Write the CRC32 at the end */
 	nbytes += table_section_crc32_write_into(&c_args);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index d30c8dd53d11..b6c0518ef4a4 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -556,7 +556,7 @@ struct vidtv_psi_pat_write_args {
  * equal to the size of the PAT, since more space is needed for TS headers during TS
  * encapsulation.
  */
-u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args);
+u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args *args);
 
 /**
  * struct vidtv_psi_sdt_write_args - Arguments for writing a SDT table
commit c570fb9ffc056124fe6dc7ea2c69ca3af3093116
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 09:33:44 2020 +0100

    media: vidtv: cleanup PSI table header function
    
    - Pass struct header_write_args as a pointer, instead of
      passing as a var;
    
    - Initialize the psi_args struct only once.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index decb9b31c86d..c769c7757ef8 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -754,26 +754,22 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args *args)
 }
 
 static u32
-vidtv_psi_table_header_write_into(struct header_write_args args)
+vidtv_psi_table_header_write_into(struct header_write_args *args)
 {
-	struct psi_write_args psi_args = {};
-	/* the number of bytes written by this function */
-	u32 nbytes = 0;
-
-	psi_args.dest_buf           = args.dest_buf;
-	psi_args.from               = args.h;
-	psi_args.len                = sizeof(struct vidtv_psi_table_header);
-	psi_args.dest_offset        = args.dest_offset;
-	psi_args.pid                = args.pid;
-	psi_args.new_psi_section    = true;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.dest_buf_sz;
-	psi_args.crc                = args.crc;
-
-	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
+	struct psi_write_args psi_args = {
+		.dest_buf           = args->dest_buf,
+		.from               = args->h,
+		.len                = sizeof(struct vidtv_psi_table_header),
+		.dest_offset        = args->dest_offset,
+		.pid                = args->pid,
+		.new_psi_section    = true,
+		.continuity_counter = args->continuity_counter,
+		.is_crc             = false,
+		.dest_buf_sz        = args->dest_buf_sz,
+		.crc                = args->crc,
+	};
 
-	return nbytes;
+	return vidtv_psi_ts_psi_write_into(&psi_args);
 }
 
 void
@@ -985,7 +981,7 @@ u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
 	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc = &crc;
 
-	nbytes += vidtv_psi_table_header_write_into(h_args);
+	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	/* note that the field 'u16 programs' is not really part of the PAT */
 
@@ -1182,7 +1178,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc                = &crc;
 
-	nbytes += vidtv_psi_table_header_write_into(h_args);
+	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	/* write the two bitfields */
 	psi_args.dest_buf = args.buf;
@@ -1334,7 +1330,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc                = &crc;
 
-	nbytes += vidtv_psi_table_header_write_into(h_args);
+	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	psi_args.dest_buf = args.buf;
 	psi_args.from     = &args.sdt->network_id;
@@ -1670,7 +1666,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc                = &crc;
 
-	nbytes += vidtv_psi_table_header_write_into(h_args);
+	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	/* write the bitfield */
 	psi_args.dest_buf = args.buf;
@@ -1880,7 +1876,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 	h_args.dest_buf_sz        = args.buf_sz;
 	h_args.crc                = &crc;
 
-	nbytes += vidtv_psi_table_header_write_into(h_args);
+	nbytes += vidtv_psi_table_header_write_into(&h_args);
 
 	psi_args.dest_buf = args.buf;
 	psi_args.from     = &args.eit->transport_id;
commit 974ea17692b59e09c5d0af1a3bc09f45d1892ea4
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 09:25:00 2020 +0100

    media: vidtv: cleanup PSI descriptor write function
    
    This function initializes the psi_args twice, and receives
    a struct, instead of a pointer to a struct.
    
    Clean it up.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index f02ee4c9a0f7..decb9b31c86d 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -634,69 +634,67 @@ void vidtv_sdt_desc_assign(struct vidtv_psi_table_sdt *sdt,
 	vidtv_psi_update_version_num(&sdt->header);
 }
 
-static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
+static u32 vidtv_psi_desc_write_into(struct desc_write_args *args)
 {
+	struct psi_write_args psi_args = {
+		.dest_buf           = args->dest_buf,
+		.from               = &args->desc->type,
+		.pid                = args->pid,
+		.new_psi_section    = false,
+		.continuity_counter = args->continuity_counter,
+		.is_crc             = false,
+		.dest_buf_sz        = args->dest_buf_sz,
+		.crc                = args->crc,
+		.len		    = sizeof_field(struct vidtv_psi_desc, type) +
+				      sizeof_field(struct vidtv_psi_desc, length),
+	};
 	struct vidtv_psi_desc_service_list_entry *serv_list_entry = NULL;
-	struct psi_write_args psi_args = {};
-	/* the number of bytes written by this function */
 	u32 nbytes = 0;
 
-	psi_args.dest_buf = args.dest_buf;
-	psi_args.from     = &args.desc->type;
-
-	psi_args.len = sizeof_field(struct vidtv_psi_desc, type) +
-		       sizeof_field(struct vidtv_psi_desc, length);
-
-	psi_args.dest_offset        = args.dest_offset + nbytes;
-	psi_args.pid                = args.pid;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = false;
-	psi_args.dest_buf_sz        = args.dest_buf_sz;
-	psi_args.crc                = args.crc;
+	psi_args.dest_offset        = args->dest_offset + nbytes;
 
 	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-	switch (args.desc->type) {
+	switch (args->desc->type) {
 	case SERVICE_DESCRIPTOR:
-		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.dest_offset = args->dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_service, service_type) +
 			       sizeof_field(struct vidtv_psi_desc_service, provider_name_len);
-		psi_args.from = &((struct vidtv_psi_desc_service *)args.desc)->service_type;
+		psi_args.from = &((struct vidtv_psi_desc_service *)args->desc)->service_type;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
-		psi_args.len = ((struct vidtv_psi_desc_service *)args.desc)->provider_name_len;
-		psi_args.from = ((struct vidtv_psi_desc_service *)args.desc)->provider_name;
+		psi_args.dest_offset = args->dest_offset + nbytes;
+		psi_args.len = ((struct vidtv_psi_desc_service *)args->desc)->provider_name_len;
+		psi_args.from = ((struct vidtv_psi_desc_service *)args->desc)->provider_name;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.dest_offset = args->dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_service, service_name_len);
-		psi_args.from = &((struct vidtv_psi_desc_service *)args.desc)->service_name_len;
+		psi_args.from = &((struct vidtv_psi_desc_service *)args->desc)->service_name_len;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
-		psi_args.len = ((struct vidtv_psi_desc_service *)args.desc)->service_name_len;
-		psi_args.from = ((struct vidtv_psi_desc_service *)args.desc)->service_name;
+		psi_args.dest_offset = args->dest_offset + nbytes;
+		psi_args.len = ((struct vidtv_psi_desc_service *)args->desc)->service_name_len;
+		psi_args.from = ((struct vidtv_psi_desc_service *)args->desc)->service_name;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 		break;
 
 	case NETWORK_NAME_DESCRIPTOR:
-		psi_args.dest_offset = args.dest_offset + nbytes;
-		psi_args.len = args.desc->length;
-		psi_args.from = ((struct vidtv_psi_desc_network_name *)args.desc)->network_name;
+		psi_args.dest_offset = args->dest_offset + nbytes;
+		psi_args.len = args->desc->length;
+		psi_args.from = ((struct vidtv_psi_desc_network_name *)args->desc)->network_name;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 		break;
 
 	case SERVICE_LIST_DESCRIPTOR:
-		serv_list_entry = ((struct vidtv_psi_desc_service_list *)args.desc)->service_list;
+		serv_list_entry = ((struct vidtv_psi_desc_service_list *)args->desc)->service_list;
 		while (serv_list_entry) {
-			psi_args.dest_offset = args.dest_offset + nbytes;
+			psi_args.dest_offset = args->dest_offset + nbytes;
 			psi_args.len = sizeof(struct vidtv_psi_desc_service_list_entry) -
 				       sizeof(struct vidtv_psi_desc_service_list_entry *);
 			psi_args.from = serv_list_entry;
@@ -708,35 +706,35 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 		break;
 
 	case SHORT_EVENT_DESCRIPTOR:
-		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.dest_offset = args->dest_offset + nbytes;
 		psi_args.len = ISO_LANGUAGE_CODE_LEN;
 		psi_args.from = ((struct vidtv_psi_desc_short_event *)
-				  args.desc)->iso_language_code;
+				  args->desc)->iso_language_code;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.dest_offset = args->dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, event_name_len);
 		psi_args.from = &((struct vidtv_psi_desc_short_event *)
-				  args.desc)->event_name_len;
+				  args->desc)->event_name_len;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
-		psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name_len;
-		psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name;
+		psi_args.dest_offset = args->dest_offset + nbytes;
+		psi_args.len = ((struct vidtv_psi_desc_short_event *)args->desc)->event_name_len;
+		psi_args.from = ((struct vidtv_psi_desc_short_event *)args->desc)->event_name;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.dest_offset = args->dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, text_len);
-		psi_args.from = &((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
+		psi_args.from = &((struct vidtv_psi_desc_short_event *)args->desc)->text_len;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
-		psi_args.dest_offset = args.dest_offset + nbytes;
-		psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
-		psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->text;
+		psi_args.dest_offset = args->dest_offset + nbytes;
+		psi_args.len = ((struct vidtv_psi_desc_short_event *)args->desc)->text_len;
+		psi_args.from = ((struct vidtv_psi_desc_short_event *)args->desc)->text;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
@@ -744,9 +742,9 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 
 	case REGISTRATION_DESCRIPTOR:
 	default:
-		psi_args.dest_offset = args.dest_offset + nbytes;
-		psi_args.len = args.desc->length;
-		psi_args.from = &args.desc->data;
+		psi_args.dest_offset = args->dest_offset + nbytes;
+		psi_args.len = args->desc->length;
+		psi_args.from = &args->desc->data;
 
 		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 		break;
@@ -1212,7 +1210,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 		d_args.dest_buf_sz        = args.buf_sz;
 		d_args.crc                = &crc;
 
-		nbytes += vidtv_psi_desc_write_into(d_args);
+		nbytes += vidtv_psi_desc_write_into(&d_args);
 
 		table_descriptor = table_descriptor->next;
 	}
@@ -1239,7 +1237,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 			d_args.dest_buf_sz        = args.buf_sz;
 			d_args.crc                = &crc;
 
-			nbytes += vidtv_psi_desc_write_into(d_args);
+			nbytes += vidtv_psi_desc_write_into(&d_args);
 
 			stream_descriptor = stream_descriptor->next;
 		}
@@ -1378,7 +1376,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 			d_args.dest_buf_sz        = args.buf_sz;
 			d_args.crc                = &crc;
 
-			nbytes += vidtv_psi_desc_write_into(d_args);
+			nbytes += vidtv_psi_desc_write_into(&d_args);
 
 			service_desc = service_desc->next;
 		}
@@ -1699,7 +1697,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 		d_args.dest_buf_sz        = args.buf_sz;
 		d_args.crc                = &crc;
 
-		nbytes += vidtv_psi_desc_write_into(d_args);
+		nbytes += vidtv_psi_desc_write_into(&d_args);
 
 		table_descriptor = table_descriptor->next;
 	}
@@ -1735,7 +1733,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 			d_args.dest_buf_sz        = args.buf_sz;
 			d_args.crc                = &crc;
 
-			nbytes += vidtv_psi_desc_write_into(d_args);
+			nbytes += vidtv_psi_desc_write_into(&d_args);
 
 			transport_descriptor = transport_descriptor->next;
 		}
@@ -1925,7 +1923,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 			d_args.dest_buf_sz        = args.buf_sz;
 			d_args.crc                = &crc;
 
-			nbytes += vidtv_psi_desc_write_into(d_args);
+			nbytes += vidtv_psi_desc_write_into(&d_args);
 
 			event_descriptor = event_descriptor->next;
 		}
commit 9e0067417b26f3d9a6e3292323a160f20620a468
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 08:54:58 2020 +0100

    media: vidtv: simplify the crc writing logic
    
    Cleanup the table_section_crc32_write_into() function
    by initializing struct psi_write_args only once and by
    passing the args as a pointer.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 2b56c642246e..f02ee4c9a0f7 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -254,26 +254,23 @@ static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args *args)
 	return nbytes;
 }
 
-static u32 table_section_crc32_write_into(struct crc32_write_args args)
+static u32 table_section_crc32_write_into(struct crc32_write_args *args)
 {
-	struct psi_write_args psi_args = {};
-	u32 nbytes = 0;
+	struct psi_write_args psi_args = {
+		.dest_buf           = args->dest_buf,
+		.from               = &args->crc,
+		.len                = CRC_SIZE_IN_BYTES,
+		.dest_offset        = args->dest_offset,
+		.pid                = args->pid,
+		.new_psi_section    = false,
+		.continuity_counter = args->continuity_counter,
+		.is_crc             = true,
+		.dest_buf_sz        = args->dest_buf_sz,
+	};
 
 	/* the CRC is the last entry in the section */
 
-	psi_args.dest_buf           = args.dest_buf;
-	psi_args.from               = &args.crc;
-	psi_args.len                = CRC_SIZE_IN_BYTES;
-	psi_args.dest_offset        = args.dest_offset;
-	psi_args.pid                = args.pid;
-	psi_args.new_psi_section    = false;
-	psi_args.continuity_counter = args.continuity_counter;
-	psi_args.is_crc             = true;
-	psi_args.dest_buf_sz        = args.dest_buf_sz;
-
-	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
-
-	return nbytes;
+	return vidtv_psi_ts_psi_write_into(&psi_args);
 }
 
 static void vidtv_psi_desc_chain(struct vidtv_psi_desc *head, struct vidtv_psi_desc *desc)
@@ -1023,7 +1020,7 @@ u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
 	c_args.dest_buf_sz        = args.buf_sz;
 
 	/* Write the CRC32 at the end */
-	nbytes += table_section_crc32_write_into(c_args);
+	nbytes += table_section_crc32_write_into(&c_args);
 
 	return nbytes;
 }
@@ -1258,7 +1255,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 	c_args.dest_buf_sz        = args.buf_sz;
 
 	/* Write the CRC32 at the end */
-	nbytes += table_section_crc32_write_into(c_args);
+	nbytes += table_section_crc32_write_into(&c_args);
 
 	return nbytes;
 }
@@ -1397,7 +1394,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 	c_args.dest_buf_sz        = args.buf_sz;
 
 	/* Write the CRC at the end */
-	nbytes += table_section_crc32_write_into(c_args);
+	nbytes += table_section_crc32_write_into(&c_args);
 
 	return nbytes;
 }
@@ -1754,7 +1751,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 	c_args.dest_buf_sz        = args.buf_sz;
 
 	/* Write the CRC32 at the end */
-	nbytes += table_section_crc32_write_into(c_args);
+	nbytes += table_section_crc32_write_into(&c_args);
 
 	return nbytes;
 }
@@ -1944,7 +1941,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 	c_args.dest_buf_sz        = args.buf_sz;
 
 	/* Write the CRC at the end */
-	nbytes += table_section_crc32_write_into(c_args);
+	nbytes += table_section_crc32_write_into(&c_args);
 
 	return nbytes;
 }
commit 5edbd330e3a06557642ffb509cc2be39964e26a6
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 24 08:42:20 2020 +0100

    media: vidtv: simplify PSI write function
    
    The function vidtv_psi_ts_psi_write_into() initializes the
    ts_header fields several times, and receives a struct
    as argument, instead of using a pointer to struct.
    
    Cleanup the function, in order to reduce its stack usage
    and to avoid initializing the ts_header multiple times.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index fcdd61744ab4..2b56c642246e 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -162,79 +162,75 @@ static void vidtv_psi_set_sec_len(struct vidtv_psi_table_header *h, u16 new_len)
  * manage the continuity_counter
  * add stuffing (i.e. padding bytes) after the CRC
  */
-static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args args)
+static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args *args)
 {
-
-	u32 nbytes_past_boundary = (args.dest_offset % TS_PACKET_LEN);
+	struct vidtv_mpeg_ts ts_header = {
+		.sync_byte = TS_SYNC_BYTE,
+		.bitfield = cpu_to_be16((args->new_psi_section << 14) | args->pid),
+		.scrambling = 0,
+		.payload = 1,
+		.adaptation_field = 0, /* no adaptation field */
+	};
+	u32 nbytes_past_boundary = (args->dest_offset % TS_PACKET_LEN);
 	bool aligned = (nbytes_past_boundary == 0);
-	struct vidtv_mpeg_ts ts_header = {};
-	u32 remaining_len = args.len;
+	u32 remaining_len = args->len;
 	u32 payload_write_len = 0;
 	u32 payload_offset = 0;
 	u32 nbytes = 0;
 
-	const u16 PAYLOAD_START = args.new_psi_section;
-
-	if (!args.crc && !args.is_crc)
+	if (!args->crc && !args->is_crc)
 		pr_warn_ratelimited("Missing CRC for chunk\n");
 
-	if (args.crc)
-		*args.crc = dvb_crc32(*args.crc, args.from, args.len);
+	if (args->crc)
+		*args->crc = dvb_crc32(*args->crc, args->from, args->len);
 
-	if (args.new_psi_section && !aligned) {
+	if (args->new_psi_section && !aligned) {
 		pr_warn_ratelimited("Cannot write a new PSI section in a misaligned buffer\n");
 
 		/* forcibly align and hope for the best */
-		nbytes += vidtv_memset(args.dest_buf,
-				       args.dest_offset + nbytes,
-				       args.dest_buf_sz,
+		nbytes += vidtv_memset(args->dest_buf,
+				       args->dest_offset + nbytes,
+				       args->dest_buf_sz,
 				       TS_FILL_BYTE,
 				       TS_PACKET_LEN - nbytes_past_boundary);
 	}
 
 	while (remaining_len) {
-		nbytes_past_boundary = (args.dest_offset + nbytes) % TS_PACKET_LEN;
+		nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN;
 		aligned = (nbytes_past_boundary == 0);
 
 		if (aligned) {
 			/* if at a packet boundary, write a new TS header */
-			ts_header.sync_byte = TS_SYNC_BYTE;
-			ts_header.bitfield = cpu_to_be16((PAYLOAD_START << 14) | args.pid);
-			ts_header.scrambling = 0;
-			ts_header.continuity_counter = *args.continuity_counter;
-			ts_header.payload = 1;
-			/* no adaptation field */
-			ts_header.adaptation_field = 0;
-
-			/* copy the header */
-			nbytes += vidtv_memcpy(args.dest_buf,
-					       args.dest_offset + nbytes,
-					       args.dest_buf_sz,
+			ts_header.continuity_counter = *args->continuity_counter;
+
+			nbytes += vidtv_memcpy(args->dest_buf,
+					       args->dest_offset + nbytes,
+					       args->dest_buf_sz,
 					       &ts_header,
 					       sizeof(ts_header));
 			/*
 			 * This will trigger a discontinuity if the buffer is full,
 			 * effectively dropping the packet.
 			 */
-			vidtv_ts_inc_cc(args.continuity_counter);
+			vidtv_ts_inc_cc(args->continuity_counter);
 		}
 
 		/* write the pointer_field in the first byte of the payload */
-		if (args.new_psi_section)
-			nbytes += vidtv_memset(args.dest_buf,
-					       args.dest_offset + nbytes,
-					       args.dest_buf_sz,
+		if (args->new_psi_section)
+			nbytes += vidtv_memset(args->dest_buf,
+					       args->dest_offset + nbytes,
+					       args->dest_buf_sz,
 					       0x0,
 					       1);
 
 		/* write as much of the payload as possible */
-		nbytes_past_boundary = (args.dest_offset + nbytes) % TS_PACKET_LEN;
+		nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN;
 		payload_write_len = min(TS_PACKET_LEN - nbytes_past_boundary, remaining_len);
 
-		nbytes += vidtv_memcpy(args.dest_buf,
-				       args.dest_offset + nbytes,
-				       args.dest_buf_sz,
-				       args.from + payload_offset,
+		nbytes += vidtv_memcpy(args->dest_buf,
+				       args->dest_offset + nbytes,
+				       args->dest_buf_sz,
+				       args->from + payload_offset,
 				       payload_write_len);
 
 		/* 'payload_write_len' written from a total of 'len' requested*/
@@ -246,12 +242,12 @@ static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args args)
 	 * fill the rest of the packet if there is any remaining space unused
 	 */
 
-	nbytes_past_boundary = (args.dest_offset + nbytes) % TS_PACKET_LEN;
+	nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN;
 
-	if (args.is_crc)
-		nbytes += vidtv_memset(args.dest_buf,
-				       args.dest_offset + nbytes,
-				       args.dest_buf_sz,
+	if (args->is_crc)
+		nbytes += vidtv_memset(args->dest_buf,
+				       args->dest_offset + nbytes,
+				       args->dest_buf_sz,
 				       TS_FILL_BYTE,
 				       TS_PACKET_LEN - nbytes_past_boundary);
 
@@ -275,7 +271,7 @@ static u32 table_section_crc32_write_into(struct crc32_write_args args)
 	psi_args.is_crc             = true;
 	psi_args.dest_buf_sz        = args.dest_buf_sz;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	return nbytes;
 }
@@ -662,7 +658,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 	psi_args.dest_buf_sz        = args.dest_buf_sz;
 	psi_args.crc                = args.crc;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	switch (args.desc->type) {
 	case SERVICE_DESCRIPTOR:
@@ -671,25 +667,25 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 			       sizeof_field(struct vidtv_psi_desc_service, provider_name_len);
 		psi_args.from = &((struct vidtv_psi_desc_service *)args.desc)->service_type;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = ((struct vidtv_psi_desc_service *)args.desc)->provider_name_len;
 		psi_args.from = ((struct vidtv_psi_desc_service *)args.desc)->provider_name;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_service, service_name_len);
 		psi_args.from = &((struct vidtv_psi_desc_service *)args.desc)->service_name_len;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = ((struct vidtv_psi_desc_service *)args.desc)->service_name_len;
 		psi_args.from = ((struct vidtv_psi_desc_service *)args.desc)->service_name;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 		break;
 
 	case NETWORK_NAME_DESCRIPTOR:
@@ -697,7 +693,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 		psi_args.len = args.desc->length;
 		psi_args.from = ((struct vidtv_psi_desc_network_name *)args.desc)->network_name;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 		break;
 
 	case SERVICE_LIST_DESCRIPTOR:
@@ -708,7 +704,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 				       sizeof(struct vidtv_psi_desc_service_list_entry *);
 			psi_args.from = serv_list_entry;
 
-			nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+			nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 			serv_list_entry = serv_list_entry->next;
 		}
@@ -720,32 +716,32 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 		psi_args.from = ((struct vidtv_psi_desc_short_event *)
 				  args.desc)->iso_language_code;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, event_name_len);
 		psi_args.from = &((struct vidtv_psi_desc_short_event *)
 				  args.desc)->event_name_len;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name_len;
 		psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, text_len);
 		psi_args.from = &((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		psi_args.dest_offset = args.dest_offset + nbytes;
 		psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
 		psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->text;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		break;
 
@@ -755,7 +751,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 		psi_args.len = args.desc->length;
 		psi_args.from = &args.desc->data;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 		break;
 	}
 
@@ -780,7 +776,7 @@ vidtv_psi_table_header_write_into(struct header_write_args args)
 	psi_args.dest_buf_sz        = args.dest_buf_sz;
 	psi_args.crc                = args.crc;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	return nbytes;
 }
@@ -1014,7 +1010,7 @@ u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
 			   sizeof(struct vidtv_psi_table_pat_program *);
 		psi_args.dest_offset = args.offset + nbytes;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		p = p->next;
 	}
@@ -1207,7 +1203,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 	psi_args.dest_buf_sz        = args.buf_sz;
 	psi_args.crc                = &crc;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (table_descriptor) {
 		/* write the descriptors, if any */
@@ -1232,7 +1228,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 				sizeof_field(struct vidtv_psi_table_pmt_stream, bitfield2);
 		psi_args.dest_offset = args.offset + nbytes;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		stream_descriptor = stream->descriptor;
 
@@ -1360,7 +1356,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 	psi_args.crc                = &crc;
 
 	/* copy u16 network_id + u8 reserved)*/
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (service) {
 		/* copy the services, if any */
@@ -1371,7 +1367,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 			       sizeof(struct vidtv_psi_table_sdt_service *);
 		psi_args.dest_offset = args.offset + nbytes;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		service_desc = service->descriptor;
 
@@ -1694,7 +1690,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 	psi_args.dest_buf_sz        = args.buf_sz;
 	psi_args.crc                = &crc;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (table_descriptor) {
 		/* write the descriptors, if any */
@@ -1718,7 +1714,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 	psi_args.dest_offset = args.offset + nbytes;
 	psi_args.pid = VIDTV_NIT_PID;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (transport) {
 		/* write the transport sections, if any */
@@ -1728,7 +1724,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 				sizeof_field(struct vidtv_psi_table_transport, bitfield);
 		psi_args.dest_offset = args.offset + nbytes;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		transport_descriptor = transport->descriptor;
 
@@ -1907,7 +1903,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 	psi_args.dest_buf_sz        = args.buf_sz;
 	psi_args.crc                = &crc;
 
-	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+	nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 	while (event) {
 		/* copy the events, if any */
@@ -1918,7 +1914,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 			       sizeof(struct vidtv_psi_table_eit_event *);
 		psi_args.dest_offset = args.offset + nbytes;
 
-		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
 
 		event_descriptor = event->descriptor;
 
commit 160028542bb15868c2da0b88bda6335dce221c1c
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 16:57:49 2020 +0100

    media: vidtv: add date to the current event
    
    The current event is using an undefined date. Instead, it
    should be the timestamp when the EIT table was generated.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 77bb560342a6..fcdd61744ab4 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -11,13 +11,16 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ":%s, %d: " fmt, __func__, __LINE__
 
+#include <linux/bcd.h>
 #include <linux/crc32.h>
 #include <linux/kernel.h>
+#include <linux/ktime.h>
 #include <linux/printk.h>
 #include <linux/ratelimit.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/string.h>
+#include <linux/time.h>
 #include <linux/types.h>
 
 #include "vidtv_common.h"
@@ -1953,16 +1956,51 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 struct vidtv_psi_table_eit_event
 *vidtv_psi_eit_event_init(struct vidtv_psi_table_eit_event *head, u16 event_id)
 {
-	const u8 DURATION_ONE_HOUR[] = {1, 0, 0};
+	const u8 DURATION[] = {0x23, 0x59, 0x59}; /* BCD encoded */
 	struct vidtv_psi_table_eit_event *e;
+	struct timespec64 ts;
+	struct tm time;
+	int mjd, l;
+	__be16 mjd_be;
 
 	e = kzalloc(sizeof(*e), GFP_KERNEL);
 	if (!e)
 		return NULL;
 
 	e->event_id = cpu_to_be16(event_id);
-	memset(e->start_time, 0xff, sizeof(e->start_time)); //todo: 0xff means 'unspecified'
-	memcpy(e->duration, DURATION_ONE_HOUR, sizeof(e->duration)); //todo, default to this for now
+
+	ts = ktime_to_timespec64(ktime_get_real());
+	time64_to_tm(ts.tv_sec, 0, &time);
+
+	/* Convert date to Modified Julian Date - per EN 300 468 Annex C */
+	if (time.tm_mon < 2)
+		l = 1;
+	else
+		l = 0;
+
+	mjd = 14956 + time.tm_mday;
+	mjd += (time.tm_year - l) * 36525 / 100;
+	mjd += (time.tm_mon + 2 + l * 12) * 306001 / 10000;
+	mjd_be = cpu_to_be16(mjd);
+
+	/*
+	 * Store MJD and hour/min/sec to the event.
+	 *
+	 * Let's make the event to start on a full hour
+	 */
+	memcpy(e->start_time, &mjd_be, sizeof(mjd_be));
+	e->start_time[2] = bin2bcd(time.tm_hour);
+	e->start_time[3] = 0;
+	e->start_time[4] = 0;
+
+	/*
+	 * TODO: for now, the event will last for a day. Should be
+	 * enough for testing purposes, but if one runs the driver
+	 * for more than that, the current event will become invalid.
+	 * So, we need a better code here in order to change the start
+	 * time once the event expires.
+	 */
+	memcpy(e->duration, DURATION, sizeof(e->duration));
 
 	e->bitfield = cpu_to_be16(RUNNING << 13);
 
commit bfa4aaebe8c097439feee65f8d39a3bb541b0aea
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 18:40:29 2020 +0100

    media: vidtv: fix service_id at SDT table
    
    The service_id there should be equal to the one used
    on other tables, otherwise, EIT entries won't be valid.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index 4aab3bb67001..8ad6c0744d36 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -424,7 +424,8 @@ int vidtv_channel_si_init(struct vidtv_mux *m)
 	if (!m->si.pat)
 		return -ENOMEM;
 
-	m->si.sdt = vidtv_psi_sdt_table_init(m->transport_stream_id);
+	m->si.sdt = vidtv_psi_sdt_table_init(m->network_id,
+					     m->transport_stream_id);
 	if (!m->si.sdt)
 		goto free_pat;
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 5c887639b676..77bb560342a6 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1271,7 +1271,8 @@ void vidtv_psi_pmt_table_destroy(struct vidtv_psi_table_pmt *pmt)
 	kfree(pmt);
 }
 
-struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id)
+struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 network_id,
+						     u16 transport_stream_id)
 {
 	struct vidtv_psi_table_sdt *sdt;
 	const u16 RESERVED = 0xff;
@@ -1307,7 +1308,7 @@ struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id)
 	 * This can be changed to something more useful, when support for
 	 * NIT gets added
 	 */
-	sdt->network_id = cpu_to_be16(0xff01);
+	sdt->network_id = cpu_to_be16(network_id);
 	sdt->reserved = RESERVED;
 
 	vidtv_psi_sdt_table_update_sec_len(sdt);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 4b64715d5759..d30c8dd53d11 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -366,7 +366,8 @@ struct vidtv_psi_table_pat *vidtv_psi_pat_table_init(u16 transport_stream_id);
 struct vidtv_psi_table_pmt *vidtv_psi_pmt_table_init(u16 program_number,
 						     u16 pcr_pid);
 
-struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id);
+struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 network_id,
+						     u16 transport_stream_id);
 
 struct vidtv_psi_table_sdt_service*
 vidtv_psi_sdt_service_init(struct vidtv_psi_table_sdt_service *head,
commit 11f4933f7bc955c16a54bf402383c5d7e4cfa8dc
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 18:04:14 2020 +0100

    media: vidtv: fix service type
    
    As the service currently broadcasts just audio, change the
    service type to reflect that.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index c3261494120e..4aab3bb67001 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -81,7 +81,7 @@ struct vidtv_channel
 
 	s302m->service->descriptor = (struct vidtv_psi_desc *)
 				     vidtv_psi_service_desc_init(NULL,
-								 DIGITAL_TELEVISION_SERVICE,
+								 DIGITAL_RADIO_SOUND_SERVICE,
 								 name,
 								 provider);
 	if (!s302m->service->descriptor)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index c3bd440e1320..4b64715d5759 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -220,6 +220,7 @@ enum service_running_status {
 enum service_type {
 	/* see ETSI EN 300 468 v1.15.1 p. 77 */
 	DIGITAL_TELEVISION_SERVICE = 0x1,
+	DIGITAL_RADIO_SOUND_SERVICE = 0X2,
 };
 
 /**
commit 039b7caed173667eccd8725509f3995c661aae82
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 14:16:40 2020 +0100

    media: vidtv: add a PID entry for the NIT table
    
    On normal TS streams, the NIT table has its own entry at PAT,
    but not at PMT.
    
    While here, properly handle alloc problems when creating
    PMT entries.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index 77e33f33afee..c3261494120e 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -45,6 +45,7 @@ static void vidtv_channel_encoder_destroy(struct vidtv_encoder *e)
 }
 
 #define ENCODING_ISO8859_15 "\x0b"
+#define TS_NIT_PID	0x10
 
 /*
  * init an audio only channel with a s302m encoder
@@ -296,6 +297,8 @@ vidtv_channel_pat_prog_cat_into_new(struct vidtv_mux *m)
 
 		cur_chnl = cur_chnl->next;
 	}
+	/* Add the NIT table */
+	vidtv_psi_pat_program_init(tail, 0, TS_NIT_PID);
 
 	return head;
 }
@@ -471,7 +474,7 @@ int vidtv_channel_si_init(struct vidtv_mux *m)
 
 	vidtv_channel_pmt_match_sections(m->channels,
 					 m->si.pmt_secs,
-					 m->si.pat->programs);
+					 m->si.pat->num_pmt);
 
 	vidtv_channel_destroy_service_list(service_list);
 
@@ -498,12 +501,11 @@ free_pat:
 
 void vidtv_channel_si_destroy(struct vidtv_mux *m)
 {
-	u16 num_programs = m->si.pat->programs;
 	u32 i;
 
 	vidtv_psi_pat_table_destroy(m->si.pat);
 
-	for (i = 0; i < num_programs; ++i)
+	for (i = 0; i < m->si.pat->num_pmt; ++i)
 		vidtv_psi_pmt_table_destroy(m->si.pmt_secs[i]);
 
 	kfree(m->si.pmt_secs);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index e0cc74e98632..0cf784c09024 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -175,7 +175,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 
 	m->mux_buf_offset += vidtv_psi_pat_write_into(pat_args);
 
-	for (i = 0; i < m->si.pat->programs; ++i) {
+	for (i = 0; i < m->si.pat->num_pmt; ++i) {
 		pmt_pid = vidtv_psi_pmt_get_pid(m->si.pmt_secs[i],
 						m->si.pat);
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 02dd217bdbf6..5c887639b676 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -794,7 +794,7 @@ vidtv_psi_pat_table_update_sec_len(struct vidtv_psi_table_pat *pat)
 	length += PAT_LEN_UNTIL_LAST_SECTION_NUMBER;
 
 	/* do not count the pointer */
-	for (i = 0; i < pat->programs; ++i)
+	for (i = 0; i < pat->num_pat; ++i)
 		length += sizeof(struct vidtv_psi_table_pat_program) -
 			  sizeof(struct vidtv_psi_table_pat_program *);
 
@@ -931,7 +931,7 @@ vidtv_psi_pat_program_assign(struct vidtv_psi_table_pat *pat,
 			program = program->next;
 		}
 
-		pat->programs = program_count;
+		pat->num_pat = program_count;
 		pat->program  = p;
 
 		/* Recompute section length */
@@ -966,8 +966,6 @@ struct vidtv_psi_table_pat *vidtv_psi_pat_table_init(u16 transport_stream_id)
 	pat->header.section_id   = 0x0;
 	pat->header.last_section = 0x0;
 
-	pat->programs = 0;
-
 	vidtv_psi_pat_table_update_sec_len(pat);
 
 	return pat;
@@ -1488,22 +1486,43 @@ vidtv_psi_pmt_create_sec_for_each_pat_entry(struct vidtv_psi_table_pat *pat,
 					    u16 pcr_pid)
 
 {
-	struct vidtv_psi_table_pat_program *program = pat->program;
+	struct vidtv_psi_table_pat_program *program;
 	struct vidtv_psi_table_pmt **pmt_secs;
-	u32 i = 0;
+	u32 i = 0, num_pmt = 0;
 
-	/* a section for each program_id */
-	pmt_secs = kcalloc(pat->programs,
+	/*
+	 * The number of PMT entries is the number of PAT entries
+	 * that contain service_id. That exclude special tables, like NIT
+	 */
+	program = pat->program;
+	while (program) {
+		if (program->service_id)
+			num_pmt++;
+		program = program->next;
+	}
+
+	pmt_secs = kcalloc(num_pmt,
 			   sizeof(struct vidtv_psi_table_pmt *),
 			   GFP_KERNEL);
 	if (!pmt_secs)
 		return NULL;
 
-	while (program) {
-		pmt_secs[i] = vidtv_psi_pmt_table_init(be16_to_cpu(program->service_id), pcr_pid);
-		++i;
-		program = program->next;
+	for (program = pat->program; program; program = program->next) {
+		if (!program->service_id)
+			continue;
+		pmt_secs[i] = vidtv_psi_pmt_table_init(be16_to_cpu(program->service_id),
+						       pcr_pid);
+
+		if (!pmt_secs[i]) {
+			while (i > 0) {
+				i--;
+				vidtv_psi_pmt_table_destroy(pmt_secs[i]);
+			}
+			return NULL;
+		}
+		i++;
 	}
+	pat->num_pmt = num_pmt;
 
 	return pmt_secs;
 }
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index d8645d75c3f1..c3bd440e1320 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -174,7 +174,8 @@ struct vidtv_psi_table_pat_program {
  */
 struct vidtv_psi_table_pat {
 	struct vidtv_psi_table_header header;
-	u16 programs; /* Included by libdvbv5, not part of the table and not actually serialized */
+	u16 num_pat;
+	u16 num_pmt;
 	struct vidtv_psi_table_pat_program *program;
 } __packed;
 
commit 91a8a240e2806c37eaf730347831f4a7de1535ac
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 13:51:31 2020 +0100

    media: vidtv: properly fill EIT service_id
    
    The EIT header ID field should not contain the network ID, but,
    instead, the service_id of the program described at EIT.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index b49fb61847e1..77e33f33afee 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -450,7 +450,8 @@ int vidtv_channel_si_init(struct vidtv_mux *m)
 		goto free_service_list;
 
 	m->si.eit = vidtv_psi_eit_table_init(m->network_id,
-					     m->transport_stream_id);
+					     m->transport_stream_id,
+					     programs->service_id);
 	if (!m->si.eit)
 		goto free_nit;
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 341af312ad56..02dd217bdbf6 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1809,7 +1809,8 @@ void vidtv_psi_eit_event_assign(struct vidtv_psi_table_eit *eit,
 
 struct vidtv_psi_table_eit
 *vidtv_psi_eit_table_init(u16 network_id,
-			  u16 transport_stream_id)
+			  u16 transport_stream_id,
+			  __be16 service_id)
 {
 	struct vidtv_psi_table_eit *eit;
 	const u16 SYNTAX = 0x1;
@@ -1824,7 +1825,7 @@ struct vidtv_psi_table_eit
 
 	eit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12));
 
-	eit->header.id = cpu_to_be16(network_id);
+	eit->header.id = service_id;
 	eit->header.current_next = ONE;
 
 	eit->header.version = 0x1f;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 4fcb2c0615bb..d8645d75c3f1 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -738,7 +738,8 @@ struct vidtv_psi_table_eit {
 
 struct vidtv_psi_table_eit
 *vidtv_psi_eit_table_init(u16 network_id,
-			  u16 transport_stream_id);
+			  u16 transport_stream_id,
+			  u16 service_id);
 
 /**
  * struct vidtv_psi_eit_write_args - Arguments for writing an EIT section
commit 1d2b2a6d8c599be2cbb1e984eeb970186694ef38
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 12:20:45 2020 +0100

    media: vidtv: fix the network ID range
    
    As defined at ETSI TS 101 162, original network IDs up to 0xfebf
    are reserved for registration at dvb.org.
    
    Let's use, instead, an original network ID at the range
    0xff00-0xffff, as this is for private temporary usage.
    
    As the same value is also used for the network ID,
    the range 0xff01-0xffff also fits better, as values
    lower than that depend if the network is used for
    satellite, terrestrial, cable of CI.
    
    While here, move the TS ID to the bridge code, where it
    is used, and change its value, as it was identical to
    the value previously used by network ID. While we could
    keep the same value, let's change it, just to make easier
    to check for the new code while reading it with DVB tools
    like dvbinspector.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
index d428bdb47ae4..fc64d0c8492a 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
@@ -29,8 +29,9 @@
 #define MUX_BUF_MAX_SZ (MUX_BUF_MIN_SZ * 10)
 #define TUNER_DEFAULT_ADDR 0x68
 #define DEMOD_DEFAULT_ADDR 0x60
-#define VIDTV_DEFAULT_NETWORK_ID 0x744
+#define VIDTV_DEFAULT_NETWORK_ID 0xff44
 #define VIDTV_DEFAULT_NETWORK_NAME "LinuxTV.org"
+#define VIDTV_DEFAULT_TS_ID 0x4081
 
 /*
  * The LNBf fake parameters here are the ranges used by an
diff --git a/drivers/media/test-drivers/vidtv/vidtv_common.h b/drivers/media/test-drivers/vidtv/vidtv_common.h
index 818e7f2b9ec5..42f63fdee681 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_common.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_common.h
@@ -16,7 +16,6 @@
 #define CLOCK_UNIT_27MHZ 27000000
 #define VIDTV_SLEEP_USECS 10000
 #define VIDTV_MAX_SLEEP_USECS (2 * VIDTV_SLEEP_USECS)
-#define VIDTV_DEFAULT_TS_ID 0x744
 
 u32 vidtv_memcpy(void *to,
 		 size_t to_offset,
commit b9e09e06e32e61269342e34f41321499da50d428
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 23 11:24:11 2020 +0100

    media: vidtv: improve EIT data
    
    Place some text at EIT data, and use ISO 8859-15 encoding for
    the German letter "ü" (u mit umlat) letter.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index 8206bcefd7c7..b49fb61847e1 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -53,8 +53,8 @@ struct vidtv_channel
 *vidtv_channel_s302m_init(struct vidtv_channel *head, u16 transport_stream_id)
 {
 	const __be32 s302m_fid              = cpu_to_be32(VIDTV_S302M_FORMAT_IDENTIFIER);
-	char *event_text = ENCODING_ISO8859_15 "Beethoven's Für Elise";
-	char *event_name = ENCODING_ISO8859_15 "Beethoven Music";
+	char *event_text = ENCODING_ISO8859_15 "Bagatelle No. 25 in A minor for solo piano, also known as F\xfcr Elise, composed by Ludwig van Beethoven";
+	char *event_name = ENCODING_ISO8859_15 "Ludwig van Beethoven: F\xfcr Elise";
 	struct vidtv_s302m_encoder_init_args encoder_args = {};
 	char *iso_language_code = ENCODING_ISO8859_15 "eng";
 	char *provider = ENCODING_ISO8859_15 "LinuxTV.org";
commit ec3eda53f4aec2e1a9cd0df27c12c95e02f8aec0
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Fri Nov 20 11:15:24 2020 +0100

    media: vidtv: cleanup null packet initialization logic
    
    Initialize the destination buffer/size and the initial
    offset when creating the local var.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 728ae7c78827..e0cc74e98632 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -348,7 +348,11 @@ static u32 vidtv_mux_poll_encoders(struct vidtv_mux *m)
 
 static u32 vidtv_mux_pad_with_nulls(struct vidtv_mux *m, u32 npkts)
 {
-	struct null_packet_write_args args = {};
+	struct null_packet_write_args args = {
+		.dest_buf           = m->mux_buf,
+		.buf_sz             = m->mux_buf_sz,
+		.dest_offset        = m->mux_buf_offset,
+	};
 	u32 initial_offset = m->mux_buf_offset;
 	struct vidtv_mux_pid_ctx *ctx;
 	u32 nbytes;
@@ -356,10 +360,7 @@ static u32 vidtv_mux_pad_with_nulls(struct vidtv_mux *m, u32 npkts)
 
 	ctx = vidtv_mux_get_pid_ctx(m, TS_NULL_PACKET_PID);
 
-	args.dest_buf           = m->mux_buf;
-	args.buf_sz             = m->mux_buf_sz;
 	args.continuity_counter = &ctx->cc;
-	args.dest_offset        = m->mux_buf_offset;
 
 	for (i = 0; i < npkts; ++i) {
 		m->mux_buf_offset += vidtv_ts_null_write_into(args);
commit c857b065abf9bd8f2064cbf82c03aba7277fe2e1
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Fri Nov 20 10:51:50 2020 +0100

    media: vidtv: pre-initialize mux arrays
    
    Instead of first zeroing all fields at the mux structs and
    then filling, do some initialization for the const data
    when they're created.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 6df9cfd7f33b..728ae7c78827 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -129,11 +129,32 @@ static void vidtv_mux_update_clk(struct vidtv_mux *m)
 
 static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 {
-	struct vidtv_psi_pat_write_args pat_args = {};
-	struct vidtv_psi_pmt_write_args pmt_args = {};
-	struct vidtv_psi_sdt_write_args sdt_args = {};
-	struct vidtv_psi_nit_write_args nit_args = {};
-	struct vidtv_psi_eit_write_args eit_args = {};
+	struct vidtv_psi_pat_write_args pat_args = {
+		.buf                = m->mux_buf,
+		.buf_sz             = m->mux_buf_sz,
+		.pat                = m->si.pat,
+	};
+	struct vidtv_psi_pmt_write_args pmt_args = {
+		.buf                = m->mux_buf,
+		.buf_sz             = m->mux_buf_sz,
+		.pcr_pid            = m->pcr_pid,
+	};
+	struct vidtv_psi_sdt_write_args sdt_args = {
+		.buf                = m->mux_buf,
+		.buf_sz             = m->mux_buf_sz,
+		.sdt                = m->si.sdt,
+	};
+	struct vidtv_psi_nit_write_args nit_args = {
+		.buf                = m->mux_buf,
+		.buf_sz             = m->mux_buf_sz,
+		.nit                = m->si.nit,
+
+	};
+	struct vidtv_psi_eit_write_args eit_args = {
+		.buf                = m->mux_buf,
+		.buf_sz             = m->mux_buf_sz,
+		.eit                = m->si.eit,
+	};
 	u32 initial_offset = m->mux_buf_offset;
 	struct vidtv_mux_pid_ctx *pat_ctx;
 	struct vidtv_mux_pid_ctx *pmt_ctx;
@@ -149,10 +170,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	nit_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_NIT_PID);
 	eit_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_EIT_PID);
 
-	pat_args.buf                = m->mux_buf;
 	pat_args.offset             = m->mux_buf_offset;
-	pat_args.pat                = m->si.pat;
-	pat_args.buf_sz             = m->mux_buf_sz;
 	pat_args.continuity_counter = &pat_ctx->cc;
 
 	m->mux_buf_offset += vidtv_psi_pat_write_into(pat_args);
@@ -169,38 +187,26 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 
 		pmt_ctx = vidtv_mux_get_pid_ctx(m, pmt_pid);
 
-		pmt_args.buf                = m->mux_buf;
 		pmt_args.offset             = m->mux_buf_offset;
 		pmt_args.pmt                = m->si.pmt_secs[i];
 		pmt_args.pid                = pmt_pid;
-		pmt_args.buf_sz             = m->mux_buf_sz;
 		pmt_args.continuity_counter = &pmt_ctx->cc;
-		pmt_args.pcr_pid            = m->pcr_pid;
 
 		/* write each section into buffer */
 		m->mux_buf_offset += vidtv_psi_pmt_write_into(pmt_args);
 	}
 
-	sdt_args.buf                = m->mux_buf;
 	sdt_args.offset             = m->mux_buf_offset;
-	sdt_args.sdt                = m->si.sdt;
-	sdt_args.buf_sz             = m->mux_buf_sz;
 	sdt_args.continuity_counter = &sdt_ctx->cc;
 
 	m->mux_buf_offset += vidtv_psi_sdt_write_into(sdt_args);
 
-	nit_args.buf                = m->mux_buf;
 	nit_args.offset             = m->mux_buf_offset;
-	nit_args.nit                = m->si.nit;
-	nit_args.buf_sz             = m->mux_buf_sz;
 	nit_args.continuity_counter = &nit_ctx->cc;
 
 	m->mux_buf_offset += vidtv_psi_nit_write_into(nit_args);
 
-	eit_args.buf                = m->mux_buf;
 	eit_args.offset             = m->mux_buf_offset;
-	eit_args.eit                = m->si.eit;
-	eit_args.buf_sz             = m->mux_buf_sz;
 	eit_args.continuity_counter = &eit_ctx->cc;
 
 	m->mux_buf_offset += vidtv_psi_eit_write_into(eit_args);
commit 330d135679e55659448953c80753c33ef16383aa
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Fri Nov 20 09:39:03 2020 +0100

    media: vidtv: remove some unused functions
    
    Right now, there's no need to access the length of some
    tables. So, drop the unused functions.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 375e01480d3d..341af312ad56 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -89,41 +89,6 @@ static void vidtv_psi_update_version_num(struct vidtv_psi_table_header *h)
 	h->version++;
 }
 
-static u16
-vidtv_psi_sdt_serv_get_desc_loop_len(struct vidtv_psi_table_sdt_service *s)
-{
-	u16 mask;
-	u16 ret;
-
-	mask = GENMASK(11, 0);
-
-	ret = be16_to_cpu(s->bitfield) & mask;
-	return ret;
-}
-
-static u16
-vidtv_psi_pmt_stream_get_desc_loop_len(struct vidtv_psi_table_pmt_stream *s)
-{
-	u16 mask;
-	u16 ret;
-
-	mask = GENMASK(9, 0);
-
-	ret = be16_to_cpu(s->bitfield2) & mask;
-	return ret;
-}
-
-static u16 vidtv_psi_pmt_get_desc_loop_len(struct vidtv_psi_table_pmt *p)
-{
-	u16 mask;
-	u16 ret;
-
-	mask = GENMASK(9, 0);
-
-	ret = be16_to_cpu(p->bitfield2) & mask;
-	return ret;
-}
-
 static u16 vidtv_psi_get_sec_len(struct vidtv_psi_table_header *h)
 {
 	u16 mask;
commit a8bd461ca3b32468777d054d9a0e050be5a418e9
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Sep 22 16:43:56 2020 +0200

    media: vidtv: do some cleanups at the driver
    
    Do some cleanups at the coding style of the driver:
    - remove "inline" declarations;
    - use reverse xmas-tree for local var declarations;
    - Adjust some indent to avoid breaking 80-cols;
    - Cleanup some comments.
    
    No functional changes.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
index 3fc7bf00a3e5..d428bdb47ae4 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
@@ -4,7 +4,8 @@
  * validate the existing APIs in the media subsystem. It can also aid
  * developers working on userspace applications.
  *
- * When this module is loaded, it will attempt to modprobe 'dvb_vidtv_tuner' and 'dvb_vidtv_demod'.
+ * When this module is loaded, it will attempt to modprobe 'dvb_vidtv_tuner'
+ * and 'dvb_vidtv_demod'.
  *
  * Copyright (C) 2020 Daniel W. S. Almeida
  */
@@ -24,18 +25,21 @@
 #include "vidtv_ts.h"
 #include "vidtv_tuner.h"
 
-//#define MUX_BUF_MAX_SZ
-//#define MUX_BUF_MIN_SZ
+#define MUX_BUF_MIN_SZ 90164
+#define MUX_BUF_MAX_SZ (MUX_BUF_MIN_SZ * 10)
 #define TUNER_DEFAULT_ADDR 0x68
 #define DEMOD_DEFAULT_ADDR 0x60
 #define VIDTV_DEFAULT_NETWORK_ID 0x744
 #define VIDTV_DEFAULT_NETWORK_NAME "LinuxTV.org"
 
-/* LNBf fake parameters: ranges used by an Universal (extended) European LNBf */
-#define LNB_CUT_FREQUENCY	11700000
-#define LNB_LOW_FREQ		9750000
-#define LNB_HIGH_FREQ		10600000
-
+/*
+ * The LNBf fake parameters here are the ranges used by an
+ * Universal (extended) European LNBf, which is likely the most common LNBf
+ * found on Satellite digital TV system nowadays.
+ */
+#define LNB_CUT_FREQUENCY	11700000	/* high IF frequency */
+#define LNB_LOW_FREQ		9750000		/* low IF frequency */
+#define LNB_HIGH_FREQ		10600000	/* transition frequency */
 
 static unsigned int drop_tslock_prob_on_low_snr;
 module_param(drop_tslock_prob_on_low_snr, uint, 0);
@@ -94,7 +98,8 @@ MODULE_PARM_DESC(si_period_msec, "How often to send SI packets. Default: 40ms");
 
 static unsigned int pcr_period_msec = 40;
 module_param(pcr_period_msec, uint, 0);
-MODULE_PARM_DESC(pcr_period_msec, "How often to send PCR packets. Default: 40ms");
+MODULE_PARM_DESC(pcr_period_msec,
+		 "How often to send PCR packets. Default: 40ms");
 
 static unsigned int mux_rate_kbytes_sec = 4096;
 module_param(mux_rate_kbytes_sec, uint, 0);
@@ -106,16 +111,14 @@ MODULE_PARM_DESC(pcr_pid, "PCR PID for all channels: defaults to 0x200");
 
 static unsigned int mux_buf_sz_pkts;
 module_param(mux_buf_sz_pkts, uint, 0);
-MODULE_PARM_DESC(mux_buf_sz_pkts, "Size for the internal mux buffer in multiples of 188 bytes");
-
-#define MUX_BUF_MIN_SZ 90164
-#define MUX_BUF_MAX_SZ (MUX_BUF_MIN_SZ * 10)
+MODULE_PARM_DESC(mux_buf_sz_pkts,
+		 "Size for the internal mux buffer in multiples of 188 bytes");
 
 static u32 vidtv_bridge_mux_buf_sz_for_mux_rate(void)
 {
 	u32 max_elapsed_time_msecs =  VIDTV_MAX_SLEEP_USECS / USEC_PER_MSEC;
-	u32 nbytes_expected;
 	u32 mux_buf_sz = mux_buf_sz_pkts * TS_PACKET_LEN;
+	u32 nbytes_expected;
 
 	nbytes_expected = mux_rate_kbytes_sec;
 	nbytes_expected *= max_elapsed_time_msecs;
@@ -145,14 +148,12 @@ static bool vidtv_bridge_check_demod_lock(struct vidtv_dvb *dvb, u32 n)
 			  FE_HAS_LOCK);
 }
 
-static void
-vidtv_bridge_on_new_pkts_avail(void *priv, u8 *buf, u32 npkts)
+/*
+ * called on a separate thread by the mux when new packets become available
+ */
+static void vidtv_bridge_on_new_pkts_avail(void *priv, u8 *buf, u32 npkts)
 {
-	/*
-	 * called on a separate thread by the mux when new packets become
-	 * available
-	 */
-	struct vidtv_dvb *dvb = (struct vidtv_dvb *)priv;
+	struct vidtv_dvb *dvb = priv;
 
 	/* drop packets if we lose the lock */
 	if (vidtv_bridge_check_demod_lock(dvb, 0))
@@ -180,8 +181,10 @@ static int vidtv_start_streaming(struct vidtv_dvb *dvb)
 		return 0;
 	}
 
-	mux_buf_sz = (mux_buf_sz_pkts) ? mux_buf_sz_pkts :
-					 vidtv_bridge_mux_buf_sz_for_mux_rate();
+	if (mux_buf_sz_pkts)
+		mux_buf_sz = mux_buf_sz_pkts;
+	else
+		mux_buf_sz = vidtv_bridge_mux_buf_sz_for_mux_rate();
 
 	mux_args.mux_buf_sz  = mux_buf_sz;
 
@@ -212,8 +215,8 @@ static int vidtv_start_feed(struct dvb_demux_feed *feed)
 {
 	struct dvb_demux *demux = feed->demux;
 	struct vidtv_dvb *dvb   = demux->priv;
-	int rc;
 	int ret;
+	int rc;
 
 	if (!demux->dmx.frontend)
 		return -EINVAL;
@@ -251,9 +254,9 @@ static int vidtv_stop_feed(struct dvb_demux_feed *feed)
 
 static struct dvb_frontend *vidtv_get_frontend_ptr(struct i2c_client *c)
 {
-	/* the demod will set this when its probe function runs */
 	struct vidtv_demod_state *state = i2c_get_clientdata(c);
 
+	/* the demod will set this when its probe function runs */
 	return &state->frontend;
 }
 
@@ -261,6 +264,11 @@ static int vidtv_master_xfer(struct i2c_adapter *i2c_adap,
 			     struct i2c_msg msgs[],
 			     int num)
 {
+	/*
+	 * Right now, this virtual driver doesn't really send or receive
+	 * messages from I2C. A real driver will require an implementation
+	 * here.
+	 */
 	return 0;
 }
 
@@ -328,11 +336,10 @@ static int vidtv_bridge_dmxdev_init(struct vidtv_dvb *dvb)
 
 static int vidtv_bridge_probe_demod(struct vidtv_dvb *dvb, u32 n)
 {
-	struct vidtv_demod_config cfg = {};
-
-	cfg.drop_tslock_prob_on_low_snr     = drop_tslock_prob_on_low_snr;
-	cfg.recover_tslock_prob_on_good_snr = recover_tslock_prob_on_good_snr;
-
+	struct vidtv_demod_config cfg = {
+		.drop_tslock_prob_on_low_snr     = drop_tslock_prob_on_low_snr,
+		.recover_tslock_prob_on_good_snr = recover_tslock_prob_on_good_snr,
+	};
 	dvb->i2c_client_demod[n] = dvb_module_probe("dvb_vidtv_demod",
 						    NULL,
 						    &dvb->i2c_adapter,
@@ -351,14 +358,14 @@ static int vidtv_bridge_probe_demod(struct vidtv_dvb *dvb, u32 n)
 
 static int vidtv_bridge_probe_tuner(struct vidtv_dvb *dvb, u32 n)
 {
-	struct vidtv_tuner_config cfg = {};
+	struct vidtv_tuner_config cfg = {
+		.fe                       = dvb->fe[n],
+		.mock_power_up_delay_msec = mock_power_up_delay_msec,
+		.mock_tune_delay_msec     = mock_tune_delay_msec,
+	};
 	u32 freq;
 	int i;
 
-	cfg.fe                       = dvb->fe[n];
-	cfg.mock_power_up_delay_msec = mock_power_up_delay_msec;
-	cfg.mock_tune_delay_msec     = mock_tune_delay_msec;
-
 	/* TODO: check if the frequencies are at a valid range */
 
 	memcpy(cfg.vidtv_valid_dvb_t_freqs,
@@ -397,9 +404,7 @@ static int vidtv_bridge_probe_tuner(struct vidtv_dvb *dvb, u32 n)
 
 static int vidtv_bridge_dvb_init(struct vidtv_dvb *dvb)
 {
-	int ret;
-	int i;
-	int j;
+	int ret, i, j;
 
 	ret = vidtv_bridge_i2c_register_adap(dvb);
 	if (ret < 0)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index f64a68dea234..8206bcefd7c7 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -33,8 +33,8 @@
 
 static void vidtv_channel_encoder_destroy(struct vidtv_encoder *e)
 {
-	struct vidtv_encoder *curr = e;
 	struct vidtv_encoder *tmp = NULL;
+	struct vidtv_encoder *curr = e;
 
 	while (curr) {
 		/* forward the call to the derived type */
@@ -46,25 +46,25 @@ static void vidtv_channel_encoder_destroy(struct vidtv_encoder *e)
 
 #define ENCODING_ISO8859_15 "\x0b"
 
+/*
+ * init an audio only channel with a s302m encoder
+ */
 struct vidtv_channel
 *vidtv_channel_s302m_init(struct vidtv_channel *head, u16 transport_stream_id)
 {
-	/*
-	 * init an audio only channel with a s302m encoder
-	 */
-	const u16 s302m_service_id          = 0x880;
-	const u16 s302m_program_num         = 0x880;
-	const u16 s302m_program_pid         = 0x101; /* packet id for PMT*/
-	const u16 s302m_es_pid              = 0x111; /* packet id for the ES */
 	const __be32 s302m_fid              = cpu_to_be32(VIDTV_S302M_FORMAT_IDENTIFIER);
-	char *name = ENCODING_ISO8859_15 "Beethoven";
-	char *provider = ENCODING_ISO8859_15 "LinuxTV.org";
-	char *iso_language_code = ENCODING_ISO8859_15 "eng";
-	char *event_name = ENCODING_ISO8859_15 "Beethoven Music";
 	char *event_text = ENCODING_ISO8859_15 "Beethoven's Für Elise";
+	char *event_name = ENCODING_ISO8859_15 "Beethoven Music";
+	struct vidtv_s302m_encoder_init_args encoder_args = {};
+	char *iso_language_code = ENCODING_ISO8859_15 "eng";
+	char *provider = ENCODING_ISO8859_15 "LinuxTV.org";
+	char *name = ENCODING_ISO8859_15 "Beethoven";
+	const u16 s302m_es_pid              = 0x111; /* packet id for the ES */
+	const u16 s302m_program_pid         = 0x101; /* packet id for PMT*/
+	const u16 s302m_service_id          = 0x880;
+	const u16 s302m_program_num         = 0x880;
 	const u16 s302m_beethoven_event_id  = 1;
 	struct vidtv_channel *s302m;
-	struct vidtv_s302m_encoder_init_args encoder_args = {};
 
 	s302m = kzalloc(sizeof(*s302m), GFP_KERNEL);
 	if (!s302m)
@@ -159,11 +159,9 @@ static struct vidtv_psi_table_eit_event
 {
 	/* Concatenate the events */
 	const struct vidtv_channel *cur_chnl = m->channels;
-
 	struct vidtv_psi_table_eit_event *curr = NULL;
 	struct vidtv_psi_table_eit_event *head = NULL;
 	struct vidtv_psi_table_eit_event *tail = NULL;
-
 	struct vidtv_psi_desc *desc = NULL;
 	u16 event_id;
 
@@ -175,7 +173,8 @@ static struct vidtv_psi_table_eit_event
 
 		if (!curr)
 			dev_warn_ratelimited(m->dev,
-					     "No events found for channel %s\n", cur_chnl->name);
+					     "No events found for channel %s\n",
+					     cur_chnl->name);
 
 		while (curr) {
 			event_id = be16_to_cpu(curr->event_id);
@@ -221,7 +220,8 @@ static struct vidtv_psi_table_sdt_service
 
 		if (!curr)
 			dev_warn_ratelimited(m->dev,
-					     "No services found for channel %s\n", cur_chnl->name);
+					     "No services found for channel %s\n",
+					     cur_chnl->name);
 
 		while (curr) {
 			service_id = be16_to_cpu(curr->service_id);
@@ -300,26 +300,24 @@ vidtv_channel_pat_prog_cat_into_new(struct vidtv_mux *m)
 	return head;
 }
 
+/*
+ * Match channels to their respective PMT sections, then assign the
+ * streams
+ */
 static void
 vidtv_channel_pmt_match_sections(struct vidtv_channel *channels,
 				 struct vidtv_psi_table_pmt **sections,
 				 u32 nsections)
 {
-	/*
-	 * Match channels to their respective PMT sections, then assign the
-	 * streams
-	 */
 	struct vidtv_psi_table_pmt *curr_section = NULL;
-	struct vidtv_channel *cur_chnl = channels;
-
-	struct vidtv_psi_table_pmt_stream *s = NULL;
 	struct vidtv_psi_table_pmt_stream *head = NULL;
 	struct vidtv_psi_table_pmt_stream *tail = NULL;
-
+	struct vidtv_psi_table_pmt_stream *s = NULL;
+	struct vidtv_channel *cur_chnl = channels;
 	struct vidtv_psi_desc *desc = NULL;
-	u32 j;
-	u16 curr_id;
 	u16 e_pid; /* elementary stream pid */
+	u16 curr_id;
+	u32 j;
 
 	while (cur_chnl) {
 		for (j = 0; j < nsections; ++j) {
@@ -345,7 +343,8 @@ vidtv_channel_pmt_match_sections(struct vidtv_channel *channels,
 						head = tail;
 
 					desc = vidtv_psi_desc_clone(s->descriptor);
-					vidtv_psi_desc_assign(&tail->descriptor, desc);
+					vidtv_psi_desc_assign(&tail->descriptor,
+							      desc);
 
 					s = s->next;
 				}
@@ -359,7 +358,8 @@ vidtv_channel_pmt_match_sections(struct vidtv_channel *channels,
 	}
 }
 
-static void vidtv_channel_destroy_service_list(struct vidtv_psi_desc_service_list_entry *e)
+static void
+vidtv_channel_destroy_service_list(struct vidtv_psi_desc_service_list_entry *e)
 {
 	struct vidtv_psi_desc_service_list_entry *tmp;
 
@@ -412,9 +412,9 @@ next_desc:
 
 int vidtv_channel_si_init(struct vidtv_mux *m)
 {
+	struct vidtv_psi_desc_service_list_entry *service_list = NULL;
 	struct vidtv_psi_table_pat_program *programs = NULL;
 	struct vidtv_psi_table_sdt_service *services = NULL;
-	struct vidtv_psi_desc_service_list_entry *service_list = NULL;
 	struct vidtv_psi_table_eit_event *events = NULL;
 
 	m->si.pat = vidtv_psi_pat_table_init(m->transport_stream_id);
@@ -449,11 +449,11 @@ int vidtv_channel_si_init(struct vidtv_mux *m)
 	if (!m->si.nit)
 		goto free_service_list;
 
-	m->si.eit = vidtv_psi_eit_table_init(m->network_id, m->transport_stream_id);
+	m->si.eit = vidtv_psi_eit_table_init(m->network_id,
+					     m->transport_stream_id);
 	if (!m->si.eit)
 		goto free_nit;
 
-
 	/* assemble all programs and assign to PAT */
 	vidtv_psi_pat_program_assign(m->si.pat, programs);
 
@@ -463,7 +463,8 @@ int vidtv_channel_si_init(struct vidtv_mux *m)
 	/* assemble all events and assign to EIT */
 	vidtv_psi_eit_event_assign(m->si.eit, events);
 
-	m->si.pmt_secs = vidtv_psi_pmt_create_sec_for_each_pat_entry(m->si.pat, m->pcr_pid);
+	m->si.pmt_secs = vidtv_psi_pmt_create_sec_for_each_pat_entry(m->si.pat,
+								     m->pcr_pid);
 	if (!m->si.pmt_secs)
 		goto free_eit;
 
@@ -496,8 +497,8 @@ free_pat:
 
 void vidtv_channel_si_destroy(struct vidtv_mux *m)
 {
-	u32 i;
 	u16 num_programs = m->si.pat->programs;
+	u32 i;
 
 	vidtv_psi_pat_table_destroy(m->si.pat);
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_demod.c b/drivers/media/test-drivers/vidtv/vidtv_demod.c
index 63ac55b81f39..b7823d97b30d 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_demod.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_demod.c
@@ -193,7 +193,6 @@ static void vidtv_demod_update_stats(struct dvb_frontend *fe)
 
 	c->cnr.stat[0].svalue = state->tuner_cnr;
 	c->cnr.stat[0].svalue -= prandom_u32_max(state->tuner_cnr / 50);
-
 }
 
 static int vidtv_demod_read_status(struct dvb_frontend *fe,
diff --git a/drivers/media/test-drivers/vidtv/vidtv_encoder.h b/drivers/media/test-drivers/vidtv/vidtv_encoder.h
index f742d566fbcb..0ac5b1e3f666 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_encoder.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_encoder.h
@@ -28,7 +28,7 @@ struct vidtv_access_unit {
 	struct vidtv_access_unit *next;
 };
 
-/* Some musical notes, used by a tone generator */
+/* Some musical notes, used by a tone generator. Values are in Hz */
 enum musical_notes {
 	NOTE_SILENT = 0,
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index eb24e27b7f5f..6df9cfd7f33b 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -63,9 +63,9 @@ static struct vidtv_mux_pid_ctx
 
 static void vidtv_mux_pid_ctx_destroy(struct vidtv_mux *m)
 {
-	int bkt;
 	struct vidtv_mux_pid_ctx *ctx;
 	struct hlist_node *tmp;
+	int bkt;
 
 	hash_for_each_safe(m->pid_ctx, bkt, tmp, ctx, h) {
 		hash_del(&ctx->h);
@@ -129,21 +129,18 @@ static void vidtv_mux_update_clk(struct vidtv_mux *m)
 
 static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 {
+	struct vidtv_psi_pat_write_args pat_args = {};
+	struct vidtv_psi_pmt_write_args pmt_args = {};
+	struct vidtv_psi_sdt_write_args sdt_args = {};
+	struct vidtv_psi_nit_write_args nit_args = {};
+	struct vidtv_psi_eit_write_args eit_args = {};
 	u32 initial_offset = m->mux_buf_offset;
-
 	struct vidtv_mux_pid_ctx *pat_ctx;
 	struct vidtv_mux_pid_ctx *pmt_ctx;
 	struct vidtv_mux_pid_ctx *sdt_ctx;
 	struct vidtv_mux_pid_ctx *nit_ctx;
 	struct vidtv_mux_pid_ctx *eit_ctx;
-
-	struct vidtv_psi_pat_write_args pat_args = {};
-	struct vidtv_psi_pmt_write_args pmt_args = {};
-	struct vidtv_psi_sdt_write_args sdt_args = {};
-	struct vidtv_psi_nit_write_args nit_args = {};
-	struct vidtv_psi_eit_write_args eit_args = {};
-
-	u32 nbytes; /* the number of bytes written by this function */
+	u32 nbytes;
 	u16 pmt_pid;
 	u32 i;
 
@@ -269,7 +266,6 @@ static bool vidtv_mux_should_push_si(struct vidtv_mux *m)
 static u32 vidtv_mux_packetize_access_units(struct vidtv_mux *m,
 					    struct vidtv_encoder *e)
 {
-	u32 nbytes = 0;
 	struct pes_write_args args = {
 		.dest_buf           = m->mux_buf,
 		.dest_buf_sz        = m->mux_buf_sz,
@@ -279,10 +275,11 @@ static u32 vidtv_mux_packetize_access_units(struct vidtv_mux *m,
 		.send_pts           = true,  /* forbidden value '01'... */
 		.send_dts           = false, /* ...for PTS_DTS flags    */
 	};
-	u32 initial_offset = m->mux_buf_offset;
 	struct vidtv_access_unit *au = e->access_units;
-	u8 *buf = NULL;
+	u32 initial_offset = m->mux_buf_offset;
 	struct vidtv_mux_pid_ctx *pid_ctx;
+	u32 nbytes = 0;
+	u8 *buf = NULL;
 
 	/* see SMPTE 302M clause 6.4 */
 	if (args.encoder_id == S302M) {
@@ -318,10 +315,10 @@ static u32 vidtv_mux_packetize_access_units(struct vidtv_mux *m,
 
 static u32 vidtv_mux_poll_encoders(struct vidtv_mux *m)
 {
-	u32 nbytes = 0;
-	u32 au_nbytes;
 	struct vidtv_channel *cur_chnl = m->channels;
 	struct vidtv_encoder *e = NULL;
+	u32 nbytes = 0;
+	u32 au_nbytes;
 
 	while (cur_chnl) {
 		e = cur_chnl->encoders;
@@ -347,9 +344,9 @@ static u32 vidtv_mux_pad_with_nulls(struct vidtv_mux *m, u32 npkts)
 {
 	struct null_packet_write_args args = {};
 	u32 initial_offset = m->mux_buf_offset;
-	u32 nbytes; /* the number of bytes written by this function */
-	u32 i;
 	struct vidtv_mux_pid_ctx *ctx;
+	u32 nbytes;
+	u32 i;
 
 	ctx = vidtv_mux_get_pid_ctx(m, TS_NULL_PACKET_PID);
 
@@ -388,9 +385,9 @@ static void vidtv_mux_tick(struct work_struct *work)
 					   struct vidtv_mux,
 					   mpeg_thread);
 	struct dtv_frontend_properties *c = &m->fe->dtv_property_cache;
+	u32 tot_bits = 0;
 	u32 nbytes;
 	u32 npkts;
-	u32 tot_bits = 0;
 
 	while (m->streaming) {
 		nbytes = 0;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index b31a29f46bde..375e01480d3d 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -76,7 +76,7 @@ static const u32 CRC_LUT[256] = {
 	0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
 };
 
-static inline u32 dvb_crc32(u32 crc, u8 *data, u32 len)
+static u32 dvb_crc32(u32 crc, u8 *data, u32 len)
 {
 	/* from libdvbv5 */
 	while (len--)
@@ -89,7 +89,8 @@ static void vidtv_psi_update_version_num(struct vidtv_psi_table_header *h)
 	h->version++;
 }
 
-static inline u16 vidtv_psi_sdt_serv_get_desc_loop_len(struct vidtv_psi_table_sdt_service *s)
+static u16
+vidtv_psi_sdt_serv_get_desc_loop_len(struct vidtv_psi_table_sdt_service *s)
 {
 	u16 mask;
 	u16 ret;
@@ -100,7 +101,8 @@ static inline u16 vidtv_psi_sdt_serv_get_desc_loop_len(struct vidtv_psi_table_sd
 	return ret;
 }
 
-static inline u16 vidtv_psi_pmt_stream_get_desc_loop_len(struct vidtv_psi_table_pmt_stream *s)
+static u16
+vidtv_psi_pmt_stream_get_desc_loop_len(struct vidtv_psi_table_pmt_stream *s)
 {
 	u16 mask;
 	u16 ret;
@@ -111,7 +113,7 @@ static inline u16 vidtv_psi_pmt_stream_get_desc_loop_len(struct vidtv_psi_table_
 	return ret;
 }
 
-static inline u16 vidtv_psi_pmt_get_desc_loop_len(struct vidtv_psi_table_pmt *p)
+static u16 vidtv_psi_pmt_get_desc_loop_len(struct vidtv_psi_table_pmt *p)
 {
 	u16 mask;
 	u16 ret;
@@ -122,7 +124,7 @@ static inline u16 vidtv_psi_pmt_get_desc_loop_len(struct vidtv_psi_table_pmt *p)
 	return ret;
 }
 
-static inline u16 vidtv_psi_get_sec_len(struct vidtv_psi_table_header *h)
+static u16 vidtv_psi_get_sec_len(struct vidtv_psi_table_header *h)
 {
 	u16 mask;
 	u16 ret;
@@ -133,7 +135,7 @@ static inline u16 vidtv_psi_get_sec_len(struct vidtv_psi_table_header *h)
 	return ret;
 }
 
-inline u16 vidtv_psi_get_pat_program_pid(struct vidtv_psi_table_pat_program *p)
+u16 vidtv_psi_get_pat_program_pid(struct vidtv_psi_table_pat_program *p)
 {
 	u16 mask;
 	u16 ret;
@@ -144,7 +146,7 @@ inline u16 vidtv_psi_get_pat_program_pid(struct vidtv_psi_table_pat_program *p)
 	return ret;
 }
 
-inline u16 vidtv_psi_pmt_stream_get_elem_pid(struct vidtv_psi_table_pmt_stream *s)
+u16 vidtv_psi_pmt_stream_get_elem_pid(struct vidtv_psi_table_pmt_stream *s)
 {
 	u16 mask;
 	u16 ret;
@@ -155,10 +157,11 @@ inline u16 vidtv_psi_pmt_stream_get_elem_pid(struct vidtv_psi_table_pmt_stream *
 	return ret;
 }
 
-static inline void vidtv_psi_set_desc_loop_len(__be16 *bitfield, u16 new_len, u8 desc_len_nbits)
+static void vidtv_psi_set_desc_loop_len(__be16 *bitfield, u16 new_len,
+					u8 desc_len_nbits)
 {
-	u16 mask;
 	__be16 new;
+	u16 mask;
 
 	mask = GENMASK(15, desc_len_nbits);
 
@@ -185,27 +188,22 @@ static void vidtv_psi_set_sec_len(struct vidtv_psi_table_header *h, u16 new_len)
 	h->bitfield = new;
 }
 
+/*
+ * Packetize PSI sections into TS packets:
+ * push a TS header (4bytes) every 184 bytes
+ * manage the continuity_counter
+ * add stuffing (i.e. padding bytes) after the CRC
+ */
 static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args args)
 {
-	/*
-	 * Packetize PSI sections into TS packets:
-	 * push a TS header (4bytes) every 184 bytes
-	 * manage the continuity_counter
-	 * add stuffing (i.e. padding bytes) after the CRC
-	 */
 
 	u32 nbytes_past_boundary = (args.dest_offset % TS_PACKET_LEN);
 	bool aligned = (nbytes_past_boundary == 0);
 	struct vidtv_mpeg_ts ts_header = {};
-
-	/* number of bytes written by this function */
-	u32 nbytes = 0;
-	/* how much there is left to write */
 	u32 remaining_len = args.len;
-	/* how much we can be written in this packet */
 	u32 payload_write_len = 0;
-	/* where we are in the source */
 	u32 payload_offset = 0;
+	u32 nbytes = 0;
 
 	const u16 PAYLOAD_START = args.new_psi_section;
 
@@ -294,9 +292,10 @@ static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args args)
 
 static u32 table_section_crc32_write_into(struct crc32_write_args args)
 {
-	/* the CRC is the last entry in the section */
-	u32 nbytes = 0;
 	struct psi_write_args psi_args = {};
+	u32 nbytes = 0;
+
+	/* the CRC is the last entry in the section */
 
 	psi_args.dest_buf           = args.dest_buf;
 	psi_args.from               = &args.crc;
@@ -391,8 +390,8 @@ struct vidtv_psi_desc_registration
 struct vidtv_psi_desc_network_name
 *vidtv_psi_network_name_desc_init(struct vidtv_psi_desc *head, char *network_name)
 {
-	struct vidtv_psi_desc_network_name *desc;
 	u32 network_name_len = network_name ? strlen(network_name) : 0;
+	struct vidtv_psi_desc_network_name *desc;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
 	if (!desc)
@@ -413,10 +412,10 @@ struct vidtv_psi_desc_service_list
 *vidtv_psi_service_list_desc_init(struct vidtv_psi_desc *head,
 				  struct vidtv_psi_desc_service_list_entry *entry)
 {
-	struct vidtv_psi_desc_service_list *desc;
 	struct vidtv_psi_desc_service_list_entry *curr_e = NULL;
 	struct vidtv_psi_desc_service_list_entry *head_e = NULL;
 	struct vidtv_psi_desc_service_list_entry *prev_e = NULL;
+	struct vidtv_psi_desc_service_list *desc;
 	u16 length = 0;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
@@ -465,10 +464,10 @@ struct vidtv_psi_desc_short_event
 				 char *event_name,
 				 char *text)
 {
-	struct vidtv_psi_desc_short_event *desc;
+	u32 iso_len =  iso_language_code ? strlen(iso_language_code) : 0;
 	u32 event_name_len = event_name ? strlen(event_name) : 0;
+	struct vidtv_psi_desc_short_event *desc;
 	u32 text_len =  text ? strlen(text) : 0;
-	u32 iso_len =  iso_language_code ? strlen(iso_language_code) : 0;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
 	if (!desc)
@@ -502,14 +501,13 @@ struct vidtv_psi_desc_short_event
 
 struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 {
-	struct vidtv_psi_desc *head = NULL;
-	struct vidtv_psi_desc *prev = NULL;
-	struct vidtv_psi_desc *curr = NULL;
-
-	struct vidtv_psi_desc_service *service;
 	struct vidtv_psi_desc_network_name *desc_network_name;
 	struct vidtv_psi_desc_service_list *desc_service_list;
 	struct vidtv_psi_desc_short_event  *desc_short_event;
+	struct vidtv_psi_desc_service *service;
+	struct vidtv_psi_desc *head = NULL;
+	struct vidtv_psi_desc *prev = NULL;
+	struct vidtv_psi_desc *curr = NULL;
 
 	while (desc) {
 		switch (desc->type) {
@@ -571,10 +569,10 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 
 void vidtv_psi_desc_destroy(struct vidtv_psi_desc *desc)
 {
+	struct vidtv_psi_desc_service_list_entry *sl_entry_tmp = NULL;
+	struct vidtv_psi_desc_service_list_entry *sl_entry = NULL;
 	struct vidtv_psi_desc *curr = desc;
 	struct vidtv_psi_desc *tmp  = NULL;
-	struct vidtv_psi_desc_service_list_entry *sl_entry = NULL;
-	struct vidtv_psi_desc_service_list_entry *sl_entry_tmp = NULL;
 
 	while (curr) {
 		tmp  = curr;
@@ -677,10 +675,10 @@ void vidtv_sdt_desc_assign(struct vidtv_psi_table_sdt *sdt,
 
 static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 {
+	struct vidtv_psi_desc_service_list_entry *serv_list_entry = NULL;
+	struct psi_write_args psi_args = {};
 	/* the number of bytes written by this function */
 	u32 nbytes = 0;
-	struct psi_write_args psi_args = {};
-	struct vidtv_psi_desc_service_list_entry *serv_list_entry = NULL;
 
 	psi_args.dest_buf = args.dest_buf;
 	psi_args.from     = &args.desc->type;
@@ -799,9 +797,9 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 static u32
 vidtv_psi_table_header_write_into(struct header_write_args args)
 {
+	struct psi_write_args psi_args = {};
 	/* the number of bytes written by this function */
 	u32 nbytes = 0;
-	struct psi_write_args psi_args = {};
 
 	psi_args.dest_buf           = args.dest_buf;
 	psi_args.from               = args.h;
@@ -822,10 +820,11 @@ vidtv_psi_table_header_write_into(struct header_write_args args)
 void
 vidtv_psi_pat_table_update_sec_len(struct vidtv_psi_table_pat *pat)
 {
-	/* see ISO/IEC 13818-1 : 2000 p.43 */
 	u16 length = 0;
 	u32 i;
 
+	/* see ISO/IEC 13818-1 : 2000 p.43 */
+
 	/* from immediately after 'section_length' until 'last_section_number'*/
 	length += PAT_LEN_UNTIL_LAST_SECTION_NUMBER;
 
@@ -841,10 +840,11 @@ vidtv_psi_pat_table_update_sec_len(struct vidtv_psi_table_pat *pat)
 
 void vidtv_psi_pmt_table_update_sec_len(struct vidtv_psi_table_pmt *pmt)
 {
-	/* see ISO/IEC 13818-1 : 2000 p.46 */
-	u16 length = 0;
 	struct vidtv_psi_table_pmt_stream *s = pmt->stream;
 	u16 desc_loop_len;
+	u16 length = 0;
+
+	/* see ISO/IEC 13818-1 : 2000 p.46 */
 
 	/* from immediately after 'section_length' until 'program_info_length'*/
 	length += PMT_LEN_UNTIL_PROGRAM_INFO_LENGTH;
@@ -875,10 +875,11 @@ void vidtv_psi_pmt_table_update_sec_len(struct vidtv_psi_table_pmt *pmt)
 
 void vidtv_psi_sdt_table_update_sec_len(struct vidtv_psi_table_sdt *sdt)
 {
-	/* see ETSI EN 300 468 V 1.10.1 p.24 */
-	u16 length = 0;
 	struct vidtv_psi_table_sdt_service *s = sdt->service;
 	u16 desc_loop_len;
+	u16 length = 0;
+
+	/* see ETSI EN 300 468 V 1.10.1 p.24 */
 
 	/*
 	 * from immediately after 'section_length' until
@@ -935,8 +936,8 @@ vidtv_psi_pat_program_init(struct vidtv_psi_table_pat_program *head,
 void
 vidtv_psi_pat_program_destroy(struct vidtv_psi_table_pat_program *p)
 {
-	struct vidtv_psi_table_pat_program *curr = p;
 	struct vidtv_psi_table_pat_program *tmp  = NULL;
+	struct vidtv_psi_table_pat_program *curr = p;
 
 	while (curr) {
 		tmp  = curr;
@@ -945,14 +946,13 @@ vidtv_psi_pat_program_destroy(struct vidtv_psi_table_pat_program *p)
 	}
 }
 
+/* This function transfers ownership of p to the table */
 void
 vidtv_psi_pat_program_assign(struct vidtv_psi_table_pat *pat,
 			     struct vidtv_psi_table_pat_program *p)
 {
-	/* This function transfers ownership of p to the table */
-
-	u16 program_count;
 	struct vidtv_psi_table_pat_program *program;
+	u16 program_count;
 
 	do {
 		program_count = 0;
@@ -1010,16 +1010,13 @@ struct vidtv_psi_table_pat *vidtv_psi_pat_table_init(u16 transport_stream_id)
 
 u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
 {
-	/* the number of bytes written by this function */
-	u32 nbytes = 0;
-	const u16 pat_pid = VIDTV_PAT_PID;
-	u32 crc = INITIAL_CRC;
-
 	struct vidtv_psi_table_pat_program *p = args.pat->program;
-
 	struct header_write_args h_args       = {};
-	struct psi_write_args psi_args            = {};
+	struct psi_write_args psi_args        = {};
 	struct crc32_write_args c_args        = {};
+	const u16 pat_pid = VIDTV_PAT_PID;
+	u32 crc = INITIAL_CRC;
+	u32 nbytes = 0;
 
 	vidtv_psi_pat_table_update_sec_len(args.pat);
 
@@ -1114,8 +1111,8 @@ vidtv_psi_pmt_stream_init(struct vidtv_psi_table_pmt_stream *head,
 
 void vidtv_psi_pmt_stream_destroy(struct vidtv_psi_table_pmt_stream *s)
 {
-	struct vidtv_psi_table_pmt_stream *curr_stream = s;
 	struct vidtv_psi_table_pmt_stream *tmp_stream  = NULL;
+	struct vidtv_psi_table_pmt_stream *curr_stream = s;
 
 	while (curr_stream) {
 		tmp_stream  = curr_stream;
@@ -1166,11 +1163,11 @@ struct vidtv_psi_table_pmt *vidtv_psi_pmt_table_init(u16 program_number,
 						     u16 pcr_pid)
 {
 	struct vidtv_psi_table_pmt *pmt;
-	const u16 SYNTAX = 0x1;
-	const u16 ZERO = 0x0;
-	const u16 ONES = 0x03;
 	const u16 RESERVED1 = 0x07;
 	const u16 RESERVED2 = 0x0f;
+	const u16 SYNTAX = 0x1;
+	const u16 ONES = 0x03;
+	const u16 ZERO = 0x0;
 	u16 desc_loop_len;
 
 	pmt = kzalloc(sizeof(*pmt), GFP_KERNEL);
@@ -1208,18 +1205,15 @@ struct vidtv_psi_table_pmt *vidtv_psi_pmt_table_init(u16 program_number,
 
 u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 {
-	/* the number of bytes written by this function */
-	u32 nbytes = 0;
-	u32 crc = INITIAL_CRC;
-
 	struct vidtv_psi_desc *table_descriptor   = args.pmt->descriptor;
 	struct vidtv_psi_table_pmt_stream *stream = args.pmt->stream;
 	struct vidtv_psi_desc *stream_descriptor;
-
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
 	struct desc_write_args d_args   = {};
 	struct crc32_write_args c_args  = {};
+	u32 crc = INITIAL_CRC;
+	u32 nbytes = 0;
 
 	vidtv_psi_pmt_table_update_sec_len(args.pmt);
 
@@ -1317,10 +1311,10 @@ void vidtv_psi_pmt_table_destroy(struct vidtv_psi_table_pmt *pmt)
 struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id)
 {
 	struct vidtv_psi_table_sdt *sdt;
+	const u16 RESERVED = 0xff;
 	const u16 SYNTAX = 0x1;
-	const u16 ONE = 0x1;
 	const u16 ONES = 0x03;
-	const u16 RESERVED = 0xff;
+	const u16 ONE = 0x1;
 
 	sdt  = kzalloc(sizeof(*sdt), GFP_KERNEL);
 	if (!sdt)
@@ -1360,18 +1354,17 @@ struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id)
 
 u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 {
-	u32 nbytes  = 0;
-	u16 sdt_pid = VIDTV_SDT_PID;  /* see ETSI EN 300 468 v1.15.1 p. 11 */
-
-	u32 crc = INITIAL_CRC;
-
 	struct vidtv_psi_table_sdt_service *service = args.sdt->service;
 	struct vidtv_psi_desc *service_desc;
-
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
 	struct desc_write_args d_args   = {};
 	struct crc32_write_args c_args  = {};
+	u16 sdt_pid = VIDTV_SDT_PID;
+	u32 nbytes  = 0;
+	u32 crc = INITIAL_CRC;
+
+	/* see ETSI EN 300 468 v1.15.1 p. 11 */
 
 	vidtv_psi_sdt_table_update_sec_len(args.sdt);
 
@@ -1520,15 +1513,16 @@ vidtv_psi_sdt_service_assign(struct vidtv_psi_table_sdt *sdt,
 	vidtv_psi_update_version_num(&sdt->header);
 }
 
+/*
+ * PMTs contain information about programs. For each program,
+ * there is one PMT section. This function will create a section
+ * for each program found in the PAT
+ */
 struct vidtv_psi_table_pmt**
-vidtv_psi_pmt_create_sec_for_each_pat_entry(struct vidtv_psi_table_pat *pat, u16 pcr_pid)
+vidtv_psi_pmt_create_sec_for_each_pat_entry(struct vidtv_psi_table_pat *pat,
+					    u16 pcr_pid)
 
 {
-	/*
-	 * PMTs contain information about programs. For each program,
-	 * there is one PMT section. This function will create a section
-	 * for each program found in the PAT
-	 */
 	struct vidtv_psi_table_pat_program *program = pat->program;
 	struct vidtv_psi_table_pmt **pmt_secs;
 	u32 i = 0;
@@ -1549,12 +1543,12 @@ vidtv_psi_pmt_create_sec_for_each_pat_entry(struct vidtv_psi_table_pat *pat, u16
 	return pmt_secs;
 }
 
+/* find the PMT section associated with 'program_num' */
 struct vidtv_psi_table_pmt
 *vidtv_psi_find_pmt_sec(struct vidtv_psi_table_pmt **pmt_sections,
 			u16 nsections,
 			u16 program_num)
 {
-	/* find the PMT section associated with 'program_num' */
 	struct vidtv_psi_table_pmt *sec = NULL;
 	u32 i;
 
@@ -1616,11 +1610,11 @@ struct vidtv_psi_table_nit
 			  char *network_name,
 			  struct vidtv_psi_desc_service_list_entry *service_list)
 {
-	struct vidtv_psi_table_nit *nit;
 	struct vidtv_psi_table_transport *transport;
+	struct vidtv_psi_table_nit *nit;
 	const u16 SYNTAX = 0x1;
-	const u16 ONE = 0x1;
 	const u16 ONES = 0x03;
+	const u16 ONE = 0x1;
 
 	nit = kzalloc(sizeof(*nit), GFP_KERNEL);
 	if (!nit)
@@ -1677,18 +1671,15 @@ free_nit:
 
 u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 {
-	/* the number of bytes written by this function */
-	u32 nbytes = 0;
-	u32 crc = INITIAL_CRC;
-
 	struct vidtv_psi_desc *table_descriptor     = args.nit->descriptor;
 	struct vidtv_psi_table_transport *transport = args.nit->transport;
 	struct vidtv_psi_desc *transport_descriptor;
-
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
 	struct desc_write_args d_args   = {};
 	struct crc32_write_args c_args  = {};
+	u32 crc = INITIAL_CRC;
+	u32 nbytes = 0;
 
 	vidtv_psi_nit_table_update_sec_len(args.nit);
 
@@ -1786,8 +1777,8 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 
 static void vidtv_psi_transport_destroy(struct vidtv_psi_table_transport *t)
 {
-	struct vidtv_psi_table_transport *curr_t = t;
 	struct vidtv_psi_table_transport *tmp_t  = NULL;
+	struct vidtv_psi_table_transport *curr_t = t;
 
 	while (curr_t) {
 		tmp_t  = curr_t;
@@ -1806,9 +1797,9 @@ void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit)
 
 void vidtv_psi_eit_table_update_sec_len(struct vidtv_psi_table_eit *eit)
 {
-	u16 length = 0;
 	struct vidtv_psi_table_eit_event *e = eit->event;
 	u16 desc_loop_len;
+	u16 length = 0;
 
 	/*
 	 * from immediately after 'section_length' until
@@ -1890,16 +1881,14 @@ struct vidtv_psi_table_eit
 
 u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 {
-	u32 nbytes  = 0;
-	u32 crc = INITIAL_CRC;
-
 	struct vidtv_psi_table_eit_event *event = args.eit->event;
 	struct vidtv_psi_desc *event_descriptor;
-
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
 	struct desc_write_args d_args   = {};
 	struct crc32_write_args c_args  = {};
+	u32 crc = INITIAL_CRC;
+	u32 nbytes  = 0;
 
 	vidtv_psi_eit_table_update_sec_len(args.eit);
 
@@ -1978,8 +1967,8 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 struct vidtv_psi_table_eit_event
 *vidtv_psi_eit_event_init(struct vidtv_psi_table_eit_event *head, u16 event_id)
 {
-	struct vidtv_psi_table_eit_event *e;
 	const u8 DURATION_ONE_HOUR[] = {1, 0, 0};
+	struct vidtv_psi_table_eit_event *e;
 
 	e = kzalloc(sizeof(*e), GFP_KERNEL);
 	if (!e)
@@ -2003,8 +1992,8 @@ struct vidtv_psi_table_eit_event
 
 void vidtv_psi_eit_event_destroy(struct vidtv_psi_table_eit_event *e)
 {
-	struct vidtv_psi_table_eit_event *curr_e = e;
 	struct vidtv_psi_table_eit_event *tmp_e  = NULL;
+	struct vidtv_psi_table_eit_event *curr_e = e;
 
 	while (curr_e) {
 		tmp_e  = curr_e;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index 569e7a50129f..ce7dd6cafc8b 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -201,10 +201,10 @@ static void vidtv_s302m_alloc_au(struct vidtv_encoder *e)
 static void
 vidtv_s302m_compute_sample_count_from_video(struct vidtv_encoder *e)
 {
-	struct vidtv_access_unit *au = e->access_units;
 	struct vidtv_access_unit *sync_au = e->sync->access_units;
-	u32 vau_duration_usecs;
+	struct vidtv_access_unit *au = e->access_units;
 	u32 sample_duration_usecs;
+	u32 vau_duration_usecs;
 	u32 s;
 
 	vau_duration_usecs    = USEC_PER_SEC / e->sync->sampling_rate_hz;
@@ -290,9 +290,9 @@ static u16 vidtv_s302m_get_sample(struct vidtv_encoder *e)
 static u32 vidtv_s302m_write_frame(struct vidtv_encoder *e,
 				   u16 sample)
 {
-	u32 nbytes = 0;
-	struct vidtv_s302m_frame_16 f = {};
 	struct vidtv_s302m_ctx *ctx = e->ctx;
+	struct vidtv_s302m_frame_16 f = {};
+	u32 nbytes = 0;
 
 	/* from ffmpeg: see s302enc.c */
 
@@ -389,6 +389,8 @@ static void vidtv_s302m_write_frames(struct vidtv_encoder *e)
 
 static void *vidtv_s302m_encode(struct vidtv_encoder *e)
 {
+	struct vidtv_s302m_ctx *ctx = e->ctx;
+
 	/*
 	 * According to SMPTE 302M, an audio access unit is specified as those
 	 * AES3 words that are associated with a corresponding video frame.
@@ -402,8 +404,6 @@ static void *vidtv_s302m_encode(struct vidtv_encoder *e)
 	 * ffmpeg
 	 */
 
-	struct vidtv_s302m_ctx *ctx = e->ctx;
-
 	vidtv_s302m_access_unit_destroy(e);
 	vidtv_s302m_alloc_au(e);
 
@@ -441,9 +441,9 @@ static u32 vidtv_s302m_clear(struct vidtv_encoder *e)
 struct vidtv_encoder
 *vidtv_s302m_encoder_init(struct vidtv_s302m_encoder_init_args args)
 {
-	struct vidtv_encoder *e;
 	u32 priv_sz = sizeof(struct vidtv_s302m_ctx);
 	struct vidtv_s302m_ctx *ctx;
+	struct vidtv_encoder *e;
 
 	e = kzalloc(sizeof(*e), GFP_KERNEL);
 	if (!e)
commit 2be65641642ef423f82162c3a5f28c754d1637d2
Author: Matti Hamalainen <ccr at tnsp.org>
Date:   Fri Nov 20 17:23:38 2020 +0200

    drm/nouveau: fix relocations applying logic and a double-free
    
    Commit 03e0d26fcf79 ("drm/nouveau: slowpath for pushbuf ioctl") included
    a logic-bug which results in the relocations not actually getting
    applied at all as the call to nouveau_gem_pushbuf_reloc_apply() is
    never reached. This causes a regression with graphical corruption,
    triggered when relocations need to be done (for example after a
    suspend/resume cycle.)
    
    Fix by setting *apply_relocs value only if there were more than 0
    relocations.
    
    Additionally, the never reached code had a leftover u_free() call,
    which, after fixing the logic, now got called and resulted in a
    double-free. Fix by removing one u_free(), moving the other
    and adding check for errors.
    
    Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
    Cc: Ben Skeggs <bskeggs at redhat.com>
    Cc: nouveau at lists.freedesktop.org
    Cc: dri-devel at lists.freedesktop.org
    Signed-off-by: Matti Hamalainen <ccr at tnsp.org>
    Fixes: 03e0d26fcf79 ("drm/nouveau: slowpath for pushbuf ioctl")
    References: https://gitlab.freedesktop.org/drm/nouveau/-/issues/11
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120152338.1203257-1-ccr@tnsp.org

diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 549bc67feabb..c2051380d18c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -558,8 +558,10 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
 			NV_PRINTK(err, cli, "validating bo list\n");
 		validate_fini(op, chan, NULL, NULL);
 		return ret;
+	} else if (ret > 0) {
+		*apply_relocs = true;
 	}
-	*apply_relocs = ret;
+
 	return 0;
 }
 
@@ -662,7 +664,6 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
 		nouveau_bo_wr32(nvbo, r->reloc_bo_offset >> 2, data);
 	}
 
-	u_free(reloc);
 	return ret;
 }
 
@@ -872,9 +873,10 @@ out:
 				break;
 			}
 		}
-		u_free(reloc);
 	}
 out_prevalid:
+	if (!IS_ERR(reloc))
+		u_free(reloc);
 	u_free(bo);
 	u_free(push);
 
commit 163d72a2d3ec7e0bc41b943fed7667f7cbfc760f
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Sep 22 11:01:17 2020 +0200

    media: vidtv: avoid copying data for PES structs
    
    Minimize the number of data copies and initialization at
    the code, passing them as pointers instead of duplicating
    the data.
    
    The only case where we're keeping the data copy is at
    vidtv_pes_write_h(), as it needs a copy of the passed
    arguments. On such case, we're being more explicit.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 89b19f0844b8..eb24e27b7f5f 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -270,22 +270,28 @@ static u32 vidtv_mux_packetize_access_units(struct vidtv_mux *m,
 					    struct vidtv_encoder *e)
 {
 	u32 nbytes = 0;
-
-	struct pes_write_args args = {};
+	struct pes_write_args args = {
+		.dest_buf           = m->mux_buf,
+		.dest_buf_sz        = m->mux_buf_sz,
+		.pid                = be16_to_cpu(e->es_pid),
+		.encoder_id         = e->id,
+		.stream_id          = be16_to_cpu(e->stream_id),
+		.send_pts           = true,  /* forbidden value '01'... */
+		.send_dts           = false, /* ...for PTS_DTS flags    */
+	};
 	u32 initial_offset = m->mux_buf_offset;
 	struct vidtv_access_unit *au = e->access_units;
-
 	u8 *buf = NULL;
-	struct vidtv_mux_pid_ctx *pid_ctx = vidtv_mux_create_pid_ctx_once(m,
-									  be16_to_cpu(e->es_pid));
+	struct vidtv_mux_pid_ctx *pid_ctx;
 
-	args.dest_buf           = m->mux_buf;
-	args.dest_buf_sz        = m->mux_buf_sz;
-	args.pid                = be16_to_cpu(e->es_pid);
-	args.encoder_id         = e->id;
+	/* see SMPTE 302M clause 6.4 */
+	if (args.encoder_id == S302M) {
+		args.send_dts = false;
+		args.send_pts = true;
+	}
+
+	pid_ctx = vidtv_mux_create_pid_ctx_once(m, be16_to_cpu(e->es_pid));
 	args.continuity_counter = &pid_ctx->cc;
-	args.stream_id          = be16_to_cpu(e->stream_id);
-	args.send_pts           = true;
 
 	while (au) {
 		buf                  = e->encoder_buf + au->offset;
@@ -295,7 +301,7 @@ static u32 vidtv_mux_packetize_access_units(struct vidtv_mux *m,
 		args.pts             = au->pts;
 		args.pcr	     = m->timing.clk;
 
-		m->mux_buf_offset += vidtv_pes_write_into(args);
+		m->mux_buf_offset += vidtv_pes_write_into(&args);
 
 		au = au->next;
 	}
diff --git a/drivers/media/test-drivers/vidtv/vidtv_pes.c b/drivers/media/test-drivers/vidtv/vidtv_pes.c
index 102352d398ed..782e5e7fbb02 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_pes.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_pes.c
@@ -56,7 +56,7 @@ static u32 vidtv_pes_h_get_len(bool send_pts, bool send_dts)
 	return len;
 }
 
-static u32 vidtv_pes_write_header_stuffing(struct pes_header_write_args args)
+static u32 vidtv_pes_write_header_stuffing(struct pes_header_write_args *args)
 {
 	/*
 	 * This is a fixed 8-bit value equal to '0xFF' that can be inserted
@@ -64,20 +64,20 @@ static u32 vidtv_pes_write_header_stuffing(struct pes_header_write_args args)
 	 * It is discarded by the decoder. No more than 32 stuffing bytes shall
 	 * be present in one PES packet header.
 	 */
-	if (args.n_pes_h_s_bytes > PES_HEADER_MAX_STUFFING_BYTES) {
+	if (args->n_pes_h_s_bytes > PES_HEADER_MAX_STUFFING_BYTES) {
 		pr_warn_ratelimited("More than %d stuffing bytes in PES packet header\n",
 				    PES_HEADER_MAX_STUFFING_BYTES);
-		args.n_pes_h_s_bytes = PES_HEADER_MAX_STUFFING_BYTES;
+		args->n_pes_h_s_bytes = PES_HEADER_MAX_STUFFING_BYTES;
 	}
 
-	return vidtv_memset(args.dest_buf,
-			    args.dest_offset,
-			    args.dest_buf_sz,
+	return vidtv_memset(args->dest_buf,
+			    args->dest_offset,
+			    args->dest_buf_sz,
 			    TS_FILL_BYTE,
-			    args.n_pes_h_s_bytes);
+			    args->n_pes_h_s_bytes);
 }
 
-static u32 vidtv_pes_write_pts_dts(struct pes_header_write_args args)
+static u32 vidtv_pes_write_pts_dts(struct pes_header_write_args *args)
 {
 	u32 nbytes = 0;  /* the number of bytes written by this function */
 
@@ -89,7 +89,7 @@ static u32 vidtv_pes_write_pts_dts(struct pes_header_write_args args)
 	u64 mask2;
 	u64 mask3;
 
-	if (!args.send_pts && args.send_dts)
+	if (!args->send_pts && args->send_dts)
 		return 0;
 
 	mask1 = GENMASK_ULL(32, 30);
@@ -97,80 +97,81 @@ static u32 vidtv_pes_write_pts_dts(struct pes_header_write_args args)
 	mask3 = GENMASK_ULL(14, 0);
 
 	/* see ISO/IEC 13818-1 : 2000 p. 32 */
-	if (args.send_pts && args.send_dts) {
-		pts_dts.pts1 = (0x3 << 4) | ((args.pts & mask1) >> 29) | 0x1;
-		pts_dts.pts2 = cpu_to_be16(((args.pts & mask2) >> 14) | 0x1);
-		pts_dts.pts3 = cpu_to_be16(((args.pts & mask3) << 1) | 0x1);
+	if (args->send_pts && args->send_dts) {
+		pts_dts.pts1 = (0x3 << 4) | ((args->pts & mask1) >> 29) | 0x1;
+		pts_dts.pts2 = cpu_to_be16(((args->pts & mask2) >> 14) | 0x1);
+		pts_dts.pts3 = cpu_to_be16(((args->pts & mask3) << 1) | 0x1);
 
-		pts_dts.dts1 = (0x1 << 4) | ((args.dts & mask1) >> 29) | 0x1;
-		pts_dts.dts2 = cpu_to_be16(((args.dts & mask2) >> 14) | 0x1);
-		pts_dts.dts3 = cpu_to_be16(((args.dts & mask3) << 1) | 0x1);
+		pts_dts.dts1 = (0x1 << 4) | ((args->dts & mask1) >> 29) | 0x1;
+		pts_dts.dts2 = cpu_to_be16(((args->dts & mask2) >> 14) | 0x1);
+		pts_dts.dts3 = cpu_to_be16(((args->dts & mask3) << 1) | 0x1);
 
 		op = &pts_dts;
 		op_sz = sizeof(pts_dts);
 
-	} else if (args.send_pts) {
-		pts.pts1 = (0x1 << 5) | ((args.pts & mask1) >> 29) | 0x1;
-		pts.pts2 = cpu_to_be16(((args.pts & mask2) >> 14) | 0x1);
-		pts.pts3 = cpu_to_be16(((args.pts & mask3) << 1) | 0x1);
+	} else if (args->send_pts) {
+		pts.pts1 = (0x1 << 5) | ((args->pts & mask1) >> 29) | 0x1;
+		pts.pts2 = cpu_to_be16(((args->pts & mask2) >> 14) | 0x1);
+		pts.pts3 = cpu_to_be16(((args->pts & mask3) << 1) | 0x1);
 
 		op = &pts;
 		op_sz = sizeof(pts);
 	}
 
 	/* copy PTS/DTS optional */
-	nbytes += vidtv_memcpy(args.dest_buf,
-			       args.dest_offset + nbytes,
-			       args.dest_buf_sz,
+	nbytes += vidtv_memcpy(args->dest_buf,
+			       args->dest_offset + nbytes,
+			       args->dest_buf_sz,
 			       op,
 			       op_sz);
 
 	return nbytes;
 }
 
-static u32 vidtv_pes_write_h(struct pes_header_write_args args)
+static u32 vidtv_pes_write_h(struct pes_header_write_args *args)
 {
 	u32 nbytes = 0;  /* the number of bytes written by this function */
 
 	struct vidtv_mpeg_pes pes_header          = {};
 	struct vidtv_pes_optional pes_optional    = {};
-	struct pes_header_write_args pts_dts_args = args;
-	u32 stream_id = (args.encoder_id == S302M) ? PRIVATE_STREAM_1_ID : args.stream_id;
+	struct pes_header_write_args pts_dts_args;
+	u32 stream_id = (args->encoder_id == S302M) ? PRIVATE_STREAM_1_ID : args->stream_id;
 	u16 pes_opt_bitfield = 0x01 << 15;
 
 	pes_header.bitfield = cpu_to_be32((PES_START_CODE_PREFIX << 8) | stream_id);
 
-	pes_header.length = cpu_to_be16(vidtv_pes_op_get_len(args.send_pts,
-							     args.send_dts) +
-							     args.access_unit_len);
+	pes_header.length = cpu_to_be16(vidtv_pes_op_get_len(args->send_pts,
+							     args->send_dts) +
+							     args->access_unit_len);
 
-	if (args.send_pts && args.send_dts)
+	if (args->send_pts && args->send_dts)
 		pes_opt_bitfield |= (0x3 << 6);
-	else if (args.send_pts)
+	else if (args->send_pts)
 		pes_opt_bitfield |= (0x1 << 7);
 
 	pes_optional.bitfield = cpu_to_be16(pes_opt_bitfield);
-	pes_optional.length = vidtv_pes_op_get_len(args.send_pts, args.send_dts) +
-			      args.n_pes_h_s_bytes -
+	pes_optional.length = vidtv_pes_op_get_len(args->send_pts, args->send_dts) +
+			      args->n_pes_h_s_bytes -
 			      sizeof(struct vidtv_pes_optional);
 
 	/* copy header */
-	nbytes += vidtv_memcpy(args.dest_buf,
-			       args.dest_offset + nbytes,
-			       args.dest_buf_sz,
+	nbytes += vidtv_memcpy(args->dest_buf,
+			       args->dest_offset + nbytes,
+			       args->dest_buf_sz,
 			       &pes_header,
 			       sizeof(pes_header));
 
 	/* copy optional header bits */
-	nbytes += vidtv_memcpy(args.dest_buf,
-			       args.dest_offset + nbytes,
-			       args.dest_buf_sz,
+	nbytes += vidtv_memcpy(args->dest_buf,
+			       args->dest_offset + nbytes,
+			       args->dest_buf_sz,
 			       &pes_optional,
 			       sizeof(pes_optional));
 
 	/* copy the timing information */
-	pts_dts_args.dest_offset = args.dest_offset + nbytes;
-	nbytes += vidtv_pes_write_pts_dts(pts_dts_args);
+	pts_dts_args = *args;
+	pts_dts_args.dest_offset = args->dest_offset + nbytes;
+	nbytes += vidtv_pes_write_pts_dts(&pts_dts_args);
 
 	/* write any PES header stuffing */
 	nbytes += vidtv_pes_write_header_stuffing(args);
@@ -299,14 +300,31 @@ static u32 vidtv_pes_write_ts_h(struct pes_ts_header_write_args args,
 	return nbytes;
 }
 
-u32 vidtv_pes_write_into(struct pes_write_args args)
+u32 vidtv_pes_write_into(struct pes_write_args *args)
 {
-	u32 unaligned_bytes = (args.dest_offset % TS_PACKET_LEN);
-	struct pes_ts_header_write_args ts_header_args = {};
-	struct pes_header_write_args pes_header_args = {};
-	u32 remaining_len = args.access_unit_len;
+	u32 unaligned_bytes = (args->dest_offset % TS_PACKET_LEN);
+	struct pes_ts_header_write_args ts_header_args = {
+		.dest_buf		= args->dest_buf,
+		.dest_buf_sz		= args->dest_buf_sz,
+		.pid			= args->pid,
+		.pcr			= args->pcr,
+		.continuity_counter	= args->continuity_counter,
+	};
+	struct pes_header_write_args pes_header_args = {
+		.dest_buf		= args->dest_buf,
+		.dest_buf_sz		= args->dest_buf_sz,
+		.encoder_id		= args->encoder_id,
+		.send_pts		= args->send_pts,
+		.pts			= args->pts,
+		.send_dts		= args->send_dts,
+		.dts			= args->dts,
+		.stream_id		= args->stream_id,
+		.n_pes_h_s_bytes	= args->n_pes_h_s_bytes,
+		.access_unit_len	= args->access_unit_len,
+	};
+	u32 remaining_len = args->access_unit_len;
 	bool wrote_pes_header = false;
-	u64 last_pcr = args.pcr;
+	u64 last_pcr = args->pcr;
 	bool need_pcr = true;
 	u32 available_space;
 	u32 payload_size;
@@ -317,25 +335,13 @@ u32 vidtv_pes_write_into(struct pes_write_args args)
 		pr_warn_ratelimited("buffer is misaligned, while starting PES\n");
 
 		/* forcibly align and hope for the best */
-		nbytes += vidtv_memset(args.dest_buf,
-				       args.dest_offset + nbytes,
-				       args.dest_buf_sz,
+		nbytes += vidtv_memset(args->dest_buf,
+				       args->dest_offset + nbytes,
+				       args->dest_buf_sz,
 				       TS_FILL_BYTE,
 				       TS_PACKET_LEN - unaligned_bytes);
 	}
 
-	if (args.send_dts && !args.send_pts) {
-		pr_warn_ratelimited("forbidden value '01' for PTS_DTS flags\n");
-		args.send_pts = true;
-		args.pts      = args.dts;
-	}
-
-	/* see SMPTE 302M clause 6.4 */
-	if (args.encoder_id == S302M) {
-		args.send_dts = false;
-		args.send_pts = true;
-	}
-
 	while (remaining_len) {
 		available_space = TS_PAYLOAD_LEN;
 		/*
@@ -344,14 +350,14 @@ u32 vidtv_pes_write_into(struct pes_write_args args)
 		 * the space needed for the TS header _and_ for the PES header
 		 */
 		if (!wrote_pes_header)
-			available_space -= vidtv_pes_h_get_len(args.send_pts,
-							       args.send_dts);
+			available_space -= vidtv_pes_h_get_len(args->send_pts,
+							       args->send_dts);
 
 		/*
 		 * if the encoder has inserted stuffing bytes in the PES
 		 * header, account for them.
 		 */
-		available_space -= args.n_pes_h_s_bytes;
+		available_space -= args->n_pes_h_s_bytes;
 
 		/* Take the extra adaptation into account if need to send PCR */
 		if (need_pcr) {
@@ -386,14 +392,9 @@ u32 vidtv_pes_write_into(struct pes_write_args args)
 		}
 
 		/* write ts header */
-		ts_header_args.dest_buf           = args.dest_buf;
-		ts_header_args.dest_offset        = args.dest_offset + nbytes;
-		ts_header_args.dest_buf_sz        = args.dest_buf_sz;
-		ts_header_args.pid                = args.pid;
-		ts_header_args.pcr		  = args.pcr;
-		ts_header_args.continuity_counter = args.continuity_counter;
-		ts_header_args.wrote_pes_header   = wrote_pes_header;
-		ts_header_args.n_stuffing_bytes   = stuff_bytes;
+		ts_header_args.dest_offset = args->dest_offset + nbytes;
+		ts_header_args.wrote_pes_header	= wrote_pes_header;
+		ts_header_args.n_stuffing_bytes	= stuff_bytes;
 
 		nbytes += vidtv_pes_write_ts_h(ts_header_args, need_pcr,
 					       &last_pcr);
@@ -402,33 +403,20 @@ u32 vidtv_pes_write_into(struct pes_write_args args)
 
 		if (!wrote_pes_header) {
 			/* write the PES header only once */
-			pes_header_args.dest_buf        = args.dest_buf;
-
-			pes_header_args.dest_offset     = args.dest_offset +
-							  nbytes;
-
-			pes_header_args.dest_buf_sz     = args.dest_buf_sz;
-			pes_header_args.encoder_id      = args.encoder_id;
-			pes_header_args.send_pts        = args.send_pts;
-			pes_header_args.pts             = args.pts;
-			pes_header_args.send_dts        = args.send_dts;
-			pes_header_args.dts             = args.dts;
-			pes_header_args.stream_id       = args.stream_id;
-			pes_header_args.n_pes_h_s_bytes = args.n_pes_h_s_bytes;
-			pes_header_args.access_unit_len = args.access_unit_len;
-
-			nbytes           += vidtv_pes_write_h(pes_header_args);
-			wrote_pes_header  = true;
+			pes_header_args.dest_offset = args->dest_offset +
+						      nbytes;
+			nbytes += vidtv_pes_write_h(&pes_header_args);
+			wrote_pes_header = true;
 		}
 
 		/* write as much of the payload as we possibly can */
-		nbytes += vidtv_memcpy(args.dest_buf,
-				       args.dest_offset + nbytes,
-				       args.dest_buf_sz,
-				       args.from,
+		nbytes += vidtv_memcpy(args->dest_buf,
+				       args->dest_offset + nbytes,
+				       args->dest_buf_sz,
+				       args->from,
 				       payload_size);
 
-		args.from += payload_size;
+		args->from += payload_size;
 
 		remaining_len -= payload_size;
 	}
diff --git a/drivers/media/test-drivers/vidtv/vidtv_pes.h b/drivers/media/test-drivers/vidtv/vidtv_pes.h
index a152693233a9..99f45056adc2 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_pes.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_pes.h
@@ -185,6 +185,6 @@ struct pes_write_args {
  * equal to the size of the access unit, since we need space for PES headers, TS headers
  * and padding bytes, if any.
  */
-u32 vidtv_pes_write_into(struct pes_write_args args);
+u32 vidtv_pes_write_into(struct pes_write_args *args);
 
 #endif // VIDTV_PES_H
commit 0a33ab1682b44ac0b4128ada7ace9f7a0ef6b59c
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Sep 22 10:28:12 2020 +0200

    media: vidtv: avoid data copy when initializing the multiplexer
    
    Initialize the fields of the arguments directly when
    declaring it, and pass the args as a pointer, instead of
    copying them.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
index e846aaab2c44..3fc7bf00a3e5 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
@@ -161,7 +161,17 @@ vidtv_bridge_on_new_pkts_avail(void *priv, u8 *buf, u32 npkts)
 
 static int vidtv_start_streaming(struct vidtv_dvb *dvb)
 {
-	struct vidtv_mux_init_args mux_args = {0};
+	struct vidtv_mux_init_args mux_args = {
+		.mux_rate_kbytes_sec         = mux_rate_kbytes_sec,
+		.on_new_packets_available_cb = vidtv_bridge_on_new_pkts_avail,
+		.pcr_period_usecs            = pcr_period_msec * USEC_PER_MSEC,
+		.si_period_usecs             = si_period_msec * USEC_PER_MSEC,
+		.pcr_pid                     = pcr_pid,
+		.transport_stream_id         = VIDTV_DEFAULT_TS_ID,
+		.network_id                  = VIDTV_DEFAULT_NETWORK_ID,
+		.network_name                = VIDTV_DEFAULT_NETWORK_NAME,
+		.priv                        = dvb,
+	};
 	struct device *dev = &dvb->pdev->dev;
 	u32 mux_buf_sz;
 
@@ -170,21 +180,13 @@ static int vidtv_start_streaming(struct vidtv_dvb *dvb)
 		return 0;
 	}
 
-	mux_buf_sz = (mux_buf_sz_pkts) ? mux_buf_sz_pkts : vidtv_bridge_mux_buf_sz_for_mux_rate();
+	mux_buf_sz = (mux_buf_sz_pkts) ? mux_buf_sz_pkts :
+					 vidtv_bridge_mux_buf_sz_for_mux_rate();
 
-	mux_args.mux_rate_kbytes_sec         = mux_rate_kbytes_sec;
-	mux_args.on_new_packets_available_cb = vidtv_bridge_on_new_pkts_avail;
-	mux_args.mux_buf_sz                  = mux_buf_sz;
-	mux_args.pcr_period_usecs            = pcr_period_msec * 1000;
-	mux_args.si_period_usecs             = si_period_msec * 1000;
-	mux_args.pcr_pid                     = pcr_pid;
-	mux_args.transport_stream_id         = VIDTV_DEFAULT_TS_ID;
-	mux_args.network_id                  = VIDTV_DEFAULT_NETWORK_ID,
-	mux_args.network_name                = VIDTV_DEFAULT_NETWORK_NAME,
-	mux_args.priv                        = dvb;
+	mux_args.mux_buf_sz  = mux_buf_sz;
 
 	dvb->streaming = true;
-	dvb->mux = vidtv_mux_init(dvb->fe[0], dev, mux_args);
+	dvb->mux = vidtv_mux_init(dvb->fe[0], dev, &mux_args);
 	if (!dvb->mux)
 		return -ENOMEM;
 	vidtv_mux_start_thread(dvb->mux);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index bba3f2315531..89b19f0844b8 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -466,7 +466,7 @@ void vidtv_mux_stop_thread(struct vidtv_mux *m)
 
 struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 				 struct device *dev,
-				 struct vidtv_mux_init_args args)
+				 struct vidtv_mux_init_args *args)
 {
 	struct vidtv_mux *m;
 
@@ -476,28 +476,28 @@ struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 
 	m->dev = dev;
 	m->fe = fe;
-	m->timing.pcr_period_usecs = args.pcr_period_usecs;
-	m->timing.si_period_usecs  = args.si_period_usecs;
+	m->timing.pcr_period_usecs = args->pcr_period_usecs;
+	m->timing.si_period_usecs  = args->si_period_usecs;
 
-	m->mux_rate_kbytes_sec = args.mux_rate_kbytes_sec;
+	m->mux_rate_kbytes_sec = args->mux_rate_kbytes_sec;
 
-	m->on_new_packets_available_cb = args.on_new_packets_available_cb;
+	m->on_new_packets_available_cb = args->on_new_packets_available_cb;
 
-	m->mux_buf = vzalloc(args.mux_buf_sz);
+	m->mux_buf = vzalloc(args->mux_buf_sz);
 	if (!m->mux_buf)
 		goto free_mux;
 
-	m->mux_buf_sz = args.mux_buf_sz;
+	m->mux_buf_sz = args->mux_buf_sz;
 
-	m->pcr_pid = args.pcr_pid;
-	m->transport_stream_id = args.transport_stream_id;
-	m->priv = args.priv;
-	m->network_id = args.network_id;
-	m->network_name = kstrdup(args.network_name, GFP_KERNEL);
+	m->pcr_pid = args->pcr_pid;
+	m->transport_stream_id = args->transport_stream_id;
+	m->priv = args->priv;
+	m->network_id = args->network_id;
+	m->network_name = kstrdup(args->network_name, GFP_KERNEL);
 	m->timing.current_jiffies = get_jiffies_64();
 
-	if (args.channels)
-		m->channels = args.channels;
+	if (args->channels)
+		m->channels = args->channels;
 	else
 		if (vidtv_channels_init(m) < 0)
 			goto free_mux_buf;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.h b/drivers/media/test-drivers/vidtv/vidtv_mux.h
index 005b707f1445..e186094c4fb7 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.h
@@ -170,7 +170,7 @@ struct vidtv_mux_init_args {
 
 struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 				 struct device *dev,
-				 struct vidtv_mux_init_args args);
+				 struct vidtv_mux_init_args *args);
 void vidtv_mux_destroy(struct vidtv_mux *m);
 
 void vidtv_mux_start_thread(struct vidtv_mux *m);
commit 0d271a79c702d4b986809cb3acfbe8911bba892e
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Thu Nov 19 11:20:38 2020 +0100

    media: vidtv: fix some notes at the tone generator
    
    The sheet music used to generate the tones had a few
    polyphonic notes. Due to that, its conversion to a
    tones sequence had a few errors.
    
    Also, due to a bug at the tone generator, it was missing
    the pause at the initial compass.
    
    Fix them.
    
    While here, reduce the compass to 100bpm.
    
    The music was converted from a Music XML file using
    this small script:
    
    <snip>
    my $count = 0;
    my $silent = 0;
    my $note;
    my $octave;
    print "\t";
    while (<>) {
            $note = $1 if (m,\<step\>(.*)\</step\>,);
            $octave = "_$1" if (m,\<octave\>(.*)\</octave\>,);
            if (m,\<alter\>1\</alter\>,) {
                    $note .= "S";
                    $sharp = 1;
            }
            if (m,\<rest/\>,) {
                    $note = "SILENT";
                    $silent = 1;
            }
            if (m,\<duration\>(.*)\</duration\>,) {
                    printf "{ NOTE_${note}${octave}, %d},", $1 * 128 / 480;
                    $count++;
                    if ($silent || $count >= 3) {
                            print "\n\t";
                            $count = 0;
                            $silent = 0;
                    } else {
                            print " ";
                            print " " if (!$sharp);
                    }
                    $sharp = 0;
                    $note = "";
                    $octave = "";
            };
    };
    print "\n";
    </snip>
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index fdb3d649c516..569e7a50129f 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -78,8 +78,9 @@ struct tone_duration {
 	int duration;
 };
 
-#define COMPASS 120		/* beats per minute (Allegro) */
+#define COMPASS 100 /* beats per minute */
 static const struct tone_duration beethoven_fur_elise[] = {
+	{ NOTE_SILENT, 512},
 	{ NOTE_E_6, 128},  { NOTE_DS_6, 128}, { NOTE_E_6, 128},
 	{ NOTE_DS_6, 128}, { NOTE_E_6, 128},  { NOTE_B_5, 128},
 	{ NOTE_D_6, 128},  { NOTE_C_6, 128},  { NOTE_A_3, 128},
@@ -120,26 +121,27 @@ static const struct tone_duration beethoven_fur_elise[] = {
 	{ NOTE_E_5, 128},  { NOTE_D_5, 128},  { NOTE_A_3, 128},
 	{ NOTE_E_4, 128},  { NOTE_A_4, 128},  { NOTE_E_4, 128},
 	{ NOTE_D_5, 128},  { NOTE_C_5, 128},  { NOTE_E_3, 128},
-	{ NOTE_E_4, 128},  { NOTE_E_5, 255},  { NOTE_E_6, 128},
-	{ NOTE_E_5, 128},  { NOTE_E_6, 128},  { NOTE_E_5, 255},
+	{ NOTE_E_4, 128},  { NOTE_E_5, 128},  { NOTE_E_5, 128},
+	{ NOTE_E_6, 128},  { NOTE_E_5, 128},  { NOTE_E_6, 128},
+	{ NOTE_E_5, 128},  { NOTE_E_5, 128},  { NOTE_DS_5, 128},
+	{ NOTE_E_5, 128},  { NOTE_DS_6, 128}, { NOTE_E_6, 128},
 	{ NOTE_DS_5, 128}, { NOTE_E_5, 128},  { NOTE_DS_6, 128},
-	{ NOTE_E_6, 128},  { NOTE_DS_5, 128}, { NOTE_E_5, 128},
-	{ NOTE_DS_6, 128}, { NOTE_E_6, 128},  { NOTE_DS_6, 128},
 	{ NOTE_E_6, 128},  { NOTE_DS_6, 128}, { NOTE_E_6, 128},
-	{ NOTE_B_5, 128},  { NOTE_D_6, 128},  { NOTE_C_6, 128},
-	{ NOTE_A_3, 128},  { NOTE_E_4, 128},  { NOTE_A_4, 128},
-	{ NOTE_C_5, 128},  { NOTE_E_5, 128},  { NOTE_A_5, 128},
-	{ NOTE_E_3, 128},  { NOTE_E_4, 128},  { NOTE_GS_4, 128},
-	{ NOTE_E_5, 128},  { NOTE_GS_5, 128}, { NOTE_B_5, 128},
-	{ NOTE_A_3, 128},  { NOTE_E_4, 128},  { NOTE_A_4, 128},
-	{ NOTE_E_5, 128},  { NOTE_E_6, 128},  { NOTE_DS_6, 128},
+	{ NOTE_DS_6, 128}, { NOTE_E_6, 128},  { NOTE_B_5, 128},
+	{ NOTE_D_6, 128},  { NOTE_C_6, 128},  { NOTE_A_3, 128},
+	{ NOTE_E_4, 128},  { NOTE_A_4, 128},  { NOTE_C_5, 128},
+	{ NOTE_E_5, 128},  { NOTE_A_5, 128},  { NOTE_E_3, 128},
+	{ NOTE_E_4, 128},  { NOTE_GS_4, 128}, { NOTE_E_5, 128},
+	{ NOTE_GS_5, 128}, { NOTE_B_5, 128},  { NOTE_A_3, 128},
+	{ NOTE_E_4, 128},  { NOTE_A_4, 128},  { NOTE_E_5, 128},
 	{ NOTE_E_6, 128},  { NOTE_DS_6, 128}, { NOTE_E_6, 128},
-	{ NOTE_B_5, 128},  { NOTE_D_6, 128},  { NOTE_C_6, 128},
-	{ NOTE_A_3, 128},  { NOTE_E_4, 128},  { NOTE_A_4, 128},
-	{ NOTE_C_5, 128},  { NOTE_E_5, 128},  { NOTE_A_5, 128},
-	{ NOTE_E_3, 128},  { NOTE_E_4, 128},  { NOTE_GS_4, 128},
-	{ NOTE_E_5, 128},  { NOTE_C_6, 128},  { NOTE_B_5, 128},
-	{ NOTE_C_5, 255},  { NOTE_C_5, 255},  { NOTE_SILENT, 512},
+	{ NOTE_DS_6, 128}, { NOTE_E_6, 128},  { NOTE_B_5, 128},
+	{ NOTE_D_6, 128},  { NOTE_C_6, 128},  { NOTE_A_3, 128},
+	{ NOTE_E_4, 128},  { NOTE_A_4, 128},  { NOTE_C_5, 128},
+	{ NOTE_E_5, 128},  { NOTE_A_5, 128},  { NOTE_E_3, 128},
+	{ NOTE_E_4, 128},  { NOTE_GS_4, 128}, { NOTE_E_5, 128},
+	{ NOTE_C_6, 128},  { NOTE_B_5, 128},  { NOTE_A_5, 512},
+	{ NOTE_SILENT, 256},
 };
 
 static struct vidtv_access_unit *vidtv_s302m_access_unit_init(struct vidtv_access_unit *head)
commit ab6bad0a4db69009fb7b2a50b8929b2bcaf7824d
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Thu Nov 19 11:20:46 2020 +0100

    media: vidtv: fix the tone generator logic
    
    The tone generator logic were repeating the song after the
    first silent. There's also a wrong logic at the note
    offset calculus, which may create some noise.
    
    Fix it.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index cbf89530aafe..fdb3d649c516 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -253,18 +253,12 @@ static u16 vidtv_s302m_get_sample(struct vidtv_encoder *e)
 			ctx->last_duration--;
 		}
 
-		/* Handle silent */
-		if (!ctx->last_tone) {
-			e->src_buf_offset = 0;
+		/* Handle pause notes */
+		if (!ctx->last_tone)
 			return 0x8000;
-		}
-
-		pos = (2 * PI * ctx->note_offset * ctx->last_tone / S302M_SAMPLING_RATE_HZ);
 
-		if (pos == 360)
-			ctx->note_offset = 0;
-		else
-			ctx->note_offset++;
+		pos = (2 * PI * ctx->note_offset * ctx->last_tone) / S302M_SAMPLING_RATE_HZ;
+		ctx->note_offset++;
 
 		return (fixp_sin32(pos % (2 * PI)) >> 16) + 0x8000;
 	}
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.h b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
index a0101734e758..e990b755bb20 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
@@ -39,7 +39,7 @@ struct vidtv_s302m_ctx {
 	u32 frame_index;
 	u32 au_count;
 	int last_duration;
-	int note_offset;
+	unsigned int note_offset;
 	enum musical_notes last_tone;
 };
 
commit af66e03edd4d46c7c37f6360dab3ed5953f36943
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Thu Nov 19 09:41:22 2020 +0100

    media: vidtv: fix the name of the program
    
    While the original plan was to use the first movement of
    the 5th Symphony, it was opted to use the Für Elise song,
    instead.
    
    Fix it.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index ddfeecd381e6..f64a68dea234 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -61,7 +61,7 @@ struct vidtv_channel
 	char *provider = ENCODING_ISO8859_15 "LinuxTV.org";
 	char *iso_language_code = ENCODING_ISO8859_15 "eng";
 	char *event_name = ENCODING_ISO8859_15 "Beethoven Music";
-	char *event_text = ENCODING_ISO8859_15 "Beethoven's 5th Symphony";
+	char *event_text = ENCODING_ISO8859_15 "Beethoven's Für Elise";
 	const u16 s302m_beethoven_event_id  = 1;
 	struct vidtv_channel *s302m;
 	struct vidtv_s302m_encoder_init_args encoder_args = {};
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index 146e4e9d361b..cbf89530aafe 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -79,7 +79,7 @@ struct tone_duration {
 };
 
 #define COMPASS 120		/* beats per minute (Allegro) */
-static const struct tone_duration beethoven_5th_symphony[] = {
+static const struct tone_duration beethoven_fur_elise[] = {
 	{ NOTE_E_6, 128},  { NOTE_DS_6, 128}, { NOTE_E_6, 128},
 	{ NOTE_DS_6, 128}, { NOTE_E_6, 128},  { NOTE_B_5, 128},
 	{ NOTE_D_6, 128},  { NOTE_C_6, 128},  { NOTE_A_3, 128},
@@ -238,14 +238,14 @@ static u16 vidtv_s302m_get_sample(struct vidtv_encoder *e)
 	if (!e->src_buf) {
 		/*
 		 * Simple tone generator: play the tones at the
-		 * beethoven_5th_symphony array.
+		 * beethoven_fur_elise array.
 		 */
 		if (ctx->last_duration <= 0) {
-			if (e->src_buf_offset >= ARRAY_SIZE(beethoven_5th_symphony))
+			if (e->src_buf_offset >= ARRAY_SIZE(beethoven_fur_elise))
 				e->src_buf_offset = 0;
 
-			ctx->last_tone = beethoven_5th_symphony[e->src_buf_offset].note;
-			ctx->last_duration = beethoven_5th_symphony[e->src_buf_offset].duration *
+			ctx->last_tone = beethoven_fur_elise[e->src_buf_offset].note;
+			ctx->last_duration = beethoven_fur_elise[e->src_buf_offset].duration *
 					     S302M_SAMPLING_RATE_HZ / COMPASS / 5;
 			e->src_buf_offset++;
 			ctx->note_offset = 0;
commit 31e82355a14ede525b96e1f300acebb29052915f
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Tue Nov 17 17:38:36 2020 +0100

    media: vidtv: don't use recursive functions
    
    The Linux stack is too short. So, using recursive functions
    is a very bad idea. Convert those into non-recursive ones.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index f7caa96c0ee8..b31a29f46bde 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -951,25 +951,29 @@ vidtv_psi_pat_program_assign(struct vidtv_psi_table_pat *pat,
 {
 	/* This function transfers ownership of p to the table */
 
-	u16 program_count = 0;
-	struct vidtv_psi_table_pat_program *program = p;
+	u16 program_count;
+	struct vidtv_psi_table_pat_program *program;
 
-	if (p == pat->program)
-		return;
+	do {
+		program_count = 0;
+		program = p;
 
-	while (program) {
-		++program_count;
-		program = program->next;
-	}
+		if (p == pat->program)
+			return;
+
+		while (program) {
+			++program_count;
+			program = program->next;
+		}
 
-	pat->programs = program_count;
-	pat->program  = p;
+		pat->programs = program_count;
+		pat->program  = p;
 
-	/* Recompute section length */
-	vidtv_psi_pat_table_update_sec_len(pat);
+		/* Recompute section length */
+		vidtv_psi_pat_table_update_sec_len(pat);
 
-	if (vidtv_psi_get_sec_len(&pat->header) > MAX_SECTION_LEN)
-		vidtv_psi_pat_program_assign(pat, NULL);
+		p = NULL;
+	} while (vidtv_psi_get_sec_len(&pat->header) > MAX_SECTION_LEN);
 
 	vidtv_psi_update_version_num(&pat->header);
 }
@@ -1124,15 +1128,16 @@ void vidtv_psi_pmt_stream_destroy(struct vidtv_psi_table_pmt_stream *s)
 void vidtv_psi_pmt_stream_assign(struct vidtv_psi_table_pmt *pmt,
 				 struct vidtv_psi_table_pmt_stream *s)
 {
-	/* This function transfers ownership of s to the table */
-	if (s == pmt->stream)
-		return;
+	do {
+		/* This function transfers ownership of s to the table */
+		if (s == pmt->stream)
+			return;
 
-	pmt->stream = s;
-	vidtv_psi_pmt_table_update_sec_len(pmt);
+		pmt->stream = s;
+		vidtv_psi_pmt_table_update_sec_len(pmt);
 
-	if (vidtv_psi_get_sec_len(&pmt->header) > MAX_SECTION_LEN)
-		vidtv_psi_pmt_stream_assign(pmt, NULL);
+		s = NULL;
+	} while (vidtv_psi_get_sec_len(&pmt->header) > MAX_SECTION_LEN);
 
 	vidtv_psi_update_version_num(&pmt->header);
 }
@@ -1500,16 +1505,17 @@ void
 vidtv_psi_sdt_service_assign(struct vidtv_psi_table_sdt *sdt,
 			     struct vidtv_psi_table_sdt_service *service)
 {
-	if (service == sdt->service)
-		return;
+	do {
+		if (service == sdt->service)
+			return;
 
-	sdt->service = service;
+		sdt->service = service;
 
-	/* recompute section length */
-	vidtv_psi_sdt_table_update_sec_len(sdt);
+		/* recompute section length */
+		vidtv_psi_sdt_table_update_sec_len(sdt);
 
-	if (vidtv_psi_get_sec_len(&sdt->header) > MAX_SECTION_LEN)
-		vidtv_psi_sdt_service_assign(sdt, NULL);
+		service = NULL;
+	} while (vidtv_psi_get_sec_len(&sdt->header) > MAX_SECTION_LEN);
 
 	vidtv_psi_update_version_num(&sdt->header);
 }
@@ -1832,14 +1838,15 @@ void vidtv_psi_eit_table_update_sec_len(struct vidtv_psi_table_eit *eit)
 void vidtv_psi_eit_event_assign(struct vidtv_psi_table_eit *eit,
 				struct vidtv_psi_table_eit_event *e)
 {
-	if (e == eit->event)
-		return;
+	do {
+		if (e == eit->event)
+			return;
 
-	eit->event = e;
-	vidtv_psi_eit_table_update_sec_len(eit);
+		eit->event = e;
+		vidtv_psi_eit_table_update_sec_len(eit);
 
-	if (vidtv_psi_get_sec_len(&eit->header) > EIT_MAX_SECTION_LEN)
-		vidtv_psi_eit_event_assign(eit, NULL);
+		e = NULL;
+	} while (vidtv_psi_get_sec_len(&eit->header) > EIT_MAX_SECTION_LEN);
 
 	vidtv_psi_update_version_num(&eit->header);
 }
commit 3be8037960bccd13052cfdeba8805ad785041d70
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Sep 21 15:11:50 2020 +0200

    media: vidtv: add error checks
    
    Currently, there are not checks if something gets bad during
    memory allocation: it will simply use NULL pointers and
    crash.
    
    Add error path at the logic which allocates memory for the
    MPEG-TS generator code, propagating the errors up to the
    vidtv_bridge. Now, if something wents bad, start_streaming
    will return an error that userspace can detect:
    
            ERROR    DMX_SET_PES_FILTER failed (PID = 0x2000): 12 Cannot allocate memory
    
    and the driver doesn't crash.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
index 068fb4e9fafe..e846aaab2c44 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
@@ -185,6 +185,8 @@ static int vidtv_start_streaming(struct vidtv_dvb *dvb)
 
 	dvb->streaming = true;
 	dvb->mux = vidtv_mux_init(dvb->fe[0], dev, mux_args);
+	if (!dvb->mux)
+		return -ENOMEM;
 	vidtv_mux_start_thread(dvb->mux);
 
 	dev_dbg_ratelimited(dev, "Started streaming\n");
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index 683da9014064..ddfeecd381e6 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -57,54 +57,75 @@ struct vidtv_channel
 	const u16 s302m_program_pid         = 0x101; /* packet id for PMT*/
 	const u16 s302m_es_pid              = 0x111; /* packet id for the ES */
 	const __be32 s302m_fid              = cpu_to_be32(VIDTV_S302M_FORMAT_IDENTIFIER);
-
 	char *name = ENCODING_ISO8859_15 "Beethoven";
 	char *provider = ENCODING_ISO8859_15 "LinuxTV.org";
 	char *iso_language_code = ENCODING_ISO8859_15 "eng";
 	char *event_name = ENCODING_ISO8859_15 "Beethoven Music";
 	char *event_text = ENCODING_ISO8859_15 "Beethoven's 5th Symphony";
 	const u16 s302m_beethoven_event_id  = 1;
-
-	struct vidtv_channel *s302m = kzalloc(sizeof(*s302m), GFP_KERNEL);
+	struct vidtv_channel *s302m;
 	struct vidtv_s302m_encoder_init_args encoder_args = {};
 
+	s302m = kzalloc(sizeof(*s302m), GFP_KERNEL);
+	if (!s302m)
+		return NULL;
+
 	s302m->name = kstrdup(name, GFP_KERNEL);
+	if (!s302m->name)
+		goto free_s302m;
 
 	s302m->service = vidtv_psi_sdt_service_init(NULL, s302m_service_id, false, true);
+	if (!s302m->service)
+		goto free_name;
 
 	s302m->service->descriptor = (struct vidtv_psi_desc *)
 				     vidtv_psi_service_desc_init(NULL,
 								 DIGITAL_TELEVISION_SERVICE,
 								 name,
 								 provider);
+	if (!s302m->service->descriptor)
+		goto free_service;
 
 	s302m->transport_stream_id = transport_stream_id;
 
 	s302m->program = vidtv_psi_pat_program_init(NULL,
 						    s302m_service_id,
 						    s302m_program_pid);
+	if (!s302m->program)
+		goto free_service;
 
 	s302m->program_num = s302m_program_num;
 
 	s302m->streams = vidtv_psi_pmt_stream_init(NULL,
 						   STREAM_PRIVATE_DATA,
 						   s302m_es_pid);
+	if (!s302m->streams)
+		goto free_program;
 
 	s302m->streams->descriptor = (struct vidtv_psi_desc *)
 				     vidtv_psi_registration_desc_init(NULL,
 								      s302m_fid,
 								      NULL,
 								      0);
+	if (!s302m->streams->descriptor)
+		goto free_streams;
+
 	encoder_args.es_pid = s302m_es_pid;
 
 	s302m->encoders = vidtv_s302m_encoder_init(encoder_args);
+	if (!s302m->encoders)
+		goto free_streams;
 
 	s302m->events = vidtv_psi_eit_event_init(NULL, s302m_beethoven_event_id);
+	if (!s302m->events)
+		goto free_encoders;
 	s302m->events->descriptor = (struct vidtv_psi_desc *)
 				    vidtv_psi_short_event_desc_init(NULL,
 								    iso_language_code,
 								    event_name,
 								    event_text);
+	if (!s302m->events->descriptor)
+		goto free_events;
 
 	if (head) {
 		while (head->next)
@@ -114,6 +135,23 @@ struct vidtv_channel
 	}
 
 	return s302m;
+
+free_events:
+	vidtv_psi_eit_event_destroy(s302m->events);
+free_encoders:
+	vidtv_s302m_encoder_destroy(s302m->encoders);
+free_streams:
+	vidtv_psi_pmt_stream_destroy(s302m->streams);
+free_program:
+	vidtv_psi_pat_program_destroy(s302m->program);
+free_service:
+	vidtv_psi_sdt_service_destroy(s302m->service);
+free_name:
+	kfree(s302m->name);
+free_s302m:
+	kfree(s302m);
+
+	return NULL;
 }
 
 static struct vidtv_psi_table_eit_event
@@ -142,6 +180,10 @@ static struct vidtv_psi_table_eit_event
 		while (curr) {
 			event_id = be16_to_cpu(curr->event_id);
 			tail = vidtv_psi_eit_event_init(tail, event_id);
+			if (!tail) {
+				vidtv_psi_eit_event_destroy(head);
+				return NULL;
+			}
 
 			desc = vidtv_psi_desc_clone(curr->descriptor);
 			vidtv_psi_desc_assign(&tail->descriptor, desc);
@@ -187,8 +229,12 @@ static struct vidtv_psi_table_sdt_service
 							  service_id,
 							  curr->EIT_schedule,
 							  curr->EIT_present_following);
+			if (!tail)
+				goto free;
 
 			desc = vidtv_psi_desc_clone(curr->descriptor);
+			if (!desc)
+				goto free_tail;
 			vidtv_psi_desc_assign(&tail->descriptor, desc);
 
 			if (!head)
@@ -201,6 +247,12 @@ static struct vidtv_psi_table_sdt_service
 	}
 
 	return head;
+
+free_tail:
+	vidtv_psi_sdt_service_destroy(tail);
+free:
+	vidtv_psi_sdt_service_destroy(head);
+	return NULL;
 }
 
 static struct vidtv_psi_table_pat_program*
@@ -231,6 +283,10 @@ vidtv_channel_pat_prog_cat_into_new(struct vidtv_mux *m)
 			tail = vidtv_psi_pat_program_init(tail,
 							  serv_id,
 							  pid);
+			if (!tail) {
+				vidtv_psi_pat_program_destroy(head);
+				return NULL;
+			}
 
 			if (!head)
 				head = tail;
@@ -303,6 +359,17 @@ vidtv_channel_pmt_match_sections(struct vidtv_channel *channels,
 	}
 }
 
+static void vidtv_channel_destroy_service_list(struct vidtv_psi_desc_service_list_entry *e)
+{
+	struct vidtv_psi_desc_service_list_entry *tmp;
+
+	while (e) {
+		tmp = e;
+		e = e->next;
+		kfree(tmp);
+	}
+}
+
 static struct vidtv_psi_desc_service_list_entry
 *vidtv_channel_build_service_list(struct vidtv_psi_table_sdt_service *s)
 {
@@ -320,6 +387,11 @@ static struct vidtv_psi_desc_service_list_entry
 			s_desc = (struct vidtv_psi_desc_service *)desc;
 
 			curr_e = kzalloc(sizeof(*curr_e), GFP_KERNEL);
+			if (!curr_e) {
+				vidtv_channel_destroy_service_list(head_e);
+				return NULL;
+			}
+
 			curr_e->service_id = s->service_id;
 			curr_e->service_type = s_desc->service_type;
 
@@ -338,18 +410,7 @@ next_desc:
 	return head_e;
 }
 
-static void vidtv_channel_destroy_service_list(struct vidtv_psi_desc_service_list_entry *e)
-{
-	struct vidtv_psi_desc_service_list_entry *tmp;
-
-	while (e) {
-		tmp = e;
-		e = e->next;
-		kfree(tmp);
-	}
-}
-
-void vidtv_channel_si_init(struct vidtv_mux *m)
+int vidtv_channel_si_init(struct vidtv_mux *m)
 {
 	struct vidtv_psi_table_pat_program *programs = NULL;
 	struct vidtv_psi_table_sdt_service *services = NULL;
@@ -357,24 +418,41 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 	struct vidtv_psi_table_eit_event *events = NULL;
 
 	m->si.pat = vidtv_psi_pat_table_init(m->transport_stream_id);
+	if (!m->si.pat)
+		return -ENOMEM;
 
 	m->si.sdt = vidtv_psi_sdt_table_init(m->transport_stream_id);
+	if (!m->si.sdt)
+		goto free_pat;
 
 	programs = vidtv_channel_pat_prog_cat_into_new(m);
+	if (!programs)
+		goto free_sdt;
 	services = vidtv_channel_sdt_serv_cat_into_new(m);
+	if (!services)
+		goto free_programs;
 
 	events = vidtv_channel_eit_event_cat_into_new(m);
+	if (!events)
+		goto free_services;
 
 	/* look for a service descriptor for every service */
 	service_list = vidtv_channel_build_service_list(services);
+	if (!service_list)
+		goto free_events;
 
 	/* use these descriptors to build the NIT */
 	m->si.nit = vidtv_psi_nit_table_init(m->network_id,
 					     m->transport_stream_id,
 					     m->network_name,
 					     service_list);
+	if (!m->si.nit)
+		goto free_service_list;
 
 	m->si.eit = vidtv_psi_eit_table_init(m->network_id, m->transport_stream_id);
+	if (!m->si.eit)
+		goto free_nit;
+
 
 	/* assemble all programs and assign to PAT */
 	vidtv_psi_pat_program_assign(m->si.pat, programs);
@@ -386,12 +464,34 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 	vidtv_psi_eit_event_assign(m->si.eit, events);
 
 	m->si.pmt_secs = vidtv_psi_pmt_create_sec_for_each_pat_entry(m->si.pat, m->pcr_pid);
+	if (!m->si.pmt_secs)
+		goto free_eit;
 
 	vidtv_channel_pmt_match_sections(m->channels,
 					 m->si.pmt_secs,
 					 m->si.pat->programs);
 
 	vidtv_channel_destroy_service_list(service_list);
+
+	return 0;
+
+free_eit:
+	vidtv_psi_eit_table_destroy(m->si.eit);
+free_nit:
+	vidtv_psi_nit_table_destroy(m->si.nit);
+free_service_list:
+	vidtv_channel_destroy_service_list(service_list);
+free_events:
+	vidtv_psi_eit_event_destroy(events);
+free_services:
+	vidtv_psi_sdt_service_destroy(services);
+free_programs:
+	vidtv_psi_pat_program_destroy(programs);
+free_sdt:
+	vidtv_psi_sdt_table_destroy(m->si.sdt);
+free_pat:
+	vidtv_psi_pat_table_destroy(m->si.pat);
+	return 0;
 }
 
 void vidtv_channel_si_destroy(struct vidtv_mux *m)
@@ -410,10 +510,15 @@ void vidtv_channel_si_destroy(struct vidtv_mux *m)
 	vidtv_psi_eit_table_destroy(m->si.eit);
 }
 
-void vidtv_channels_init(struct vidtv_mux *m)
+int vidtv_channels_init(struct vidtv_mux *m)
 {
 	/* this is the place to add new 'channels' for vidtv */
 	m->channels = vidtv_channel_s302m_init(NULL, m->transport_stream_id);
+
+	if (!m->channels)
+		return -ENOMEM;
+
+	return 0;
 }
 
 void vidtv_channels_destroy(struct vidtv_mux *m)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.h b/drivers/media/test-drivers/vidtv/vidtv_channel.h
index e1ba638ab77f..4bc2a4c0980d 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.h
@@ -65,14 +65,14 @@ struct vidtv_channel {
  * vidtv_channel_si_init - Init the PSI tables from the channels in the mux
  * @m: The mux containing the channels.
  */
-void vidtv_channel_si_init(struct vidtv_mux *m);
+int vidtv_channel_si_init(struct vidtv_mux *m);
 void vidtv_channel_si_destroy(struct vidtv_mux *m);
 
 /**
  * vidtv_channels_init - Init hardcoded, fake 'channels'.
  * @m: The mux to store the channels into.
  */
-void vidtv_channels_init(struct vidtv_mux *m);
+int vidtv_channels_init(struct vidtv_mux *m);
 struct vidtv_channel
 *vidtv_channel_s302m_init(struct vidtv_channel *head, u16 transport_stream_id);
 void vidtv_channels_destroy(struct vidtv_mux *m);
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 465c5a6a3bc8..bba3f2315531 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -47,37 +47,56 @@ static struct vidtv_mux_pid_ctx
 	struct vidtv_mux_pid_ctx *ctx;
 
 	ctx = vidtv_mux_get_pid_ctx(m, pid);
-
 	if (ctx)
-		goto end;
+		return ctx;
+
+	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+	if (!ctx)
+		return NULL;
 
-	ctx      = kzalloc(sizeof(*ctx), GFP_KERNEL);
 	ctx->pid = pid;
 	ctx->cc  = 0;
 	hash_add(m->pid_ctx, &ctx->h, pid);
 
-end:
 	return ctx;
 }
 
-static void vidtv_mux_pid_ctx_init(struct vidtv_mux *m)
+static void vidtv_mux_pid_ctx_destroy(struct vidtv_mux *m)
+{
+	int bkt;
+	struct vidtv_mux_pid_ctx *ctx;
+	struct hlist_node *tmp;
+
+	hash_for_each_safe(m->pid_ctx, bkt, tmp, ctx, h) {
+		hash_del(&ctx->h);
+		kfree(ctx);
+	}
+}
+
+static int vidtv_mux_pid_ctx_init(struct vidtv_mux *m)
 {
 	struct vidtv_psi_table_pat_program *p = m->si.pat->program;
 	u16 pid;
 
 	hash_init(m->pid_ctx);
 	/* push the pcr pid ctx */
-	vidtv_mux_create_pid_ctx_once(m, m->pcr_pid);
-	/* push the null packet pid ctx */
-	vidtv_mux_create_pid_ctx_once(m, TS_NULL_PACKET_PID);
+	if (!vidtv_mux_create_pid_ctx_once(m, m->pcr_pid))
+		return -ENOMEM;
+	/* push the NULL packet pid ctx */
+	if (!vidtv_mux_create_pid_ctx_once(m, TS_NULL_PACKET_PID))
+		goto free;
 	/* push the PAT pid ctx */
-	vidtv_mux_create_pid_ctx_once(m, VIDTV_PAT_PID);
+	if (!vidtv_mux_create_pid_ctx_once(m, VIDTV_PAT_PID))
+		goto free;
 	/* push the SDT pid ctx */
-	vidtv_mux_create_pid_ctx_once(m, VIDTV_SDT_PID);
+	if (!vidtv_mux_create_pid_ctx_once(m, VIDTV_SDT_PID))
+		goto free;
 	/* push the NIT pid ctx */
-	vidtv_mux_create_pid_ctx_once(m, VIDTV_NIT_PID);
+	if (!vidtv_mux_create_pid_ctx_once(m, VIDTV_NIT_PID))
+		goto free;
 	/* push the EIT pid ctx */
-	vidtv_mux_create_pid_ctx_once(m, VIDTV_EIT_PID);
+	if (!vidtv_mux_create_pid_ctx_once(m, VIDTV_EIT_PID))
+		goto free;
 
 	/* add a ctx for all PMT sections */
 	while (p) {
@@ -85,18 +104,12 @@ static void vidtv_mux_pid_ctx_init(struct vidtv_mux *m)
 		vidtv_mux_create_pid_ctx_once(m, pid);
 		p = p->next;
 	}
-}
 
-static void vidtv_mux_pid_ctx_destroy(struct vidtv_mux *m)
-{
-	int bkt;
-	struct vidtv_mux_pid_ctx *ctx;
-	struct hlist_node *tmp;
+	return 0;
 
-	hash_for_each_safe(m->pid_ctx, bkt, tmp, ctx, h) {
-		hash_del(&ctx->h);
-		kfree(ctx);
-	}
+free:
+	vidtv_mux_pid_ctx_destroy(m);
+	return -ENOMEM;
 }
 
 static void vidtv_mux_update_clk(struct vidtv_mux *m)
@@ -455,7 +468,11 @@ struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 				 struct device *dev,
 				 struct vidtv_mux_init_args args)
 {
-	struct vidtv_mux *m = kzalloc(sizeof(*m), GFP_KERNEL);
+	struct vidtv_mux *m;
+
+	m = kzalloc(sizeof(*m), GFP_KERNEL);
+	if (!m)
+		return NULL;
 
 	m->dev = dev;
 	m->fe = fe;
@@ -467,6 +484,9 @@ struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 	m->on_new_packets_available_cb = args.on_new_packets_available_cb;
 
 	m->mux_buf = vzalloc(args.mux_buf_sz);
+	if (!m->mux_buf)
+		goto free_mux;
+
 	m->mux_buf_sz = args.mux_buf_sz;
 
 	m->pcr_pid = args.pcr_pid;
@@ -479,16 +499,29 @@ struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 	if (args.channels)
 		m->channels = args.channels;
 	else
-		vidtv_channels_init(m);
+		if (vidtv_channels_init(m) < 0)
+			goto free_mux_buf;
 
 	/* will alloc data for pmt_sections after initializing pat */
-	vidtv_channel_si_init(m);
+	if (vidtv_channel_si_init(m) < 0)
+		goto free_channels;
 
 	INIT_WORK(&m->mpeg_thread, vidtv_mux_tick);
 
-	vidtv_mux_pid_ctx_init(m);
+	if (vidtv_mux_pid_ctx_init(m) < 0)
+		goto free_channel_si;
 
 	return m;
+
+free_channel_si:
+	vidtv_channel_si_destroy(m);
+free_channels:
+	vidtv_channels_destroy(m);
+free_mux_buf:
+	vfree(m->mux_buf);
+free_mux:
+	kfree(m);
+	return NULL;
 }
 
 void vidtv_mux_destroy(struct vidtv_mux *m)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index f4f6b90633db..f7caa96c0ee8 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -333,6 +333,8 @@ struct vidtv_psi_desc_service *vidtv_psi_service_desc_init(struct vidtv_psi_desc
 	u32 provider_name_len = provider_name ? strlen(provider_name) : 0;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+	if (!desc)
+		return NULL;
 
 	desc->type = SERVICE_DESCRIPTOR;
 
@@ -367,6 +369,8 @@ struct vidtv_psi_desc_registration
 	struct vidtv_psi_desc_registration *desc;
 
 	desc = kzalloc(sizeof(*desc) + sizeof(format_id) + additional_info_len, GFP_KERNEL);
+	if (!desc)
+		return NULL;
 
 	desc->type = REGISTRATION_DESCRIPTOR;
 
@@ -391,6 +395,8 @@ struct vidtv_psi_desc_network_name
 	u32 network_name_len = network_name ? strlen(network_name) : 0;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+	if (!desc)
+		return NULL;
 
 	desc->type = NETWORK_NAME_DESCRIPTOR;
 
@@ -414,11 +420,23 @@ struct vidtv_psi_desc_service_list
 	u16 length = 0;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+	if (!desc)
+		return NULL;
 
 	desc->type = SERVICE_LIST_DESCRIPTOR;
 
 	while (entry) {
 		curr_e = kzalloc(sizeof(*curr_e), GFP_KERNEL);
+		if (!curr_e) {
+			while (head_e) {
+				curr_e = head_e;
+				head_e = head_e->next;
+				kfree(curr_e);
+			}
+			kfree(desc);
+			return NULL;
+		}
+
 		curr_e->service_id = entry->service_id;
 		curr_e->service_type = entry->service_type;
 
@@ -453,6 +471,8 @@ struct vidtv_psi_desc_short_event
 	u32 iso_len =  iso_language_code ? strlen(iso_language_code) : 0;
 
 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+	if (!desc)
+		return NULL;
 
 	desc->type = SHORT_EVENT_DESCRIPTOR;
 
@@ -496,10 +516,10 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 		case SERVICE_DESCRIPTOR:
 			service = (struct vidtv_psi_desc_service *)desc;
 			curr = (struct vidtv_psi_desc *)
-				vidtv_psi_service_desc_init(head,
-							    service->service_type,
-							    service->service_name,
-							    service->provider_name);
+			       vidtv_psi_service_desc_init(head,
+							   service->service_type,
+							   service->service_name,
+							   service->provider_name);
 		break;
 
 		case NETWORK_NAME_DESCRIPTOR:
@@ -512,8 +532,8 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 		case SERVICE_LIST_DESCRIPTOR:
 			desc_service_list = (struct vidtv_psi_desc_service_list *)desc;
 			curr = (struct vidtv_psi_desc *)
-				vidtv_psi_service_list_desc_init(head,
-								 desc_service_list->service_list);
+			       vidtv_psi_service_list_desc_init(head,
+								desc_service_list->service_list);
 		break;
 
 		case SHORT_EVENT_DESCRIPTOR:
@@ -528,12 +548,15 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 		case REGISTRATION_DESCRIPTOR:
 		default:
 			curr = kzalloc(sizeof(*desc) + desc->length, GFP_KERNEL);
+			if (!curr)
+				return NULL;
 			memcpy(curr, desc, sizeof(*desc) + desc->length);
-		break;
-	}
+		}
+
+		if (!curr)
+			return NULL;
 
-		if (curr)
-			curr->next = NULL;
+		curr->next = NULL;
 		if (!head)
 			head = curr;
 		if (prev)
@@ -890,6 +913,8 @@ vidtv_psi_pat_program_init(struct vidtv_psi_table_pat_program *head,
 	const u16 RESERVED = 0x07;
 
 	program = kzalloc(sizeof(*program), GFP_KERNEL);
+	if (!program)
+		return NULL;
 
 	program->service_id = cpu_to_be16(service_id);
 
@@ -951,11 +976,15 @@ vidtv_psi_pat_program_assign(struct vidtv_psi_table_pat *pat,
 
 struct vidtv_psi_table_pat *vidtv_psi_pat_table_init(u16 transport_stream_id)
 {
-	struct vidtv_psi_table_pat *pat = kzalloc(sizeof(*pat), GFP_KERNEL);
+	struct vidtv_psi_table_pat *pat;
 	const u16 SYNTAX = 0x1;
 	const u16 ZERO = 0x0;
 	const u16 ONES = 0x03;
 
+	pat = kzalloc(sizeof(*pat), GFP_KERNEL);
+	if (!pat)
+		return NULL;
+
 	pat->header.table_id = 0x0;
 
 	pat->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ZERO << 14) | (ONES << 12));
@@ -1055,6 +1084,8 @@ vidtv_psi_pmt_stream_init(struct vidtv_psi_table_pmt_stream *head,
 	u16 desc_loop_len;
 
 	stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+	if (!stream)
+		return NULL;
 
 	stream->type = stream_type;
 
@@ -1129,7 +1160,7 @@ u16 vidtv_psi_pmt_get_pid(struct vidtv_psi_table_pmt *section,
 struct vidtv_psi_table_pmt *vidtv_psi_pmt_table_init(u16 program_number,
 						     u16 pcr_pid)
 {
-	struct vidtv_psi_table_pmt *pmt = kzalloc(sizeof(*pmt), GFP_KERNEL);
+	struct vidtv_psi_table_pmt *pmt;
 	const u16 SYNTAX = 0x1;
 	const u16 ZERO = 0x0;
 	const u16 ONES = 0x03;
@@ -1137,6 +1168,10 @@ struct vidtv_psi_table_pmt *vidtv_psi_pmt_table_init(u16 program_number,
 	const u16 RESERVED2 = 0x0f;
 	u16 desc_loop_len;
 
+	pmt = kzalloc(sizeof(*pmt), GFP_KERNEL);
+	if (!pmt)
+		return NULL;
+
 	if (!pcr_pid)
 		pcr_pid = 0x1fff;
 
@@ -1276,14 +1311,17 @@ void vidtv_psi_pmt_table_destroy(struct vidtv_psi_table_pmt *pmt)
 
 struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id)
 {
-	struct vidtv_psi_table_sdt *sdt = kzalloc(sizeof(*sdt), GFP_KERNEL);
+	struct vidtv_psi_table_sdt *sdt;
 	const u16 SYNTAX = 0x1;
 	const u16 ONE = 0x1;
 	const u16 ONES = 0x03;
 	const u16 RESERVED = 0xff;
 
-	sdt->header.table_id = 0x42;
+	sdt  = kzalloc(sizeof(*sdt), GFP_KERNEL);
+	if (!sdt)
+		return NULL;
 
+	sdt->header.table_id = 0x42;
 	sdt->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12));
 
 	/*
@@ -1418,6 +1456,8 @@ struct vidtv_psi_table_sdt_service
 	struct vidtv_psi_table_sdt_service *service;
 
 	service = kzalloc(sizeof(*service), GFP_KERNEL);
+	if (!service)
+		return NULL;
 
 	/*
 	 * ETSI 300 468: this is a 16bit field which serves as a label to
@@ -1491,6 +1531,8 @@ vidtv_psi_pmt_create_sec_for_each_pat_entry(struct vidtv_psi_table_pat *pat, u16
 	pmt_secs = kcalloc(pat->programs,
 			   sizeof(struct vidtv_psi_table_pmt *),
 			   GFP_KERNEL);
+	if (!pmt_secs)
+		return NULL;
 
 	while (program) {
 		pmt_secs[i] = vidtv_psi_pmt_table_init(be16_to_cpu(program->service_id), pcr_pid);
@@ -1568,13 +1610,20 @@ struct vidtv_psi_table_nit
 			  char *network_name,
 			  struct vidtv_psi_desc_service_list_entry *service_list)
 {
-	struct vidtv_psi_table_nit *nit = kzalloc(sizeof(*nit), GFP_KERNEL);
-	struct vidtv_psi_table_transport *transport = kzalloc(sizeof(*transport), GFP_KERNEL);
-
+	struct vidtv_psi_table_nit *nit;
+	struct vidtv_psi_table_transport *transport;
 	const u16 SYNTAX = 0x1;
 	const u16 ONE = 0x1;
 	const u16 ONES = 0x03;
 
+	nit = kzalloc(sizeof(*nit), GFP_KERNEL);
+	if (!nit)
+		return NULL;
+
+	transport = kzalloc(sizeof(*transport), GFP_KERNEL);
+	if (!transport)
+		goto free_nit;
+
 	nit->header.table_id = 0x40; // ACTUAL_NETWORK
 
 	nit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12));
@@ -1593,18 +1642,31 @@ struct vidtv_psi_table_nit
 
 	nit->descriptor = (struct vidtv_psi_desc *)
 			  vidtv_psi_network_name_desc_init(NULL, network_name);
+	if (!nit->descriptor)
+		goto free_transport;
 
 	transport->transport_id = cpu_to_be16(transport_stream_id);
 	transport->network_id = cpu_to_be16(network_id);
 	transport->bitfield = cpu_to_be16(0xf);
 	transport->descriptor = (struct vidtv_psi_desc *)
 				vidtv_psi_service_list_desc_init(NULL, service_list);
+	if (!transport->descriptor)
+		goto free_nit_desc;
 
 	nit->transport = transport;
 
 	vidtv_psi_nit_table_update_sec_len(nit);
 
 	return nit;
+
+free_nit_desc:
+	vidtv_psi_desc_destroy((struct vidtv_psi_desc *)nit->descriptor);
+
+free_transport:
+	kfree(transport);
+free_nit:
+	kfree(nit);
+	return NULL;
 }
 
 u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
@@ -1786,12 +1848,15 @@ struct vidtv_psi_table_eit
 *vidtv_psi_eit_table_init(u16 network_id,
 			  u16 transport_stream_id)
 {
-	struct vidtv_psi_table_eit *eit = kzalloc(sizeof(*eit), GFP_KERNEL);
-
+	struct vidtv_psi_table_eit *eit;
 	const u16 SYNTAX = 0x1;
 	const u16 ONE = 0x1;
 	const u16 ONES = 0x03;
 
+	eit = kzalloc(sizeof(*eit), GFP_KERNEL);
+	if (!eit)
+		return NULL;
+
 	eit->header.table_id = 0x4e; //actual_transport_stream: present/following
 
 	eit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12));
@@ -1906,9 +1971,13 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 struct vidtv_psi_table_eit_event
 *vidtv_psi_eit_event_init(struct vidtv_psi_table_eit_event *head, u16 event_id)
 {
-	struct vidtv_psi_table_eit_event *e = kzalloc(sizeof(*e), GFP_KERNEL);
+	struct vidtv_psi_table_eit_event *e;
 	const u8 DURATION_ONE_HOUR[] = {1, 0, 0};
 
+	e = kzalloc(sizeof(*e), GFP_KERNEL);
+	if (!e)
+		return NULL;
+
 	e->event_id = cpu_to_be16(event_id);
 	memset(e->start_time, 0xff, sizeof(e->start_time)); //todo: 0xff means 'unspecified'
 	memcpy(e->duration, DURATION_ONE_HOUR, sizeof(e->duration)); //todo, default to this for now
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index ec88af63a74e..146e4e9d361b 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -144,7 +144,11 @@ static const struct tone_duration beethoven_5th_symphony[] = {
 
 static struct vidtv_access_unit *vidtv_s302m_access_unit_init(struct vidtv_access_unit *head)
 {
-	struct vidtv_access_unit *au = kzalloc(sizeof(*au), GFP_KERNEL);
+	struct vidtv_access_unit *au;
+
+	au = kzalloc(sizeof(*au), GFP_KERNEL);
+	if (!au)
+		return NULL;
 
 	if (head) {
 		while (head->next)
@@ -441,9 +445,13 @@ static u32 vidtv_s302m_clear(struct vidtv_encoder *e)
 struct vidtv_encoder
 *vidtv_s302m_encoder_init(struct vidtv_s302m_encoder_init_args args)
 {
-	struct vidtv_encoder *e = kzalloc(sizeof(*e), GFP_KERNEL);
+	struct vidtv_encoder *e;
 	u32 priv_sz = sizeof(struct vidtv_s302m_ctx);
-	struct vidtv_s302m_ctx *ctx = kzalloc(priv_sz, GFP_KERNEL);
+	struct vidtv_s302m_ctx *ctx;
+
+	e = kzalloc(sizeof(*e), GFP_KERNEL);
+	if (!e)
+		return NULL;
 
 	e->id = S302M;
 
@@ -461,6 +469,11 @@ struct vidtv_encoder
 	e->src_buf_offset = 0;
 
 	e->is_video_encoder = false;
+
+	ctx = kzalloc(priv_sz, GFP_KERNEL);
+	if (!ctx)
+		return NULL;
+
 	e->ctx = ctx;
 	ctx->last_duration = 0;
 
commit 8922e3931dd79055bb3f851bed33f069fc67a2fc
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Sep 21 14:19:08 2020 +0200

    media: vidtv: reorganize includes
    
    - Place the includes on alphabetical order;
    - get rid of asm/byteorder.h;
    - add bug.h at vidtv_s302m.c, as it is needed by
      inux/fixp-arith.h
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
index 2f97ecf423ed..068fb4e9fafe 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
@@ -9,20 +9,20 @@
  * Copyright (C) 2020 Daniel W. S. Almeida
  */
 
+#include <linux/dev_printk.h>
 #include <linux/moduleparam.h>
 #include <linux/mutex.h>
 #include <linux/platform_device.h>
-#include <linux/dev_printk.h>
 #include <linux/time.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
 
 #include "vidtv_bridge.h"
+#include "vidtv_common.h"
 #include "vidtv_demod.h"
-#include "vidtv_tuner.h"
-#include "vidtv_ts.h"
 #include "vidtv_mux.h"
-#include "vidtv_common.h"
+#include "vidtv_ts.h"
+#include "vidtv_tuner.h"
 
 //#define MUX_BUF_MAX_SZ
 //#define MUX_BUF_MIN_SZ
diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.h b/drivers/media/test-drivers/vidtv/vidtv_bridge.h
index 78fe8472fa37..a85068bffd0f 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.h
@@ -20,9 +20,11 @@
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
 #include <linux/types.h>
+
 #include <media/dmxdev.h>
 #include <media/dvb_demux.h>
 #include <media/dvb_frontend.h>
+
 #include "vidtv_mux.h"
 
 /**
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index 13e56544bb1e..683da9014064 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -19,16 +19,16 @@
  * Copyright (C) 2020 Daniel W. S. Almeida
  */
 
-#include <linux/types.h>
-#include <linux/slab.h>
 #include <linux/dev_printk.h>
 #include <linux/ratelimit.h>
+#include <linux/slab.h>
+#include <linux/types.h>
 
 #include "vidtv_channel.h"
-#include "vidtv_psi.h"
+#include "vidtv_common.h"
 #include "vidtv_encoder.h"
 #include "vidtv_mux.h"
-#include "vidtv_common.h"
+#include "vidtv_psi.h"
 #include "vidtv_s302m.h"
 
 static void vidtv_channel_encoder_destroy(struct vidtv_encoder *e)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.h b/drivers/media/test-drivers/vidtv/vidtv_channel.h
index 40ed7fcdc5a1..e1ba638ab77f 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.h
@@ -23,9 +23,10 @@
 #define VIDTV_CHANNEL_H
 
 #include <linux/types.h>
-#include "vidtv_psi.h"
+
 #include "vidtv_encoder.h"
 #include "vidtv_mux.h"
+#include "vidtv_psi.h"
 
 /**
  * struct vidtv_channel - A 'channel' abstraction
diff --git a/drivers/media/test-drivers/vidtv/vidtv_demod.c b/drivers/media/test-drivers/vidtv/vidtv_demod.c
index eba7fe1a1b48..63ac55b81f39 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_demod.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_demod.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/workqueue.h>
+
 #include <media/dvb_frontend.h>
 
 #include "vidtv_demod.h"
diff --git a/drivers/media/test-drivers/vidtv/vidtv_demod.h b/drivers/media/test-drivers/vidtv/vidtv_demod.h
index 87651b0193e6..ab84044f33ba 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_demod.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_demod.h
@@ -12,6 +12,7 @@
 #define VIDTV_DEMOD_H
 
 #include <linux/dvb/frontend.h>
+
 #include <media/dvb_frontend.h>
 
 /**
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index c3646dd269dd..465c5a6a3bc8 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -12,23 +12,23 @@
  * Copyright (C) 2020 Daniel W. S. Almeida
  */
 
-#include <linux/types.h>
-#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/dev_printk.h>
 #include <linux/jiffies.h>
 #include <linux/kernel.h>
-#include <linux/dev_printk.h>
+#include <linux/math64.h>
 #include <linux/ratelimit.h>
-#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/types.h>
 #include <linux/vmalloc.h>
-#include <linux/math64.h>
 
-#include "vidtv_mux.h"
-#include "vidtv_ts.h"
-#include "vidtv_pes.h"
-#include "vidtv_encoder.h"
 #include "vidtv_channel.h"
 #include "vidtv_common.h"
+#include "vidtv_encoder.h"
+#include "vidtv_mux.h"
+#include "vidtv_pes.h"
 #include "vidtv_psi.h"
+#include "vidtv_ts.h"
 
 static struct vidtv_mux_pid_ctx
 *vidtv_mux_get_pid_ctx(struct vidtv_mux *m, u16 pid)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.h b/drivers/media/test-drivers/vidtv/vidtv_mux.h
index 6eeb09fbfe4d..005b707f1445 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.h
@@ -15,9 +15,10 @@
 #ifndef VIDTV_MUX_H
 #define VIDTV_MUX_H
 
-#include <linux/types.h>
 #include <linux/hashtable.h>
+#include <linux/types.h>
 #include <linux/workqueue.h>
+
 #include <media/dvb_frontend.h>
 
 #include "vidtv_psi.h"
diff --git a/drivers/media/test-drivers/vidtv/vidtv_pes.c b/drivers/media/test-drivers/vidtv/vidtv_pes.c
index 1c75f88070e9..102352d398ed 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_pes.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_pes.c
@@ -16,7 +16,6 @@
 #include <linux/types.h>
 #include <linux/printk.h>
 #include <linux/ratelimit.h>
-#include <asm/byteorder.h>
 
 #include "vidtv_pes.h"
 #include "vidtv_common.h"
diff --git a/drivers/media/test-drivers/vidtv/vidtv_pes.h b/drivers/media/test-drivers/vidtv/vidtv_pes.h
index 0ea9e863024d..a152693233a9 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_pes.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_pes.h
@@ -14,7 +14,6 @@
 #ifndef VIDTV_PES_H
 #define VIDTV_PES_H
 
-#include <asm/byteorder.h>
 #include <linux/types.h>
 
 #include "vidtv_common.h"
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 4dda5b0004a3..f4f6b90633db 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -11,18 +11,17 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ":%s, %d: " fmt, __func__, __LINE__
 
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/slab.h>
 #include <linux/crc32.h>
-#include <linux/string.h>
+#include <linux/kernel.h>
 #include <linux/printk.h>
 #include <linux/ratelimit.h>
+#include <linux/slab.h>
+#include <linux/string.h>
 #include <linux/string.h>
-#include <asm/byteorder.h>
+#include <linux/types.h>
 
-#include "vidtv_psi.h"
 #include "vidtv_common.h"
+#include "vidtv_psi.h"
 #include "vidtv_ts.h"
 
 #define CRC_SIZE_IN_BYTES 4
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 58efe54f7a5a..4fcb2c0615bb 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -13,7 +13,6 @@
 #define VIDTV_PSI_H
 
 #include <linux/types.h>
-#include <asm/byteorder.h>
 
 /*
  * all section lengths start immediately after the 'section_length' field
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index aacf8110d874..ec88af63a74e 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -17,23 +17,22 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ":%s, %d: " fmt, __func__, __LINE__
 
-#include <linux/types.h>
-#include <linux/slab.h>
+#include <linux/bug.h>
 #include <linux/crc32.h>
-#include <linux/vmalloc.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
+#include <linux/fixp-arith.h>
 #include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/math64.h>
 #include <linux/printk.h>
 #include <linux/ratelimit.h>
-#include <linux/fixp-arith.h>
-
-#include <linux/math64.h>
-#include <asm/byteorder.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/vmalloc.h>
 
-#include "vidtv_s302m.h"
-#include "vidtv_encoder.h"
 #include "vidtv_common.h"
+#include "vidtv_encoder.h"
+#include "vidtv_s302m.h"
 
 #define S302M_SAMPLING_RATE_HZ 48000
 #define PES_PRIVATE_STREAM_1 0xbd  /* PES: private_stream_1 */
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.h b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
index b1bbe521e766..a0101734e758 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
@@ -19,7 +19,6 @@
 #define VIDTV_S302M_H
 
 #include <linux/types.h>
-#include <asm/byteorder.h>
 
 #include "vidtv_encoder.h"
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_ts.c b/drivers/media/test-drivers/vidtv/vidtv_ts.c
index 190b9e4438dc..ca4bb9c40b78 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_ts.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_ts.c
@@ -9,14 +9,13 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ":%s, %d: " fmt, __func__, __LINE__
 
+#include <linux/math64.h>
 #include <linux/printk.h>
 #include <linux/ratelimit.h>
 #include <linux/types.h>
-#include <linux/math64.h>
-#include <asm/byteorder.h>
 
-#include "vidtv_ts.h"
 #include "vidtv_common.h"
+#include "vidtv_ts.h"
 
 static u32 vidtv_ts_write_pcr_bits(u8 *to, u32 to_offset, u64 pcr)
 {
diff --git a/drivers/media/test-drivers/vidtv/vidtv_ts.h b/drivers/media/test-drivers/vidtv/vidtv_ts.h
index 83dcc9183b45..6b989a2c1433 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_ts.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_ts.h
@@ -11,7 +11,6 @@
 #define VIDTV_TS_H
 
 #include <linux/types.h>
-#include <asm/byteorder.h>
 
 #define TS_SYNC_BYTE 0x47
 #define TS_PACKET_LEN 188
diff --git a/drivers/media/test-drivers/vidtv/vidtv_tuner.c b/drivers/media/test-drivers/vidtv/vidtv_tuner.c
index 9bc49e099f65..14b6bc902ee1 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_tuner.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_tuner.c
@@ -13,11 +13,12 @@
 #include <linux/errno.h>
 #include <linux/i2c.h>
 #include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/ratelimit.h>
 #include <linux/slab.h>
 #include <linux/types.h>
+
 #include <media/dvb_frontend.h>
-#include <linux/printk.h>
-#include <linux/ratelimit.h>
 
 #include "vidtv_tuner.h"
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_tuner.h b/drivers/media/test-drivers/vidtv/vidtv_tuner.h
index 8455b2d564b3..fd55346a5c87 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_tuner.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_tuner.h
@@ -11,6 +11,7 @@
 #define VIDTV_TUNER_H
 
 #include <linux/types.h>
+
 #include <media/dvb_frontend.h>
 
 #define NUM_VALID_TUNER_FREQS 8
commit c2b6ca661ae209ea3eeb71ea38ef3fa7dca9c3c1
Author: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
Date:   Sat Oct 31 16:05:52 2020 +0100

    media: vidtv: psi: fix missing assignments in while loops
    
    Some variables were only assigned once but were used in while
    loops as if they had been updated at every iteration. Fix this.
    
    Signed-off-by: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung at kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index ad2957efa483..4dda5b0004a3 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -1175,9 +1175,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 
 	struct vidtv_psi_desc *table_descriptor   = args.pmt->descriptor;
 	struct vidtv_psi_table_pmt_stream *stream = args.pmt->stream;
-	struct vidtv_psi_desc *stream_descriptor  = (stream) ?
-						    args.pmt->stream->descriptor :
-						    NULL;
+	struct vidtv_psi_desc *stream_descriptor;
 
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
@@ -1237,6 +1235,8 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 
 		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
 
+		stream_descriptor = stream->descriptor;
+
 		while (stream_descriptor) {
 			/* write the stream descriptors, if any */
 			d_args.dest_buf           = args.buf;
@@ -1324,9 +1324,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 	u32 crc = INITIAL_CRC;
 
 	struct vidtv_psi_table_sdt_service *service = args.sdt->service;
-	struct vidtv_psi_desc *service_desc = (args.sdt->service) ?
-					      args.sdt->service->descriptor :
-					      NULL;
+	struct vidtv_psi_desc *service_desc;
 
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
@@ -1373,6 +1371,8 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 
 		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
 
+		service_desc = service->descriptor;
+
 		while (service_desc) {
 			/* copy the service descriptors, if any */
 			d_args.dest_buf           = args.buf;
@@ -1616,9 +1616,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 
 	struct vidtv_psi_desc *table_descriptor     = args.nit->descriptor;
 	struct vidtv_psi_table_transport *transport = args.nit->transport;
-	struct vidtv_psi_desc *transport_descriptor = (transport) ?
-						       args.nit->transport->descriptor :
-						       NULL;
+	struct vidtv_psi_desc *transport_descriptor;
 
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
@@ -1686,6 +1684,8 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
 
 		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
 
+		transport_descriptor = transport->descriptor;
+
 		while (transport_descriptor) {
 			/* write the transport descriptors, if any */
 			d_args.dest_buf           = args.buf;
@@ -1823,9 +1823,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
 	u32 crc = INITIAL_CRC;
 
 	struct vidtv_psi_table_eit_event *event = args.eit->event;
-	struct vidtv_psi_desc *event_descriptor = (args.eit->event) ?
-						   args.eit->event->descriptor :
-						   NULL;
+	struct vidtv_psi_desc *event_descriptor;
 
 	struct header_write_args h_args = {};
 	struct psi_write_args psi_args  = {};
commit 99b99d135ee3fd3a073556b5b646a69b1793f3a2
Author: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
Date:   Sat Oct 31 16:05:51 2020 +0100

    media: vidtv: Move s302m specific fields into encoder context
    
    A few fields used only by the tone generator in the s302m encoder
    are stored in struct vidtv_encoder. Move them into
    struct vidtv_s302m_ctx instead. While we are at it: fix a
    checkpatch warning for long lines.
    
    Signed-off-by: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung at kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_encoder.h b/drivers/media/test-drivers/vidtv/vidtv_encoder.h
index 65d81daef4c3..f742d566fbcb 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_encoder.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_encoder.h
@@ -131,9 +131,6 @@ struct vidtv_encoder {
 	u32 encoder_buf_offset;
 
 	u64 sample_count;
-	int last_duration;
-	int note_offset;
-	enum musical_notes last_tone;
 
 	struct vidtv_access_unit *access_units;
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.c b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
index a447ccbd68d5..aacf8110d874 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.c
@@ -230,36 +230,38 @@ static u16 vidtv_s302m_get_sample(struct vidtv_encoder *e)
 {
 	u16 sample;
 	int pos;
+	struct vidtv_s302m_ctx *ctx = e->ctx;
 
 	if (!e->src_buf) {
 		/*
 		 * Simple tone generator: play the tones at the
 		 * beethoven_5th_symphony array.
 		 */
-		if (e->last_duration <= 0) {
+		if (ctx->last_duration <= 0) {
 			if (e->src_buf_offset >= ARRAY_SIZE(beethoven_5th_symphony))
 				e->src_buf_offset = 0;
 
-			e->last_tone = beethoven_5th_symphony[e->src_buf_offset].note;
-			e->last_duration = beethoven_5th_symphony[e->src_buf_offset].duration * S302M_SAMPLING_RATE_HZ / COMPASS / 5;
+			ctx->last_tone = beethoven_5th_symphony[e->src_buf_offset].note;
+			ctx->last_duration = beethoven_5th_symphony[e->src_buf_offset].duration *
+					     S302M_SAMPLING_RATE_HZ / COMPASS / 5;
 			e->src_buf_offset++;
-			e->note_offset = 0;
+			ctx->note_offset = 0;
 		} else {
-			e->last_duration--;
+			ctx->last_duration--;
 		}
 
 		/* Handle silent */
-		if (!e->last_tone) {
+		if (!ctx->last_tone) {
 			e->src_buf_offset = 0;
 			return 0x8000;
 		}
 
-		pos = (2 * PI * e->note_offset * e->last_tone / S302M_SAMPLING_RATE_HZ);
+		pos = (2 * PI * ctx->note_offset * ctx->last_tone / S302M_SAMPLING_RATE_HZ);
 
 		if (pos == 360)
-			e->note_offset = 0;
+			ctx->note_offset = 0;
 		else
-			e->note_offset++;
+			ctx->note_offset++;
 
 		return (fixp_sin32(pos % (2 * PI)) >> 16) + 0x8000;
 	}
@@ -442,6 +444,7 @@ struct vidtv_encoder
 {
 	struct vidtv_encoder *e = kzalloc(sizeof(*e), GFP_KERNEL);
 	u32 priv_sz = sizeof(struct vidtv_s302m_ctx);
+	struct vidtv_s302m_ctx *ctx = kzalloc(priv_sz, GFP_KERNEL);
 
 	e->id = S302M;
 
@@ -453,14 +456,14 @@ struct vidtv_encoder
 	e->encoder_buf_offset = 0;
 
 	e->sample_count = 0;
-	e->last_duration = 0;
 
 	e->src_buf = (args.src_buf) ? args.src_buf : NULL;
 	e->src_buf_sz = (args.src_buf) ? args.src_buf_sz : 0;
 	e->src_buf_offset = 0;
 
 	e->is_video_encoder = false;
-	e->ctx = kzalloc(priv_sz, GFP_KERNEL);
+	e->ctx = ctx;
+	ctx->last_duration = 0;
 
 	e->encode = vidtv_s302m_encode;
 	e->clear = vidtv_s302m_clear;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_s302m.h b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
index eca5e3150ede..b1bbe521e766 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_s302m.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_s302m.h
@@ -39,6 +39,9 @@ struct vidtv_s302m_ctx {
 	struct vidtv_encoder *enc;
 	u32 frame_index;
 	u32 au_count;
+	int last_duration;
+	int note_offset;
+	enum musical_notes last_tone;
 };
 
 /**
commit 84306c96b1c249d5eab6af9f86110a2d80b56010
Author: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
Date:   Sat Oct 31 16:05:50 2020 +0100

    media: vidtv: psi: extract descriptor chaining code into a helper
    
    The code to append a descriptor to the end of a chain is repeated
    throughout the psi generator code. Extract it into its own helper
    function to avoid cluttering.
    
    Signed-off-by: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung at kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index b0b476545d65..ad2957efa483 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -314,6 +314,16 @@ static u32 table_section_crc32_write_into(struct crc32_write_args args)
 	return nbytes;
 }
 
+static void vidtv_psi_desc_chain(struct vidtv_psi_desc *head, struct vidtv_psi_desc *desc)
+{
+	if (head) {
+		while (head->next)
+			head = head->next;
+
+		head->next = desc;
+	}
+}
+
 struct vidtv_psi_desc_service *vidtv_psi_service_desc_init(struct vidtv_psi_desc *head,
 							   enum service_type service_type,
 							   char *service_name,
@@ -345,12 +355,7 @@ struct vidtv_psi_desc_service *vidtv_psi_service_desc_init(struct vidtv_psi_desc
 	if (provider_name && provider_name_len)
 		desc->provider_name = kstrdup(provider_name, GFP_KERNEL);
 
-	if (head) {
-		while (head->next)
-			head = head->next;
-
-		head->next = (struct vidtv_psi_desc *)desc;
-	}
+	vidtv_psi_desc_chain(head, (struct vidtv_psi_desc *)desc);
 	return desc;
 }
 
@@ -376,13 +381,7 @@ struct vidtv_psi_desc_registration
 		       additional_ident_info,
 		       additional_info_len);
 
-	if (head) {
-		while (head->next)
-			head = head->next;
-
-		head->next = (struct vidtv_psi_desc *)desc;
-	}
-
+	vidtv_psi_desc_chain(head, (struct vidtv_psi_desc *)desc);
 	return desc;
 }
 
@@ -401,13 +400,7 @@ struct vidtv_psi_desc_network_name
 	if (network_name && network_name_len)
 		desc->network_name = kstrdup(network_name, GFP_KERNEL);
 
-	if (head) {
-		while (head->next)
-			head = head->next;
-
-		head->next = (struct vidtv_psi_desc *)desc;
-	}
-
+	vidtv_psi_desc_chain(head, (struct vidtv_psi_desc *)desc);
 	return desc;
 }
 
@@ -445,13 +438,7 @@ struct vidtv_psi_desc_service_list
 	desc->length = length;
 	desc->service_list = head_e;
 
-	if (head) {
-		while (head->next)
-			head = head->next;
-
-		head->next = (struct vidtv_psi_desc *)desc;
-	}
-
+	vidtv_psi_desc_chain(head, (struct vidtv_psi_desc *)desc);
 	return desc;
 }
 
@@ -490,13 +477,7 @@ struct vidtv_psi_desc_short_event
 	if (text && text_len)
 		desc->text = kstrdup(text, GFP_KERNEL);
 
-	if (head) {
-		while (head->next)
-			head = head->next;
-
-		head->next = (struct vidtv_psi_desc *)desc;
-	}
-
+	vidtv_psi_desc_chain(head, (struct vidtv_psi_desc *)desc);
 	return desc;
 }
 
commit 7a7899f6f58e3270ccfd200ee63ebced5ddba3c9
Author: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
Date:   Sat Oct 31 16:05:49 2020 +0100

    media: vidtv: psi: Implement an Event Information Table (EIT)
    
    Implement an Event Information Table (EIT) as per EN 300 468
    5.2.4.
    
    The EIT provides information in chronological order regarding
    the events contained within each service.
    
    For now only present event information is supported.
    
    [mchehab+huawei at kernel.org: removed an extra blank line]
    Signed-off-by: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung at kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/Documentation/driver-api/media/drivers/vidtv.rst b/Documentation/driver-api/media/drivers/vidtv.rst
index 2d7ddf676b13..edaceef2808c 100644
--- a/Documentation/driver-api/media/drivers/vidtv.rst
+++ b/Documentation/driver-api/media/drivers/vidtv.rst
@@ -149,11 +149,11 @@ vidtv_psi.[ch]
 	Because the generator is implemented in a separate file, it can be
 	reused elsewhere in the media subsystem.
 
-	Currently vidtv supports working with 4 PSI tables: PAT, PMT,
-	SDT and NIT.
+	Currently vidtv supports working with 5 PSI tables: PAT, PMT,
+	SDT, NIT and EIT.
 
 	The specification for PAT and PMT can be found in *ISO 13818-1:
-	Systems*, while the specification for the SDT, NIT can be found in *ETSI
+	Systems*, while the specification for the SDT, NIT, EIT can be found in *ETSI
 	EN 300 468: Specification for Service Information (SI) in DVB
 	systems*.
 
@@ -197,6 +197,8 @@ vidtv_channel.[ch]
 
 	#. Their programs will be concatenated to populate the PAT
 
+	#. Their events will be concatenated to populate the EIT
+
 	#. For each program in the PAT, a PMT section will be created
 
 	#. The PMT section for a channel will be assigned its streams.
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index a246b49123d9..13e56544bb1e 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -9,6 +9,7 @@
  * When vidtv boots, it will create some hardcoded channels.
  * Their services will be concatenated to populate the SDT.
  * Their programs will be concatenated to populate the PAT
+ * Their events will be concatenated to populate the EIT
  * For each program in the PAT, a PMT section will be created
  * The PMT section for a channel will be assigned its streams.
  * Every stream will have its corresponding encoder polled to produce TS packets
@@ -59,13 +60,17 @@ struct vidtv_channel
 
 	char *name = ENCODING_ISO8859_15 "Beethoven";
 	char *provider = ENCODING_ISO8859_15 "LinuxTV.org";
+	char *iso_language_code = ENCODING_ISO8859_15 "eng";
+	char *event_name = ENCODING_ISO8859_15 "Beethoven Music";
+	char *event_text = ENCODING_ISO8859_15 "Beethoven's 5th Symphony";
+	const u16 s302m_beethoven_event_id  = 1;
 
 	struct vidtv_channel *s302m = kzalloc(sizeof(*s302m), GFP_KERNEL);
 	struct vidtv_s302m_encoder_init_args encoder_args = {};
 
 	s302m->name = kstrdup(name, GFP_KERNEL);
 
-	s302m->service = vidtv_psi_sdt_service_init(NULL, s302m_service_id);
+	s302m->service = vidtv_psi_sdt_service_init(NULL, s302m_service_id, false, true);
 
 	s302m->service->descriptor = (struct vidtv_psi_desc *)
 				     vidtv_psi_service_desc_init(NULL,
@@ -94,6 +99,13 @@ struct vidtv_channel
 
 	s302m->encoders = vidtv_s302m_encoder_init(encoder_args);
 
+	s302m->events = vidtv_psi_eit_event_init(NULL, s302m_beethoven_event_id);
+	s302m->events->descriptor = (struct vidtv_psi_desc *)
+				    vidtv_psi_short_event_desc_init(NULL,
+								    iso_language_code,
+								    event_name,
+								    event_text);
+
 	if (head) {
 		while (head->next)
 			head = head->next;
@@ -104,6 +116,48 @@ struct vidtv_channel
 	return s302m;
 }
 
+static struct vidtv_psi_table_eit_event
+*vidtv_channel_eit_event_cat_into_new(struct vidtv_mux *m)
+{
+	/* Concatenate the events */
+	const struct vidtv_channel *cur_chnl = m->channels;
+
+	struct vidtv_psi_table_eit_event *curr = NULL;
+	struct vidtv_psi_table_eit_event *head = NULL;
+	struct vidtv_psi_table_eit_event *tail = NULL;
+
+	struct vidtv_psi_desc *desc = NULL;
+	u16 event_id;
+
+	if (!cur_chnl)
+		return NULL;
+
+	while (cur_chnl) {
+		curr = cur_chnl->events;
+
+		if (!curr)
+			dev_warn_ratelimited(m->dev,
+					     "No events found for channel %s\n", cur_chnl->name);
+
+		while (curr) {
+			event_id = be16_to_cpu(curr->event_id);
+			tail = vidtv_psi_eit_event_init(tail, event_id);
+
+			desc = vidtv_psi_desc_clone(curr->descriptor);
+			vidtv_psi_desc_assign(&tail->descriptor, desc);
+
+			if (!head)
+				head = tail;
+
+			curr = curr->next;
+		}
+
+		cur_chnl = cur_chnl->next;
+	}
+
+	return head;
+}
+
 static struct vidtv_psi_table_sdt_service
 *vidtv_channel_sdt_serv_cat_into_new(struct vidtv_mux *m)
 {
@@ -129,7 +183,10 @@ static struct vidtv_psi_table_sdt_service
 
 		while (curr) {
 			service_id = be16_to_cpu(curr->service_id);
-			tail = vidtv_psi_sdt_service_init(tail, service_id);
+			tail = vidtv_psi_sdt_service_init(tail,
+							  service_id,
+							  curr->EIT_schedule,
+							  curr->EIT_present_following);
 
 			desc = vidtv_psi_desc_clone(curr->descriptor);
 			vidtv_psi_desc_assign(&tail->descriptor, desc);
@@ -297,6 +354,7 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 	struct vidtv_psi_table_pat_program *programs = NULL;
 	struct vidtv_psi_table_sdt_service *services = NULL;
 	struct vidtv_psi_desc_service_list_entry *service_list = NULL;
+	struct vidtv_psi_table_eit_event *events = NULL;
 
 	m->si.pat = vidtv_psi_pat_table_init(m->transport_stream_id);
 
@@ -305,6 +363,8 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 	programs = vidtv_channel_pat_prog_cat_into_new(m);
 	services = vidtv_channel_sdt_serv_cat_into_new(m);
 
+	events = vidtv_channel_eit_event_cat_into_new(m);
+
 	/* look for a service descriptor for every service */
 	service_list = vidtv_channel_build_service_list(services);
 
@@ -314,12 +374,17 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 					     m->network_name,
 					     service_list);
 
+	m->si.eit = vidtv_psi_eit_table_init(m->network_id, m->transport_stream_id);
+
 	/* assemble all programs and assign to PAT */
 	vidtv_psi_pat_program_assign(m->si.pat, programs);
 
 	/* assemble all services and assign to SDT */
 	vidtv_psi_sdt_service_assign(m->si.sdt, services);
 
+	/* assemble all events and assign to EIT */
+	vidtv_psi_eit_event_assign(m->si.eit, events);
+
 	m->si.pmt_secs = vidtv_psi_pmt_create_sec_for_each_pat_entry(m->si.pat, m->pcr_pid);
 
 	vidtv_channel_pmt_match_sections(m->channels,
@@ -342,6 +407,7 @@ void vidtv_channel_si_destroy(struct vidtv_mux *m)
 	kfree(m->si.pmt_secs);
 	vidtv_psi_sdt_table_destroy(m->si.sdt);
 	vidtv_psi_nit_table_destroy(m->si.nit);
+	vidtv_psi_eit_table_destroy(m->si.eit);
 }
 
 void vidtv_channels_init(struct vidtv_mux *m)
@@ -361,6 +427,7 @@ void vidtv_channels_destroy(struct vidtv_mux *m)
 		vidtv_psi_pat_program_destroy(curr->program);
 		vidtv_psi_pmt_stream_destroy(curr->streams);
 		vidtv_channel_encoder_destroy(curr->encoders);
+		vidtv_psi_eit_event_destroy(curr->events);
 
 		tmp = curr;
 		curr = curr->next;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.h b/drivers/media/test-drivers/vidtv/vidtv_channel.h
index 2c3cba4313b0..40ed7fcdc5a1 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.h
@@ -9,6 +9,7 @@
  * When vidtv boots, it will create some hardcoded channels.
  * Their services will be concatenated to populate the SDT.
  * Their programs will be concatenated to populate the PAT
+ * Their events will be concatenated to populate the EIT
  * For each program in the PAT, a PMT section will be created
  * The PMT section for a channel will be assigned its streams.
  * Every stream will have its corresponding encoder polled to produce TS packets
@@ -44,6 +45,7 @@
  * Will be concatenated into the PAT.
  * @streams: A stream loop used to populate the PMT section for 'program'
  * @encoders: A encoder loop. There must be one encoder for each stream.
+ * @events: Optional event information. This will feed into the EIT.
  * @next: Optionally chain this channel.
  */
 struct vidtv_channel {
@@ -54,6 +56,7 @@ struct vidtv_channel {
 	struct vidtv_psi_table_pat_program *program;
 	struct vidtv_psi_table_pmt_stream *streams;
 	struct vidtv_encoder *encoders;
+	struct vidtv_psi_table_eit_event *events;
 	struct vidtv_channel *next;
 };
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 2a960e87c39c..c3646dd269dd 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -76,6 +76,8 @@ static void vidtv_mux_pid_ctx_init(struct vidtv_mux *m)
 	vidtv_mux_create_pid_ctx_once(m, VIDTV_SDT_PID);
 	/* push the NIT pid ctx */
 	vidtv_mux_create_pid_ctx_once(m, VIDTV_NIT_PID);
+	/* push the EIT pid ctx */
+	vidtv_mux_create_pid_ctx_once(m, VIDTV_EIT_PID);
 
 	/* add a ctx for all PMT sections */
 	while (p) {
@@ -120,11 +122,13 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	struct vidtv_mux_pid_ctx *pmt_ctx;
 	struct vidtv_mux_pid_ctx *sdt_ctx;
 	struct vidtv_mux_pid_ctx *nit_ctx;
+	struct vidtv_mux_pid_ctx *eit_ctx;
 
 	struct vidtv_psi_pat_write_args pat_args = {};
 	struct vidtv_psi_pmt_write_args pmt_args = {};
 	struct vidtv_psi_sdt_write_args sdt_args = {};
 	struct vidtv_psi_nit_write_args nit_args = {};
+	struct vidtv_psi_eit_write_args eit_args = {};
 
 	u32 nbytes; /* the number of bytes written by this function */
 	u16 pmt_pid;
@@ -133,6 +137,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	pat_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_PAT_PID);
 	sdt_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_SDT_PID);
 	nit_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_NIT_PID);
+	eit_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_EIT_PID);
 
 	pat_args.buf                = m->mux_buf;
 	pat_args.offset             = m->mux_buf_offset;
@@ -182,6 +187,14 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 
 	m->mux_buf_offset += vidtv_psi_nit_write_into(nit_args);
 
+	eit_args.buf                = m->mux_buf;
+	eit_args.offset             = m->mux_buf_offset;
+	eit_args.eit                = m->si.eit;
+	eit_args.buf_sz             = m->mux_buf_sz;
+	eit_args.continuity_counter = &eit_ctx->cc;
+
+	m->mux_buf_offset += vidtv_psi_eit_write_into(eit_args);
+
 	nbytes = m->mux_buf_offset - initial_offset;
 
 	m->num_streamed_si++;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.h b/drivers/media/test-drivers/vidtv/vidtv_mux.h
index 5dfbe30c2ac8..6eeb09fbfe4d 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.h
@@ -58,6 +58,7 @@ struct vidtv_mux_timing {
  * @pat: The PAT in use by the muxer.
  * @pmt_secs: The PMT sections in use by the muxer. One for each program in the PAT.
  * @sdt: The SDT in use by the muxer.
+ * @eit: the EIT in use by the muxer.
  */
 struct vidtv_mux_si {
 	/* the SI tables */
@@ -65,6 +66,7 @@ struct vidtv_mux_si {
 	struct vidtv_psi_table_pmt **pmt_secs; /* the PMT sections */
 	struct vidtv_psi_table_sdt *sdt;
 	struct vidtv_psi_table_nit *nit;
+	struct vidtv_psi_table_eit *eit;
 };
 
 /**
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 0de6d646a483..b0b476545d65 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -28,6 +28,7 @@
 #define CRC_SIZE_IN_BYTES 4
 #define MAX_VERSION_NUM 32
 #define INITIAL_CRC 0xffffffff
+#define ISO_LANGUAGE_CODE_LEN 3
 
 static const u32 CRC_LUT[256] = {
 	/* from libdvbv5 */
@@ -454,6 +455,51 @@ struct vidtv_psi_desc_service_list
 	return desc;
 }
 
+struct vidtv_psi_desc_short_event
+*vidtv_psi_short_event_desc_init(struct vidtv_psi_desc *head,
+				 char *iso_language_code,
+				 char *event_name,
+				 char *text)
+{
+	struct vidtv_psi_desc_short_event *desc;
+	u32 event_name_len = event_name ? strlen(event_name) : 0;
+	u32 text_len =  text ? strlen(text) : 0;
+	u32 iso_len =  iso_language_code ? strlen(iso_language_code) : 0;
+
+	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+
+	desc->type = SHORT_EVENT_DESCRIPTOR;
+
+	desc->length = ISO_LANGUAGE_CODE_LEN +
+		       sizeof_field(struct vidtv_psi_desc_short_event, event_name_len) +
+		       event_name_len +
+		       sizeof_field(struct vidtv_psi_desc_short_event, text_len) +
+		       text_len;
+
+	desc->event_name_len = event_name_len;
+	desc->text_len = text_len;
+
+	if (iso_len != ISO_LANGUAGE_CODE_LEN)
+		iso_language_code = "eng";
+
+	desc->iso_language_code = kstrdup(iso_language_code, GFP_KERNEL);
+
+	if (event_name && event_name_len)
+		desc->event_name = kstrdup(event_name, GFP_KERNEL);
+
+	if (text && text_len)
+		desc->text = kstrdup(text, GFP_KERNEL);
+
+	if (head) {
+		while (head->next)
+			head = head->next;
+
+		head->next = (struct vidtv_psi_desc *)desc;
+	}
+
+	return desc;
+}
+
 struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 {
 	struct vidtv_psi_desc *head = NULL;
@@ -463,6 +509,7 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 	struct vidtv_psi_desc_service *service;
 	struct vidtv_psi_desc_network_name *desc_network_name;
 	struct vidtv_psi_desc_service_list *desc_service_list;
+	struct vidtv_psi_desc_short_event  *desc_short_event;
 
 	while (desc) {
 		switch (desc->type) {
@@ -489,6 +536,15 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 								 desc_service_list->service_list);
 		break;
 
+		case SHORT_EVENT_DESCRIPTOR:
+			desc_short_event = (struct vidtv_psi_desc_short_event *)desc;
+			curr = (struct vidtv_psi_desc *)
+			       vidtv_psi_short_event_desc_init(head,
+							       desc_short_event->iso_language_code,
+							       desc_short_event->event_name,
+							       desc_short_event->text);
+		break;
+
 		case REGISTRATION_DESCRIPTOR:
 		default:
 			curr = kzalloc(sizeof(*desc) + desc->length, GFP_KERNEL);
@@ -544,6 +600,12 @@ void vidtv_psi_desc_destroy(struct vidtv_psi_desc *desc)
 			}
 			break;
 
+		case SHORT_EVENT_DESCRIPTOR:
+			kfree(((struct vidtv_psi_desc_short_event *)tmp)->iso_language_code);
+			kfree(((struct vidtv_psi_desc_short_event *)tmp)->event_name);
+			kfree(((struct vidtv_psi_desc_short_event *)tmp)->text);
+		break;
+
 		default:
 			pr_warn_ratelimited("Possible leak: not handling descriptor type %d\n",
 					    tmp->type);
@@ -683,6 +745,41 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 		}
 		break;
 
+	case SHORT_EVENT_DESCRIPTOR:
+		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.len = ISO_LANGUAGE_CODE_LEN;
+		psi_args.from = ((struct vidtv_psi_desc_short_event *)
+				  args.desc)->iso_language_code;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, event_name_len);
+		psi_args.from = &((struct vidtv_psi_desc_short_event *)
+				  args.desc)->event_name_len;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name_len;
+		psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, text_len);
+		psi_args.from = &((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
+		psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->text;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		break;
+
 	case REGISTRATION_DESCRIPTOR:
 	default:
 		psi_args.dest_offset = args.dest_offset + nbytes;
@@ -1334,7 +1431,9 @@ void vidtv_psi_sdt_table_destroy(struct vidtv_psi_table_sdt *sdt)
 
 struct vidtv_psi_table_sdt_service
 *vidtv_psi_sdt_service_init(struct vidtv_psi_table_sdt_service *head,
-			    u16 service_id)
+			    u16 service_id,
+			    bool eit_schedule,
+			    bool eit_present_following)
 {
 	struct vidtv_psi_table_sdt_service *service;
 
@@ -1347,8 +1446,8 @@ struct vidtv_psi_table_sdt_service
 	 * corresponding program_map_section
 	 */
 	service->service_id            = cpu_to_be16(service_id);
-	service->EIT_schedule          = 0x0;
-	service->EIT_present_following = 0x0;
+	service->EIT_schedule          = eit_schedule;
+	service->EIT_present_following = eit_present_following;
 	service->reserved              = 0x3f;
 
 	service->bitfield = cpu_to_be16(RUNNING << 13);
@@ -1656,3 +1755,213 @@ void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit)
 	vidtv_psi_transport_destroy(nit->transport);
 	kfree(nit);
 }
+
+void vidtv_psi_eit_table_update_sec_len(struct vidtv_psi_table_eit *eit)
+{
+	u16 length = 0;
+	struct vidtv_psi_table_eit_event *e = eit->event;
+	u16 desc_loop_len;
+
+	/*
+	 * from immediately after 'section_length' until
+	 * 'last_table_id'
+	 */
+	length += EIT_LEN_UNTIL_LAST_TABLE_ID;
+
+	while (e) {
+		/* skip both pointers at the end */
+		length += sizeof(struct vidtv_psi_table_eit_event) -
+			  sizeof(struct vidtv_psi_desc *) -
+			  sizeof(struct vidtv_psi_table_eit_event *);
+
+		desc_loop_len = vidtv_psi_desc_comp_loop_len(e->descriptor);
+		vidtv_psi_set_desc_loop_len(&e->bitfield, desc_loop_len, 12);
+
+		length += desc_loop_len;
+
+		e = e->next;
+	}
+
+	length += CRC_SIZE_IN_BYTES;
+
+	vidtv_psi_set_sec_len(&eit->header, length);
+}
+
+void vidtv_psi_eit_event_assign(struct vidtv_psi_table_eit *eit,
+				struct vidtv_psi_table_eit_event *e)
+{
+	if (e == eit->event)
+		return;
+
+	eit->event = e;
+	vidtv_psi_eit_table_update_sec_len(eit);
+
+	if (vidtv_psi_get_sec_len(&eit->header) > EIT_MAX_SECTION_LEN)
+		vidtv_psi_eit_event_assign(eit, NULL);
+
+	vidtv_psi_update_version_num(&eit->header);
+}
+
+struct vidtv_psi_table_eit
+*vidtv_psi_eit_table_init(u16 network_id,
+			  u16 transport_stream_id)
+{
+	struct vidtv_psi_table_eit *eit = kzalloc(sizeof(*eit), GFP_KERNEL);
+
+	const u16 SYNTAX = 0x1;
+	const u16 ONE = 0x1;
+	const u16 ONES = 0x03;
+
+	eit->header.table_id = 0x4e; //actual_transport_stream: present/following
+
+	eit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12));
+
+	eit->header.id = cpu_to_be16(network_id);
+	eit->header.current_next = ONE;
+
+	eit->header.version = 0x1f;
+
+	eit->header.one2  = ONES;
+	eit->header.section_id   = 0;
+	eit->header.last_section = 0;
+
+	eit->transport_id = cpu_to_be16(transport_stream_id);
+	eit->network_id = cpu_to_be16(network_id);
+
+	eit->last_segment = eit->header.last_section; /* not implemented */
+	eit->last_table_id = eit->header.table_id; /* not implemented */
+
+	vidtv_psi_eit_table_update_sec_len(eit);
+
+	return eit;
+}
+
+u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
+{
+	u32 nbytes  = 0;
+	u32 crc = INITIAL_CRC;
+
+	struct vidtv_psi_table_eit_event *event = args.eit->event;
+	struct vidtv_psi_desc *event_descriptor = (args.eit->event) ?
+						   args.eit->event->descriptor :
+						   NULL;
+
+	struct header_write_args h_args = {};
+	struct psi_write_args psi_args  = {};
+	struct desc_write_args d_args   = {};
+	struct crc32_write_args c_args  = {};
+
+	vidtv_psi_eit_table_update_sec_len(args.eit);
+
+	h_args.dest_buf           = args.buf;
+	h_args.dest_offset        = args.offset;
+	h_args.h                  = &args.eit->header;
+	h_args.pid                = VIDTV_EIT_PID;
+	h_args.continuity_counter = args.continuity_counter;
+	h_args.dest_buf_sz        = args.buf_sz;
+	h_args.crc                = &crc;
+
+	nbytes += vidtv_psi_table_header_write_into(h_args);
+
+	psi_args.dest_buf = args.buf;
+	psi_args.from     = &args.eit->transport_id;
+
+	psi_args.len = sizeof_field(struct vidtv_psi_table_eit, transport_id) +
+		       sizeof_field(struct vidtv_psi_table_eit, network_id)   +
+		       sizeof_field(struct vidtv_psi_table_eit, last_segment) +
+		       sizeof_field(struct vidtv_psi_table_eit, last_table_id);
+
+	psi_args.dest_offset        = args.offset + nbytes;
+	psi_args.pid                = VIDTV_EIT_PID;
+	psi_args.new_psi_section    = false;
+	psi_args.continuity_counter = args.continuity_counter;
+	psi_args.is_crc             = false;
+	psi_args.dest_buf_sz        = args.buf_sz;
+	psi_args.crc                = &crc;
+
+	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+	while (event) {
+		/* copy the events, if any */
+		psi_args.from = event;
+		/* skip both pointers at the end */
+		psi_args.len = sizeof(struct vidtv_psi_table_eit_event) -
+			       sizeof(struct vidtv_psi_desc *) -
+			       sizeof(struct vidtv_psi_table_eit_event *);
+		psi_args.dest_offset = args.offset + nbytes;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		event_descriptor = event->descriptor;
+
+		while (event_descriptor) {
+			/* copy the event descriptors, if any */
+			d_args.dest_buf           = args.buf;
+			d_args.dest_offset        = args.offset + nbytes;
+			d_args.desc               = event_descriptor;
+			d_args.pid                = VIDTV_EIT_PID;
+			d_args.continuity_counter = args.continuity_counter;
+			d_args.dest_buf_sz        = args.buf_sz;
+			d_args.crc                = &crc;
+
+			nbytes += vidtv_psi_desc_write_into(d_args);
+
+			event_descriptor = event_descriptor->next;
+		}
+
+		event = event->next;
+	}
+
+	c_args.dest_buf           = args.buf;
+	c_args.dest_offset        = args.offset + nbytes;
+	c_args.crc                = cpu_to_be32(crc);
+	c_args.pid                = VIDTV_EIT_PID;
+	c_args.continuity_counter = args.continuity_counter;
+	c_args.dest_buf_sz        = args.buf_sz;
+
+	/* Write the CRC at the end */
+	nbytes += table_section_crc32_write_into(c_args);
+
+	return nbytes;
+}
+
+struct vidtv_psi_table_eit_event
+*vidtv_psi_eit_event_init(struct vidtv_psi_table_eit_event *head, u16 event_id)
+{
+	struct vidtv_psi_table_eit_event *e = kzalloc(sizeof(*e), GFP_KERNEL);
+	const u8 DURATION_ONE_HOUR[] = {1, 0, 0};
+
+	e->event_id = cpu_to_be16(event_id);
+	memset(e->start_time, 0xff, sizeof(e->start_time)); //todo: 0xff means 'unspecified'
+	memcpy(e->duration, DURATION_ONE_HOUR, sizeof(e->duration)); //todo, default to this for now
+
+	e->bitfield = cpu_to_be16(RUNNING << 13);
+
+	if (head) {
+		while (head->next)
+			head = head->next;
+
+		head->next = e;
+	}
+
+	return e;
+}
+
+void vidtv_psi_eit_event_destroy(struct vidtv_psi_table_eit_event *e)
+{
+	struct vidtv_psi_table_eit_event *curr_e = e;
+	struct vidtv_psi_table_eit_event *tmp_e  = NULL;
+
+	while (curr_e) {
+		tmp_e  = curr_e;
+		curr_e = curr_e->next;
+		vidtv_psi_desc_destroy(tmp_e->descriptor);
+		kfree(tmp_e);
+	}
+}
+
+void vidtv_psi_eit_table_destroy(struct vidtv_psi_table_eit *eit)
+{
+	vidtv_psi_eit_event_destroy(eit->event);
+	kfree(eit);
+}
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index b5f2e6d7d1e8..58efe54f7a5a 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -24,16 +24,20 @@
 #define PMT_LEN_UNTIL_PROGRAM_INFO_LENGTH 9
 #define SDT_LEN_UNTIL_RESERVED_FOR_FUTURE_USE 8
 #define NIT_LEN_UNTIL_NETWORK_DESCRIPTOR_LEN 7
+#define EIT_LEN_UNTIL_LAST_TABLE_ID 11
 #define MAX_SECTION_LEN 1021
+#define EIT_MAX_SECTION_LEN 4093 /* see ETSI 300 468 v.1.10.1 p. 26 */
 #define VIDTV_PAT_PID 0 /* mandated by the specs */
 #define VIDTV_SDT_PID 0x0011 /* mandated by the specs */
 #define VIDTV_NIT_PID 0x0010 /* mandated by the specs */
+#define VIDTV_EIT_PID 0x0012 /*mandated by the specs */
 
 enum vidtv_psi_descriptors {
 	REGISTRATION_DESCRIPTOR	= 0x05, /* See ISO/IEC 13818-1 section 2.6.8 */
 	NETWORK_NAME_DESCRIPTOR = 0x40, /* See ETSI EN 300 468 section 6.2.27 */
 	SERVICE_LIST_DESCRIPTOR = 0x41, /* See ETSI EN 300 468 section 6.2.35 */
 	SERVICE_DESCRIPTOR = 0x48, /* See ETSI EN 300 468 section 6.2.33 */
+	SHORT_EVENT_DESCRIPTOR = 0x4d, /* See ETSI EN 300 468 section 6.2.37 */
 };
 
 enum vidtv_psi_stream_types {
@@ -118,6 +122,27 @@ struct vidtv_psi_desc_service_list {
 	struct vidtv_psi_desc_service_list_entry *service_list;
 } __packed;
 
+/**
+ * struct vidtv_psi_desc_short_event - A short event descriptor
+ * see ETSI EN 300 468 v1.15.1 section 6.2.37
+ */
+struct vidtv_psi_desc_short_event {
+	struct vidtv_psi_desc *next;
+	u8 type;
+	u8 length;
+	char *iso_language_code;
+	u8 event_name_len;
+	char *event_name;
+	u8 text_len;
+	char *text;
+} __packed;
+
+struct vidtv_psi_desc_short_event
+*vidtv_psi_short_event_desc_init(struct vidtv_psi_desc *head,
+				 char *iso_language_code,
+				 char *event_name,
+				 char *text);
+
 /**
  * struct vidtv_psi_table_header - A header that is present for all PSI tables.
  */
@@ -344,7 +369,9 @@ struct vidtv_psi_table_sdt *vidtv_psi_sdt_table_init(u16 transport_stream_id);
 
 struct vidtv_psi_table_sdt_service*
 vidtv_psi_sdt_service_init(struct vidtv_psi_table_sdt_service *head,
-			   u16 service_id);
+			   u16 service_id,
+			   bool eit_schedule,
+			   bool eit_present_following);
 
 void
 vidtv_psi_desc_destroy(struct vidtv_psi_desc *desc);
@@ -684,4 +711,95 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args);
 
 void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit);
 
+/**
+ * struct vidtv_psi_desc_short_event - A short event descriptor
+ * see ETSI EN 300 468 v1.15.1 section 6.2.37
+ */
+struct vidtv_psi_table_eit_event {
+	__be16 event_id;
+	u8 start_time[5];
+	u8 duration[3];
+	__be16 bitfield; /* desc_length: 12, free_CA_mode: 1, running_status: 1 */
+	struct vidtv_psi_desc *descriptor;
+	struct vidtv_psi_table_eit_event *next;
+} __packed;
+
+/*
+ * struct vidtv_psi_table_eit - A Event Information Table (EIT)
+ * See ETSI 300 468 section 5.2.4
+ */
+struct vidtv_psi_table_eit {
+	struct vidtv_psi_table_header header;
+	__be16 transport_id;
+	__be16 network_id;
+	u8 last_segment;
+	u8 last_table_id;
+	struct vidtv_psi_table_eit_event *event;
+} __packed;
+
+struct vidtv_psi_table_eit
+*vidtv_psi_eit_table_init(u16 network_id,
+			  u16 transport_stream_id);
+
+/**
+ * struct vidtv_psi_eit_write_args - Arguments for writing an EIT section
+ * @buf: The destination buffer.
+ * @offset: The offset into the destination buffer.
+ * @nit: A pointer to the NIT
+ * @buf_sz: The size of the destination buffer.
+ * @continuity_counter: A pointer to the CC. Incremented on every new packet.
+ *
+ */
+struct vidtv_psi_eit_write_args {
+	char *buf;
+	u32 offset;
+	struct vidtv_psi_table_eit *eit;
+	u32 buf_sz;
+	u8 *continuity_counter;
+};
+
+/**
+ * vidtv_psi_eit_write_into - Write EIT as MPEG-TS packets into a buffer.
+ * @args: an instance of struct vidtv_psi_nit_write_args
+ *
+ * This function writes the MPEG TS packets for a EIT table into a buffer.
+ * Calling code will usually generate the EIT via a call to its init function
+ * and thus is responsible for freeing it.
+ *
+ * Return: The number of bytes written into the buffer. This is NOT
+ * equal to the size of the EIT, since more space is needed for TS headers during TS
+ * encapsulation.
+ */
+u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args);
+
+void vidtv_psi_eit_table_destroy(struct vidtv_psi_table_eit *eit);
+
+/**
+ * vidtv_psi_eit_table_update_sec_len - Recompute and update the EIT section length.
+ * @eit: The EIT whose length is to be updated.
+ *
+ * This will traverse the table and accumulate the length of its components,
+ * which is then used to replace the 'section_length' field.
+ *
+ * If section_length > EIT_MAX_SECTION_LEN, the operation fails.
+ */
+void vidtv_psi_eit_table_update_sec_len(struct vidtv_psi_table_eit *eit);
+
+/**
+ * vidtv_psi_eit_event_assign - Assigns the event loop to the EIT.
+ * @eit: The EIT to assign to.
+ * @e: The event loop
+ *
+ * This will free the previous event loop in the table.
+ * This will assign ownership of the stream loop to the table, i.e. the table
+ * will free this stream loop when a call to its destroy function is made.
+ */
+void vidtv_psi_eit_event_assign(struct vidtv_psi_table_eit *eit,
+				struct vidtv_psi_table_eit_event *e);
+
+struct vidtv_psi_table_eit_event
+*vidtv_psi_eit_event_init(struct vidtv_psi_table_eit_event *head, u16 event_id);
+
+void vidtv_psi_eit_event_destroy(struct vidtv_psi_table_eit_event *e);
+
 #endif // VIDTV_PSI_H
commit c2f78f0cb294aa6f009d3a170f4ee8ad199ba5da
Author: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
Date:   Sat Oct 31 16:05:48 2020 +0100

    media: vidtv: psi: add a Network Information Table (NIT)
    
    Add a Network Information Table (NIT) as specified in ETSI EN 300 468.
    
    This table conveys information relating to the physical organization of
    the multiplexes carried via a given network and the characteristics of
    the network itself.
    
    It is conveyed in the output of vidtv as packets with TS PID of 0x0010
    
    [mchehab+huawei at kernel.org: removed an extra blank line]
    Signed-off-by: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung at kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/Documentation/driver-api/media/drivers/vidtv.rst b/Documentation/driver-api/media/drivers/vidtv.rst
index 65115448c52d..2d7ddf676b13 100644
--- a/Documentation/driver-api/media/drivers/vidtv.rst
+++ b/Documentation/driver-api/media/drivers/vidtv.rst
@@ -149,11 +149,11 @@ vidtv_psi.[ch]
 	Because the generator is implemented in a separate file, it can be
 	reused elsewhere in the media subsystem.
 
-	Currently vidtv supports working with 3 PSI tables: PAT, PMT and
-	SDT.
+	Currently vidtv supports working with 4 PSI tables: PAT, PMT,
+	SDT and NIT.
 
 	The specification for PAT and PMT can be found in *ISO 13818-1:
-	Systems*, while the specification for the SDT can be found in *ETSI
+	Systems*, while the specification for the SDT, NIT can be found in *ETSI
 	EN 300 468: Specification for Service Information (SI) in DVB
 	systems*.
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
index 74b054947bbe..2f97ecf423ed 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c
@@ -28,6 +28,8 @@
 //#define MUX_BUF_MIN_SZ
 #define TUNER_DEFAULT_ADDR 0x68
 #define DEMOD_DEFAULT_ADDR 0x60
+#define VIDTV_DEFAULT_NETWORK_ID 0x744
+#define VIDTV_DEFAULT_NETWORK_NAME "LinuxTV.org"
 
 /* LNBf fake parameters: ranges used by an Universal (extended) European LNBf */
 #define LNB_CUT_FREQUENCY	11700000
@@ -177,6 +179,8 @@ static int vidtv_start_streaming(struct vidtv_dvb *dvb)
 	mux_args.si_period_usecs             = si_period_msec * 1000;
 	mux_args.pcr_pid                     = pcr_pid;
 	mux_args.transport_stream_id         = VIDTV_DEFAULT_TS_ID;
+	mux_args.network_id                  = VIDTV_DEFAULT_NETWORK_ID,
+	mux_args.network_name                = VIDTV_DEFAULT_NETWORK_NAME,
 	mux_args.priv                        = dvb;
 
 	dvb->streaming = true;
diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c
index f2b97cf08e87..a246b49123d9 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_channel.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c
@@ -246,10 +246,57 @@ vidtv_channel_pmt_match_sections(struct vidtv_channel *channels,
 	}
 }
 
+static struct vidtv_psi_desc_service_list_entry
+*vidtv_channel_build_service_list(struct vidtv_psi_table_sdt_service *s)
+{
+	struct vidtv_psi_desc_service_list_entry *curr_e = NULL;
+	struct vidtv_psi_desc_service_list_entry *head_e = NULL;
+	struct vidtv_psi_desc_service_list_entry *prev_e = NULL;
+	struct vidtv_psi_desc *desc = s->descriptor;
+	struct vidtv_psi_desc_service *s_desc;
+
+	while (s) {
+		while (desc) {
+			if (s->descriptor->type != SERVICE_DESCRIPTOR)
+				goto next_desc;
+
+			s_desc = (struct vidtv_psi_desc_service *)desc;
+
+			curr_e = kzalloc(sizeof(*curr_e), GFP_KERNEL);
+			curr_e->service_id = s->service_id;
+			curr_e->service_type = s_desc->service_type;
+
+			if (!head_e)
+				head_e = curr_e;
+			if (prev_e)
+				prev_e->next = curr_e;
+
+			prev_e = curr_e;
+
+next_desc:
+			desc = desc->next;
+		}
+		s = s->next;
+	}
+	return head_e;
+}
+
+static void vidtv_channel_destroy_service_list(struct vidtv_psi_desc_service_list_entry *e)
+{
+	struct vidtv_psi_desc_service_list_entry *tmp;
+
+	while (e) {
+		tmp = e;
+		e = e->next;
+		kfree(tmp);
+	}
+}
+
 void vidtv_channel_si_init(struct vidtv_mux *m)
 {
 	struct vidtv_psi_table_pat_program *programs = NULL;
 	struct vidtv_psi_table_sdt_service *services = NULL;
+	struct vidtv_psi_desc_service_list_entry *service_list = NULL;
 
 	m->si.pat = vidtv_psi_pat_table_init(m->transport_stream_id);
 
@@ -258,6 +305,15 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 	programs = vidtv_channel_pat_prog_cat_into_new(m);
 	services = vidtv_channel_sdt_serv_cat_into_new(m);
 
+	/* look for a service descriptor for every service */
+	service_list = vidtv_channel_build_service_list(services);
+
+	/* use these descriptors to build the NIT */
+	m->si.nit = vidtv_psi_nit_table_init(m->network_id,
+					     m->transport_stream_id,
+					     m->network_name,
+					     service_list);
+
 	/* assemble all programs and assign to PAT */
 	vidtv_psi_pat_program_assign(m->si.pat, programs);
 
@@ -269,6 +325,8 @@ void vidtv_channel_si_init(struct vidtv_mux *m)
 	vidtv_channel_pmt_match_sections(m->channels,
 					 m->si.pmt_secs,
 					 m->si.pat->programs);
+
+	vidtv_channel_destroy_service_list(service_list);
 }
 
 void vidtv_channel_si_destroy(struct vidtv_mux *m)
@@ -283,6 +341,7 @@ void vidtv_channel_si_destroy(struct vidtv_mux *m)
 
 	kfree(m->si.pmt_secs);
 	vidtv_psi_sdt_table_destroy(m->si.sdt);
+	vidtv_psi_nit_table_destroy(m->si.nit);
 }
 
 void vidtv_channels_init(struct vidtv_mux *m)
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.c b/drivers/media/test-drivers/vidtv/vidtv_mux.c
index 082740ae9d44..2a960e87c39c 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.c
@@ -74,6 +74,8 @@ static void vidtv_mux_pid_ctx_init(struct vidtv_mux *m)
 	vidtv_mux_create_pid_ctx_once(m, VIDTV_PAT_PID);
 	/* push the SDT pid ctx */
 	vidtv_mux_create_pid_ctx_once(m, VIDTV_SDT_PID);
+	/* push the NIT pid ctx */
+	vidtv_mux_create_pid_ctx_once(m, VIDTV_NIT_PID);
 
 	/* add a ctx for all PMT sections */
 	while (p) {
@@ -117,10 +119,12 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 	struct vidtv_mux_pid_ctx *pat_ctx;
 	struct vidtv_mux_pid_ctx *pmt_ctx;
 	struct vidtv_mux_pid_ctx *sdt_ctx;
+	struct vidtv_mux_pid_ctx *nit_ctx;
 
 	struct vidtv_psi_pat_write_args pat_args = {};
 	struct vidtv_psi_pmt_write_args pmt_args = {};
 	struct vidtv_psi_sdt_write_args sdt_args = {};
+	struct vidtv_psi_nit_write_args nit_args = {};
 
 	u32 nbytes; /* the number of bytes written by this function */
 	u16 pmt_pid;
@@ -128,6 +132,7 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 
 	pat_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_PAT_PID);
 	sdt_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_SDT_PID);
+	nit_ctx = vidtv_mux_get_pid_ctx(m, VIDTV_NIT_PID);
 
 	pat_args.buf                = m->mux_buf;
 	pat_args.offset             = m->mux_buf_offset;
@@ -169,6 +174,14 @@ static u32 vidtv_mux_push_si(struct vidtv_mux *m)
 
 	m->mux_buf_offset += vidtv_psi_sdt_write_into(sdt_args);
 
+	nit_args.buf                = m->mux_buf;
+	nit_args.offset             = m->mux_buf_offset;
+	nit_args.nit                = m->si.nit;
+	nit_args.buf_sz             = m->mux_buf_sz;
+	nit_args.continuity_counter = &nit_ctx->cc;
+
+	m->mux_buf_offset += vidtv_psi_nit_write_into(nit_args);
+
 	nbytes = m->mux_buf_offset - initial_offset;
 
 	m->num_streamed_si++;
@@ -446,6 +459,8 @@ struct vidtv_mux *vidtv_mux_init(struct dvb_frontend *fe,
 	m->pcr_pid = args.pcr_pid;
 	m->transport_stream_id = args.transport_stream_id;
 	m->priv = args.priv;
+	m->network_id = args.network_id;
+	m->network_name = kstrdup(args.network_name, GFP_KERNEL);
 	m->timing.current_jiffies = get_jiffies_64();
 
 	if (args.channels)
@@ -469,6 +484,7 @@ void vidtv_mux_destroy(struct vidtv_mux *m)
 	vidtv_mux_pid_ctx_destroy(m);
 	vidtv_channel_si_destroy(m);
 	vidtv_channels_destroy(m);
+	kfree(m->network_name);
 	vfree(m->mux_buf);
 	kfree(m);
 }
diff --git a/drivers/media/test-drivers/vidtv/vidtv_mux.h b/drivers/media/test-drivers/vidtv/vidtv_mux.h
index 2caa60623e97..5dfbe30c2ac8 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_mux.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_mux.h
@@ -64,6 +64,7 @@ struct vidtv_mux_si {
 	struct vidtv_psi_table_pat *pat;
 	struct vidtv_psi_table_pmt **pmt_secs; /* the PMT sections */
 	struct vidtv_psi_table_sdt *sdt;
+	struct vidtv_psi_table_nit *nit;
 };
 
 /**
@@ -99,6 +100,8 @@ struct vidtv_mux_pid_ctx {
  * @pcr_pid: The TS PID used for the PSI packets. All channels will share the
  * same PCR.
  * @transport_stream_id: The transport stream ID
+ * @network_id: The network ID
+ * @network_name: The network name
  * @priv: Private data.
  */
 struct vidtv_mux {
@@ -128,6 +131,8 @@ struct vidtv_mux {
 
 	u16 pcr_pid;
 	u16 transport_stream_id;
+	u16 network_id;
+	char *network_name;
 	void *priv;
 };
 
@@ -142,6 +147,8 @@ struct vidtv_mux {
  * same PCR.
  * @transport_stream_id: The transport stream ID
  * @channels: an optional list of channels to use
+ * @network_id: The network ID
+ * @network_name: The network name
  * @priv: Private data.
  */
 struct vidtv_mux_init_args {
@@ -153,6 +160,8 @@ struct vidtv_mux_init_args {
 	u16 pcr_pid;
 	u16 transport_stream_id;
 	struct vidtv_channel *channels;
+	u16 network_id;
+	char *network_name;
 	void *priv;
 };
 
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index f2e25e68c085..0de6d646a483 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -6,10 +6,6 @@
  * technically be broken into one or more sections, we do not do this here,
  * hence 'table' and 'section' are interchangeable for vidtv.
  *
- * This code currently supports three tables: PAT, PMT and SDT. These are the
- * bare minimum to get userspace to recognize our MPEG transport stream. It can
- * be extended to support more PSI tables in the future.
- *
  * Copyright (C) 2020 Daniel W. S. Almeida
  */
 
@@ -389,6 +385,75 @@ struct vidtv_psi_desc_registration
 	return desc;
 }
 
+struct vidtv_psi_desc_network_name
+*vidtv_psi_network_name_desc_init(struct vidtv_psi_desc *head, char *network_name)
+{
+	struct vidtv_psi_desc_network_name *desc;
+	u32 network_name_len = network_name ? strlen(network_name) : 0;
+
+	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+
+	desc->type = NETWORK_NAME_DESCRIPTOR;
+
+	desc->length = network_name_len;
+
+	if (network_name && network_name_len)
+		desc->network_name = kstrdup(network_name, GFP_KERNEL);
+
+	if (head) {
+		while (head->next)
+			head = head->next;
+
+		head->next = (struct vidtv_psi_desc *)desc;
+	}
+
+	return desc;
+}
+
+struct vidtv_psi_desc_service_list
+*vidtv_psi_service_list_desc_init(struct vidtv_psi_desc *head,
+				  struct vidtv_psi_desc_service_list_entry *entry)
+{
+	struct vidtv_psi_desc_service_list *desc;
+	struct vidtv_psi_desc_service_list_entry *curr_e = NULL;
+	struct vidtv_psi_desc_service_list_entry *head_e = NULL;
+	struct vidtv_psi_desc_service_list_entry *prev_e = NULL;
+	u16 length = 0;
+
+	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+
+	desc->type = SERVICE_LIST_DESCRIPTOR;
+
+	while (entry) {
+		curr_e = kzalloc(sizeof(*curr_e), GFP_KERNEL);
+		curr_e->service_id = entry->service_id;
+		curr_e->service_type = entry->service_type;
+
+		length += sizeof(struct vidtv_psi_desc_service_list_entry) -
+			  sizeof(struct vidtv_psi_desc_service_list_entry *);
+
+		if (!head_e)
+			head_e = curr_e;
+		if (prev_e)
+			prev_e->next = curr_e;
+
+		prev_e = curr_e;
+		entry = entry->next;
+	}
+
+	desc->length = length;
+	desc->service_list = head_e;
+
+	if (head) {
+		while (head->next)
+			head = head->next;
+
+		head->next = (struct vidtv_psi_desc *)desc;
+	}
+
+	return desc;
+}
+
 struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 {
 	struct vidtv_psi_desc *head = NULL;
@@ -396,6 +461,8 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 	struct vidtv_psi_desc *curr = NULL;
 
 	struct vidtv_psi_desc_service *service;
+	struct vidtv_psi_desc_network_name *desc_network_name;
+	struct vidtv_psi_desc_service_list *desc_service_list;
 
 	while (desc) {
 		switch (desc->type) {
@@ -408,6 +475,20 @@ struct vidtv_psi_desc *vidtv_psi_desc_clone(struct vidtv_psi_desc *desc)
 							    service->provider_name);
 		break;
 
+		case NETWORK_NAME_DESCRIPTOR:
+			desc_network_name = (struct vidtv_psi_desc_network_name *)desc;
+			curr = (struct vidtv_psi_desc *)
+			       vidtv_psi_network_name_desc_init(head,
+								desc_network_name->network_name);
+		break;
+
+		case SERVICE_LIST_DESCRIPTOR:
+			desc_service_list = (struct vidtv_psi_desc_service_list *)desc;
+			curr = (struct vidtv_psi_desc *)
+				vidtv_psi_service_list_desc_init(head,
+								 desc_service_list->service_list);
+		break;
+
 		case REGISTRATION_DESCRIPTOR:
 		default:
 			curr = kzalloc(sizeof(*desc) + desc->length, GFP_KERNEL);
@@ -433,6 +514,8 @@ void vidtv_psi_desc_destroy(struct vidtv_psi_desc *desc)
 {
 	struct vidtv_psi_desc *curr = desc;
 	struct vidtv_psi_desc *tmp  = NULL;
+	struct vidtv_psi_desc_service_list_entry *sl_entry = NULL;
+	struct vidtv_psi_desc_service_list_entry *sl_entry_tmp = NULL;
 
 	while (curr) {
 		tmp  = curr;
@@ -448,6 +531,19 @@ void vidtv_psi_desc_destroy(struct vidtv_psi_desc *desc)
 			/* nothing to do */
 			break;
 
+		case NETWORK_NAME_DESCRIPTOR:
+			kfree(((struct vidtv_psi_desc_network_name *)tmp)->network_name);
+			break;
+
+		case SERVICE_LIST_DESCRIPTOR:
+			sl_entry = ((struct vidtv_psi_desc_service_list *)tmp)->service_list;
+			while (sl_entry) {
+				sl_entry_tmp = sl_entry;
+				sl_entry = sl_entry->next;
+				kfree(sl_entry_tmp);
+			}
+			break;
+
 		default:
 			pr_warn_ratelimited("Possible leak: not handling descriptor type %d\n",
 					    tmp->type);
@@ -519,6 +615,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 	/* the number of bytes written by this function */
 	u32 nbytes = 0;
 	struct psi_write_args psi_args = {};
+	struct vidtv_psi_desc_service_list_entry *serv_list_entry = NULL;
 
 	psi_args.dest_buf = args.dest_buf;
 	psi_args.from     = &args.desc->type;
@@ -564,6 +661,28 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
 		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
 		break;
 
+	case NETWORK_NAME_DESCRIPTOR:
+		psi_args.dest_offset = args.dest_offset + nbytes;
+		psi_args.len = args.desc->length;
+		psi_args.from = ((struct vidtv_psi_desc_network_name *)args.desc)->network_name;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+		break;
+
+	case SERVICE_LIST_DESCRIPTOR:
+		serv_list_entry = ((struct vidtv_psi_desc_service_list *)args.desc)->service_list;
+		while (serv_list_entry) {
+			psi_args.dest_offset = args.dest_offset + nbytes;
+			psi_args.len = sizeof(struct vidtv_psi_desc_service_list_entry) -
+				       sizeof(struct vidtv_psi_desc_service_list_entry *);
+			psi_args.from = serv_list_entry;
+
+			nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+			serv_list_entry = serv_list_entry->next;
+		}
+		break;
+
 	case REGISTRATION_DESCRIPTOR:
 	default:
 		psi_args.dest_offset = args.dest_offset + nbytes;
@@ -682,7 +801,6 @@ void vidtv_psi_sdt_table_update_sec_len(struct vidtv_psi_table_sdt *sdt)
 	}
 
 	length += CRC_SIZE_IN_BYTES;
-
 	vidtv_psi_set_sec_len(&sdt->header, length);
 }
 
@@ -1321,3 +1439,220 @@ struct vidtv_psi_table_pmt
 
 	return NULL; /* not found */
 }
+
+static void vidtv_psi_nit_table_update_sec_len(struct vidtv_psi_table_nit *nit)
+{
+	u16 length = 0;
+	struct vidtv_psi_table_transport *t = nit->transport;
+	u16 desc_loop_len;
+	u16 transport_loop_len = 0;
+
+	/*
+	 * from immediately after 'section_length' until
+	 * 'network_descriptor_length'
+	 */
+	length += NIT_LEN_UNTIL_NETWORK_DESCRIPTOR_LEN;
+
+	desc_loop_len = vidtv_psi_desc_comp_loop_len(nit->descriptor);
+	vidtv_psi_set_desc_loop_len(&nit->bitfield, desc_loop_len, 12);
+
+	length += desc_loop_len;
+
+	length += sizeof_field(struct vidtv_psi_table_nit, bitfield2);
+
+	while (t) {
+		/* skip both pointers at the end */
+		transport_loop_len += sizeof(struct vidtv_psi_table_transport) -
+				      sizeof(struct vidtv_psi_desc *) -
+				      sizeof(struct vidtv_psi_table_transport *);
+
+		length += transport_loop_len;
+
+		desc_loop_len = vidtv_psi_desc_comp_loop_len(t->descriptor);
+		vidtv_psi_set_desc_loop_len(&t->bitfield, desc_loop_len, 12);
+
+		length += desc_loop_len;
+
+		t = t->next;
+	}
+
+	// Actually sets the transport stream loop len, maybe rename this function later
+	vidtv_psi_set_desc_loop_len(&nit->bitfield2, transport_loop_len, 12);
+	length += CRC_SIZE_IN_BYTES;
+
+	vidtv_psi_set_sec_len(&nit->header, length);
+}
+
+struct vidtv_psi_table_nit
+*vidtv_psi_nit_table_init(u16 network_id,
+			  u16 transport_stream_id,
+			  char *network_name,
+			  struct vidtv_psi_desc_service_list_entry *service_list)
+{
+	struct vidtv_psi_table_nit *nit = kzalloc(sizeof(*nit), GFP_KERNEL);
+	struct vidtv_psi_table_transport *transport = kzalloc(sizeof(*transport), GFP_KERNEL);
+
+	const u16 SYNTAX = 0x1;
+	const u16 ONE = 0x1;
+	const u16 ONES = 0x03;
+
+	nit->header.table_id = 0x40; // ACTUAL_NETWORK
+
+	nit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12));
+
+	nit->header.id = cpu_to_be16(network_id);
+	nit->header.current_next = ONE;
+
+	nit->header.version = 0x1f;
+
+	nit->header.one2  = ONES;
+	nit->header.section_id   = 0;
+	nit->header.last_section = 0;
+
+	nit->bitfield = cpu_to_be16(0xf);
+	nit->bitfield2 = cpu_to_be16(0xf);
+
+	nit->descriptor = (struct vidtv_psi_desc *)
+			  vidtv_psi_network_name_desc_init(NULL, network_name);
+
+	transport->transport_id = cpu_to_be16(transport_stream_id);
+	transport->network_id = cpu_to_be16(network_id);
+	transport->bitfield = cpu_to_be16(0xf);
+	transport->descriptor = (struct vidtv_psi_desc *)
+				vidtv_psi_service_list_desc_init(NULL, service_list);
+
+	nit->transport = transport;
+
+	vidtv_psi_nit_table_update_sec_len(nit);
+
+	return nit;
+}
+
+u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
+{
+	/* the number of bytes written by this function */
+	u32 nbytes = 0;
+	u32 crc = INITIAL_CRC;
+
+	struct vidtv_psi_desc *table_descriptor     = args.nit->descriptor;
+	struct vidtv_psi_table_transport *transport = args.nit->transport;
+	struct vidtv_psi_desc *transport_descriptor = (transport) ?
+						       args.nit->transport->descriptor :
+						       NULL;
+
+	struct header_write_args h_args = {};
+	struct psi_write_args psi_args  = {};
+	struct desc_write_args d_args   = {};
+	struct crc32_write_args c_args  = {};
+
+	vidtv_psi_nit_table_update_sec_len(args.nit);
+
+	h_args.dest_buf           = args.buf;
+	h_args.dest_offset        = args.offset;
+	h_args.h                  = &args.nit->header;
+	h_args.pid                = VIDTV_NIT_PID;
+	h_args.continuity_counter = args.continuity_counter;
+	h_args.dest_buf_sz        = args.buf_sz;
+	h_args.crc                = &crc;
+
+	nbytes += vidtv_psi_table_header_write_into(h_args);
+
+	/* write the bitfield */
+	psi_args.dest_buf = args.buf;
+	psi_args.from     = &args.nit->bitfield;
+	psi_args.len      = sizeof_field(struct vidtv_psi_table_nit, bitfield);
+
+	psi_args.dest_offset        = args.offset + nbytes;
+	psi_args.pid                = VIDTV_NIT_PID;
+	psi_args.new_psi_section    = false;
+	psi_args.continuity_counter = args.continuity_counter;
+	psi_args.is_crc             = false;
+	psi_args.dest_buf_sz        = args.buf_sz;
+	psi_args.crc                = &crc;
+
+	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+	while (table_descriptor) {
+		/* write the descriptors, if any */
+		d_args.dest_buf           = args.buf;
+		d_args.dest_offset        = args.offset + nbytes;
+		d_args.desc               = table_descriptor;
+		d_args.pid                = VIDTV_NIT_PID;
+		d_args.continuity_counter = args.continuity_counter;
+		d_args.dest_buf_sz        = args.buf_sz;
+		d_args.crc                = &crc;
+
+		nbytes += vidtv_psi_desc_write_into(d_args);
+
+		table_descriptor = table_descriptor->next;
+	}
+
+	/* write the second bitfield */
+	psi_args.dest_buf = args.buf;
+	psi_args.from = &args.nit->bitfield2;
+	psi_args.len = sizeof_field(struct vidtv_psi_table_nit, bitfield2);
+	psi_args.dest_offset = args.offset + nbytes;
+	psi_args.pid = VIDTV_NIT_PID;
+
+	nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+	while (transport) {
+		/* write the transport sections, if any */
+		psi_args.from = transport;
+		psi_args.len  = sizeof_field(struct vidtv_psi_table_transport, transport_id) +
+				sizeof_field(struct vidtv_psi_table_transport, network_id)   +
+				sizeof_field(struct vidtv_psi_table_transport, bitfield);
+		psi_args.dest_offset = args.offset + nbytes;
+
+		nbytes += vidtv_psi_ts_psi_write_into(psi_args);
+
+		while (transport_descriptor) {
+			/* write the transport descriptors, if any */
+			d_args.dest_buf           = args.buf;
+			d_args.dest_offset        = args.offset + nbytes;
+			d_args.desc               = transport_descriptor;
+			d_args.pid                = VIDTV_NIT_PID;
+			d_args.continuity_counter = args.continuity_counter;
+			d_args.dest_buf_sz        = args.buf_sz;
+			d_args.crc                = &crc;
+
+			nbytes += vidtv_psi_desc_write_into(d_args);
+
+			transport_descriptor = transport_descriptor->next;
+		}
+
+		transport = transport->next;
+	}
+
+	c_args.dest_buf           = args.buf;
+	c_args.dest_offset        = args.offset + nbytes;
+	c_args.crc                = cpu_to_be32(crc);
+	c_args.pid                = VIDTV_NIT_PID;
+	c_args.continuity_counter = args.continuity_counter;
+	c_args.dest_buf_sz        = args.buf_sz;
+
+	/* Write the CRC32 at the end */
+	nbytes += table_section_crc32_write_into(c_args);
+
+	return nbytes;
+}
+
+static void vidtv_psi_transport_destroy(struct vidtv_psi_table_transport *t)
+{
+	struct vidtv_psi_table_transport *curr_t = t;
+	struct vidtv_psi_table_transport *tmp_t  = NULL;
+
+	while (curr_t) {
+		tmp_t  = curr_t;
+		curr_t = curr_t->next;
+		vidtv_psi_desc_destroy(tmp_t->descriptor);
+		kfree(tmp_t);
+	}
+}
+
+void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit)
+{
+	vidtv_psi_desc_destroy(nit->descriptor);
+	vidtv_psi_transport_destroy(nit->transport);
+	kfree(nit);
+}
diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.h b/drivers/media/test-drivers/vidtv/vidtv_psi.h
index 3f962cc78278..b5f2e6d7d1e8 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.h
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.h
@@ -6,10 +6,6 @@
  * technically be broken into one or more sections, we do not do this here,
  * hence 'table' and 'section' are interchangeable for vidtv.
  *
- * This code currently supports three tables: PAT, PMT and SDT. These are the
- * bare minimum to get userspace to recognize our MPEG transport stream. It can
- * be extended to support more PSI tables in the future.
- *
  * Copyright (C) 2020 Daniel W. S. Almeida
  */
 
@@ -27,12 +23,16 @@
 #define PAT_LEN_UNTIL_LAST_SECTION_NUMBER 5
 #define PMT_LEN_UNTIL_PROGRAM_INFO_LENGTH 9
 #define SDT_LEN_UNTIL_RESERVED_FOR_FUTURE_USE 8
+#define NIT_LEN_UNTIL_NETWORK_DESCRIPTOR_LEN 7
 #define MAX_SECTION_LEN 1021
 #define VIDTV_PAT_PID 0 /* mandated by the specs */
 #define VIDTV_SDT_PID 0x0011 /* mandated by the specs */
+#define VIDTV_NIT_PID 0x0010 /* mandated by the specs */
 
 enum vidtv_psi_descriptors {
 	REGISTRATION_DESCRIPTOR	= 0x05, /* See ISO/IEC 13818-1 section 2.6.8 */
+	NETWORK_NAME_DESCRIPTOR = 0x40, /* See ETSI EN 300 468 section 6.2.27 */
+	SERVICE_LIST_DESCRIPTOR = 0x41, /* See ETSI EN 300 468 section 6.2.35 */
 	SERVICE_DESCRIPTOR = 0x48, /* See ETSI EN 300 468 section 6.2.33 */
 };
 
@@ -90,6 +90,34 @@ struct vidtv_psi_desc_registration {
 	u8 additional_identification_info[];
 } __packed;
 
+/**
+ * struct vidtv_psi_desc_network_name - A network name descriptor
+ * see ETSI EN 300 468 v1.15.1 section 6.2.27
+ */
+struct vidtv_psi_desc_network_name {
+	struct vidtv_psi_desc *next;
+	u8 type;
+	u8 length;
+	char *network_name;
+} __packed;
+
+struct vidtv_psi_desc_service_list_entry {
+	__be16 service_id;
+	u8 service_type;
+	struct vidtv_psi_desc_service_list_entry *next;
+} __packed;
+
+/**
+ * struct vidtv_psi_desc_service_list - A service list descriptor
+ * see ETSI EN 300 468 v1.15.1 section 6.2.35
+ */
+struct vidtv_psi_desc_service_list {
+	struct vidtv_psi_desc *next;
+	u8 type;
+	u8 length;
+	struct vidtv_psi_desc_service_list_entry *service_list;
+} __packed;
+
 /**
  * struct vidtv_psi_table_header - A header that is present for all PSI tables.
  */
@@ -290,6 +318,13 @@ struct vidtv_psi_desc_registration
 				  u8 *additional_ident_info,
 				  u32 additional_info_len);
 
+struct vidtv_psi_desc_network_name
+*vidtv_psi_network_name_desc_init(struct vidtv_psi_desc *head, char *network_name);
+
+struct vidtv_psi_desc_service_list
+*vidtv_psi_service_list_desc_init(struct vidtv_psi_desc *head,
+				  struct vidtv_psi_desc_service_list_entry *entry);
+
 struct vidtv_psi_table_pat_program
 *vidtv_psi_pat_program_init(struct vidtv_psi_table_pat_program *head,
 			    u16 service_id,
@@ -574,4 +609,79 @@ struct vidtv_psi_table_pmt *vidtv_psi_find_pmt_sec(struct vidtv_psi_table_pmt **
 u16 vidtv_psi_get_pat_program_pid(struct vidtv_psi_table_pat_program *p);
 u16 vidtv_psi_pmt_stream_get_elem_pid(struct vidtv_psi_table_pmt_stream *s);
 
+/**
+ * struct vidtv_psi_table_transport - A entry in the TS loop for the NIT and/or other tables.
+ * See ETSI 300 468 section 5.2.1
+ * @transport_id: The TS ID being described
+ * @network_id: The network_id that contains the TS ID
+ * @bitfield: Contains the descriptor loop length
+ * @descriptor: A descriptor loop
+ * @next: Pointer to the next entry
+ *
+ */
+struct vidtv_psi_table_transport {
+	__be16 transport_id;
+	__be16 network_id;
+	__be16 bitfield; /* desc_len: 12, reserved: 4 */
+	struct vidtv_psi_desc *descriptor;
+	struct vidtv_psi_table_transport *next;
+} __packed;
+
+/**
+ * struct vidtv_psi_table_nit - A Network Information Table (NIT). See ETSI 300
+ * 468 section 5.2.1
+ * @header: A PSI table header
+ * @bitfield: Contains the network descriptor length
+ * @descriptor: A descriptor loop describing the network
+ * @bitfield2: Contains the transport stream loop length
+ * @transport: The transport stream loop
+ *
+ */
+struct vidtv_psi_table_nit {
+	struct vidtv_psi_table_header header;
+	__be16 bitfield; /* network_desc_len: 12, reserved:4 */
+	struct vidtv_psi_desc *descriptor;
+	__be16 bitfield2; /* ts_loop_len: 12, reserved: 4 */
+	struct vidtv_psi_table_transport *transport;
+} __packed;
+
+struct vidtv_psi_table_nit
+*vidtv_psi_nit_table_init(u16 network_id,
+			  u16 transport_stream_id,
+			  char *network_name,
+			  struct vidtv_psi_desc_service_list_entry *service_list);
+
+/**
+ * struct vidtv_psi_nit_write_args - Arguments for writing a NIT section
+ * @buf: The destination buffer.
+ * @offset: The offset into the destination buffer.
+ * @nit: A pointer to the NIT
+ * @buf_sz: The size of the destination buffer.
+ * @continuity_counter: A pointer to the CC. Incremented on every new packet.
+ *
+ */
+struct vidtv_psi_nit_write_args {
+	char *buf;
+	u32 offset;
+	struct vidtv_psi_table_nit *nit;
+	u32 buf_sz;
+	u8 *continuity_counter;
+};
+
+/**
+ * vidtv_psi_nit_write_into - Write NIT as MPEG-TS packets into a buffer.
+ * @args: an instance of struct vidtv_psi_nit_write_args
+ *
+ * This function writes the MPEG TS packets for a NIT table into a buffer.
+ * Calling code will usually generate the NIT via a call to its init function
+ * and thus is responsible for freeing it.
+ *
+ * Return: The number of bytes written into the buffer. This is NOT
+ * equal to the size of the NIT, since more space is needed for TS headers during TS
+ * encapsulation.
+ */
+u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args);
+
+void vidtv_psi_nit_table_destroy(struct vidtv_psi_table_nit *nit);
+
 #endif // VIDTV_PSI_H
commit dd6dbe8d7e312238cc0ad0b907042a96b0505d44
Author: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
Date:   Sat Oct 31 16:05:47 2020 +0100

    media: vidtv: extract the initial CRC value to into a #define
    
    The same constant (0xffffffff) is used in three different functions.
    
    Extract it into a #define to avoid repetition.
    
    Signed-off-by: Daniel W. S. Almeida <dwlsalmeida at gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c
index 82cf67dd27c0..f2e25e68c085 100644
--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c
+++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c
@@ -31,6 +31,7 @@
 
 #define CRC_SIZE_IN_BYTES 4
 #define MAX_VERSION_NUM 32
+#define INITIAL_CRC 0xffffffff
 
 static const u32 CRC_LUT[256] = {
 	/* from libdvbv5 */
@@ -784,7 +785,7 @@ u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
 	/* the number of bytes written by this function */
 	u32 nbytes = 0;
 	const u16 pat_pid = VIDTV_PAT_PID;
-	u32 crc = 0xffffffff;
+	u32 crc = INITIAL_CRC;
 
 	struct vidtv_psi_table_pat_program *p = args.pat->program;
 
@@ -974,7 +975,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
 {
 	/* the number of bytes written by this function */
 	u32 nbytes = 0;
-	u32 crc = 0xffffffff;
+	u32 crc = INITIAL_CRC;
 
 	struct vidtv_psi_desc *table_descriptor   = args.pmt->descriptor;
 	struct vidtv_psi_table_pmt_stream *stream = args.pmt->stream;
@@ -1124,7 +1125,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
 	u32 nbytes  = 0;
 	u16 sdt_pid = VIDTV_SDT_PID;  /* see ETSI EN 300 468 v1.15.1 p. 11 */
 
-	u32 crc = 0xffffffff;
+	u32 crc = INITIAL_CRC;
 
 	struct vidtv_psi_table_sdt_service *service = args.sdt->service;
 	struct vidtv_psi_desc *service_desc = (args.sdt->service) ?
commit cbf3d60329c4e11edcecac0c8fc6767b0f05e3a7
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Wed Nov 25 12:56:26 2020 +0530

    ch_ktls: lock is not freed
    
    Currently lock gets freed only if timeout expires, but missed a
    case when HW returns failure and goes for cleanup.
    
    Fixes: efca3878a5fb ("ch_ktls: Issue if connection offload fails")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Link: https://lore.kernel.org/r/20201125072626.10861-1-rohitm@chelsio.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index c24485c0d512..7f90b828d159 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -544,7 +544,9 @@ static int chcr_ktls_dev_add(struct net_device *netdev, struct sock *sk,
 		/* need to wait for hw response, can't free tx_info yet. */
 		if (tx_info->open_state == CH_KTLS_OPEN_PENDING)
 			tx_info->pending_close = true;
-		/* free the lock after the cleanup */
+		else
+			spin_unlock_bh(&tx_info->lock);
+		/* if in pending close, free the lock after the cleanup */
 		goto put_module;
 	}
 	spin_unlock_bh(&tx_info->lock);
commit 025cc2fb6a4e84e9a0552c0017dcd1c24b7ac7da
Author: Maxim Mikityanskiy <maximmi at mellanox.com>
Date:   Wed Nov 25 14:18:10 2020 -0800

    net/tls: Protect from calling tls_dev_del for TLS RX twice
    
    tls_device_offload_cleanup_rx doesn't clear tls_ctx->netdev after
    calling tls_dev_del if TLX TX offload is also enabled. Clearing
    tls_ctx->netdev gets postponed until tls_device_gc_task. It leaves a
    time frame when tls_device_down may get called and call tls_dev_del for
    RX one extra time, confusing the driver, which may lead to a crash.
    
    This patch corrects this racy behavior by adding a flag to prevent
    tls_device_down from calling tls_dev_del the second time.
    
    Fixes: e8f69799810c ("net/tls: Add generic NIC offload infrastructure")
    Signed-off-by: Maxim Mikityanskiy <maximmi at mellanox.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>
    Link: https://lore.kernel.org/r/20201125221810.69870-1-saeedm@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/tls.h b/include/net/tls.h
index cf1473099453..2bdd802212fe 100644
--- a/include/net/tls.h
+++ b/include/net/tls.h
@@ -199,6 +199,12 @@ enum tls_context_flags {
 	 * to be atomic.
 	 */
 	TLS_TX_SYNC_SCHED = 1,
+	/* tls_dev_del was called for the RX side, device state was released,
+	 * but tls_ctx->netdev might still be kept, because TX-side driver
+	 * resources might not be released yet. Used to prevent the second
+	 * tls_dev_del call in tls_device_down if it happens simultaneously.
+	 */
+	TLS_RX_DEV_CLOSED = 2,
 };
 
 struct cipher_context {
diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c
index 54d3e161d198..a3ab2d3d4e4e 100644
--- a/net/tls/tls_device.c
+++ b/net/tls/tls_device.c
@@ -1262,6 +1262,8 @@ void tls_device_offload_cleanup_rx(struct sock *sk)
 	if (tls_ctx->tx_conf != TLS_HW) {
 		dev_put(netdev);
 		tls_ctx->netdev = NULL;
+	} else {
+		set_bit(TLS_RX_DEV_CLOSED, &tls_ctx->flags);
 	}
 out:
 	up_read(&device_offload_lock);
@@ -1291,7 +1293,8 @@ static int tls_device_down(struct net_device *netdev)
 		if (ctx->tx_conf == TLS_HW)
 			netdev->tlsdev_ops->tls_dev_del(netdev, ctx,
 							TLS_OFFLOAD_CTX_DIR_TX);
-		if (ctx->rx_conf == TLS_HW)
+		if (ctx->rx_conf == TLS_HW &&
+		    !test_bit(TLS_RX_DEV_CLOSED, &ctx->flags))
 			netdev->tlsdev_ops->tls_dev_del(netdev, ctx,
 							TLS_OFFLOAD_CTX_DIR_RX);
 		WRITE_ONCE(ctx->netdev, NULL);
commit a060133c2058bcc5bf2f82e1135ce76b4bc9865b
Merge: 3cb2e6d92be6 a7b43649507d
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Wed Nov 25 17:26:37 2020 -0800

    Merge branch 'devlink-port-attribute-fixes'
    
    Parav Pandit says:
    
    ====================
    devlink port attribute fixes
    
    This patchset contains 2 small fixes for devlink port attributes.
    
    Patch summary:
    Patch-1 synchronize the devlink port attribute reader
            with net namespace change operation
    Patch-2 Ensure to return devlink port's netdevice attributes
            when netdev and devlink instance belong to same net namespace
    ====================
    
    Link: https://lore.kernel.org/r/20201125091620.6781-1-parav@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit a7b43649507dae4e55ff0087cad4e4dd1c6d5b99
Author: Parav Pandit <parav at nvidia.com>
Date:   Wed Nov 25 11:16:20 2020 +0200

    devlink: Make sure devlink instance and port are in same net namespace
    
    When devlink reload operation is not used, netdev of an Ethernet port may
    be present in different net namespace than the net namespace of the
    devlink instance.
    
    Ensure that both the devlink instance and devlink port netdev are located
    in same net namespace.
    
    Fixes: 070c63f20f6c ("net: devlink: allow to change namespaces during reload")
    Signed-off-by: Parav Pandit <parav at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 79b8df41bea3..8c5ddffd707d 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -782,9 +782,10 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 			devlink_port->desired_type))
 		goto nla_put_failure_type_locked;
 	if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
+		struct net *net = devlink_net(devlink_port->devlink);
 		struct net_device *netdev = devlink_port->type_dev;
 
-		if (netdev &&
+		if (netdev && net_eq(net, dev_net(netdev)) &&
 		    (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
 				 netdev->ifindex) ||
 		     nla_put_string(msg, DEVLINK_ATTR_PORT_NETDEV_NAME,
commit b187c9b4178b87954dbc94e78a7094715794714f
Author: Parav Pandit <parav at nvidia.com>
Date:   Wed Nov 25 11:16:19 2020 +0200

    devlink: Hold rtnl lock while reading netdev attributes
    
    A netdevice of a devlink port can be moved to different net namespace
    than its parent devlink instance.
    This scenario occurs when devlink reload is not used.
    
    When netdevice is undergoing migration to net namespace, its ifindex
    and name may change.
    
    In such use case, devlink port query may read stale netdev attributes.
    
    Fix it by reading them under rtnl lock.
    
    Fixes: bfcd3a466172 ("Introduce devlink infrastructure")
    Signed-off-by: Parav Pandit <parav at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/devlink.c b/net/core/devlink.c
index c91e15b7a2bd..79b8df41bea3 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -772,6 +772,8 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 	if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
 		goto nla_put_failure;
 
+	/* Hold rtnl lock while accessing port's netdev attributes. */
+	rtnl_lock();
 	spin_lock_bh(&devlink_port->type_lock);
 	if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type))
 		goto nla_put_failure_type_locked;
@@ -798,6 +800,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 			goto nla_put_failure_type_locked;
 	}
 	spin_unlock_bh(&devlink_port->type_lock);
+	rtnl_unlock();
 	if (devlink_nl_port_attrs_put(msg, devlink_port))
 		goto nla_put_failure;
 	if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack))
@@ -808,6 +811,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 
 nla_put_failure_type_locked:
 	spin_unlock_bh(&devlink_port->type_lock);
+	rtnl_unlock();
 nla_put_failure:
 	genlmsg_cancel(msg, hdr);
 	return -EMSGSIZE;
commit 3cb2e6d92be637b79d6ba0746d610a8dfcc0400b
Author: Min Li <min.li.xe at renesas.com>
Date:   Tue Nov 24 21:58:35 2020 -0500

    ptp: clockmatrix: bug fix for idtcm_strverscmp
    
    Feed kstrtou8 with NULL terminated string.
    
    Changes since v1:
    -Use sscanf to get rid of adhoc string parse.
    Changes since v2:
    -Check if sscanf returns 3.
    
    Fixes: 7ea5fda2b132 ("ptp: ptp_clockmatrix: update to support 4.8.7 firmware")
    Signed-off-by: Min Li <min.li.xe at renesas.com>
    Link: https://lore.kernel.org/r/1606273115-25792-1-git-send-email-min.li.xe@renesas.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/ptp/ptp_clockmatrix.c b/drivers/ptp/ptp_clockmatrix.c
index e020faff7da5..663255774c0b 100644
--- a/drivers/ptp/ptp_clockmatrix.c
+++ b/drivers/ptp/ptp_clockmatrix.c
@@ -103,43 +103,26 @@ static int timespec_to_char_array(struct timespec64 const *ts,
 	return 0;
 }
 
-static int idtcm_strverscmp(const char *ver1, const char *ver2)
+static int idtcm_strverscmp(const char *version1, const char *version2)
 {
-	u8 num1;
-	u8 num2;
-	int result = 0;
-
-	/* loop through each level of the version string */
-	while (result == 0) {
-		/* extract leading version numbers */
-		if (kstrtou8(ver1, 10, &num1) < 0)
-			return -1;
+	u8 ver1[3], ver2[3];
+	int i;
 
-		if (kstrtou8(ver2, 10, &num2) < 0)
-			return -1;
+	if (sscanf(version1, "%hhu.%hhu.%hhu",
+		   &ver1[0], &ver1[1], &ver1[2]) != 3)
+		return -1;
+	if (sscanf(version2, "%hhu.%hhu.%hhu",
+		   &ver2[0], &ver2[1], &ver2[2]) != 3)
+		return -1;
 
-		/* if numbers differ, then set the result */
-		if (num1 < num2)
-			result = -1;
-		else if (num1 > num2)
-			result = 1;
-		else {
-			/* if numbers are the same, go to next level */
-			ver1 = strchr(ver1, '.');
-			ver2 = strchr(ver2, '.');
-			if (!ver1 && !ver2)
-				break;
-			else if (!ver1)
-				result = -1;
-			else if (!ver2)
-				result = 1;
-			else {
-				ver1++;
-				ver2++;
-			}
-		}
+	for (i = 0; i < 3; i++) {
+		if (ver1[i] > ver2[i])
+			return 1;
+		if (ver1[i] < ver2[i])
+			return -1;
 	}
-	return result;
+
+	return 0;
 }
 
 static int idtcm_xfer_read(struct idtcm *idtcm,
commit 3d2a9d642512c21a12d19b9250e7a835dcb41a79
Author: Dennis Dalessandro <dennis.dalessandro at cornelisnetworks.com>
Date:   Wed Nov 25 16:01:12 2020 -0500

    IB/hfi1: Ensure correct mm is used at all times
    
    Two earlier bug fixes have created a security problem in the hfi1
    driver. One fix aimed to solve an issue where current->mm was not valid
    when closing the hfi1 cdev. It attempted to do this by saving a cached
    value of the current->mm pointer at file open time. This is a problem if
    another process with access to the FD calls in via write() or ioctl() to
    pin pages via the hfi driver. The other fix tried to solve a use after
    free by taking a reference on the mm.
    
    To fix this correctly we use the existing cached value of the mm in the
    mmu notifier. Now we can check in the insert, evict, etc. routines that
    current->mm matched what the notifier was registered for. If not, then
    don't allow access. The register of the mmu notifier will save the mm
    pointer.
    
    Since in do_exit() the exit_mm() is called before exit_files(), which
    would call our close routine a reference is needed on the mm. We rely on
    the mmgrab done by the registration of the notifier, whereas before it was
    explicit. The mmu notifier deregistration happens when the user context is
    torn down, the creation of which triggered the registration.
    
    Also of note is we do not do any explicit work to protect the interval
    tree notifier. It doesn't seem that this is going to be needed since we
    aren't actually doing anything with current->mm. The interval tree
    notifier stuff still has a FIXME noted from a previous commit that will be
    addressed in a follow on patch.
    
    Cc: <stable at vger.kernel.org>
    Fixes: e0cf75deab81 ("IB/hfi1: Fix mm_struct use after free")
    Fixes: 3faa3d9a308e ("IB/hfi1: Make use of mm consistent")
    Link: https://lore.kernel.org/r/20201125210112.104301.51331.stgit@awfm-01.aw.intel.com
    Suggested-by: Jann Horn <jannh at google.com>
    Reported-by: Jason Gunthorpe <jgg at nvidia.com>
    Reviewed-by: Ira Weiny <ira.weiny at intel.com>
    Reviewed-by: Mike Marciniszyn <mike.marciniszyn at cornelisnetworks.com>
    Signed-off-by: Dennis Dalessandro <dennis.dalessandro at cornelisnetworks.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
index 8ca51e43cf53..329ee4f48d95 100644
--- a/drivers/infiniband/hw/hfi1/file_ops.c
+++ b/drivers/infiniband/hw/hfi1/file_ops.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright(c) 2020 Cornelis Networks, Inc.
  * Copyright(c) 2015-2020 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -206,8 +207,6 @@ static int hfi1_file_open(struct inode *inode, struct file *fp)
 	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;
 	fp->private_data = fd;
 	return 0;
@@ -711,7 +710,6 @@ static int hfi1_file_close(struct inode *inode, struct file *fp)
 
 	deallocate_ctxt(uctxt);
 done:
-	mmdrop(fdata->mm);
 
 	if (atomic_dec_and_test(&dd->user_refcount))
 		complete(&dd->user_comp);
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h
index b4c6bff60a4e..e09e8244a94c 100644
--- a/drivers/infiniband/hw/hfi1/hfi.h
+++ b/drivers/infiniband/hw/hfi1/hfi.h
@@ -1,6 +1,7 @@
 #ifndef _HFI1_KERNEL_H
 #define _HFI1_KERNEL_H
 /*
+ * Copyright(c) 2020 Cornelis Networks, Inc.
  * Copyright(c) 2015-2020 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -1451,7 +1452,6 @@ struct hfi1_filedata {
 	u32 invalid_tid_idx;
 	/* protect invalid_tids array and invalid_tid_idx */
 	spinlock_t invalid_lock;
-	struct mm_struct *mm;
 };
 
 extern struct xarray hfi1_dev_table;
diff --git a/drivers/infiniband/hw/hfi1/mmu_rb.c b/drivers/infiniband/hw/hfi1/mmu_rb.c
index 24ca17b77b72..f3fb28e3d5d7 100644
--- a/drivers/infiniband/hw/hfi1/mmu_rb.c
+++ b/drivers/infiniband/hw/hfi1/mmu_rb.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright(c) 2020 Cornelis Networks, Inc.
  * Copyright(c) 2016 - 2017 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -48,23 +49,11 @@
 #include <linux/rculist.h>
 #include <linux/mmu_notifier.h>
 #include <linux/interval_tree_generic.h>
+#include <linux/sched/mm.h>
 
 #include "mmu_rb.h"
 #include "trace.h"
 
-struct mmu_rb_handler {
-	struct mmu_notifier mn;
-	struct rb_root_cached root;
-	void *ops_arg;
-	spinlock_t lock;        /* protect the RB tree */
-	struct mmu_rb_ops *ops;
-	struct mm_struct *mm;
-	struct list_head lru_list;
-	struct work_struct del_work;
-	struct list_head del_list;
-	struct workqueue_struct *wq;
-};
-
 static unsigned long mmu_node_start(struct mmu_rb_node *);
 static unsigned long mmu_node_last(struct mmu_rb_node *);
 static int mmu_notifier_range_start(struct mmu_notifier *,
@@ -92,37 +81,36 @@ static unsigned long mmu_node_last(struct mmu_rb_node *node)
 	return PAGE_ALIGN(node->addr + node->len) - 1;
 }
 
-int hfi1_mmu_rb_register(void *ops_arg, struct mm_struct *mm,
+int hfi1_mmu_rb_register(void *ops_arg,
 			 struct mmu_rb_ops *ops,
 			 struct workqueue_struct *wq,
 			 struct mmu_rb_handler **handler)
 {
-	struct mmu_rb_handler *handlr;
+	struct mmu_rb_handler *h;
 	int ret;
 
-	handlr = kmalloc(sizeof(*handlr), GFP_KERNEL);
-	if (!handlr)
+	h = kmalloc(sizeof(*h), GFP_KERNEL);
+	if (!h)
 		return -ENOMEM;
 
-	handlr->root = RB_ROOT_CACHED;
-	handlr->ops = ops;
-	handlr->ops_arg = ops_arg;
-	INIT_HLIST_NODE(&handlr->mn.hlist);
-	spin_lock_init(&handlr->lock);
-	handlr->mn.ops = &mn_opts;
-	handlr->mm = mm;
-	INIT_WORK(&handlr->del_work, handle_remove);
-	INIT_LIST_HEAD(&handlr->del_list);
-	INIT_LIST_HEAD(&handlr->lru_list);
-	handlr->wq = wq;
-
-	ret = mmu_notifier_register(&handlr->mn, handlr->mm);
+	h->root = RB_ROOT_CACHED;
+	h->ops = ops;
+	h->ops_arg = ops_arg;
+	INIT_HLIST_NODE(&h->mn.hlist);
+	spin_lock_init(&h->lock);
+	h->mn.ops = &mn_opts;
+	INIT_WORK(&h->del_work, handle_remove);
+	INIT_LIST_HEAD(&h->del_list);
+	INIT_LIST_HEAD(&h->lru_list);
+	h->wq = wq;
+
+	ret = mmu_notifier_register(&h->mn, current->mm);
 	if (ret) {
-		kfree(handlr);
+		kfree(h);
 		return ret;
 	}
 
-	*handler = handlr;
+	*handler = h;
 	return 0;
 }
 
@@ -134,7 +122,7 @@ void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler)
 	struct list_head del_list;
 
 	/* Unregister first so we don't get any more notifications. */
-	mmu_notifier_unregister(&handler->mn, handler->mm);
+	mmu_notifier_unregister(&handler->mn, handler->mn.mm);
 
 	/*
 	 * Make sure the wq delete handler is finished running.  It will not
@@ -166,6 +154,10 @@ int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler,
 	int ret = 0;
 
 	trace_hfi1_mmu_rb_insert(mnode->addr, mnode->len);
+
+	if (current->mm != handler->mn.mm)
+		return -EPERM;
+
 	spin_lock_irqsave(&handler->lock, flags);
 	node = __mmu_rb_search(handler, mnode->addr, mnode->len);
 	if (node) {
@@ -180,6 +172,7 @@ int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler,
 		__mmu_int_rb_remove(mnode, &handler->root);
 		list_del(&mnode->list); /* remove from LRU list */
 	}
+	mnode->handler = handler;
 unlock:
 	spin_unlock_irqrestore(&handler->lock, flags);
 	return ret;
@@ -217,6 +210,9 @@ bool hfi1_mmu_rb_remove_unless_exact(struct mmu_rb_handler *handler,
 	unsigned long flags;
 	bool ret = false;
 
+	if (current->mm != handler->mn.mm)
+		return ret;
+
 	spin_lock_irqsave(&handler->lock, flags);
 	node = __mmu_rb_search(handler, addr, len);
 	if (node) {
@@ -239,6 +235,9 @@ void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg)
 	unsigned long flags;
 	bool stop = false;
 
+	if (current->mm != handler->mn.mm)
+		return;
+
 	INIT_LIST_HEAD(&del_list);
 
 	spin_lock_irqsave(&handler->lock, flags);
@@ -272,6 +271,9 @@ void hfi1_mmu_rb_remove(struct mmu_rb_handler *handler,
 {
 	unsigned long flags;
 
+	if (current->mm != handler->mn.mm)
+		return;
+
 	/* Validity of handler and node pointers has been checked by caller. */
 	trace_hfi1_mmu_rb_remove(node->addr, node->len);
 	spin_lock_irqsave(&handler->lock, flags);
diff --git a/drivers/infiniband/hw/hfi1/mmu_rb.h b/drivers/infiniband/hw/hfi1/mmu_rb.h
index f04cec1e99d1..423aacc67e94 100644
--- a/drivers/infiniband/hw/hfi1/mmu_rb.h
+++ b/drivers/infiniband/hw/hfi1/mmu_rb.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright(c) 2020 Cornelis Networks, Inc.
  * Copyright(c) 2016 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -54,6 +55,7 @@ struct mmu_rb_node {
 	unsigned long len;
 	unsigned long __last;
 	struct rb_node node;
+	struct mmu_rb_handler *handler;
 	struct list_head list;
 };
 
@@ -71,7 +73,19 @@ struct mmu_rb_ops {
 		     void *evict_arg, bool *stop);
 };
 
-int hfi1_mmu_rb_register(void *ops_arg, struct mm_struct *mm,
+struct mmu_rb_handler {
+	struct mmu_notifier mn;
+	struct rb_root_cached root;
+	void *ops_arg;
+	spinlock_t lock;        /* protect the RB tree */
+	struct mmu_rb_ops *ops;
+	struct list_head lru_list;
+	struct work_struct del_work;
+	struct list_head del_list;
+	struct workqueue_struct *wq;
+};
+
+int hfi1_mmu_rb_register(void *ops_arg,
 			 struct mmu_rb_ops *ops,
 			 struct workqueue_struct *wq,
 			 struct mmu_rb_handler **handler);
diff --git a/drivers/infiniband/hw/hfi1/user_exp_rcv.c b/drivers/infiniband/hw/hfi1/user_exp_rcv.c
index f81ca20f4b69..b94fc7fd75a9 100644
--- a/drivers/infiniband/hw/hfi1/user_exp_rcv.c
+++ b/drivers/infiniband/hw/hfi1/user_exp_rcv.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright(c) 2020 Cornelis Networks, Inc.
  * Copyright(c) 2015-2018 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -173,15 +174,18 @@ static void unpin_rcv_pages(struct hfi1_filedata *fd,
 {
 	struct page **pages;
 	struct hfi1_devdata *dd = fd->uctxt->dd;
+	struct mm_struct *mm;
 
 	if (mapped) {
 		pci_unmap_single(dd->pcidev, node->dma_addr,
 				 node->npages * PAGE_SIZE, PCI_DMA_FROMDEVICE);
 		pages = &node->pages[idx];
+		mm = mm_from_tid_node(node);
 	} else {
 		pages = &tidbuf->pages[idx];
+		mm = current->mm;
 	}
-	hfi1_release_user_pages(fd->mm, pages, npages, mapped);
+	hfi1_release_user_pages(mm, pages, npages, mapped);
 	fd->tid_n_pinned -= npages;
 }
 
@@ -216,12 +220,12 @@ static int pin_rcv_pages(struct hfi1_filedata *fd, struct tid_user_buf *tidbuf)
 	 * pages, accept the amount pinned so far and program only that.
 	 * User space knows how to deal with partially programmed buffers.
 	 */
-	if (!hfi1_can_pin_pages(dd, fd->mm, fd->tid_n_pinned, npages)) {
+	if (!hfi1_can_pin_pages(dd, current->mm, fd->tid_n_pinned, npages)) {
 		kfree(pages);
 		return -ENOMEM;
 	}
 
-	pinned = hfi1_acquire_user_pages(fd->mm, vaddr, npages, true, pages);
+	pinned = hfi1_acquire_user_pages(current->mm, vaddr, npages, true, pages);
 	if (pinned <= 0) {
 		kfree(pages);
 		return pinned;
@@ -756,7 +760,7 @@ static int set_rcvarray_entry(struct hfi1_filedata *fd,
 
 	if (fd->use_mn) {
 		ret = mmu_interval_notifier_insert(
-			&node->notifier, fd->mm,
+			&node->notifier, current->mm,
 			tbuf->vaddr + (pageidx * PAGE_SIZE), npages * PAGE_SIZE,
 			&tid_mn_ops);
 		if (ret)
diff --git a/drivers/infiniband/hw/hfi1/user_exp_rcv.h b/drivers/infiniband/hw/hfi1/user_exp_rcv.h
index 332abb446861..d45c7b6988d4 100644
--- a/drivers/infiniband/hw/hfi1/user_exp_rcv.h
+++ b/drivers/infiniband/hw/hfi1/user_exp_rcv.h
@@ -1,6 +1,7 @@
 #ifndef _HFI1_USER_EXP_RCV_H
 #define _HFI1_USER_EXP_RCV_H
 /*
+ * Copyright(c) 2020 - Cornelis Networks, Inc.
  * Copyright(c) 2015 - 2017 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -95,4 +96,9 @@ int hfi1_user_exp_rcv_clear(struct hfi1_filedata *fd,
 int hfi1_user_exp_rcv_invalid(struct hfi1_filedata *fd,
 			      struct hfi1_tid_info *tinfo);
 
+static inline struct mm_struct *mm_from_tid_node(struct tid_rb_node *node)
+{
+	return node->notifier.mm;
+}
+
 #endif /* _HFI1_USER_EXP_RCV_H */
diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c
index a92346e88628..4a4956f96a7e 100644
--- a/drivers/infiniband/hw/hfi1/user_sdma.c
+++ b/drivers/infiniband/hw/hfi1/user_sdma.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright(c) 2020 - Cornelis Networks, Inc.
  * Copyright(c) 2015 - 2018 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -188,7 +189,6 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
 	atomic_set(&pq->n_reqs, 0);
 	init_waitqueue_head(&pq->wait);
 	atomic_set(&pq->n_locked, 0);
-	pq->mm = fd->mm;
 
 	iowait_init(&pq->busy, 0, NULL, NULL, defer_packet_queue,
 		    activate_packet_queue, NULL, NULL);
@@ -230,7 +230,7 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
 
 	cq->nentries = hfi1_sdma_comp_ring_size;
 
-	ret = hfi1_mmu_rb_register(pq, pq->mm, &sdma_rb_ops, dd->pport->hfi1_wq,
+	ret = hfi1_mmu_rb_register(pq, &sdma_rb_ops, dd->pport->hfi1_wq,
 				   &pq->handler);
 	if (ret) {
 		dd_dev_err(dd, "Failed to register with MMU %d", ret);
@@ -980,13 +980,13 @@ static int pin_sdma_pages(struct user_sdma_request *req,
 
 	npages -= node->npages;
 retry:
-	if (!hfi1_can_pin_pages(pq->dd, pq->mm,
+	if (!hfi1_can_pin_pages(pq->dd, current->mm,
 				atomic_read(&pq->n_locked), npages)) {
 		cleared = sdma_cache_evict(pq, npages);
 		if (cleared >= npages)
 			goto retry;
 	}
-	pinned = hfi1_acquire_user_pages(pq->mm,
+	pinned = hfi1_acquire_user_pages(current->mm,
 					 ((unsigned long)iovec->iov.iov_base +
 					 (node->npages * PAGE_SIZE)), npages, 0,
 					 pages + node->npages);
@@ -995,7 +995,7 @@ retry:
 		return pinned;
 	}
 	if (pinned != npages) {
-		unpin_vector_pages(pq->mm, pages, node->npages, pinned);
+		unpin_vector_pages(current->mm, pages, node->npages, pinned);
 		return -EFAULT;
 	}
 	kfree(node->pages);
@@ -1008,7 +1008,8 @@ retry:
 static void unpin_sdma_pages(struct sdma_mmu_node *node)
 {
 	if (node->npages) {
-		unpin_vector_pages(node->pq->mm, node->pages, 0, node->npages);
+		unpin_vector_pages(mm_from_sdma_node(node), node->pages, 0,
+				   node->npages);
 		atomic_sub(node->npages, &node->pq->n_locked);
 	}
 }
diff --git a/drivers/infiniband/hw/hfi1/user_sdma.h b/drivers/infiniband/hw/hfi1/user_sdma.h
index 9972e0e6545e..1e8c02fe8ad1 100644
--- a/drivers/infiniband/hw/hfi1/user_sdma.h
+++ b/drivers/infiniband/hw/hfi1/user_sdma.h
@@ -1,6 +1,7 @@
 #ifndef _HFI1_USER_SDMA_H
 #define _HFI1_USER_SDMA_H
 /*
+ * Copyright(c) 2020 - Cornelis Networks, Inc.
  * Copyright(c) 2015 - 2018 Intel Corporation.
  *
  * This file is provided under a dual BSD/GPLv2 license.  When using or
@@ -133,7 +134,6 @@ struct hfi1_user_sdma_pkt_q {
 	unsigned long unpinned;
 	struct mmu_rb_handler *handler;
 	atomic_t n_locked;
-	struct mm_struct *mm;
 };
 
 struct hfi1_user_sdma_comp_q {
@@ -250,4 +250,9 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
 				   struct iovec *iovec, unsigned long dim,
 				   unsigned long *count);
 
+static inline struct mm_struct *mm_from_sdma_node(struct sdma_mmu_node *node)
+{
+	return node->rb.handler->mn.mm;
+}
+
 #endif /* _HFI1_USER_SDMA_H */
commit c0700dfa2cae44c033ed97dade8a2679c7d22a9d
Author: Florian Westphal <fw at strlen.de>
Date:   Thu Nov 19 16:34:54 2020 +0100

    netfilter: nf_tables: avoid false-postive lockdep splat
    
    There are reports wrt lockdep splat in nftables, e.g.:
    ------------[ cut here ]------------
    WARNING: CPU: 2 PID: 31416 at net/netfilter/nf_tables_api.c:622
    lockdep_nfnl_nft_mutex_not_held+0x28/0x38 [nf_tables]
    ...
    
    These are caused by an earlier, unrelated bug such as a n ABBA deadlock
    in a different subsystem.
    In such an event, lockdep is disabled and lockdep_is_held returns true
    unconditionally.  This then causes the WARN() in nf_tables.
    
    Make the WARN conditional on lockdep still active to avoid this.
    
    Fixes: f102d66b335a417 ("netfilter: nf_tables: use dedicated mutex to guard transactions")
    Reported-by: Naresh Kamboju <naresh.kamboju at linaro.org>
    Link: https://lore.kernel.org/linux-kselftest/CA+G9fYvFUpODs+NkSYcnwKnXm62tmP=ksLeBPmB+KFrB2rvCtQ@mail.gmail.com/
    Signed-off-by: Florian Westphal <fw at strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 0f58e98542be..23abf1578594 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -619,7 +619,8 @@ static int nft_request_module(struct net *net, const char *fmt, ...)
 static void lockdep_nfnl_nft_mutex_not_held(void)
 {
 #ifdef CONFIG_PROVE_LOCKING
-	WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES));
+	if (debug_locks)
+		WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES));
 #endif
 }
 
commit 68ad89de918e1c5a79c9c56127e5e31741fd517e
Author: Eric Dumazet <edumazet at google.com>
Date:   Thu Nov 19 01:59:32 2020 -0800

    netfilter: ipset: prevent uninit-value in hash_ip6_add
    
    syzbot found that we are not validating user input properly
    before copying 16 bytes [1].
    
    Using NLA_BINARY in ipaddr_policy[] for IPv6 address is not correct,
    since it ensures at most 16 bytes were provided.
    
    We should instead make sure user provided exactly 16 bytes.
    
    In old kernels (before v4.20), fix would be to remove the NLA_BINARY,
    since NLA_POLICY_EXACT_LEN() was not yet available.
    
    [1]
    BUG: KMSAN: uninit-value in hash_ip6_add+0x1cba/0x3a50 net/netfilter/ipset/ip_set_hash_gen.h:892
    CPU: 1 PID: 11611 Comm: syz-executor.0 Not tainted 5.10.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0x21c/0x280 lib/dump_stack.c:118
     kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:118
     __msan_warning+0x5f/0xa0 mm/kmsan/kmsan_instr.c:197
     hash_ip6_add+0x1cba/0x3a50 net/netfilter/ipset/ip_set_hash_gen.h:892
     hash_ip6_uadt+0x976/0xbd0 net/netfilter/ipset/ip_set_hash_ip.c:267
     call_ad+0x329/0xd00 net/netfilter/ipset/ip_set_core.c:1720
     ip_set_ad+0x111f/0x1440 net/netfilter/ipset/ip_set_core.c:1808
     ip_set_uadd+0xf6/0x110 net/netfilter/ipset/ip_set_core.c:1833
     nfnetlink_rcv_msg+0xc7d/0xdf0 net/netfilter/nfnetlink.c:252
     netlink_rcv_skb+0x70a/0x820 net/netlink/af_netlink.c:2494
     nfnetlink_rcv+0x4f0/0x4380 net/netfilter/nfnetlink.c:600
     netlink_unicast_kernel net/netlink/af_netlink.c:1304 [inline]
     netlink_unicast+0x11da/0x14b0 net/netlink/af_netlink.c:1330
     netlink_sendmsg+0x173c/0x1840 net/netlink/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:651 [inline]
     sock_sendmsg net/socket.c:671 [inline]
     ____sys_sendmsg+0xc7a/0x1240 net/socket.c:2353
     ___sys_sendmsg net/socket.c:2407 [inline]
     __sys_sendmsg+0x6d5/0x830 net/socket.c:2440
     __do_sys_sendmsg net/socket.c:2449 [inline]
     __se_sys_sendmsg+0x97/0xb0 net/socket.c:2447
     __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2447
     do_syscall_64+0x9f/0x140 arch/x86/entry/common.c:48
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x45deb9
    Code: 0d b4 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 db b3 fb ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007fe2e503fc78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 0000000000029ec0 RCX: 000000000045deb9
    RDX: 0000000000000000 RSI: 0000000020000140 RDI: 0000000000000003
    RBP: 000000000118bf60 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 000000000118bf2c
    R13: 000000000169fb7f R14: 00007fe2e50409c0 R15: 000000000118bf2c
    
    Uninit was stored to memory at:
     kmsan_save_stack_with_flags mm/kmsan/kmsan.c:121 [inline]
     kmsan_internal_chain_origin+0xad/0x130 mm/kmsan/kmsan.c:289
     __msan_chain_origin+0x57/0xa0 mm/kmsan/kmsan_instr.c:147
     ip6_netmask include/linux/netfilter/ipset/pfxlen.h:49 [inline]
     hash_ip6_netmask net/netfilter/ipset/ip_set_hash_ip.c:185 [inline]
     hash_ip6_uadt+0xb1c/0xbd0 net/netfilter/ipset/ip_set_hash_ip.c:263
     call_ad+0x329/0xd00 net/netfilter/ipset/ip_set_core.c:1720
     ip_set_ad+0x111f/0x1440 net/netfilter/ipset/ip_set_core.c:1808
     ip_set_uadd+0xf6/0x110 net/netfilter/ipset/ip_set_core.c:1833
     nfnetlink_rcv_msg+0xc7d/0xdf0 net/netfilter/nfnetlink.c:252
     netlink_rcv_skb+0x70a/0x820 net/netlink/af_netlink.c:2494
     nfnetlink_rcv+0x4f0/0x4380 net/netfilter/nfnetlink.c:600
     netlink_unicast_kernel net/netlink/af_netlink.c:1304 [inline]
     netlink_unicast+0x11da/0x14b0 net/netlink/af_netlink.c:1330
     netlink_sendmsg+0x173c/0x1840 net/netlink/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:651 [inline]
     sock_sendmsg net/socket.c:671 [inline]
     ____sys_sendmsg+0xc7a/0x1240 net/socket.c:2353
     ___sys_sendmsg net/socket.c:2407 [inline]
     __sys_sendmsg+0x6d5/0x830 net/socket.c:2440
     __do_sys_sendmsg net/socket.c:2449 [inline]
     __se_sys_sendmsg+0x97/0xb0 net/socket.c:2447
     __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2447
     do_syscall_64+0x9f/0x140 arch/x86/entry/common.c:48
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Uninit was stored to memory at:
     kmsan_save_stack_with_flags mm/kmsan/kmsan.c:121 [inline]
     kmsan_internal_chain_origin+0xad/0x130 mm/kmsan/kmsan.c:289
     kmsan_memcpy_memmove_metadata+0x25e/0x2d0 mm/kmsan/kmsan.c:226
     kmsan_memcpy_metadata+0xb/0x10 mm/kmsan/kmsan.c:246
     __msan_memcpy+0x46/0x60 mm/kmsan/kmsan_instr.c:110
     ip_set_get_ipaddr6+0x2cb/0x370 net/netfilter/ipset/ip_set_core.c:310
     hash_ip6_uadt+0x439/0xbd0 net/netfilter/ipset/ip_set_hash_ip.c:255
     call_ad+0x329/0xd00 net/netfilter/ipset/ip_set_core.c:1720
     ip_set_ad+0x111f/0x1440 net/netfilter/ipset/ip_set_core.c:1808
     ip_set_uadd+0xf6/0x110 net/netfilter/ipset/ip_set_core.c:1833
     nfnetlink_rcv_msg+0xc7d/0xdf0 net/netfilter/nfnetlink.c:252
     netlink_rcv_skb+0x70a/0x820 net/netlink/af_netlink.c:2494
     nfnetlink_rcv+0x4f0/0x4380 net/netfilter/nfnetlink.c:600
     netlink_unicast_kernel net/netlink/af_netlink.c:1304 [inline]
     netlink_unicast+0x11da/0x14b0 net/netlink/af_netlink.c:1330
     netlink_sendmsg+0x173c/0x1840 net/netlink/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:651 [inline]
     sock_sendmsg net/socket.c:671 [inline]
     ____sys_sendmsg+0xc7a/0x1240 net/socket.c:2353
     ___sys_sendmsg net/socket.c:2407 [inline]
     __sys_sendmsg+0x6d5/0x830 net/socket.c:2440
     __do_sys_sendmsg net/socket.c:2449 [inline]
     __se_sys_sendmsg+0x97/0xb0 net/socket.c:2447
     __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2447
     do_syscall_64+0x9f/0x140 arch/x86/entry/common.c:48
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Uninit was created at:
     kmsan_save_stack_with_flags mm/kmsan/kmsan.c:121 [inline]
     kmsan_internal_poison_shadow+0x5c/0xf0 mm/kmsan/kmsan.c:104
     kmsan_slab_alloc+0x8d/0xe0 mm/kmsan/kmsan_hooks.c:76
     slab_alloc_node mm/slub.c:2906 [inline]
     __kmalloc_node_track_caller+0xc61/0x15f0 mm/slub.c:4512
     __kmalloc_reserve net/core/skbuff.c:142 [inline]
     __alloc_skb+0x309/0xae0 net/core/skbuff.c:210
     alloc_skb include/linux/skbuff.h:1094 [inline]
     netlink_alloc_large_skb net/netlink/af_netlink.c:1176 [inline]
     netlink_sendmsg+0xdb8/0x1840 net/netlink/af_netlink.c:1894
     sock_sendmsg_nosec net/socket.c:651 [inline]
     sock_sendmsg net/socket.c:671 [inline]
     ____sys_sendmsg+0xc7a/0x1240 net/socket.c:2353
     ___sys_sendmsg net/socket.c:2407 [inline]
     __sys_sendmsg+0x6d5/0x830 net/socket.c:2440
     __do_sys_sendmsg net/socket.c:2449 [inline]
     __se_sys_sendmsg+0x97/0xb0 net/socket.c:2447
     __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2447
     do_syscall_64+0x9f/0x140 arch/x86/entry/common.c:48
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: a7b4f989a629 ("netfilter: ipset: IP set core support")
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Reported-by: syzbot <syzkaller at googlegroups.com>
    Acked-by: Jozsef Kadlecsik <kadlec at netfilter.org>
    Signed-off-by: Pablo Neira Ayuso <pablo at netfilter.org>

diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c
index 7cff6e5e7445..2b19189a930f 100644
--- a/net/netfilter/ipset/ip_set_core.c
+++ b/net/netfilter/ipset/ip_set_core.c
@@ -271,8 +271,7 @@ flag_nested(const struct nlattr *nla)
 
 static const struct nla_policy ipaddr_policy[IPSET_ATTR_IPADDR_MAX + 1] = {
 	[IPSET_ATTR_IPADDR_IPV4]	= { .type = NLA_U32 },
-	[IPSET_ATTR_IPADDR_IPV6]	= { .type = NLA_BINARY,
-					    .len = sizeof(struct in6_addr) },
+	[IPSET_ATTR_IPADDR_IPV6]	= NLA_POLICY_EXACT_LEN(sizeof(struct in6_addr)),
 };
 
 int
commit ab43108d0dd48d287e1b5bb9cd4a969457ed9b0e
Author: Colin Ian King <colin.king at canonical.com>
Date:   Tue Nov 24 12:15:28 2020 +0000

    drm/mcde: fix masking and bitwise-or on variable val
    
    The masking of val with ~MCDE_CRX1_CLKSEL_MASK is currently being
    ignored because there seems to be a missing bitwise-or of val in the
    following statement.  Fix this by replacing the assignment of val
    with a bitwise-or.
    
    Fixes: d795fd322063 ("drm/mcde: Support DPI output")
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Addresses-Coverity: ("Unused valued")
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201124121528.395681-1-colin.king@canonical.com

diff --git a/drivers/gpu/drm/mcde/mcde_display.c b/drivers/gpu/drm/mcde/mcde_display.c
index d941026b940c..7c2e0b865441 100644
--- a/drivers/gpu/drm/mcde/mcde_display.c
+++ b/drivers/gpu/drm/mcde/mcde_display.c
@@ -738,7 +738,7 @@ static void mcde_configure_fifo(struct mcde *mcde, enum mcde_fifo fifo,
 	} else {
 		/* Use the MCDE clock for DSI */
 		val &= ~MCDE_CRX1_CLKSEL_MASK;
-		val = MCDE_CRX1_CLKSEL_MCDECLK << MCDE_CRX1_CLKSEL_SHIFT;
+		val |= MCDE_CRX1_CLKSEL_MCDECLK << MCDE_CRX1_CLKSEL_SHIFT;
 	}
 	writel(val, mcde->regs + cr1);
 	spin_unlock(&mcde->fifo_crx1_lock);
commit 9a44bc9449cfe7e39dbadf537ff669fb007a9e63
Author: KP Singh <kpsingh at google.com>
Date:   Wed Nov 25 20:24:04 2020 +0000

    bpf: Add MAINTAINERS entry for BPF LSM
    
    Similar to XDP and some JITs, also add Brendan and Florent who have been
    reviewing all my patches internally as reviewers. The patches are expected
    as usual to go via the BPF tree(s) / list / merge workflows.
    
    Signed-off-by: KP Singh <kpsingh at google.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Link: https://lore.kernel.org/bpf/20201125202404.1419509-1-kpsingh@chromium.org

diff --git a/MAINTAINERS b/MAINTAINERS
index 15355c055a1a..3004f0abfe7d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3356,6 +3356,17 @@ S:	Supported
 F:	arch/x86/net/
 X:	arch/x86/net/bpf_jit_comp32.c
 
+BPF LSM (Security Audit and Enforcement using BPF)
+M:	KP Singh <kpsingh at chromium.org>
+R:	Florent Revest <revest at chromium.org>
+R:	Brendan Jackman <jackmanb at chromium.org>
+L:	bpf at vger.kernel.org
+S:	Maintained
+F:	Documentation/bpf/bpf_lsm.rst
+F:	include/linux/bpf_lsm.h
+F:	kernel/bpf/bpf_lsm.c
+F:	security/bpf/
+
 BROADCOM B44 10/100 ETHERNET DRIVER
 M:	Michael Chan <michael.chan at broadcom.com>
 L:	netdev at vger.kernel.org
commit 90cf87d16bd566cff40c2bc8e32e6d4cd3af23f0
Author: Vladimir Oltean <vladimir.oltean at nxp.com>
Date:   Wed Nov 25 00:02:59 2020 +0200

    enetc: Let the hardware auto-advance the taprio base-time of 0
    
    The tc-taprio base time indicates the beginning of the tc-taprio
    schedule, which is cyclic by definition (where the length of the cycle
    in nanoseconds is called the cycle time). The base time is a 64-bit PTP
    time in the TAI domain.
    
    Logically, the base-time should be a future time. But that imposes some
    restrictions to user space, which has to retrieve the current PTP time
    from the NIC first, then calculate a base time that will still be larger
    than the base time by the time the kernel driver programs this value
    into the hardware. Actually ensuring that the programmed base time is in
    the future is still a problem even if the kernel alone deals with this.
    
    Luckily, the enetc hardware already advances a base-time that is in the
    past into a congruent time in the immediate future, according to the
    same formula that can be found in the software implementation of taprio
    (in taprio_get_start_time):
    
            /* Schedule the start time for the beginning of the next
             * cycle.
             */
            n = div64_s64(ktime_sub_ns(now, base), cycle);
            *start = ktime_add_ns(base, (n + 1) * cycle);
    
    There's only one problem: the driver doesn't let the hardware do that.
    It interferes with the base-time passed from user space, by special-casing
    the situation when the base-time is zero, and replaces that with the
    current PTP time. This changes the intended effective base-time of the
    schedule, which will in the end have a different phase offset than if
    the base-time of 0.000000000 was to be advanced by an integer multiple
    of the cycle-time.
    
    Fixes: 34c6adf1977b ("enetc: Configure the Time-Aware Scheduler via tc-taprio offload")
    Signed-off-by: Vladimir Oltean <vladimir.oltean at nxp.com>
    Link: https://lore.kernel.org/r/20201124220259.3027991-1-vladimir.oltean@nxp.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/enetc/enetc_qos.c b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
index 827f74e86d34..dbceb99c4441 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_qos.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
@@ -92,18 +92,8 @@ static int enetc_setup_taprio(struct net_device *ndev,
 	gcl_config->atc = 0xff;
 	gcl_config->acl_len = cpu_to_le16(gcl_len);
 
-	if (!admin_conf->base_time) {
-		gcl_data->btl =
-			cpu_to_le32(enetc_rd(&priv->si->hw, ENETC_SICTR0));
-		gcl_data->bth =
-			cpu_to_le32(enetc_rd(&priv->si->hw, ENETC_SICTR1));
-	} else {
-		gcl_data->btl =
-			cpu_to_le32(lower_32_bits(admin_conf->base_time));
-		gcl_data->bth =
-			cpu_to_le32(upper_32_bits(admin_conf->base_time));
-	}
-
+	gcl_data->btl = cpu_to_le32(lower_32_bits(admin_conf->base_time));
+	gcl_data->bth = cpu_to_le32(upper_32_bits(admin_conf->base_time));
 	gcl_data->ct = cpu_to_le32(admin_conf->cycle_time);
 	gcl_data->cte = cpu_to_le32(admin_conf->cycle_time_extension);
 
commit 2543a6000e593a213fba5b504f52c07e09f39835
Author: Eric Dumazet <edumazet at google.com>
Date:   Tue Nov 24 12:38:22 2020 -0800

    gro_cells: reduce number of synchronize_net() calls
    
    After cited commit, gro_cells_destroy() became damn slow
    on hosts with a lot of cores.
    
    This is because we have one additional synchronize_net() per cpu as
    stated in the changelog.
    
    gro_cells_init() is setting NAPI_STATE_NO_BUSY_POLL, and this was enough
    to not have one synchronize_net() call per netif_napi_del()
    
    We can factorize all the synchronize_net() to a single one,
    right before freeing per-cpu memory.
    
    Fixes: 5198d545dba8 ("net: remove napi_hash_del() from driver-facing API")
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Link: https://lore.kernel.org/r/20201124203822.1360107-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/gro_cells.c b/net/core/gro_cells.c
index e095fb871d91..6eb2e5ec2c50 100644
--- a/net/core/gro_cells.c
+++ b/net/core/gro_cells.c
@@ -99,9 +99,14 @@ void gro_cells_destroy(struct gro_cells *gcells)
 		struct gro_cell *cell = per_cpu_ptr(gcells->cells, i);
 
 		napi_disable(&cell->napi);
-		netif_napi_del(&cell->napi);
+		__netif_napi_del(&cell->napi);
 		__skb_queue_purge(&cell->napi_skbs);
 	}
+	/* This barrier is needed because netpoll could access dev->napi_list
+	 * under rcu protection.
+	 */
+	synchronize_net();
+
 	free_percpu(gcells->cells);
 	gcells->cells = NULL;
 }
commit 12a8fe56c0f06eaab1f9d89d246c3591bcc7a966
Author: Antonio Borneo <antonio.borneo at st.com>
Date:   Tue Nov 24 23:37:29 2020 +0100

    net: stmmac: fix incorrect merge of patch upstream
    
    Commit 757926247836 ("net: stmmac: add flexible PPS to dwmac
    4.10a") was intended to modify the struct dwmac410_ops, but it got
    somehow badly merged and modified the struct dwmac4_ops.
    
    Revert the modification in struct dwmac4_ops and re-apply it
    properly in struct dwmac410_ops.
    
    Fixes: 757926247836 ("net: stmmac: add flexible PPS to dwmac 4.10a")
    Signed-off-by: Antonio Borneo <antonio.borneo at st.com>
    Reported-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
    Link: https://lore.kernel.org/r/20201124223729.886992-1-antonio.borneo@st.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
index 002791b77356..ced6d76a0d85 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
@@ -1171,7 +1171,6 @@ const struct stmmac_ops dwmac4_ops = {
 	.pcs_get_adv_lp = dwmac4_get_adv_lp,
 	.debug = dwmac4_debug,
 	.set_filter = dwmac4_set_filter,
-	.flex_pps_config = dwmac5_flex_pps_config,
 	.set_mac_loopback = dwmac4_set_mac_loopback,
 	.update_vlan_hash = dwmac4_update_vlan_hash,
 	.sarc_configure = dwmac4_sarc_configure,
@@ -1213,6 +1212,7 @@ const struct stmmac_ops dwmac410_ops = {
 	.pcs_get_adv_lp = dwmac4_get_adv_lp,
 	.debug = dwmac4_debug,
 	.set_filter = dwmac4_set_filter,
+	.flex_pps_config = dwmac5_flex_pps_config,
 	.set_mac_loopback = dwmac4_set_mac_loopback,
 	.update_vlan_hash = dwmac4_update_vlan_hash,
 	.sarc_configure = dwmac4_sarc_configure,
commit e255e11e66da8281e337e4e352956e8a4999fca4
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Tue Nov 24 15:17:28 2020 +0800

    ipv6: addrlabel: fix possible memory leak in ip6addrlbl_net_init
    
    kmemleak report a memory leak as follows:
    
    unreferenced object 0xffff8880059c6a00 (size 64):
      comm "ip", pid 23696, jiffies 4296590183 (age 1755.384s)
      hex dump (first 32 bytes):
        20 01 00 10 00 00 00 00 00 00 00 00 00 00 00 00   ...............
        1c 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00  ................
      backtrace:
        [<00000000aa4e7a87>] ip6addrlbl_add+0x90/0xbb0
        [<0000000070b8d7f1>] ip6addrlbl_net_init+0x109/0x170
        [<000000006a9ca9d4>] ops_init+0xa8/0x3c0
        [<000000002da57bf2>] setup_net+0x2de/0x7e0
        [<000000004e52d573>] copy_net_ns+0x27d/0x530
        [<00000000b07ae2b4>] create_new_namespaces+0x382/0xa30
        [<000000003b76d36f>] unshare_nsproxy_namespaces+0xa1/0x1d0
        [<0000000030653721>] ksys_unshare+0x3a4/0x780
        [<0000000007e82e40>] __x64_sys_unshare+0x2d/0x40
        [<0000000031a10c08>] do_syscall_64+0x33/0x40
        [<0000000099df30e7>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    We should free all rules when we catch an error in ip6addrlbl_net_init().
    otherwise a memory leak will occur.
    
    Fixes: 2a8cc6c89039 ("[IPV6] ADDRCONF: Support RFC3484 configurable address selection policy table.")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Link: https://lore.kernel.org/r/20201124071728.8385-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c
index 642fc6ac13d2..8a22486cf270 100644
--- a/net/ipv6/addrlabel.c
+++ b/net/ipv6/addrlabel.c
@@ -306,7 +306,9 @@ static int ip6addrlbl_del(struct net *net,
 /* add default label */
 static int __net_init ip6addrlbl_net_init(struct net *net)
 {
-	int err = 0;
+	struct ip6addrlbl_entry *p = NULL;
+	struct hlist_node *n;
+	int err;
 	int i;
 
 	ADDRLABEL(KERN_DEBUG "%s\n", __func__);
@@ -315,14 +317,20 @@ static int __net_init ip6addrlbl_net_init(struct net *net)
 	INIT_HLIST_HEAD(&net->ipv6.ip6addrlbl_table.head);
 
 	for (i = 0; i < ARRAY_SIZE(ip6addrlbl_init_table); i++) {
-		int ret = ip6addrlbl_add(net,
-					 ip6addrlbl_init_table[i].prefix,
-					 ip6addrlbl_init_table[i].prefixlen,
-					 0,
-					 ip6addrlbl_init_table[i].label, 0);
-		/* XXX: should we free all rules when we catch an error? */
-		if (ret && (!err || err != -ENOMEM))
-			err = ret;
+		err = ip6addrlbl_add(net,
+				     ip6addrlbl_init_table[i].prefix,
+				     ip6addrlbl_init_table[i].prefixlen,
+				     0,
+				     ip6addrlbl_init_table[i].label, 0);
+		if (err)
+			goto err_ip6addrlbl_add;
+	}
+	return 0;
+
+err_ip6addrlbl_add:
+	hlist_for_each_entry_safe(p, n, &net->ipv6.ip6addrlbl_table.head, list) {
+		hlist_del_rcu(&p->list);
+		kfree_rcu(p, rcu);
 	}
 	return err;
 }
commit 33fc379df76b4991e5ae312f07bcd6820811971e
Author: Anand K Mistry <amistry at google.com>
Date:   Tue Nov 10 12:33:53 2020 +1100

    x86/speculation: Fix prctl() when spectre_v2_user={seccomp,prctl},ibpb
    
    When spectre_v2_user={seccomp,prctl},ibpb is specified on the command
    line, IBPB is force-enabled and STIPB is conditionally-enabled (or not
    available).
    
    However, since
    
      21998a351512 ("x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS.")
    
    the spectre_v2_user_ibpb variable is set to SPECTRE_V2_USER_{PRCTL,SECCOMP}
    instead of SPECTRE_V2_USER_STRICT, which is the actual behaviour.
    Because the issuing of IBPB relies on the switch_mm_*_ibpb static
    branches, the mitigations behave as expected.
    
    Since
    
      1978b3a53a74 ("x86/speculation: Allow IBPB to be conditionally enabled on CPUs with always-on STIBP")
    
    this discrepency caused the misreporting of IB speculation via prctl().
    
    On CPUs with STIBP always-on and spectre_v2_user=seccomp,ibpb,
    prctl(PR_GET_SPECULATION_CTRL) would return PR_SPEC_PRCTL |
    PR_SPEC_ENABLE instead of PR_SPEC_DISABLE since both IBPB and STIPB are
    always on. It also allowed prctl(PR_SET_SPECULATION_CTRL) to set the IB
    speculation mode, even though the flag is ignored.
    
    Similarly, for CPUs without SMT, prctl(PR_GET_SPECULATION_CTRL) should
    also return PR_SPEC_DISABLE since IBPB is always on and STIBP is not
    available.
    
     [ bp: Massage commit message. ]
    
    Fixes: 21998a351512 ("x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS.")
    Fixes: 1978b3a53a74 ("x86/speculation: Allow IBPB to be conditionally enabled on CPUs with always-on STIBP")
    Signed-off-by: Anand K Mistry <amistry at google.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201110123349.1.Id0cbf996d2151f4c143c90f9028651a5b49a5908@changeid

diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index 581fb7223ad0..d41b70fe4918 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -739,11 +739,13 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
 	if (boot_cpu_has(X86_FEATURE_IBPB)) {
 		setup_force_cpu_cap(X86_FEATURE_USE_IBPB);
 
+		spectre_v2_user_ibpb = mode;
 		switch (cmd) {
 		case SPECTRE_V2_USER_CMD_FORCE:
 		case SPECTRE_V2_USER_CMD_PRCTL_IBPB:
 		case SPECTRE_V2_USER_CMD_SECCOMP_IBPB:
 			static_branch_enable(&switch_mm_always_ibpb);
+			spectre_v2_user_ibpb = SPECTRE_V2_USER_STRICT;
 			break;
 		case SPECTRE_V2_USER_CMD_PRCTL:
 		case SPECTRE_V2_USER_CMD_AUTO:
@@ -757,8 +759,6 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
 		pr_info("mitigation: Enabling %s Indirect Branch Prediction Barrier\n",
 			static_key_enabled(&switch_mm_always_ibpb) ?
 			"always-on" : "conditional");
-
-		spectre_v2_user_ibpb = mode;
 	}
 
 	/*
commit fa02fcd94b0c8dff6cc65714510cf25ad194b90d
Merge: 127c501a03d5 9215f6bb4705
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Nov 25 10:35:44 2020 -0800

    Merge tag 'media/v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
    
    Pull media fixes from Mauro Carvalho Chehab:
    
     - a rand Kconfig fixup for mtk-vcodec
    
     - a fix at h264 handling at cedrus codec driver
    
     - some warning fixes when config PM is not enabled at marvell-ccic
    
     - two fixes at venus codec driver: one related to codec profile and the
       other one related to a bad error path which causes an OOPS on module
       re-bind
    
    * tag 'media/v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
      media: venus: pm_helpers: Fix kernel module reload
      media: venus: venc: Fix setting of profile and level
      media: cedrus: h264: Fix check for presence of scaling matrix
      media: media/platform/marvell-ccic: fix warnings when CONFIG_PM is not enabled
      media: mtk-vcodec: fix build breakage when one of VPU or SCP is enabled
      media: mtk-vcodec: move firmware implementations into their own files

commit 30aca1bacb398dec6c1ed5eeca33f355bd7b6203
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Mon Nov 16 17:39:51 2020 -0800

    RISC-V: fix barrier() use in <vdso/processor.h>
    
    riscv's <vdso/processor.h> uses barrier() so it should include
    <asm/barrier.h>
    
    Fixes this build error:
      CC [M]  drivers/net/ethernet/emulex/benet/be_main.o
    In file included from ./include/vdso/processor.h:10,
                     from ./arch/riscv/include/asm/processor.h:11,
                     from ./include/linux/prefetch.h:15,
                     from drivers/net/ethernet/emulex/benet/be_main.c:14:
    ./arch/riscv/include/asm/vdso/processor.h: In function 'cpu_relax':
    ./arch/riscv/include/asm/vdso/processor.h:14:2: error: implicit declaration of function 'barrier' [-Werror=implicit-function-declaration]
       14 |  barrier();
    
    This happens with a total of 5 networking drivers -- they all use
    <linux/prefetch.h>.
    
    rv64 allmodconfig now builds cleanly after this patch.
    
    Fixes fallout from:
    815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h mutually exclusive")
    
    Fixes: ad5d1122b82f ("riscv: use vDSO common flow to reduce the latency of the time-related functions")
    Reported-by: Andreas Schwab <schwab at linux-m68k.org>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Acked-by: Arvind Sankar <nivedita at alum.mit.edu>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt at google.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt at google.com>

diff --git a/arch/riscv/include/asm/vdso/processor.h b/arch/riscv/include/asm/vdso/processor.h
index 82a5693b1861..134388cbaaa1 100644
--- a/arch/riscv/include/asm/vdso/processor.h
+++ b/arch/riscv/include/asm/vdso/processor.h
@@ -4,6 +4,8 @@
 
 #ifndef __ASSEMBLY__
 
+#include <asm/barrier.h>
+
 static inline void cpu_relax(void)
 {
 #ifdef __riscv_muldiv
commit 6134b110f97178d6919441a82dc91a7f3664b4e0
Author: Anup Patel <anup.patel at wdc.com>
Date:   Fri Nov 6 13:23:59 2020 +0530

    RISC-V: Add missing jump label initialization
    
    The jump_label_init() should be called from setup_arch() very
    early for proper functioning of jump label support.
    
    Fixes: ebc00dde8a97 ("riscv: Add jump-label implementation")
    Signed-off-by: Anup Patel <anup.patel at wdc.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt at google.com>

diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index c424cc6dd833..117f3212a8e4 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -75,6 +75,7 @@ void __init setup_arch(char **cmdline_p)
 	*cmdline_p = boot_command_line;
 
 	early_ioremap_setup();
+	jump_label_init();
 	parse_early_param();
 
 	efi_init();
commit e553fdc8105ac2ef3f321739da3908bb6673f7de
Author: Nathan Chancellor <natechancellor at gmail.com>
Date:   Sun Nov 8 13:37:37 2020 -0700

    riscv: Explicitly specify the build id style in vDSO Makefile again
    
    Commit a96843372331 ("kbuild: explicitly specify the build id style")
    explicitly set the build ID style to SHA1. Commit c2c81bb2f691 ("RISC-V:
    Fix the VDSO symbol generaton for binutils-2.35+") undid this change,
    likely unintentionally.
    
    Restore it so that the build ID style stays consistent across the tree
    regardless of linker.
    
    Fixes: c2c81bb2f691 ("RISC-V: Fix the VDSO symbol generaton for binutils-2.35+")
    Signed-off-by: Nathan Chancellor <natechancellor at gmail.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Reviewed-by: Bill Wendling <morbo at google.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt at google.com>

diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile
index cb8f9e4cfcbf..0cfd6da784f8 100644
--- a/arch/riscv/kernel/vdso/Makefile
+++ b/arch/riscv/kernel/vdso/Makefile
@@ -44,7 +44,7 @@ SYSCFLAGS_vdso.so.dbg = $(c_flags)
 $(obj)/vdso.so.dbg: $(src)/vdso.lds $(obj-vdso) FORCE
 	$(call if_changed,vdsold)
 SYSCFLAGS_vdso.so.dbg = -shared -s -Wl,-soname=linux-vdso.so.1 \
-	-Wl,--build-id -Wl,--hash-style=both
+	-Wl,--build-id=sha1 -Wl,--hash-style=both
 
 # We also create a special relocatable object that should mirror the symbol
 # table and layout of the linked DSO. With ld --just-symbols we can then
commit f39e7d3aae2934b1cfdd209b54c508e2552e9531
Author: Bob Peterson <rpeterso at redhat.com>
Date:   Tue Nov 24 10:41:40 2020 -0600

    gfs2: Don't freeze the file system during unmount
    
    GFS2's freeze/thaw mechanism uses a special freeze glock to control its
    operation. It does this with a sync glock operation (glops.c) called
    freeze_go_sync. When the freeze glock is demoted (glock's do_xmote) the
    glops function causes the file system to be frozen. This is intended. However,
    GFS2's mount and unmount processes also hold the freeze glock to prevent other
    processes, perhaps on different cluster nodes, from mounting the frozen file
    system in read-write mode.
    
    Before this patch, there was no check in freeze_go_sync for whether a freeze
    in intended or whether the glock demote was caused by a normal unmount.
    So it was trying to freeze the file system it's trying to unmount, which
    ends up in a deadlock.
    
    This patch adds an additional check to freeze_go_sync so that demotes of the
    freeze glock are ignored if they come from the unmount process.
    
    Fixes: 20b329129009 ("gfs2: Fix regression in freeze_go_sync")
    Signed-off-by: Bob Peterson <rpeterso at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index e2cfc00ab936..3faa421568b0 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -582,7 +582,8 @@ static int freeze_go_sync(struct gfs2_glock *gl)
 	 * Once thawed, the work func acquires the freeze glock in
 	 * SH and everybody goes back to thawed.
 	 */
-	if (gl->gl_state == LM_ST_SHARED && !gfs2_withdrawn(sdp)) {
+	if (gl->gl_state == LM_ST_SHARED && !gfs2_withdrawn(sdp) &&
+	    !test_bit(SDF_NORECOVERY, &sdp->sd_flags)) {
 		atomic_set(&sdp->sd_freeze_state, SFS_STARTING_FREEZE);
 		error = freeze_super(sdp->sd_vfs);
 		if (error) {
commit 778721510e84209f78e31e2ccb296ae36d623f5e
Author: Bob Peterson <rpeterso at redhat.com>
Date:   Tue Nov 24 10:44:36 2020 -0500

    gfs2: check for empty rgrp tree in gfs2_ri_update
    
    If gfs2 tries to mount a (corrupt) file system that has no resource
    groups it still tries to set preferences on the first one, which causes
    a kernel null pointer dereference. This patch adds a check to function
    gfs2_ri_update so this condition is detected and reported back as an
    error.
    
    Reported-by: syzbot+e3f23ce40269a4c9053a at syzkaller.appspotmail.com
    Signed-off-by: Bob Peterson <rpeterso at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index f7addc6197ed..5e8eef9990e3 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -985,6 +985,10 @@ static int gfs2_ri_update(struct gfs2_inode *ip)
 	if (error < 0)
 		return error;
 
+	if (RB_EMPTY_ROOT(&sdp->sd_rindex_tree)) {
+		fs_err(sdp, "no resource groups found in the file system.\n");
+		return -ENOENT;
+	}
 	set_rgrp_preferences(sdp);
 
 	sdp->sd_rindex_uptodate = 1;
commit 36a237526cd81ff4b6829e6ebd60921c6f976e3b
Author: Geert Uytterhoeven <geert at linux-m68k.org>
Date:   Tue Nov 24 20:16:46 2020 +0100

    efi: EFI_EARLYCON should depend on EFI
    
    CONFIG_EFI_EARLYCON defaults to yes, and thus is enabled on systems that
    do not support EFI, or do not have EFI support enabled, but do satisfy
    the symbol's other dependencies.
    
    While drivers/firmware/efi/ won't be entered during the build phase if
    CONFIG_EFI=n, and drivers/firmware/efi/earlycon.c itself thus won't be
    built, enabling EFI_EARLYCON does force-enable CONFIG_FONT_SUPPORT and
    CONFIG_ARCH_USE_MEMREMAP_PROT, and CONFIG_FONT_8x16, which is
    undesirable.
    
    Fix this by making CONFIG_EFI_EARLYCON depend on CONFIG_EFI.
    
    This reduces kernel size on headless systems by more than 4 KiB.
    
    Fixes: 69c1f396f25b805a ("efi/x86: Convert x86 EFI earlyprintk into generic earlycon implementation")
    Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
    Link: https://lore.kernel.org/r/20201124191646.3559757-1-geert@linux-m68k.org
    Reviewed-by: Damien Le Moal <damien.lemoal at wdc.com>
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>

diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
index 36ec1f718893..d9895491ff34 100644
--- a/drivers/firmware/efi/Kconfig
+++ b/drivers/firmware/efi/Kconfig
@@ -270,7 +270,7 @@ config EFI_DEV_PATH_PARSER
 
 config EFI_EARLYCON
 	def_bool y
-	depends on SERIAL_EARLYCON && !ARM && !IA64
+	depends on EFI && SERIAL_EARLYCON && !ARM && !IA64
 	select FONT_SUPPORT
 	select ARCH_USE_MEMREMAP_PROT
 
commit ff04f3b6f2e27f8ae28a498416af2a8dd5072b43
Author: Ard Biesheuvel <ardb at kernel.org>
Date:   Wed Nov 25 08:45:55 2020 +0100

    efivarfs: revert "fix memory leak in efivarfs_create()"
    
    The memory leak addressed by commit fe5186cf12e3 is a false positive:
    all allocations are recorded in a linked list, and freed when the
    filesystem is unmounted. This leads to double frees, and as reported
    by David, leads to crashes if SLUB is configured to self destruct when
    double frees occur.
    
    So drop the redundant kfree() again, and instead, mark the offending
    pointer variable so the allocation is ignored by kmemleak.
    
    Cc: Vamshi K Sthambamkadi <vamshi.k.sthambamkadi at gmail.com>
    Fixes: fe5186cf12e3 ("efivarfs: fix memory leak in efivarfs_create()")
    Reported-by: David Laight <David.Laight at aculab.com>
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>

diff --git a/fs/efivarfs/inode.c b/fs/efivarfs/inode.c
index 96c0c86f3fff..0297ad95eb5c 100644
--- a/fs/efivarfs/inode.c
+++ b/fs/efivarfs/inode.c
@@ -7,6 +7,7 @@
 #include <linux/efi.h>
 #include <linux/fs.h>
 #include <linux/ctype.h>
+#include <linux/kmemleak.h>
 #include <linux/slab.h>
 #include <linux/uuid.h>
 
@@ -103,6 +104,7 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
 	var->var.VariableName[i] = '\0';
 
 	inode->i_private = var;
+	kmemleak_ignore(var);
 
 	err = efivar_entry_add(var, &efivarfs_list);
 	if (err)
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index f943fd0b0699..15880a68faad 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -21,7 +21,6 @@ LIST_HEAD(efivarfs_list);
 static void efivarfs_evict_inode(struct inode *inode)
 {
 	clear_inode(inode);
-	kfree(inode->i_private);
 }
 
 static const struct super_operations efivarfs_ops = {
commit 50bdcf047503e30126327d0be4f0ad7337106d68
Author: Amadeusz Sławiński <amadeuszx.slawinski at linux.intel.com>
Date:   Mon Nov 23 12:28:17 2020 -0500

    efi/efivars: Set generic ops before loading SSDT
    
    Efivars allows for overriding of SSDT tables, however starting with
    commit
    
      bf67fad19e493b ("efi: Use more granular check for availability for variable services")
    
    this use case is broken. When loading SSDT generic ops should be set
    first, however mentioned commit reversed order of operations. Fix this
    by restoring original order of operations.
    
    Fixes: bf67fad19e493b ("efi: Use more granular check for availability for variable services")
    Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski at linux.intel.com>
    Link: https://lore.kernel.org/r/20201123172817.124146-1-amadeuszx.slawinski@linux.intel.com
    Tested-by: Cezary Rojewski <cezary.rojewski at intel.com>
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>

diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 5e5480a0a32d..6c6eec044a97 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -390,10 +390,10 @@ static int __init efisubsys_init(void)
 
 	if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
 				      EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME)) {
-		efivar_ssdt_load();
 		error = generic_ops_register();
 		if (error)
 			goto err_put;
+		efivar_ssdt_load();
 		platform_device_register_simple("efivars", 0, NULL, 0);
 	}
 
commit 2ed381439e89fa6d1a0839ef45ccd45d99d8e915
Author: Shiraz Saleem <shiraz.saleem at intel.com>
Date:   Tue Nov 24 18:56:16 2020 -0600

    RDMA/i40iw: Address an mmap handler exploit in i40iw
    
    i40iw_mmap manipulates the vma->vm_pgoff to differentiate a push page mmap
    vs a doorbell mmap, and uses it to compute the pfn in remap_pfn_range
    without any validation. This is vulnerable to an mmap exploit as described
    in: https://lore.kernel.org/r/20201119093523.7588-1-zhudi21@huawei.com
    
    The push feature is disabled in the driver currently and therefore no push
    mmaps are issued from user-space. The feature does not work as expected in
    the x722 product.
    
    Remove the push module parameter and all VMA attribute manipulations for
    this feature in i40iw_mmap. Update i40iw_mmap to only allow DB user
    mmapings at offset = 0. Check vm_pgoff for zero and if the mmaps are bound
    to a single page.
    
    Cc: <stable at kernel.org>
    Fixes: d37498417947 ("i40iw: add files for iwarp interface")
    Link: https://lore.kernel.org/r/20201125005616.1800-2-shiraz.saleem@intel.com
    Reported-by: Di Zhu <zhudi21 at huawei.com>
    Signed-off-by: Shiraz Saleem <shiraz.saleem at intel.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
index 2408b279e4c2..584932d3cc44 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_main.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
@@ -54,10 +54,6 @@
 #define DRV_VERSION	__stringify(DRV_VERSION_MAJOR) "."		\
 	__stringify(DRV_VERSION_MINOR) "." __stringify(DRV_VERSION_BUILD)
 
-static int push_mode;
-module_param(push_mode, int, 0644);
-MODULE_PARM_DESC(push_mode, "Low latency mode: 0=disabled (default), 1=enabled)");
-
 static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug flags: 0=disabled (default), 0x7fffffff=all");
@@ -1580,7 +1576,6 @@ static enum i40iw_status_code i40iw_setup_init_state(struct i40iw_handler *hdl,
 	if (status)
 		goto exit;
 	iwdev->obj_next = iwdev->obj_mem;
-	iwdev->push_mode = push_mode;
 
 	init_waitqueue_head(&iwdev->vchnl_waitq);
 	init_waitqueue_head(&dev->vf_reqs);
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index 581ecbadf586..533f3caecb7a 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -167,39 +167,16 @@ static void i40iw_dealloc_ucontext(struct ib_ucontext *context)
  */
 static int i40iw_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 {
-	struct i40iw_ucontext *ucontext;
-	u64 db_addr_offset, push_offset, pfn;
-
-	ucontext = to_ucontext(context);
-	if (ucontext->iwdev->sc_dev.is_pf) {
-		db_addr_offset = I40IW_DB_ADDR_OFFSET;
-		push_offset = I40IW_PUSH_OFFSET;
-		if (vma->vm_pgoff)
-			vma->vm_pgoff += I40IW_PF_FIRST_PUSH_PAGE_INDEX - 1;
-	} else {
-		db_addr_offset = I40IW_VF_DB_ADDR_OFFSET;
-		push_offset = I40IW_VF_PUSH_OFFSET;
-		if (vma->vm_pgoff)
-			vma->vm_pgoff += I40IW_VF_FIRST_PUSH_PAGE_INDEX - 1;
-	}
+	struct i40iw_ucontext *ucontext = to_ucontext(context);
+	u64 dbaddr;
 
-	vma->vm_pgoff += db_addr_offset >> PAGE_SHIFT;
-
-	if (vma->vm_pgoff == (db_addr_offset >> PAGE_SHIFT)) {
-		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-	} else {
-		if ((vma->vm_pgoff - (push_offset >> PAGE_SHIFT)) % 2)
-			vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-		else
-			vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-	}
+	if (vma->vm_pgoff || vma->vm_end - vma->vm_start != PAGE_SIZE)
+		return -EINVAL;
 
-	pfn = vma->vm_pgoff +
-	      (pci_resource_start(ucontext->iwdev->ldev->pcidev, 0) >>
-	       PAGE_SHIFT);
+	dbaddr = I40IW_DB_ADDR_OFFSET + pci_resource_start(ucontext->iwdev->ldev->pcidev, 0);
 
-	return rdma_user_mmap_io(context, vma, pfn, PAGE_SIZE,
-				 vma->vm_page_prot, NULL);
+	return rdma_user_mmap_io(context, vma, dbaddr >> PAGE_SHIFT, PAGE_SIZE,
+				 pgprot_noncached(vma->vm_page_prot), NULL);
 }
 
 /**
commit d98bccf10dd0f36cabee71a425381fce0908de3b
Author: Jon Hunter <jonathanh at nvidia.com>
Date:   Wed Nov 18 16:04:58 2020 +0000

    arm64: tegra: Fix Tegra234 VDK node names
    
    When the device-tree board file was added for the Tegra234 VDK simulator
    it incorrectly used the names 'cbb' and 'sdhci' instead of 'bus' and
    'mmc', respectively. The names 'bus' and 'mmc' are required by the
    device-tree json-schema validation tools. Therefore, fix this by
    renaming these nodes accordingly.
    
    Fixes: 639448912ba1 ("arm64: tegra: Initial Tegra234 VDK support")
    Reported-by: Ashish Singhal <ashishsingha at nvidia.com>
    Signed-off-by: Jon Hunter <jonathanh at nvidia.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/arch/arm64/boot/dts/nvidia/tegra234-sim-vdk.dts b/arch/arm64/boot/dts/nvidia/tegra234-sim-vdk.dts
index f6e6a24829af..b5d9a5526272 100644
--- a/arch/arm64/boot/dts/nvidia/tegra234-sim-vdk.dts
+++ b/arch/arm64/boot/dts/nvidia/tegra234-sim-vdk.dts
@@ -8,7 +8,7 @@
 	compatible = "nvidia,tegra234-vdk", "nvidia,tegra234";
 
 	aliases {
-		sdhci3 = "/cbb at 0/sdhci at 3460000";
+		mmc3 = "/bus at 0/mmc at 3460000";
 		serial0 = &uarta;
 	};
 
@@ -17,12 +17,12 @@
 		stdout-path = "serial0:115200n8";
 	};
 
-	cbb at 0 {
+	bus at 0 {
 		serial at 3100000 {
 			status = "okay";
 		};
 
-		sdhci at 3460000 {
+		mmc at 3460000 {
 			status = "okay";
 			bus-width = <8>;
 			non-removable;
commit 1741e18737948c140ccc4cc643e8126d95ee6e79
Author: Dipen Patel <dipenp at nvidia.com>
Date:   Fri Sep 11 19:26:45 2020 -0700

    arm64: tegra: Wrong AON HSP reg property size
    
    The AON HSP node's "reg" property size 0xa0000 will overlap with other
    resources. This patch fixes that wrong value with correct size 0x90000.
    
    Reviewed-by: Mikko Perttunen <mperttunen at nvidia.com>
    Signed-off-by: Dipen Patel <dipenp at nvidia.com>
    Fixes: a38570c22e9d ("arm64: tegra: Add nodes for TCU on Tegra194")
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi
index e9c90f0f44ff..93438d2b9469 100644
--- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi
@@ -1161,7 +1161,7 @@
 
 		hsp_aon: hsp at c150000 {
 			compatible = "nvidia,tegra194-hsp", "nvidia,tegra186-hsp";
-			reg = <0x0c150000 0xa0000>;
+			reg = <0x0c150000 0x90000>;
 			interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>,
 			             <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
 			             <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
commit f24a2acc15bcc7bbd295f9759efc873b88fbe429
Author: JC Kuo <jckuo at nvidia.com>
Date:   Thu Nov 19 15:23:45 2020 +0800

    arm64: tegra: Fix USB_VBUS_EN0 regulator on Jetson TX1
    
    USB host mode is broken on the OTG port of Jetson TX1 platform because
    the USB_VBUS_EN0 regulator (regulator at 11) is being overwritten by the
    vdd-cam-1v2 regulator. This commit rearranges USB_VBUS_EN0 to be
    regulator at 14.
    
    Fixes: 257c8047be44 ("arm64: tegra: jetson-tx1: Add camera supplies")
    Cc: stable at vger.kernel.org
    Signed-off-by: JC Kuo <jckuo at nvidia.com>
    Reviewed-by: Jon Hunter <jonathanh at nvidia.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi
index e18e1a9a3011..a9caaf7c0d67 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi
@@ -1663,16 +1663,6 @@
 		vin-supply = <&vdd_5v0_sys>;
 	};
 
-	vdd_usb_vbus_otg: regulator at 11 {
-		compatible = "regulator-fixed";
-		regulator-name = "USB_VBUS_EN0";
-		regulator-min-microvolt = <5000000>;
-		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;
-		enable-active-high;
-		vin-supply = <&vdd_5v0_sys>;
-	};
-
 	vdd_hdmi: regulator at 10 {
 		compatible = "regulator-fixed";
 		regulator-name = "VDD_HDMI_5V0";
@@ -1712,4 +1702,14 @@
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
+
+	vdd_usb_vbus_otg: regulator at 14 {
+		compatible = "regulator-fixed";
+		regulator-name = "USB_VBUS_EN0";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		vin-supply = <&vdd_5v0_sys>;
+	};
 };
commit 476e23f4c540949ac5ea4fad4f6f6fa0e2d41f42
Author: Jon Hunter <jonathanh at nvidia.com>
Date:   Wed Nov 11 10:41:17 2020 +0000

    arm64: tegra: Correct the UART for Jetson Xavier NX
    
    The Jetson Xavier NX board routes UARTA to the 40-pin header and UARTC
    to a 12-pin debug header. The UARTs can be used by either the Tegra
    Combined UART (TCU) driver or the Tegra 8250 driver. By default, the
    TCU will use UARTC on Jetson Xavier NX. Currently, device-tree for
    Xavier NX enables the TCU and the Tegra 8250 node for UARTC. Fix this
    by disabling the Tegra 8250 node for UARTC and enabling the Tegra 8250
    node for UARTA.
    
    Fixes: 3f9efbbe57bc ("arm64: tegra: Add support for Jetson Xavier NX")
    Cc: stable at vger.kernel.org
    Signed-off-by: Jon Hunter <jonathanh at nvidia.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/arch/arm64/boot/dts/nvidia/tegra194-p3668-0000.dtsi b/arch/arm64/boot/dts/nvidia/tegra194-p3668-0000.dtsi
index a2893be80507..0dc8304a2edd 100644
--- a/arch/arm64/boot/dts/nvidia/tegra194-p3668-0000.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra194-p3668-0000.dtsi
@@ -54,7 +54,7 @@
 			status = "okay";
 		};
 
-		serial at c280000 {
+		serial at 3100000 {
 			status = "okay";
 		};
 
commit fb319496935b7475a863a00c76895e8bb3216704
Author: Jon Hunter <jonathanh at nvidia.com>
Date:   Mon Nov 16 16:20:26 2020 +0000

    arm64: tegra: Disable the ACONNECT for Jetson TX2
    
    Commit ff4c371d2bc0 ("arm64: defconfig: Build ADMA and ACONNECT driver")
    enable the Tegra ADMA and ACONNECT drivers and this is causing resume
    from system suspend to fail on Jetson TX2. Resume is failing because the
    ACONNECT driver is being resumed before the BPMP driver, and the ACONNECT
    driver is attempting to power on a power-domain that is provided by the
    BPMP. While a proper fix for the resume sequencing problem is identified,
    disable the ACONNECT for Jetson TX2 temporarily to avoid breaking system
    suspend.
    
    Please note that ACONNECT driver is used by the Audio Processing Engine
    (APE) on Tegra, but because there is no mainline support for APE on
    Jetson TX2 currently, disabling the ACONNECT does not disable any useful
    feature at the moment.
    
    Signed-off-by: Jon Hunter <jonathanh at nvidia.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts b/arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts
index 381a84912ba8..c28d51cc5797 100644
--- a/arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts
+++ b/arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts
@@ -10,18 +10,6 @@
 	model = "NVIDIA Jetson TX2 Developer Kit";
 	compatible = "nvidia,p2771-0000", "nvidia,tegra186";
 
-	aconnect {
-		status = "okay";
-
-		dma-controller at 2930000 {
-			status = "okay";
-		};
-
-		interrupt-controller at 2a40000 {
-			status = "okay";
-		};
-	};
-
 	i2c at 3160000 {
 		power-monitor at 42 {
 			compatible = "ti,ina3221";
commit 0abdb0fba07322ce960d32a92a64847b3009b2e2
Author: Lars Povlsen <lars.povlsen at microchip.com>
Date:   Fri Nov 20 22:34:14 2020 +0100

    spi: dw: Fix spi registration for controllers overriding CS
    
    When SPI DW memory ops support was introduced, there was a check for
    excluding controllers which supplied their own CS function. Even so,
    the mem_ops pointer is *always* presented to the SPI core.
    
    This causes the SPI core sanity check in spi_controller_check_ops() to
    refuse registration, since a mem_ops pointer is being supplied without
    an exec_op member function.
    
    The end result is failure of the SPI DW driver on sparx5 and similar
    platforms.
    
    The fix in the core SPI DW driver is to avoid presenting the mem_ops
    pointer if the exec_op function is not set.
    
    Fixes: 6423207e57ea (spi: dw: Add memory operations support)
    Signed-off-by: Lars Povlsen <lars.povlsen at microchip.com>
    Acked-by: Serge Semin <fancer.lancer at gmail.com>
    Link: https://lore.kernel.org/r/20201120213414.339701-1-lars.povlsen@microchip.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
index 0b2236ade412..c33866f747db 100644
--- a/drivers/spi/spi-dw-core.c
+++ b/drivers/spi/spi-dw-core.c
@@ -875,7 +875,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
 		master->set_cs = dw_spi_set_cs;
 	master->transfer_one = dw_spi_transfer_one;
 	master->handle_err = dw_spi_handle_err;
-	master->mem_ops = &dws->mem_ops;
+	if (dws->mem_ops.exec_op)
+		master->mem_ops = &dws->mem_ops;
 	master->max_speed_hz = dws->max_freq;
 	master->dev.of_node = dev->of_node;
 	master->dev.fwnode = dev->fwnode;
commit 3fba05a2832f93b4d0cd4204f771fdae0d823114
Author: Luo Meng <luomeng12 at huawei.com>
Date:   Mon Nov 23 21:38:39 2020 +0800

    ASoC: wm_adsp: fix error return code in wm_adsp_load()
    
    Fix to return a negative error code from the error handling case
    instead of 0 in function wm_adsp_load(), as done elsewhere in this
    function.
    
    Fixes: 170b1e123f38 ("ASoC: wm_adsp: Add support for new Halo core DSPs")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Luo Meng <luomeng12 at huawei.com>
    Acked-by: Richard Fitzgerald <rf at opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20201123133839.4073787-1-luomeng12@huawei.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index bcf18bf15a02..e61d00486c65 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1937,6 +1937,7 @@ static int wm_adsp_load(struct wm_adsp *dsp)
 			mem = wm_adsp_find_region(dsp, type);
 			if (!mem) {
 				adsp_err(dsp, "No region of type: %x\n", type);
+				ret = -EINVAL;
 				goto out_fw;
 			}
 
commit e2be2a833ab5338fa5b8b99ba622b911d96f1795
Author: Lu Baolu <baolu.lu at linux.intel.com>
Date:   Wed Nov 25 09:41:24 2020 +0800

    x86/tboot: Don't disable swiotlb when iommu is forced on
    
    After commit 327d5b2fee91c ("iommu/vt-d: Allow 32bit devices to uses DMA
    domain"), swiotlb could also be used for direct memory access if IOMMU
    is enabled but a device is configured to pass through the DMA translation.
    Keep swiotlb when IOMMU is forced on, otherwise, some devices won't work
    if "iommu=pt" kernel parameter is used.
    
    Fixes: 327d5b2fee91 ("iommu/vt-d: Allow 32bit devices to uses DMA domain")
    Reported-and-tested-by: Adrian Huang <ahuang12 at lenovo.com>
    Signed-off-by: Lu Baolu <baolu.lu at linux.intel.com>
    Link: https://lore.kernel.org/r/20201125014124.4070776-1-baolu.lu@linux.intel.com
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=210237
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
index 420be871d9d4..ae64f98ec2ab 100644
--- a/arch/x86/kernel/tboot.c
+++ b/arch/x86/kernel/tboot.c
@@ -514,13 +514,10 @@ int tboot_force_iommu(void)
 	if (!tboot_enabled())
 		return 0;
 
-	if (no_iommu || swiotlb || dmar_disabled)
+	if (no_iommu || dmar_disabled)
 		pr_warn("Forcing Intel-IOMMU to enabled\n");
 
 	dmar_disabled = 0;
-#ifdef CONFIG_SWIOTLB
-	swiotlb = 0;
-#endif
 	no_iommu = 0;
 
 	return 1;
commit fdeb17c70c9ecae655378761accf5a26a55a33cf
Author: Hui Su <sh_def at 163.com>
Date:   Wed Nov 25 00:52:05 2020 +0800

    trace: fix potenial dangerous pointer
    
    The bdi_dev_name() returns a char [64], and
    the __entry->name is a char [32].
    
    It maybe dangerous to TP_printk("%s", __entry->name)
    after the strncpy().
    
    CC: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201124165205.GA23937@rlk
    Acked-by: Steven Rostedt (VMware) <rostedt at goodmis.org>
    Acked-by: Tejun Heo <tj at kernel.org>
    Signed-off-by: Hui Su <sh_def at 163.com>
    Signed-off-by: Jan Kara <jack at suse.cz>

diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h
index e7cbccc7c14c..57d795365987 100644
--- a/include/trace/events/writeback.h
+++ b/include/trace/events/writeback.h
@@ -190,7 +190,7 @@ TRACE_EVENT(inode_foreign_history,
 	),
 
 	TP_fast_assign(
-		strncpy(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32);
+		strscpy_pad(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32);
 		__entry->ino		= inode->i_ino;
 		__entry->cgroup_ino	= __trace_wbc_assign_cgroup(wbc);
 		__entry->history	= history;
@@ -219,7 +219,7 @@ TRACE_EVENT(inode_switch_wbs,
 	),
 
 	TP_fast_assign(
-		strncpy(__entry->name,	bdi_dev_name(old_wb->bdi), 32);
+		strscpy_pad(__entry->name, bdi_dev_name(old_wb->bdi), 32);
 		__entry->ino		= inode->i_ino;
 		__entry->old_cgroup_ino	= __trace_wb_assign_cgroup(old_wb);
 		__entry->new_cgroup_ino	= __trace_wb_assign_cgroup(new_wb);
@@ -252,7 +252,7 @@ TRACE_EVENT(track_foreign_dirty,
 		struct address_space *mapping = page_mapping(page);
 		struct inode *inode = mapping ? mapping->host : NULL;
 
-		strncpy(__entry->name,	bdi_dev_name(wb->bdi), 32);
+		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
 		__entry->bdi_id		= wb->bdi->id;
 		__entry->ino		= inode ? inode->i_ino : 0;
 		__entry->memcg_id	= wb->memcg_css->id;
@@ -285,7 +285,7 @@ TRACE_EVENT(flush_foreign,
 	),
 
 	TP_fast_assign(
-		strncpy(__entry->name,	bdi_dev_name(wb->bdi), 32);
+		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
 		__entry->cgroup_ino	= __trace_wb_assign_cgroup(wb);
 		__entry->frn_bdi_id	= frn_bdi_id;
 		__entry->frn_memcg_id	= frn_memcg_id;
commit 853735e404244f5496cdb6188c5ed9a0f9627ee6
Author: Rui Miguel Silva <rui.silva at linaro.org>
Date:   Fri Nov 13 15:06:04 2020 +0000

    optee: add writeback to valid memory type
    
    Only in smp systems the cache policy is setup as write alloc, in
    single cpu systems the cache policy is set as writeback and it is
    normal memory, so, it should pass the is_normal_memory check in the
    share memory registration.
    
    Add the right condition to make it work in no smp systems.
    
    Fixes: cdbcf83d29c1 ("tee: optee: check type of registered shared memory")
    Signed-off-by: Rui Miguel Silva <rui.silva at linaro.org>
    Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>

diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
index 20b6fd7383c5..c981757ba0d4 100644
--- a/drivers/tee/optee/call.c
+++ b/drivers/tee/optee/call.c
@@ -534,7 +534,8 @@ void optee_free_pages_list(void *list, size_t num_entries)
 static bool is_normal_memory(pgprot_t p)
 {
 #if defined(CONFIG_ARM)
-	return (pgprot_val(p) & L_PTE_MT_MASK) == L_PTE_MT_WRITEALLOC;
+	return (((pgprot_val(p) & L_PTE_MT_MASK) == L_PTE_MT_WRITEALLOC) ||
+		((pgprot_val(p) & L_PTE_MT_MASK) == L_PTE_MT_WRITEBACK));
 #elif defined(CONFIG_ARM64)
 	return (pgprot_val(p) & PTE_ATTRINDX_MASK) == PTE_ATTRINDX(MT_NORMAL);
 #else
commit bf8975837dac156c33a4d15d46602700998cb6dd
Author: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
Date:   Tue Nov 24 12:57:07 2020 +0100

    dma-buf/dma-resv: Respect num_fences when initializing the shared fence list.
    
    We hardcode the maximum number of shared fences to 4, instead of
    respecting num_fences. Use a minimum of 4, but more if num_fences
    is higher.
    
    This seems to have been an oversight when first implementing the
    api.
    
    Fixes: 04a5faa8cbe5 ("reservation: update api and add some helpers")
    Cc: <stable at vger.kernel.org> # v3.17+
    Reported-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
    Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
    Reviewed-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201124115707.406917-1-maarten.lankhorst@linux.intel.com

diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
index bb5a42b10c29..6ddbeb5dfbf6 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -200,7 +200,7 @@ int dma_resv_reserve_shared(struct dma_resv *obj, unsigned int num_fences)
 			max = max(old->shared_count + num_fences,
 				  old->shared_max * 2);
 	} else {
-		max = 4;
+		max = max(4ul, roundup_pow_of_two(num_fences));
 	}
 
 	new = dma_resv_list_alloc(max);
commit ad89653f79f1882d55d9df76c9b2b94f008c4e27
Author: Si-Wei Liu <si-wei.liu at oracle.com>
Date:   Thu Nov 5 18:26:33 2020 -0500

    vhost-vdpa: fix page pinning leakage in error path (rework)
    
    Pinned pages are not properly accounted particularly when
    mapping error occurs on IOTLB update. Clean up dangling
    pinned pages for the error path.
    
    The memory usage for bookkeeping pinned pages is reverted
    to what it was before: only one single free page is needed.
    This helps reduce the host memory demand for VM with a large
    amount of memory, or in the situation where host is running
    short of free memory.
    
    Fixes: 4c8cf31885f6 ("vhost: introduce vDPA-based backend")
    Signed-off-by: Si-Wei Liu <si-wei.liu at oracle.com>
    Link: https://lore.kernel.org/r/1604618793-4681-1-git-send-email-si-wei.liu@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Jason Wang <jasowang at redhat.com>

diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
index 2754f3069738..f2db99031e2f 100644
--- a/drivers/vhost/vdpa.c
+++ b/drivers/vhost/vdpa.c
@@ -577,6 +577,8 @@ static int vhost_vdpa_map(struct vhost_vdpa *v,
 
 	if (r)
 		vhost_iotlb_del_range(dev->iotlb, iova, iova + size - 1);
+	else
+		atomic64_add(size >> PAGE_SHIFT, &dev->mm->pinned_vm);
 
 	return r;
 }
@@ -608,8 +610,9 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
 	unsigned long list_size = PAGE_SIZE / sizeof(struct page *);
 	unsigned int gup_flags = FOLL_LONGTERM;
 	unsigned long npages, cur_base, map_pfn, last_pfn = 0;
-	unsigned long locked, lock_limit, pinned, i;
+	unsigned long lock_limit, sz2pin, nchunks, i;
 	u64 iova = msg->iova;
+	long pinned;
 	int ret = 0;
 
 	if (msg->iova < v->range.first ||
@@ -620,6 +623,7 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
 				    msg->iova + msg->size - 1))
 		return -EEXIST;
 
+	/* Limit the use of memory for bookkeeping */
 	page_list = (struct page **) __get_free_page(GFP_KERNEL);
 	if (!page_list)
 		return -ENOMEM;
@@ -628,52 +632,75 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
 		gup_flags |= FOLL_WRITE;
 
 	npages = PAGE_ALIGN(msg->size + (iova & ~PAGE_MASK)) >> PAGE_SHIFT;
-	if (!npages)
-		return -EINVAL;
+	if (!npages) {
+		ret = -EINVAL;
+		goto free;
+	}
 
 	mmap_read_lock(dev->mm);
 
-	locked = atomic64_add_return(npages, &dev->mm->pinned_vm);
 	lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
-
-	if (locked > lock_limit) {
+	if (npages + atomic64_read(&dev->mm->pinned_vm) > lock_limit) {
 		ret = -ENOMEM;
-		goto out;
+		goto unlock;
 	}
 
 	cur_base = msg->uaddr & PAGE_MASK;
 	iova &= PAGE_MASK;
+	nchunks = 0;
 
 	while (npages) {
-		pinned = min_t(unsigned long, npages, list_size);
-		ret = pin_user_pages(cur_base, pinned,
-				     gup_flags, page_list, NULL);
-		if (ret != pinned)
+		sz2pin = min_t(unsigned long, npages, list_size);
+		pinned = pin_user_pages(cur_base, sz2pin,
+					gup_flags, page_list, NULL);
+		if (sz2pin != pinned) {
+			if (pinned < 0) {
+				ret = pinned;
+			} else {
+				unpin_user_pages(page_list, pinned);
+				ret = -ENOMEM;
+			}
 			goto out;
+		}
+		nchunks++;
 
 		if (!last_pfn)
 			map_pfn = page_to_pfn(page_list[0]);
 
-		for (i = 0; i < ret; i++) {
+		for (i = 0; i < pinned; i++) {
 			unsigned long this_pfn = page_to_pfn(page_list[i]);
 			u64 csize;
 
 			if (last_pfn && (this_pfn != last_pfn + 1)) {
 				/* Pin a contiguous chunk of memory */
 				csize = (last_pfn - map_pfn + 1) << PAGE_SHIFT;
-				if (vhost_vdpa_map(v, iova, csize,
-						   map_pfn << PAGE_SHIFT,
-						   msg->perm))
+				ret = vhost_vdpa_map(v, iova, csize,
+						     map_pfn << PAGE_SHIFT,
+						     msg->perm);
+				if (ret) {
+					/*
+					 * Unpin the pages that are left unmapped
+					 * from this point on in the current
+					 * page_list. The remaining outstanding
+					 * ones which may stride across several
+					 * chunks will be covered in the common
+					 * error path subsequently.
+					 */
+					unpin_user_pages(&page_list[i],
+							 pinned - i);
 					goto out;
+				}
+
 				map_pfn = this_pfn;
 				iova += csize;
+				nchunks = 0;
 			}
 
 			last_pfn = this_pfn;
 		}
 
-		cur_base += ret << PAGE_SHIFT;
-		npages -= ret;
+		cur_base += pinned << PAGE_SHIFT;
+		npages -= pinned;
 	}
 
 	/* Pin the rest chunk */
@@ -681,10 +708,27 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
 			     map_pfn << PAGE_SHIFT, msg->perm);
 out:
 	if (ret) {
+		if (nchunks) {
+			unsigned long pfn;
+
+			/*
+			 * Unpin the outstanding pages which are yet to be
+			 * mapped but haven't due to vdpa_map() or
+			 * pin_user_pages() failure.
+			 *
+			 * Mapped pages are accounted in vdpa_map(), hence
+			 * the corresponding unpinning will be handled by
+			 * vdpa_unmap().
+			 */
+			WARN_ON(!last_pfn);
+			for (pfn = map_pfn; pfn <= last_pfn; pfn++)
+				unpin_user_page(pfn_to_page(pfn));
+		}
 		vhost_vdpa_unmap(v, msg->iova, msg->size);
-		atomic64_sub(npages, &dev->mm->pinned_vm);
 	}
+unlock:
 	mmap_read_unlock(dev->mm);
+free:
 	free_page((unsigned long)page_list);
 	return ret;
 }
commit 8009b0f4ab3151f3b8c1675ceb0f9151f09dddaa
Author: Stefano Garzarella <sgarzare at redhat.com>
Date:   Mon Nov 16 17:16:53 2020 +0100

    vringh: fix vringh_iov_push_*() documentation
    
    vringh_iov_push_*() functions don't have 'dst' parameter, but have
    the 'src' parameter.
    
    Replace 'dst' description with 'src' description.
    
    Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
    Link: https://lore.kernel.org/r/20201116161653.102904-1-sgarzare@redhat.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>

diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
index 8bd8b403f087..b7403ba8e7f7 100644
--- a/drivers/vhost/vringh.c
+++ b/drivers/vhost/vringh.c
@@ -730,7 +730,7 @@ EXPORT_SYMBOL(vringh_iov_pull_user);
 /**
  * vringh_iov_push_user - copy bytes into vring_iov.
  * @wiov: the wiov as passed to vringh_getdesc_user() (updated as we consume)
- * @dst: the place to copy.
+ * @src: the place to copy from.
  * @len: the maximum length to copy.
  *
  * Returns the bytes copied <= len or a negative errno.
@@ -976,7 +976,7 @@ EXPORT_SYMBOL(vringh_iov_pull_kern);
 /**
  * vringh_iov_push_kern - copy bytes into vring_iov.
  * @wiov: the wiov as passed to vringh_getdesc_kern() (updated as we consume)
- * @dst: the place to copy.
+ * @src: the place to copy from.
  * @len: the maximum length to copy.
  *
  * Returns the bytes copied <= len or a negative errno.
@@ -1333,7 +1333,7 @@ EXPORT_SYMBOL(vringh_iov_pull_iotlb);
  * vringh_iov_push_iotlb - copy bytes into vring_iov.
  * @vrh: the vring.
  * @wiov: the wiov as passed to vringh_getdesc_iotlb() (updated as we consume)
- * @dst: the place to copy.
+ * @src: the place to copy from.
  * @len: the maximum length to copy.
  *
  * Returns the bytes copied <= len or a negative errno.
commit b4fffc177fad3c99ee049611a508ca9561bb6871
Author: Mike Christie <michael.christie at oracle.com>
Date:   Fri Nov 20 09:50:59 2020 -0600

    vhost scsi: fix lun reset completion handling
    
    vhost scsi owns the scsi se_cmd but lio frees the se_cmd->se_tmr
    before calling release_cmd, so while with normal cmd completion we
    can access the se_cmd from the vhost work, we can't do the same with
    se_cmd->se_tmr. This has us copy the tmf response in
    vhost_scsi_queue_tm_rsp to our internal vhost-scsi tmf struct for
    when it gets sent to the guest from our worker thread.
    
    Fixes: efd838fec17b ("vhost scsi: Add support for LUN resets.")
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Acked-by: Stefan Hajnoczi <stefanha at redhat.com>
    Link: https://lore.kernel.org/r/1605887459-3864-1-git-send-email-michael.christie@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>

diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index f22fce549862..6ff8a5096691 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -220,6 +220,7 @@ struct vhost_scsi_tmf {
 	struct list_head queue_entry;
 
 	struct se_cmd se_cmd;
+	u8 scsi_resp;
 	struct vhost_scsi_inflight *inflight;
 	struct iovec resp_iov;
 	int in_iovs;
@@ -426,6 +427,7 @@ static void vhost_scsi_queue_tm_rsp(struct se_cmd *se_cmd)
 	struct vhost_scsi_tmf *tmf = container_of(se_cmd, struct vhost_scsi_tmf,
 						  se_cmd);
 
+	tmf->scsi_resp = se_cmd->se_tmr_req->response;
 	transport_generic_free_cmd(&tmf->se_cmd, 0);
 }
 
@@ -1183,7 +1185,7 @@ static void vhost_scsi_tmf_resp_work(struct vhost_work *work)
 						  vwork);
 	int resp_code;
 
-	if (tmf->se_cmd.se_tmr_req->response == TMR_FUNCTION_COMPLETE)
+	if (tmf->scsi_resp == TMR_FUNCTION_COMPLETE)
 		resp_code = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
 	else
 		resp_code = VIRTIO_SCSI_S_FUNCTION_REJECTED;
commit 10e26e749fd0ba78a913548e2efeca1a157772da
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Tue Sep 22 16:46:55 2020 +0200

    drm/ast: Reload gamma LUT after changing primary plane's color format
    
    The gamma LUT has to be reloaded after changing the primary plane's
    color format. This used to be done implicitly by the CRTC atomic_enable()
    helper after updating the primary plane. With the recent reordering of
    the steps, the primary plane's setup was moved last and invalidated
    the gamma LUT. Fix this by setting the LUT from within atomic_flush().
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Fixes: 2f0ddd89fe32 ("drm/ast: Enable CRTC before planes")
    Cc: Thomas Zimmermann <tzimmermann at suse.de>
    Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
    Cc: Dave Airlie <airlied at redhat.com>
    Cc: dri-devel at lists.freedesktop.org
    Link: https://patchwork.freedesktop.org/patch/msgid/20200922144655.23624-1-tzimmermann@suse.de
    (cherry-picked from 8e3784dfef8a03143b13e7e4011f276a954f1bc6)

diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 834a156e3a75..0a1e1cf57e19 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -742,7 +742,6 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
 	case DRM_MODE_DPMS_SUSPEND:
 		if (ast->tx_chip_type == AST_TX_DP501)
 			ast_set_dp501_video_output(crtc->dev, 1);
-		ast_crtc_load_lut(ast, crtc);
 		break;
 	case DRM_MODE_DPMS_OFF:
 		if (ast->tx_chip_type == AST_TX_DP501)
@@ -777,6 +776,21 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
 	return 0;
 }
 
+static void
+ast_crtc_helper_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state)
+{
+	struct ast_private *ast = to_ast_private(crtc->dev);
+	struct ast_crtc_state *ast_crtc_state = to_ast_crtc_state(crtc->state);
+	struct ast_crtc_state *old_ast_crtc_state = to_ast_crtc_state(old_crtc_state);
+
+	/*
+	 * The gamma LUT has to be reloaded after changing the primary
+	 * plane's color format.
+	 */
+	if (old_ast_crtc_state->format != ast_crtc_state->format)
+		ast_crtc_load_lut(ast, crtc);
+}
+
 static void
 ast_crtc_helper_atomic_enable(struct drm_crtc *crtc,
 			      struct drm_crtc_state *old_crtc_state)
@@ -830,6 +844,7 @@ ast_crtc_helper_atomic_disable(struct drm_crtc *crtc,
 
 static const struct drm_crtc_helper_funcs ast_crtc_helper_funcs = {
 	.atomic_check = ast_crtc_helper_atomic_check,
+	.atomic_flush = ast_crtc_helper_atomic_flush,
 	.atomic_enable = ast_crtc_helper_atomic_enable,
 	.atomic_disable = ast_crtc_helper_atomic_disable,
 };
commit 030c5b52d4c1225030891d25abfe376b6e239712
Author: xinhui pan <xinhui.pan at amd.com>
Date:   Fri Oct 23 13:41:12 2020 +0800

    drm/amdgpu: Fix size calculation when init onchip memory
    
    Size is page count here.
    
    Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/1372
    Reviewed-by: Christian König <christian.koenig at amd.com>
    Signed-off-by: xinhui pan <xinhui.pan at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    (cherry picked from commit d836917da7e5ca9b33ef4d499972f1feeb519e00)
    [airlied: from drm-next]
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 8039d2399584..a0248d78190f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -69,10 +69,10 @@ static int amdgpu_ttm_backend_bind(struct ttm_bo_device *bdev,
 
 static int amdgpu_ttm_init_on_chip(struct amdgpu_device *adev,
 				    unsigned int type,
-				    uint64_t size)
+				    uint64_t size_in_page)
 {
 	return ttm_range_man_init(&adev->mman.bdev, type,
-				  false, size >> PAGE_SHIFT);
+				  false, size_in_page);
 }
 
 /**
commit 6f7a1f9c1af30f1eadc0ad9e77ec8ee95c48b2c9
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Tue Nov 24 20:15:24 2020 -0800

    Documentation: netdev-FAQ: suggest how to post co-dependent series
    
    Make an explicit suggestion how to post user space side of kernel
    patches to avoid reposts when patchwork groups the wrong patches.
    
    v2: mention the cases unlike iproute2 explicitly
    
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>
    Reviewed-by: Florian Fainelli <f.fainelli at gmail.com>
    Reviewed-by: David Ahern <dsahern at kernel.org>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/Documentation/networking/netdev-FAQ.rst b/Documentation/networking/netdev-FAQ.rst
index 21537766be4d..4b9ed5874d5a 100644
--- a/Documentation/networking/netdev-FAQ.rst
+++ b/Documentation/networking/netdev-FAQ.rst
@@ -254,6 +254,32 @@ you will have done run-time testing specific to your change, but at a
 minimum, your changes should survive an ``allyesconfig`` and an
 ``allmodconfig`` build without new warnings or failures.
 
+Q: How do I post corresponding changes to user space components?
+----------------------------------------------------------------
+A: User space code exercising kernel features should be posted
+alongside kernel patches. This gives reviewers a chance to see
+how any new interface is used and how well it works.
+
+When user space tools reside in the kernel repo itself all changes
+should generally come as one series. If series becomes too large
+or the user space project is not reviewed on netdev include a link
+to a public repo where user space patches can be seen.
+
+In case user space tooling lives in a separate repository but is
+reviewed on netdev  (e.g. patches to `iproute2` tools) kernel and
+user space patches should form separate series (threads) when posted
+to the mailing list, e.g.::
+
+  [PATCH net-next 0/3] net: some feature cover letter
+   └─ [PATCH net-next 1/3] net: some feature prep
+   └─ [PATCH net-next 2/3] net: some feature do it
+   └─ [PATCH net-next 3/3] selftest: net: some feature
+
+  [PATCH iproute2-next] ip: add support for some feature
+
+Posting as one thread is discouraged because it confuses patchwork
+(as of patchwork 2.2.2).
+
 Q: Any other tips to help ensure my net/net-next patch gets OK'd?
 -----------------------------------------------------------------
 A: Attention to detail.  Re-read your own work as if you were the
commit 855b69857830f8d918d715014f05e59a3f7491a0
Author: Luo Meng <luomeng12 at huawei.com>
Date:   Tue Nov 24 17:45:23 2020 -0800

    Input: i8042 - fix error return code in i8042_setup_aux()
    
    Fix to return a negative error code from the error handling case
    instead of 0 in function i8042_setup_aux(), as done elsewhere in this
    function.
    
    Fixes: f81134163fc7 ("Input: i8042 - use platform_driver_probe")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Luo Meng <luomeng12 at huawei.com>
    Reviewed-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201123133420.4071187-1-luomeng12@huawei.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index 944cbb519c6d..abae23af0791 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -1471,7 +1471,8 @@ static int __init i8042_setup_aux(void)
 	if (error)
 		goto err_free_ports;
 
-	if (aux_enable())
+	error = aux_enable();
+	if (error)
 		goto err_free_irq;
 
 	i8042_aux_irq_registered = true;
commit fa248db082270200863d254e0f39bbb29923d6b1
Author: Dmitry Torokhov <dmitry.torokhov at gmail.com>
Date:   Tue Nov 24 17:42:57 2020 -0800

    Input: soc_button_array - add missing include
    
    This fixes the following build errors:
    
      CC [M]  drivers/input/misc/soc_button_array.o
    drivers/input/misc/soc_button_array.c:156:4: error: implicit declaration of function 'irq_set_irq_type' [-Werror,-Wimplicit-function-declaration]
                            irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
                            ^
    drivers/input/misc/soc_button_array.c:156:26: error: use of undeclared identifier 'IRQ_TYPE_LEVEL_LOW'
                            irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
                                                  ^
    2 errors generated.
    
    Fixes: 78a5b53e9fb4 ("Input: soc_button_array - work around DSDTs which modify the irqflags")
    Reported-by: kernel test robot <lkp at intel.com>
    Reviewed-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201123061508.GA1009828@dtor-ws
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c
index cae1a3fae83a..d14a65683c5e 100644
--- a/drivers/input/misc/soc_button_array.c
+++ b/drivers/input/misc/soc_button_array.c
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 #include <linux/input.h>
 #include <linux/init.h>
+#include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/acpi.h>
 #include <linux/dmi.h>
commit 26c8996526e8a49fb14ea8d0ae0d60bf82a25cdf
Merge: 49d66ed81962 14a2e551faea
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Tue Nov 24 16:49:14 2020 -0800

    Merge tag 'batadv-net-pullrequest-20201124' of git://git.open-mesh.org/linux-merge
    
    Simon Wunderlich says:
    
    ====================
    Here is a batman-adv bugfix:
    
     - set module owner to THIS_MODULE, by Taehee Yoo
    
    * tag 'batadv-net-pullrequest-20201124' of git://git.open-mesh.org/linux-merge:
      batman-adv: set .owner to THIS_MODULE
    ====================
    
    Link: https://lore.kernel.org/r/20201124134417.17269-1-sw@simonwunderlich.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 49d66ed819629b2f82ff963420746015f241dfcb
Merge: 5fc145f15582 3ada288150fb
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Tue Nov 24 16:28:38 2020 -0800

    Merge branch 'ibmvnic-null-pointer-dereference'
    
    Lijun Pan says:
    
    ====================
    ibmvnic: null pointer dereference
    
    Fix two NULL pointer dereference crash issues.
    Improve module removal procedure.
    ====================
    
    Link: https://lore.kernel.org/r/20201123193547.57225-1-ljp@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 3ada288150fb17ab3fcce2cf5fce20461f86b2ee
Author: Lijun Pan <ljp at linux.ibm.com>
Date:   Mon Nov 23 13:35:47 2020 -0600

    ibmvnic: enhance resetting status check during module exit
    
    Based on the discussion with Sukadev Bhattiprolu and Dany Madden,
    we believe that checking adapter->resetting bit is preferred
    since RESETTING state flag is not as strict as resetting bit.
    RESETTING state flag is removed since it is verbose now.
    
    Fixes: 7d7195a026ba ("ibmvnic: Do not process device remove during device reset")
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 26ba07df404e..2491ebc97871 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2215,7 +2215,6 @@ static void __ibmvnic_reset(struct work_struct *work)
 
 		if (!saved_state) {
 			reset_state = adapter->state;
-			adapter->state = VNIC_RESETTING;
 			saved_state = true;
 		}
 		spin_unlock_irqrestore(&adapter->state_lock, flags);
@@ -5280,7 +5279,7 @@ static int ibmvnic_remove(struct vio_dev *dev)
 	unsigned long flags;
 
 	spin_lock_irqsave(&adapter->state_lock, flags);
-	if (adapter->state == VNIC_RESETTING) {
+	if (test_bit(0, &adapter->resetting)) {
 		spin_unlock_irqrestore(&adapter->state_lock, flags);
 		return -EBUSY;
 	}
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 217dcc7ded70..47a3fd71c96f 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -942,8 +942,7 @@ enum vnic_state {VNIC_PROBING = 1,
 		 VNIC_CLOSING,
 		 VNIC_CLOSED,
 		 VNIC_REMOVING,
-		 VNIC_REMOVED,
-		 VNIC_RESETTING};
+		 VNIC_REMOVED};
 
 enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1,
 			   VNIC_RESET_MOBILITY,
commit 0e435befaea45f7ea58682eecab5e37e05b2ce65
Author: Lijun Pan <ljp at linux.ibm.com>
Date:   Mon Nov 23 13:35:46 2020 -0600

    ibmvnic: fix NULL pointer dereference in ibmvic_reset_crq
    
    crq->msgs could be NULL if the previous reset did not complete after
    freeing crq->msgs. Check for NULL before dereferencing them.
    
    Snippet of call trace:
    ...
    ibmvnic 30000003 env3 (unregistering): Releasing sub-CRQ
    ibmvnic 30000003 env3 (unregistering): Releasing CRQ
    BUG: Kernel NULL pointer dereference on read at 0x00000000
    Faulting instruction address: 0xc0000000000c1a30
    Oops: Kernel access of bad area, sig: 11 [#1]
    LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
    Modules linked in: ibmvnic(E-) rpadlpar_io rpaphp xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT nf_reject_ipv4 nft_compat nft_counter nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables xsk_diag tcp_diag udp_diag tun raw_diag inet_diag unix_diag bridge af_packet_diag netlink_diag stp llc rfkill sunrpc pseries_rng xts vmx_crypto uio_pdrv_genirq uio binfmt_misc ip_tables xfs libcrc32c sd_mod t10_pi sg ibmvscsi ibmveth scsi_transport_srp dm_mirror dm_region_hash dm_log dm_mod [last unloaded: ibmvnic]
    CPU: 20 PID: 8426 Comm: kworker/20:0 Tainted: G            E     5.10.0-rc1+ #12
    Workqueue: events __ibmvnic_reset [ibmvnic]
    NIP:  c0000000000c1a30 LR: c008000001b00c18 CTR: 0000000000000400
    REGS: c00000000d05b7a0 TRAP: 0380   Tainted: G            E      (5.10.0-rc1+)
    MSR:  800000000280b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE>  CR: 44002480  XER: 20040000
    CFAR: c0000000000c19ec IRQMASK: 0
    GPR00: 0000000000000400 c00000000d05ba30 c008000001b17c00 0000000000000000
    GPR04: 0000000000000000 0000000000000000 0000000000000000 00000000000001e2
    GPR08: 000000000001f400 ffffffffffffd950 0000000000000000 c008000001b0b280
    GPR12: c0000000000c19c8 c00000001ec72e00 c00000000019a778 c00000002647b440
    GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
    GPR20: 0000000000000006 0000000000000001 0000000000000003 0000000000000002
    GPR24: 0000000000001000 c008000001b0d570 0000000000000005 c00000007ab5d550
    GPR28: c00000007ab5c000 c000000032fcf848 c00000007ab5cc00 c000000032fcf800
    NIP [c0000000000c1a30] memset+0x68/0x104
    LR [c008000001b00c18] ibmvnic_reset_crq+0x70/0x110 [ibmvnic]
    Call Trace:
    [c00000000d05ba30] [0000000000000800] 0x800 (unreliable)
    [c00000000d05bab0] [c008000001b0a930] do_reset.isra.40+0x224/0x634 [ibmvnic]
    [c00000000d05bb80] [c008000001b08574] __ibmvnic_reset+0x17c/0x3c0 [ibmvnic]
    [c00000000d05bc50] [c00000000018d9ac] process_one_work+0x2cc/0x800
    [c00000000d05bd20] [c00000000018df58] worker_thread+0x78/0x520
    [c00000000d05bdb0] [c00000000019a934] kthread+0x1c4/0x1d0
    [c00000000d05be20] [c00000000000d5d0] ret_from_kernel_thread+0x5c/0x6c
    
    Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index db4a8e17477c..26ba07df404e 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -4973,6 +4973,9 @@ static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter)
 	} while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
 
 	/* Clean out the queue */
+	if (!crq->msgs)
+		return -EINVAL;
+
 	memset(crq->msgs, 0, PAGE_SIZE);
 	crq->cur = 0;
 	crq->active = false;
commit a0faaa27c71608799e0dd765c5af38a089091802
Author: Lijun Pan <ljp at linux.ibm.com>
Date:   Mon Nov 23 13:35:45 2020 -0600

    ibmvnic: fix NULL pointer dereference in reset_sub_crq_queues
    
    adapter->tx_scrq and adapter->rx_scrq could be NULL if the previous reset
    did not complete after freeing sub crqs. Check for NULL before
    dereferencing them.
    
    Snippet of call trace:
    ibmvnic 30000006 env6: Releasing sub-CRQ
    ibmvnic 30000006 env6: Releasing CRQ
    ...
    ibmvnic 30000006 env6: Got Control IP offload Response
    ibmvnic 30000006 env6: Re-setting tx_scrq[0]
    BUG: Kernel NULL pointer dereference on read at 0x00000000
    Faulting instruction address: 0xc008000003dea7cc
    Oops: Kernel access of bad area, sig: 11 [#1]
    LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
    Modules linked in: rpadlpar_io rpaphp xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT nf_reject_ipv4 nft_compat nft_counter nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables xsk_diag tcp_diag udp_diag raw_diag inet_diag unix_diag af_packet_diag netlink_diag tun bridge stp llc rfkill sunrpc pseries_rng xts vmx_crypto uio_pdrv_genirq uio binfmt_misc ip_tables xfs libcrc32c sd_mod t10_pi sg ibmvscsi ibmvnic ibmveth scsi_transport_srp dm_mirror dm_region_hash dm_log dm_mod
    CPU: 80 PID: 1856 Comm: kworker/80:2 Tainted: G        W         5.8.0+ #4
    Workqueue: events __ibmvnic_reset [ibmvnic]
    NIP:  c008000003dea7cc LR: c008000003dea7bc CTR: 0000000000000000
    REGS: c0000007ef7db860 TRAP: 0380   Tainted: G        W          (5.8.0+)
    MSR:  800000000280b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE>  CR: 28002422  XER: 0000000d
    CFAR: c000000000bd9520 IRQMASK: 0
    GPR00: c008000003dea7bc c0000007ef7dbaf0 c008000003df7400 c0000007fa26ec00
    GPR04: c0000007fcd0d008 c0000007fcd96350 0000000000000027 c0000007fcd0d010
    GPR08: 0000000000000023 0000000000000000 0000000000000000 0000000000000000
    GPR12: 0000000000002000 c00000001ec18e00 c0000000001982f8 c0000007bad6e840
    GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
    GPR20: 0000000000000000 0000000000000000 0000000000000000 fffffffffffffef7
    GPR24: 0000000000000402 c0000007fa26f3a8 0000000000000003 c00000016f8ec048
    GPR28: 0000000000000000 0000000000000000 0000000000000000 c0000007fa26ec00
    NIP [c008000003dea7cc] ibmvnic_reset_init+0x15c/0x258 [ibmvnic]
    LR [c008000003dea7bc] ibmvnic_reset_init+0x14c/0x258 [ibmvnic]
    Call Trace:
    [c0000007ef7dbaf0] [c008000003dea7bc] ibmvnic_reset_init+0x14c/0x258 [ibmvnic] (unreliable)
    [c0000007ef7dbb80] [c008000003de8860] __ibmvnic_reset+0x408/0x970 [ibmvnic]
    [c0000007ef7dbc50] [c00000000018b7cc] process_one_work+0x2cc/0x800
    [c0000007ef7dbd20] [c00000000018bd78] worker_thread+0x78/0x520
    [c0000007ef7dbdb0] [c0000000001984c4] kthread+0x1d4/0x1e0
    [c0000007ef7dbe20] [c00000000000cea8] ret_from_kernel_thread+0x5c/0x74
    
    Fixes: 57a49436f4e8 ("ibmvnic: Reset sub-crqs during driver reset")
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 2aa40b2f225c..db4a8e17477c 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2880,6 +2880,9 @@ static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter)
 {
 	int i, rc;
 
+	if (!adapter->tx_scrq || !adapter->rx_scrq)
+		return -EINVAL;
+
 	for (i = 0; i < adapter->req_tx_queues; i++) {
 		netdev_dbg(adapter->netdev, "Re-setting tx_scrq[%d]\n", i);
 		rc = reset_one_sub_crq_queue(adapter, adapter->tx_scrq[i]);
commit 5fc145f1558274726e4ce85d5b0418ebfb5bf837
Merge: d8f0a86795c6 1396d3148bd2
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Tue Nov 24 16:07:16 2020 -0800

    Merge branch 'fixes-for-ena-driver'
    
    Shay Agroskin says:
    
    ====================
    Fixes for ENA driver
    
    - fix wrong data offset on machines that support rx offset
    - work-around Intel iommu issue
    - fix out of bound access when request id is wrong
    ====================
    
    Link: https://lore.kernel.org/r/20201123190859.21298-1-shayagr@amazon.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 1396d3148bd250db880573f9ed0abe5d6fba1fce
Author: Shay Agroskin <shayagr at amazon.com>
Date:   Mon Nov 23 21:08:59 2020 +0200

    net: ena: fix packet's addresses for rx_offset feature
    
    This patch fixes two lines in which the rx_offset received by the device
    wasn't taken into account:
    
    - prefetch function:
            In our driver the copied data would reside in
            rx_info->page + rx_headroom + rx_offset
    
            so the prefetch function is changed accordingly.
    
    - setting page_offset to zero for descriptors > 1:
            for every descriptor but the first, the rx_offset is zero. Hence
            the page_offset value should be set to rx_headroom.
    
            The previous implementation changed the value of rx_info after
            the descriptor was added to the SKB (essentially providing wrong
            page offset).
    
    Fixes: 68f236df93a9 ("net: ena: add support for the rx offset feature")
    Signed-off-by: Shay Agroskin <shayagr at amazon.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index ec0008ba7751..df1884d57d1a 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -908,10 +908,14 @@ static void ena_free_all_io_rx_resources(struct ena_adapter *adapter)
 static int ena_alloc_rx_page(struct ena_ring *rx_ring,
 				    struct ena_rx_buffer *rx_info, gfp_t gfp)
 {
+	int headroom = rx_ring->rx_headroom;
 	struct ena_com_buf *ena_buf;
 	struct page *page;
 	dma_addr_t dma;
 
+	/* restore page offset value in case it has been changed by device */
+	rx_info->page_offset = headroom;
+
 	/* if previous allocated page is not used */
 	if (unlikely(rx_info->page))
 		return 0;
@@ -941,10 +945,9 @@ static int ena_alloc_rx_page(struct ena_ring *rx_ring,
 		  "Allocate page %p, rx_info %p\n", page, rx_info);
 
 	rx_info->page = page;
-	rx_info->page_offset = 0;
 	ena_buf = &rx_info->ena_buf;
-	ena_buf->paddr = dma + rx_ring->rx_headroom;
-	ena_buf->len = ENA_PAGE_SIZE - rx_ring->rx_headroom;
+	ena_buf->paddr = dma + headroom;
+	ena_buf->len = ENA_PAGE_SIZE - headroom;
 
 	return 0;
 }
@@ -1356,7 +1359,8 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
 
 	/* save virt address of first buffer */
 	va = page_address(rx_info->page) + rx_info->page_offset;
-	prefetch(va + NET_IP_ALIGN);
+
+	prefetch(va);
 
 	if (len <= rx_ring->rx_copybreak) {
 		skb = ena_alloc_skb(rx_ring, false);
@@ -1397,8 +1401,6 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
 
 		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_info->page,
 				rx_info->page_offset, len, ENA_PAGE_SIZE);
-		/* The offset is non zero only for the first buffer */
-		rx_info->page_offset = 0;
 
 		netif_dbg(rx_ring->adapter, rx_status, rx_ring->netdev,
 			  "RX skb updated. len %d. data_len %d\n",
@@ -1517,8 +1519,7 @@ static int ena_xdp_handle_buff(struct ena_ring *rx_ring, struct xdp_buff *xdp)
 	int ret;
 
 	rx_info = &rx_ring->rx_buffer_info[rx_ring->ena_bufs[0].req_id];
-	xdp->data = page_address(rx_info->page) +
-		rx_info->page_offset + rx_ring->rx_headroom;
+	xdp->data = page_address(rx_info->page) + rx_info->page_offset;
 	xdp_set_data_meta_invalid(xdp);
 	xdp->data_hard_start = page_address(rx_info->page);
 	xdp->data_end = xdp->data + rx_ring->ena_bufs[0].len;
@@ -1585,8 +1586,9 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi,
 		if (unlikely(ena_rx_ctx.descs == 0))
 			break;
 
+		/* First descriptor might have an offset set by the device */
 		rx_info = &rx_ring->rx_buffer_info[rx_ring->ena_bufs[0].req_id];
-		rx_info->page_offset = ena_rx_ctx.pkt_offset;
+		rx_info->page_offset += ena_rx_ctx.pkt_offset;
 
 		netif_dbg(rx_ring->adapter, rx_status, rx_ring->netdev,
 			  "rx_poll: q %d got packet from ena. descs #: %d l3 proto %d l4 proto %d hash: %x\n",
commit 09323b3bca95181c0da79daebc8b0603e500f573
Author: Shay Agroskin <shayagr at amazon.com>
Date:   Mon Nov 23 21:08:58 2020 +0200

    net: ena: set initial DMA width to avoid intel iommu issue
    
    The ENA driver uses the readless mechanism, which uses DMA, to find
    out what the DMA mask is supposed to be.
    
    If DMA is used without setting the dma_mask first, it causes the
    Intel IOMMU driver to think that ENA is a 32-bit device and therefore
    disables IOMMU passthrough permanently.
    
    This patch sets the dma_mask to be ENA_MAX_PHYS_ADDR_SIZE_BITS=48
    before readless initialization in
    ena_device_init()->ena_com_mmio_reg_read_request_init(),
    which is large enough to workaround the intel_iommu issue.
    
    DMA mask is set again to the correct value after it's received from the
    device after readless is initialized.
    
    The patch also changes the driver to use dma_set_mask_and_coherent()
    function instead of the two pci_set_dma_mask() and
    pci_set_consistent_dma_mask() ones. Both methods achieve the same
    effect.
    
    Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
    Signed-off-by: Mike Cui <mikecui at amazon.com>
    Signed-off-by: Arthur Kiyanovski <akiyano at amazon.com>
    Signed-off-by: Shay Agroskin <shayagr at amazon.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 574c2b5ba21e..ec0008ba7751 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -3367,16 +3367,9 @@ static int ena_device_init(struct ena_com_dev *ena_dev, struct pci_dev *pdev,
 		goto err_mmio_read_less;
 	}
 
-	rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(dma_width));
+	rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(dma_width));
 	if (rc) {
-		dev_err(dev, "pci_set_dma_mask failed 0x%x\n", rc);
-		goto err_mmio_read_less;
-	}
-
-	rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(dma_width));
-	if (rc) {
-		dev_err(dev, "err_pci_set_consistent_dma_mask failed 0x%x\n",
-			rc);
+		dev_err(dev, "dma_set_mask_and_coherent failed %d\n", rc);
 		goto err_mmio_read_less;
 	}
 
@@ -4146,6 +4139,12 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 		return rc;
 	}
 
+	rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(ENA_MAX_PHYS_ADDR_SIZE_BITS));
+	if (rc) {
+		dev_err(&pdev->dev, "dma_set_mask_and_coherent failed %d\n", rc);
+		goto err_disable_device;
+	}
+
 	pci_set_master(pdev);
 
 	ena_dev = vzalloc(sizeof(*ena_dev));
commit 5b7022cf1dc0d721bd4b5f3bada05bd8ced82fe0
Author: Shay Agroskin <shayagr at amazon.com>
Date:   Mon Nov 23 21:08:57 2020 +0200

    net: ena: handle bad request id in ena_netdev
    
    After request id is checked in validate_rx_req_id() its value is still
    used in the line
            rx_ring->free_ids[next_to_clean] =
                                            rx_ring->ena_bufs[i].req_id;
    even if it was found to be out-of-bound for the array free_ids.
    
    The patch moves the request id to an earlier stage in the napi routine and
    makes sure its value isn't used if it's found out-of-bounds.
    
    Fixes: 30623e1ed116 ("net: ena: avoid memory access violation by validating req_id properly")
    Signed-off-by: Ido Segev <idose at amazon.com>
    Signed-off-by: Shay Agroskin <shayagr at amazon.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/amazon/ena/ena_eth_com.c b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
index ad30cacc1622..032ab9f20438 100644
--- a/drivers/net/ethernet/amazon/ena/ena_eth_com.c
+++ b/drivers/net/ethernet/amazon/ena/ena_eth_com.c
@@ -516,6 +516,7 @@ int ena_com_rx_pkt(struct ena_com_io_cq *io_cq,
 {
 	struct ena_com_rx_buf_info *ena_buf = &ena_rx_ctx->ena_bufs[0];
 	struct ena_eth_io_rx_cdesc_base *cdesc = NULL;
+	u16 q_depth = io_cq->q_depth;
 	u16 cdesc_idx = 0;
 	u16 nb_hw_desc;
 	u16 i = 0;
@@ -543,6 +544,8 @@ int ena_com_rx_pkt(struct ena_com_io_cq *io_cq,
 	do {
 		ena_buf[i].len = cdesc->length;
 		ena_buf[i].req_id = cdesc->req_id;
+		if (unlikely(ena_buf[i].req_id >= q_depth))
+			return -EIO;
 
 		if (++i >= nb_hw_desc)
 			break;
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index e8131dadc22c..574c2b5ba21e 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -789,24 +789,6 @@ static void ena_free_all_io_tx_resources(struct ena_adapter *adapter)
 					      adapter->num_io_queues);
 }
 
-static int validate_rx_req_id(struct ena_ring *rx_ring, u16 req_id)
-{
-	if (likely(req_id < rx_ring->ring_size))
-		return 0;
-
-	netif_err(rx_ring->adapter, rx_err, rx_ring->netdev,
-		  "Invalid rx req_id: %hu\n", req_id);
-
-	u64_stats_update_begin(&rx_ring->syncp);
-	rx_ring->rx_stats.bad_req_id++;
-	u64_stats_update_end(&rx_ring->syncp);
-
-	/* Trigger device reset */
-	rx_ring->adapter->reset_reason = ENA_REGS_RESET_INV_RX_REQ_ID;
-	set_bit(ENA_FLAG_TRIGGER_RESET, &rx_ring->adapter->flags);
-	return -EFAULT;
-}
-
 /* ena_setup_rx_resources - allocate I/O Rx resources (Descriptors)
  * @adapter: network interface device structure
  * @qid: queue index
@@ -1356,15 +1338,10 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
 	struct ena_rx_buffer *rx_info;
 	u16 len, req_id, buf = 0;
 	void *va;
-	int rc;
 
 	len = ena_bufs[buf].len;
 	req_id = ena_bufs[buf].req_id;
 
-	rc = validate_rx_req_id(rx_ring, req_id);
-	if (unlikely(rc < 0))
-		return NULL;
-
 	rx_info = &rx_ring->rx_buffer_info[req_id];
 
 	if (unlikely(!rx_info->page)) {
@@ -1440,10 +1417,6 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
 		len = ena_bufs[buf].len;
 		req_id = ena_bufs[buf].req_id;
 
-		rc = validate_rx_req_id(rx_ring, req_id);
-		if (unlikely(rc < 0))
-			return NULL;
-
 		rx_info = &rx_ring->rx_buffer_info[req_id];
 	} while (1);
 
@@ -1697,12 +1670,18 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi,
 error:
 	adapter = netdev_priv(rx_ring->netdev);
 
-	u64_stats_update_begin(&rx_ring->syncp);
-	rx_ring->rx_stats.bad_desc_num++;
-	u64_stats_update_end(&rx_ring->syncp);
+	if (rc == -ENOSPC) {
+		u64_stats_update_begin(&rx_ring->syncp);
+		rx_ring->rx_stats.bad_desc_num++;
+		u64_stats_update_end(&rx_ring->syncp);
+		adapter->reset_reason = ENA_REGS_RESET_TOO_MANY_RX_DESCS;
+	} else {
+		u64_stats_update_begin(&rx_ring->syncp);
+		rx_ring->rx_stats.bad_req_id++;
+		u64_stats_update_end(&rx_ring->syncp);
+		adapter->reset_reason = ENA_REGS_RESET_INV_RX_REQ_ID;
+	}
 
-	/* Too many desc from the device. Trigger reset */
-	adapter->reset_reason = ENA_REGS_RESET_TOO_MANY_RX_DESCS;
 	set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
 
 	return 0;
commit 7032908cd5842af9710de4815a456241b5e6d2d1
Merge: 418baf2c28f3 74cde1a53368
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Wed Nov 25 00:56:28 2020 +0100

    Merge tag 'irqchip-fixes-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent
    
    Pull irqchip fixes from Marc Zyngier:
    
     - Fix Exiu driver trigger type when using ACPI
    
     - Fix GICv3 ITS suspend/resume to use the in-kernel path
       at all times, sidestepping braindead firmware support
    
    Link: https://lore.kernel.org/r/20201122184752.553990-1-maz@kernel.org

commit 127c501a03d5db8b833e953728d3bcf53c8832a9
Merge: 073861ed77b6 1254100030b3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 24 15:33:18 2020 -0800

    Merge tag '5.10-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
    
    Pull cifs fixes from Steve French:
     "Four smb3 fixes for stable: one fixes a memleak, the other three
      address a problem found with decryption offload that can cause a use
      after free"
    
    * tag '5.10-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6:
      smb3: Handle error case during offload read path
      smb3: Avoid Mid pending list corruption
      smb3: Call cifs reconnect from demultiplex thread
      cifs: fix a memleak with modefromsid

commit 073861ed77b6b957c3c8d54a11dc503f7d986ceb
Author: Hugh Dickins <hughd at google.com>
Date:   Tue Nov 24 08:46:43 2020 -0800

    mm: fix VM_BUG_ON(PageTail) and BUG_ON(PageWriteback)
    
    Twice now, when exercising ext4 looped on shmem huge pages, I have crashed
    on the PF_ONLY_HEAD check inside PageWaiters(): ext4_finish_bio() calling
    end_page_writeback() calling wake_up_page() on tail of a shmem huge page,
    no longer an ext4 page at all.
    
    The problem is that PageWriteback is not accompanied by a page reference
    (as the NOTE at the end of test_clear_page_writeback() acknowledges): as
    soon as TestClearPageWriteback has been done, that page could be removed
    from page cache, freed, and reused for something else by the time that
    wake_up_page() is reached.
    
    https://lore.kernel.org/linux-mm/20200827122019.GC14765@casper.infradead.org/
    Matthew Wilcox suggested avoiding or weakening the PageWaiters() tail
    check; but I'm paranoid about even looking at an unreferenced struct page,
    lest its memory might itself have already been reused or hotremoved (and
    wake_up_page_bit() may modify that memory with its ClearPageWaiters()).
    
    Then on crashing a second time, realized there's a stronger reason against
    that approach.  If my testing just occasionally crashes on that check,
    when the page is reused for part of a compound page, wouldn't it be much
    more common for the page to get reused as an order-0 page before reaching
    wake_up_page()?  And on rare occasions, might that reused page already be
    marked PageWriteback by its new user, and already be waited upon?  What
    would that look like?
    
    It would look like BUG_ON(PageWriteback) after wait_on_page_writeback()
    in write_cache_pages() (though I have never seen that crash myself).
    
    Matthew Wilcox explaining this to himself:
     "page is allocated, added to page cache, dirtied, writeback starts,
    
      --- thread A ---
      filesystem calls end_page_writeback()
            test_clear_page_writeback()
      --- context switch to thread B ---
      truncate_inode_pages_range() finds the page, it doesn't have writeback set,
      we delete it from the page cache.  Page gets reallocated, dirtied, writeback
      starts again.  Then we call write_cache_pages(), see
      PageWriteback() set, call wait_on_page_writeback()
      --- context switch back to thread A ---
      wake_up_page(page, PG_writeback);
      ... thread B is woken, but because the wakeup was for the old use of
      the page, PageWriteback is still set.
    
      Devious"
    
    And prior to 2a9127fcf229 ("mm: rewrite wait_on_page_bit_common() logic")
    this would have been much less likely: before that, wake_page_function()'s
    non-exclusive case would stop walking and not wake if it found Writeback
    already set again; whereas now the non-exclusive case proceeds to wake.
    
    I have not thought of a fix that does not add a little overhead: the
    simplest fix is for end_page_writeback() to get_page() before calling
    test_clear_page_writeback(), then put_page() after wake_up_page().
    
    Was there a chance of missed wakeups before, since a page freed before
    reaching wake_up_page() would have PageWaiters cleared?  I think not,
    because each waiter does hold a reference on the page.  This bug comes
    when the old use of the page, the one we do TestClearPageWriteback on,
    had *no* waiters, so no additional page reference beyond the page cache
    (and whoever racily freed it).  The reuse of the page has a waiter
    holding a reference, and its own PageWriteback set; but the belated
    wake_up_page() has woken the reuse to hit that BUG_ON(PageWriteback).
    
    Reported-by: syzbot+3622cea378100f45d59f at syzkaller.appspotmail.com
    Reported-by: Qian Cai <cai at lca.pw>
    Fixes: 2a9127fcf229 ("mm: rewrite wait_on_page_bit_common() logic")
    Signed-off-by: Hugh Dickins <hughd at google.com>
    Cc: stable at vger.kernel.org # v5.8+
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/filemap.c b/mm/filemap.c
index 3ebbe64a0106..0b2067b3c328 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1484,11 +1484,19 @@ void end_page_writeback(struct page *page)
 		rotate_reclaimable_page(page);
 	}
 
+	/*
+	 * Writeback does not hold a page reference of its own, relying
+	 * on truncation to wait for the clearing of PG_writeback.
+	 * But here we must make sure that the page is not freed and
+	 * reused before the wake_up_page().
+	 */
+	get_page(page);
 	if (!test_clear_page_writeback(page))
 		BUG();
 
 	smp_mb__after_atomic();
 	wake_up_page(page, PG_writeback);
+	put_page(page);
 }
 EXPORT_SYMBOL(end_page_writeback);
 
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 7709f0e223f5..586042472ac9 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2754,12 +2754,6 @@ int test_clear_page_writeback(struct page *page)
 	} else {
 		ret = TestClearPageWriteback(page);
 	}
-	/*
-	 * NOTE: Page might be free now! Writeback doesn't hold a page
-	 * reference on its own, it relies on truncation to wait for
-	 * the clearing of PG_writeback. The below can only access
-	 * page state that is static across allocation cycles.
-	 */
 	if (ret) {
 		dec_lruvec_state(lruvec, NR_WRITEBACK);
 		dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
commit d8f0a86795c69f5b697f7d9e5274c124da93c92d
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Mon Nov 23 17:23:51 2020 +0100

    nfc: s3fwrn5: use signed integer for parsing GPIO numbers
    
    GPIOs - as returned by of_get_named_gpio() and used by the gpiolib - are
    signed integers, where negative number indicates error.  The return
    value of of_get_named_gpio() should not be assigned to an unsigned int
    because in case of !CONFIG_GPIOLIB such number would be a valid GPIO.
    
    Fixes: c04c674fadeb ("nfc: s3fwrn5: Add driver for Samsung S3FWRN5 NFC Chip")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Link: https://lore.kernel.org/r/20201123162351.209100-1-krzk@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/nfc/s3fwrn5/i2c.c b/drivers/nfc/s3fwrn5/i2c.c
index dc995286be84..d0a3bd9ff3c3 100644
--- a/drivers/nfc/s3fwrn5/i2c.c
+++ b/drivers/nfc/s3fwrn5/i2c.c
@@ -26,8 +26,8 @@ struct s3fwrn5_i2c_phy {
 	struct i2c_client *i2c_dev;
 	struct nci_dev *ndev;
 
-	unsigned int gpio_en;
-	unsigned int gpio_fw_wake;
+	int gpio_en;
+	int gpio_fw_wake;
 
 	struct mutex mutex;
 
commit 078eb55cdf25e0a621d406c233cc1b4acc31c82f
Author: Ezequiel Garcia <ezequiel at collabora.com>
Date:   Mon Nov 23 18:35:53 2020 +0200

    dpaa2-eth: Fix compile error due to missing devlink support
    
    The dpaa2 driver depends on devlink, so it should select
    NET_DEVLINK in order to fix compile errors, such as:
    
    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.o: in function `dpaa2_eth_rx_err':
    dpaa2-eth.c:(.text+0x3cec): undefined reference to `devlink_trap_report'
    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.o: in function `dpaa2_eth_dl_info_get':
    dpaa2-eth-devlink.c:(.text+0x160): undefined reference to `devlink_info_driver_name_put'
    
    Fixes: ceeb03ad8e22 ("dpaa2-eth: add basic devlink support")
    Signed-off-by: Ezequiel Garcia <ezequiel at collabora.com>
    Signed-off-by: Ioana Ciornei <ioana.ciornei at nxp.com>
    Link: https://lore.kernel.org/r/20201123163553.1666476-1-ciorneiioana@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/dpaa2/Kconfig b/drivers/net/ethernet/freescale/dpaa2/Kconfig
index c0e05f71826d..ee7a906e30b3 100644
--- a/drivers/net/ethernet/freescale/dpaa2/Kconfig
+++ b/drivers/net/ethernet/freescale/dpaa2/Kconfig
@@ -5,6 +5,7 @@ config FSL_DPAA2_ETH
 	select PHYLINK
 	select PCS_LYNX
 	select FSL_XGMAC_MDIO
+	select NET_DEVLINK
 	help
 	  This is the DPAA2 Ethernet driver supporting Freescale SoCs
 	  with DPAA2 (DataPath Acceleration Architecture v2).
commit 515b269d5bd29a986d5e1c0a0cba87fa865a48b4
Author: Alexander Aring <aahringo at redhat.com>
Date:   Mon Nov 23 10:53:35 2020 -0500

    gfs2: set lockdep subclass for iopen glocks
    
    This patch introduce a new globs attribute to define the subclass of the
    glock lockref spinlock. This avoid the following lockdep warning, which
    occurs when we lock an inode lock while an iopen lock is held:
    
    ============================================
    WARNING: possible recursive locking detected
    5.10.0-rc3+ #4990 Not tainted
    --------------------------------------------
    kworker/0:1/12 is trying to acquire lock:
    ffff9067d45672d8 (&gl->gl_lockref.lock){+.+.}-{3:3}, at: lockref_get+0x9/0x20
    
    but task is already holding lock:
    ffff9067da308588 (&gl->gl_lockref.lock){+.+.}-{3:3}, at: delete_work_func+0x164/0x260
    
    other info that might help us debug this:
     Possible unsafe locking scenario:
    
           CPU0
           ----
      lock(&gl->gl_lockref.lock);
      lock(&gl->gl_lockref.lock);
    
     *** DEADLOCK ***
    
     May be due to missing lock nesting notation
    
    3 locks held by kworker/0:1/12:
     #0: ffff9067c1bfdd38 ((wq_completion)delete_workqueue){+.+.}-{0:0}, at: process_one_work+0x1b7/0x540
     #1: ffffac594006be70 ((work_completion)(&(&gl->gl_delete)->work)){+.+.}-{0:0}, at: process_one_work+0x1b7/0x540
     #2: ffff9067da308588 (&gl->gl_lockref.lock){+.+.}-{3:3}, at: delete_work_func+0x164/0x260
    
    stack backtrace:
    CPU: 0 PID: 12 Comm: kworker/0:1 Not tainted 5.10.0-rc3+ #4990
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
    Workqueue: delete_workqueue delete_work_func
    Call Trace:
     dump_stack+0x8b/0xb0
     __lock_acquire.cold+0x19e/0x2e3
     lock_acquire+0x150/0x410
     ? lockref_get+0x9/0x20
     _raw_spin_lock+0x27/0x40
     ? lockref_get+0x9/0x20
     lockref_get+0x9/0x20
     delete_work_func+0x188/0x260
     process_one_work+0x237/0x540
     worker_thread+0x4d/0x3b0
     ? process_one_work+0x540/0x540
     kthread+0x127/0x140
     ? __kthread_bind_mask+0x60/0x60
     ret_from_fork+0x22/0x30
    
    Suggested-by: Andreas Gruenbacher <agruenba at redhat.com>
    Signed-off-by: Alexander Aring <aahringo at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index d98a2e5dab9f..35a6fd103761 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1035,6 +1035,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
 	gl->gl_node.next = NULL;
 	gl->gl_flags = 0;
 	gl->gl_name = name;
+	lockdep_set_subclass(&gl->gl_lockref.lock, glops->go_subclass);
 	gl->gl_lockref.count = 1;
 	gl->gl_state = LM_ST_UNLOCKED;
 	gl->gl_target = LM_ST_UNLOCKED;
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index 6cedeefb7b3f..e2cfc00ab936 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -781,6 +781,7 @@ const struct gfs2_glock_operations gfs2_iopen_glops = {
 	.go_callback = iopen_go_callback,
 	.go_demote_ok = iopen_go_demote_ok,
 	.go_flags = GLOF_LRU | GLOF_NONDISK,
+	.go_subclass = 1,
 };
 
 const struct gfs2_glock_operations gfs2_flock_glops = {
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index d7707307f4b1..f8858d995b24 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -247,6 +247,7 @@ struct gfs2_glock_operations {
 			const char *fs_id_buf);
 	void (*go_callback)(struct gfs2_glock *gl, bool remote);
 	void (*go_free)(struct gfs2_glock *gl);
+	const int go_subclass;
 	const int go_type;
 	const unsigned long go_flags;
 #define GLOF_ASPACE 1 /* address space attached */
commit 16e6281b6b22b0178eab95c6a82502d7b10f67b8
Author: Alexander Aring <aahringo at redhat.com>
Date:   Sun Nov 22 18:10:24 2020 -0500

    gfs2: Fix deadlock dumping resource group glocks
    
    Commit 0e539ca1bbbe ("gfs2: Fix NULL pointer dereference in gfs2_rgrp_dump")
    introduced additional locking in gfs2_rgrp_go_dump, which is also used for
    dumping resource group glocks via debugfs.  However, on that code path, the
    glock spin lock is already taken in dump_glock, and taking it again in
    gfs2_glock2rgrp leads to deadlock.  This can be reproduced with:
    
      $ mkfs.gfs2 -O -p lock_nolock /dev/FOO
      $ mount /dev/FOO /mnt/foo
      $ touch /mnt/foo/bar
      $ cat /sys/kernel/debug/gfs2/FOO/glocks
    
    Fix that by not taking the glock spin lock inside the go_dump callback.
    
    Fixes: 0e539ca1bbbe ("gfs2: Fix NULL pointer dereference in gfs2_rgrp_dump")
    Signed-off-by: Alexander Aring <aahringo at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index 67f2921ae8d4..6cedeefb7b3f 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -245,7 +245,7 @@ static void rgrp_go_inval(struct gfs2_glock *gl, int flags)
 static void gfs2_rgrp_go_dump(struct seq_file *seq, struct gfs2_glock *gl,
 			      const char *fs_id_buf)
 {
-	struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl);
+	struct gfs2_rgrpd *rgd = gl->gl_object;
 
 	if (rgd)
 		gfs2_rgrp_dump(seq, rgd, fs_id_buf);
commit bc40a3691f15c0728209cd0e2dc9e8e18854187f
Author: Jesper Dangaard Brouer <brouer at redhat.com>
Date:   Mon Nov 23 14:42:26 2020 +0100

    MAINTAINERS: Update page pool entry
    
    Add some file F: matches that is related to page_pool.
    
    Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
    Signed-off-by: Jesper Dangaard Brouer <brouer at redhat.com>
    Link: https://lore.kernel.org/r/160613894639.2826716.14635284017814375894.stgit@firesoul
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index ac84b34ef2ad..d0d974f44655 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13161,7 +13161,9 @@ M:	Jesper Dangaard Brouer <hawk at kernel.org>
 M:	Ilias Apalodimas <ilias.apalodimas at linaro.org>
 L:	netdev at vger.kernel.org
 S:	Supported
+F:	Documentation/networking/page_pool.rst
 F:	include/net/page_pool.h
+F:	include/trace/events/page_pool.h
 F:	net/core/page_pool.c
 
 PANASONIC LAPTOP ACPI EXTRAS DRIVER
commit 68878a5c5b852d17f5827ce8a0f6fbd8b4cdfada
Author: Zhen Lei <thunder.leizhen at huawei.com>
Date:   Tue Nov 24 18:41:00 2020 +0800

    bpftool: Fix error return value in build_btf_type_table
    
    An appropriate return value should be set on the failed path.
    
    Fixes: 4d374ba0bf30 ("tools: bpftool: implement "bpftool btf show|list"")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen at huawei.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Yonghong Song <yhs at fb.com>
    Link: https://lore.kernel.org/bpf/20201124104100.491-1-thunder.leizhen@huawei.com

diff --git a/tools/bpf/bpftool/btf.c b/tools/bpf/bpftool/btf.c
index 8ab142ff5eac..2afb7d5b1aca 100644
--- a/tools/bpf/bpftool/btf.c
+++ b/tools/bpf/bpftool/btf.c
@@ -693,6 +693,7 @@ build_btf_type_table(struct btf_attach_table *tab, enum bpf_obj_type type,
 		obj_node = calloc(1, sizeof(*obj_node));
 		if (!obj_node) {
 			p_err("failed to allocate memory: %s", strerror(errno));
+			err = -ENOMEM;
 			goto err_free;
 		}
 
commit 407c85c7ddd6b84d3cbdd2275616f70c27c17913
Author: Alexander Duyck <alexanderduyck at fb.com>
Date:   Fri Nov 20 19:47:44 2020 -0800

    tcp: Set ECT0 bit in tos/tclass for synack when BPF needs ECN
    
    When a BPF program is used to select between a type of TCP congestion
    control algorithm that uses either ECN or not there is a case where the
    synack for the frame was coming up without the ECT0 bit set. A bit of
    research found that this was due to the final socket being configured to
    dctcp while the listener socket was staying in cubic.
    
    To reproduce it all that is needed is to monitor TCP traffic while running
    the sample bpf program "samples/bpf/tcp_cong_kern.c". What is observed,
    assuming tcp_dctcp module is loaded or compiled in and the traffic matches
    the rules in the sample file, is that for all frames with the exception of
    the synack the ECT0 bit is set.
    
    To address that it is necessary to make one additional call to
    tcp_bpf_ca_needs_ecn using the request socket and then use the output of
    that to set the ECT0 bit for the tos/tclass of the packet.
    
    Fixes: 91b5b21c7c16 ("bpf: Add support for changing congestion control")
    Signed-off-by: Alexander Duyck <alexanderduyck at fb.com>
    Link: https://lore.kernel.org/r/160593039663.2604.1374502006916871573.stgit@localhost.localdomain
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index c95fcdfeed42..8391aa29e7a4 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -980,13 +980,17 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,
 
 	skb = tcp_make_synack(sk, dst, req, foc, synack_type, syn_skb);
 
-	tos = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
-			tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
-			inet_sk(sk)->tos;
-
 	if (skb) {
 		__tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr);
 
+		tos = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
+				tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
+				inet_sk(sk)->tos;
+
+		if (!INET_ECN_is_capable(tos) &&
+		    tcp_bpf_ca_needs_ecn((struct sock *)req))
+			tos |= INET_ECN_ECT_0;
+
 		rcu_read_lock();
 		err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr,
 					    ireq->ir_rmt_addr,
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index d2502911b7fa..992cbf3eb9e3 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -527,11 +527,16 @@ static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
 		if (np->repflow && ireq->pktopts)
 			fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts));
 
-		rcu_read_lock();
-		opt = ireq->ipv6_opt;
 		tclass = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
 				tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
 				np->tclass;
+
+		if (!INET_ECN_is_capable(tclass) &&
+		    tcp_bpf_ca_needs_ecn((struct sock *)req))
+			tclass |= INET_ECN_ECT_0;
+
+		rcu_read_lock();
+		opt = ireq->ipv6_opt;
 		if (!opt)
 			opt = rcu_dereference(np->opt);
 		err = ip6_xmit(sk, skb, fl6, sk->sk_mark, opt,
commit 36ccdf85829a7dd6936dba5d02fa50138471f0d3
Author: Björn Töpel <bjorn.topel at intel.com>
Date:   Mon Nov 23 18:56:00 2020 +0100

    net, xsk: Avoid taking multiple skbuff references
    
    Commit 642e450b6b59 ("xsk: Do not discard packet when NETDEV_TX_BUSY")
    addressed the problem that packets were discarded from the Tx AF_XDP
    ring, when the driver returned NETDEV_TX_BUSY. Part of the fix was
    bumping the skbuff reference count, so that the buffer would not be
    freed by dev_direct_xmit(). A reference count larger than one means
    that the skbuff is "shared", which is not the case.
    
    If the "shared" skbuff is sent to the generic XDP receive path,
    netif_receive_generic_xdp(), and pskb_expand_head() is entered the
    BUG_ON(skb_shared(skb)) will trigger.
    
    This patch adds a variant to dev_direct_xmit(), __dev_direct_xmit(),
    where a user can select the skbuff free policy. This allows AF_XDP to
    avoid bumping the reference count, but still keep the NETDEV_TX_BUSY
    behavior.
    
    Fixes: 642e450b6b59 ("xsk: Do not discard packet when NETDEV_TX_BUSY")
    Reported-by: Yonghong Song <yhs at fb.com>
    Signed-off-by: Björn Töpel <bjorn.topel at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Link: https://lore.kernel.org/bpf/20201123175600.146255-1-bjorn.topel@gmail.com

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 964b494b0e8d..76775abf259d 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2813,9 +2813,21 @@ u16 dev_pick_tx_zero(struct net_device *dev, struct sk_buff *skb,
 		     struct net_device *sb_dev);
 u16 dev_pick_tx_cpu_id(struct net_device *dev, struct sk_buff *skb,
 		       struct net_device *sb_dev);
+
 int dev_queue_xmit(struct sk_buff *skb);
 int dev_queue_xmit_accel(struct sk_buff *skb, struct net_device *sb_dev);
-int dev_direct_xmit(struct sk_buff *skb, u16 queue_id);
+int __dev_direct_xmit(struct sk_buff *skb, u16 queue_id);
+
+static inline int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
+{
+	int ret;
+
+	ret = __dev_direct_xmit(skb, queue_id);
+	if (!dev_xmit_complete(ret))
+		kfree_skb(skb);
+	return ret;
+}
+
 int register_netdevice(struct net_device *dev);
 void unregister_netdevice_queue(struct net_device *dev, struct list_head *head);
 void unregister_netdevice_many(struct list_head *head);
diff --git a/net/core/dev.c b/net/core/dev.c
index 82dc6b48e45f..8588ade790cb 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4180,7 +4180,7 @@ int dev_queue_xmit_accel(struct sk_buff *skb, struct net_device *sb_dev)
 }
 EXPORT_SYMBOL(dev_queue_xmit_accel);
 
-int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
+int __dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
 {
 	struct net_device *dev = skb->dev;
 	struct sk_buff *orig_skb = skb;
@@ -4210,17 +4210,13 @@ int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
 	dev_xmit_recursion_dec();
 
 	local_bh_enable();
-
-	if (!dev_xmit_complete(ret))
-		kfree_skb(skb);
-
 	return ret;
 drop:
 	atomic_long_inc(&dev->tx_dropped);
 	kfree_skb_list(skb);
 	return NET_XMIT_DROP;
 }
-EXPORT_SYMBOL(dev_direct_xmit);
+EXPORT_SYMBOL(__dev_direct_xmit);
 
 /*************************************************************************
  *			Receiver routines
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index 5a6cdf7b320d..b7b039bd9d03 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -411,11 +411,7 @@ static int xsk_generic_xmit(struct sock *sk)
 		skb_shinfo(skb)->destructor_arg = (void *)(long)desc.addr;
 		skb->destructor = xsk_destruct_skb;
 
-		/* Hinder dev_direct_xmit from freeing the packet and
-		 * therefore completing it in the destructor
-		 */
-		refcount_inc(&skb->users);
-		err = dev_direct_xmit(skb, xs->queue_id);
+		err = __dev_direct_xmit(skb, xs->queue_id);
 		if  (err == NETDEV_TX_BUSY) {
 			/* Tell user-space to retry the send */
 			skb->destructor = sock_wfree;
@@ -429,12 +425,10 @@ static int xsk_generic_xmit(struct sock *sk)
 		/* Ignore NET_XMIT_CN as packet might have been sent */
 		if (err == NET_XMIT_DROP) {
 			/* SKB completed but not sent */
-			kfree_skb(skb);
 			err = -EBUSY;
 			goto out;
 		}
 
-		consume_skb(skb);
 		sent_frame = true;
 	}
 
commit 5204bb683c1633e550c2124ccc2358dd645a80db
Author: Moshe Shemesh <moshe at mellanox.com>
Date:   Mon Nov 23 07:36:25 2020 +0200

    devlink: Fix reload stats structure
    
    Fix reload stats structure exposed to the user. Change stats structure
    hierarchy to have the reload action as a parent of the stat entry and
    then stat entry includes value per limit. This will also help to avoid
    string concatenation on iproute2 output.
    
    Reload stats structure before this fix:
    "stats": {
        "reload": {
            "driver_reinit": 2,
            "fw_activate": 1,
            "fw_activate_no_reset": 0
         }
    }
    
    After this fix:
    "stats": {
        "reload": {
            "driver_reinit": {
                "unspecified": 2
            },
            "fw_activate": {
                "unspecified": 1,
                "no_reset": 0
            }
    }
    
    Fixes: a254c264267e ("devlink: Add reload stats")
    Signed-off-by: Moshe Shemesh <moshe at mellanox.com>
    Reviewed-by: Jiri Pirko <jiri at nvidia.com>
    Link: https://lore.kernel.org/r/1606109785-25197-1-git-send-email-moshe@mellanox.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index 0113bc4db9f5..5203f54a2be1 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -526,6 +526,8 @@ enum devlink_attr {
 	DEVLINK_ATTR_RELOAD_STATS_LIMIT,	/* u8 */
 	DEVLINK_ATTR_RELOAD_STATS_VALUE,	/* u32 */
 	DEVLINK_ATTR_REMOTE_RELOAD_STATS,	/* nested */
+	DEVLINK_ATTR_RELOAD_ACTION_INFO,        /* nested */
+	DEVLINK_ATTR_RELOAD_ACTION_STATS,       /* nested */
 
 	/* add new attributes above here, update the policy in devlink.c */
 
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 4b0211590aac..c91e15b7a2bd 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -517,7 +517,7 @@ devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_l
 	return test_bit(limit, &devlink->ops->reload_limits);
 }
 
-static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_action action,
+static int devlink_reload_stat_put(struct sk_buff *msg,
 				   enum devlink_reload_limit limit, u32 value)
 {
 	struct nlattr *reload_stats_entry;
@@ -526,8 +526,7 @@ static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_acti
 	if (!reload_stats_entry)
 		return -EMSGSIZE;
 
-	if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_ACTION, action) ||
-	    nla_put_u8(msg, DEVLINK_ATTR_RELOAD_STATS_LIMIT, limit) ||
+	if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_STATS_LIMIT, limit) ||
 	    nla_put_u32(msg, DEVLINK_ATTR_RELOAD_STATS_VALUE, value))
 		goto nla_put_failure;
 	nla_nest_end(msg, reload_stats_entry);
@@ -540,7 +539,7 @@ nla_put_failure:
 
 static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote)
 {
-	struct nlattr *reload_stats_attr;
+	struct nlattr *reload_stats_attr, *act_info, *act_stats;
 	int i, j, stat_idx;
 	u32 value;
 
@@ -552,17 +551,29 @@ static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink
 	if (!reload_stats_attr)
 		return -EMSGSIZE;
 
-	for (j = 0; j <= DEVLINK_RELOAD_LIMIT_MAX; j++) {
-		/* Remote stats are shown even if not locally supported. Stats
-		 * of actions with unspecified limit are shown though drivers
-		 * don't need to register unspecified limit.
-		 */
-		if (!is_remote && j != DEVLINK_RELOAD_LIMIT_UNSPEC &&
-		    !devlink_reload_limit_is_supported(devlink, j))
+	for (i = 0; i <= DEVLINK_RELOAD_ACTION_MAX; i++) {
+		if ((!is_remote &&
+		     !devlink_reload_action_is_supported(devlink, i)) ||
+		    i == DEVLINK_RELOAD_ACTION_UNSPEC)
 			continue;
-		for (i = 0; i <= DEVLINK_RELOAD_ACTION_MAX; i++) {
-			if ((!is_remote && !devlink_reload_action_is_supported(devlink, i)) ||
-			    i == DEVLINK_RELOAD_ACTION_UNSPEC ||
+		act_info = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_ACTION_INFO);
+		if (!act_info)
+			goto nla_put_failure;
+
+		if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_ACTION, i))
+			goto action_info_nest_cancel;
+		act_stats = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_ACTION_STATS);
+		if (!act_stats)
+			goto action_info_nest_cancel;
+
+		for (j = 0; j <= DEVLINK_RELOAD_LIMIT_MAX; j++) {
+			/* Remote stats are shown even if not locally supported.
+			 * Stats of actions with unspecified limit are shown
+			 * though drivers don't need to register unspecified
+			 * limit.
+			 */
+			if ((!is_remote && j != DEVLINK_RELOAD_LIMIT_UNSPEC &&
+			     !devlink_reload_limit_is_supported(devlink, j)) ||
 			    devlink_reload_combination_is_invalid(i, j))
 				continue;
 
@@ -571,13 +582,19 @@ static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink
 				value = devlink->stats.reload_stats[stat_idx];
 			else
 				value = devlink->stats.remote_reload_stats[stat_idx];
-			if (devlink_reload_stat_put(msg, i, j, value))
-				goto nla_put_failure;
+			if (devlink_reload_stat_put(msg, j, value))
+				goto action_stats_nest_cancel;
 		}
+		nla_nest_end(msg, act_stats);
+		nla_nest_end(msg, act_info);
 	}
 	nla_nest_end(msg, reload_stats_attr);
 	return 0;
 
+action_stats_nest_cancel:
+	nla_nest_cancel(msg, act_stats);
+action_info_nest_cancel:
+	nla_nest_cancel(msg, act_info);
 nla_put_failure:
 	nla_nest_cancel(msg, reload_stats_attr);
 	return -EMSGSIZE;
commit 80145ac2f739558e66bd8789df3414bc0e111c58
Merge: b1489422041b 1179f170b6f0
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 24 12:15:44 2020 -0800

    Merge tag 's390-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
    
    Pull s390 fix from Heiko Carstens:
     "Disable interrupts when restoring fpu and vector registers, otherwise
      KVM guests might see corrupted register contents"
    
    * tag 's390-5.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
      s390: fix fpu restore in entry.S

commit b1489422041ba58f224270480d8241be24f0f8dd
Merge: d5beb3140f91 f737561c7096
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 24 12:12:55 2020 -0800

    Merge tag 'arc-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
    
    Pull ARC fixes from Vineet Gupta:
     "A couple more stack unwinder related fixes:
    
       - More stack unwinding updates
    
       - Misc minor fixes"
    
    * tag 'arc-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
      ARC: stack unwinding: reorganize how initial register state setup
      ARC: stack unwinding: don't assume non-current task is sleeping
      ARC: mm: fix spelling mistakes
      ARC: bitops: Remove unecessary operation and value

commit 9bd2702d292cb7b565b09e949d30288ab7a26d51
Author: Lincoln Ramsay <lincoln.ramsay at opengear.com>
Date:   Mon Nov 23 21:40:43 2020 +0000

    aquantia: Remove the build_skb path
    
    When performing IPv6 forwarding, there is an expectation that SKBs
    will have some headroom. When forwarding a packet from the aquantia
    driver, this does not always happen, triggering a kernel warning.
    
    aq_ring.c has this code (edited slightly for brevity):
    
    if (buff->is_eop && buff->len <= AQ_CFG_RX_FRAME_MAX - AQ_SKB_ALIGN) {
        skb = build_skb(aq_buf_vaddr(&buff->rxdata), AQ_CFG_RX_FRAME_MAX);
    } else {
        skb = napi_alloc_skb(napi, AQ_CFG_RX_HDR_SIZE);
    
    There is a significant difference between the SKB produced by these
    2 code paths. When napi_alloc_skb creates an SKB, there is a certain
    amount of headroom reserved. However, this is not done in the
    build_skb codepath.
    
    As the hardware buffer that build_skb is built around does not
    handle the presence of the SKB header, this code path is being
    removed and the napi_alloc_skb path will always be used. This code
    path does have to copy the packet header into the SKB, but it adds
    the packet data as a frag.
    
    Fixes: 018423e90bee ("net: ethernet: aquantia: Add ring support code")
    Signed-off-by: Lincoln Ramsay <lincoln.ramsay at opengear.com>
    Link: https://lore.kernel.org/r/MWHPR1001MB23184F3EAFA413E0D1910EC9E8FC0@MWHPR1001MB2318.namprd10.prod.outlook.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
index 4f913658eea4..24122ccda614 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
@@ -413,85 +413,63 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
 					      buff->rxdata.pg_off,
 					      buff->len, DMA_FROM_DEVICE);
 
-		/* for single fragment packets use build_skb() */
-		if (buff->is_eop &&
-		    buff->len <= AQ_CFG_RX_FRAME_MAX - AQ_SKB_ALIGN) {
-			skb = build_skb(aq_buf_vaddr(&buff->rxdata),
+		skb = napi_alloc_skb(napi, AQ_CFG_RX_HDR_SIZE);
+		if (unlikely(!skb)) {
+			u64_stats_update_begin(&self->stats.rx.syncp);
+			self->stats.rx.skb_alloc_fails++;
+			u64_stats_update_end(&self->stats.rx.syncp);
+			err = -ENOMEM;
+			goto err_exit;
+		}
+		if (is_ptp_ring)
+			buff->len -=
+				aq_ptp_extract_ts(self->aq_nic, skb,
+						  aq_buf_vaddr(&buff->rxdata),
+						  buff->len);
+
+		hdr_len = buff->len;
+		if (hdr_len > AQ_CFG_RX_HDR_SIZE)
+			hdr_len = eth_get_headlen(skb->dev,
+						  aq_buf_vaddr(&buff->rxdata),
+						  AQ_CFG_RX_HDR_SIZE);
+
+		memcpy(__skb_put(skb, hdr_len), aq_buf_vaddr(&buff->rxdata),
+		       ALIGN(hdr_len, sizeof(long)));
+
+		if (buff->len - hdr_len > 0) {
+			skb_add_rx_frag(skb, 0, buff->rxdata.page,
+					buff->rxdata.pg_off + hdr_len,
+					buff->len - hdr_len,
 					AQ_CFG_RX_FRAME_MAX);
-			if (unlikely(!skb)) {
-				u64_stats_update_begin(&self->stats.rx.syncp);
-				self->stats.rx.skb_alloc_fails++;
-				u64_stats_update_end(&self->stats.rx.syncp);
-				err = -ENOMEM;
-				goto err_exit;
-			}
-			if (is_ptp_ring)
-				buff->len -=
-					aq_ptp_extract_ts(self->aq_nic, skb,
-						aq_buf_vaddr(&buff->rxdata),
-						buff->len);
-			skb_put(skb, buff->len);
 			page_ref_inc(buff->rxdata.page);
-		} else {
-			skb = napi_alloc_skb(napi, AQ_CFG_RX_HDR_SIZE);
-			if (unlikely(!skb)) {
-				u64_stats_update_begin(&self->stats.rx.syncp);
-				self->stats.rx.skb_alloc_fails++;
-				u64_stats_update_end(&self->stats.rx.syncp);
-				err = -ENOMEM;
-				goto err_exit;
-			}
-			if (is_ptp_ring)
-				buff->len -=
-					aq_ptp_extract_ts(self->aq_nic, skb,
-						aq_buf_vaddr(&buff->rxdata),
-						buff->len);
-
-			hdr_len = buff->len;
-			if (hdr_len > AQ_CFG_RX_HDR_SIZE)
-				hdr_len = eth_get_headlen(skb->dev,
-							  aq_buf_vaddr(&buff->rxdata),
-							  AQ_CFG_RX_HDR_SIZE);
-
-			memcpy(__skb_put(skb, hdr_len), aq_buf_vaddr(&buff->rxdata),
-			       ALIGN(hdr_len, sizeof(long)));
-
-			if (buff->len - hdr_len > 0) {
-				skb_add_rx_frag(skb, 0, buff->rxdata.page,
-						buff->rxdata.pg_off + hdr_len,
-						buff->len - hdr_len,
-						AQ_CFG_RX_FRAME_MAX);
-				page_ref_inc(buff->rxdata.page);
-			}
+		}
 
-			if (!buff->is_eop) {
-				buff_ = buff;
-				i = 1U;
-				do {
-					next_ = buff_->next,
-					buff_ = &self->buff_ring[next_];
+		if (!buff->is_eop) {
+			buff_ = buff;
+			i = 1U;
+			do {
+				next_ = buff_->next;
+				buff_ = &self->buff_ring[next_];
 
-					dma_sync_single_range_for_cpu(
-							aq_nic_get_dev(self->aq_nic),
-							buff_->rxdata.daddr,
-							buff_->rxdata.pg_off,
-							buff_->len,
-							DMA_FROM_DEVICE);
-					skb_add_rx_frag(skb, i++,
-							buff_->rxdata.page,
-							buff_->rxdata.pg_off,
-							buff_->len,
-							AQ_CFG_RX_FRAME_MAX);
-					page_ref_inc(buff_->rxdata.page);
-					buff_->is_cleaned = 1;
-
-					buff->is_ip_cso &= buff_->is_ip_cso;
-					buff->is_udp_cso &= buff_->is_udp_cso;
-					buff->is_tcp_cso &= buff_->is_tcp_cso;
-					buff->is_cso_err |= buff_->is_cso_err;
+				dma_sync_single_range_for_cpu(aq_nic_get_dev(self->aq_nic),
+							      buff_->rxdata.daddr,
+							      buff_->rxdata.pg_off,
+							      buff_->len,
+							      DMA_FROM_DEVICE);
+				skb_add_rx_frag(skb, i++,
+						buff_->rxdata.page,
+						buff_->rxdata.pg_off,
+						buff_->len,
+						AQ_CFG_RX_FRAME_MAX);
+				page_ref_inc(buff_->rxdata.page);
+				buff_->is_cleaned = 1;
 
-				} while (!buff_->is_eop);
-			}
+				buff->is_ip_cso &= buff_->is_ip_cso;
+				buff->is_udp_cso &= buff_->is_udp_cso;
+				buff->is_tcp_cso &= buff_->is_tcp_cso;
+				buff->is_cso_err |= buff_->is_cso_err;
+
+			} while (!buff_->is_eop);
 		}
 
 		if (buff->is_vlan)
commit b8a9092330da2030496ff357272f342eb970d51b
Author: Nick Desaulniers <ndesaulniers at google.com>
Date:   Mon Nov 9 10:35:28 2020 -0800

    Kbuild: do not emit debug info for assembly with LLVM_IAS=1
    
    Clang's integrated assembler produces the warning for assembly files:
    
    warning: DWARF2 only supports one section per compilation unit
    
    If -Wa,-gdwarf-* is unspecified, then debug info is not emitted for
    assembly sources (it is still emitted for C sources).  This will be
    re-enabled for newer DWARF versions in a follow up patch.
    
    Enables defconfig+CONFIG_DEBUG_INFO to build cleanly with
    LLVM=1 LLVM_IAS=1 for x86_64 and arm64.
    
    Cc: <stable at vger.kernel.org>
    Link: https://github.com/ClangBuiltLinux/linux/issues/716
    Reported-by: Dmitry Golovin <dima at golovin.in>
    Reported-by: Nathan Chancellor <natechancellor at gmail.com>
    Suggested-by: Dmitry Golovin <dima at golovin.in>
    Suggested-by: Nathan Chancellor <natechancellor at gmail.com>
    Suggested-by: Sedat Dilek <sedat.dilek at gmail.com>
    Reviewed-by: Fangrui Song <maskray at google.com>
    Reviewed-by: Nathan Chancellor <natechancellor at gmail.com>
    Signed-off-by: Nick Desaulniers <ndesaulniers at google.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/Makefile b/Makefile
index 87d659d3c8de..ae1592c1f5d6 100644
--- a/Makefile
+++ b/Makefile
@@ -828,7 +828,9 @@ else
 DEBUG_CFLAGS	+= -g
 endif
 
+ifneq ($(LLVM_IAS),1)
 KBUILD_AFLAGS	+= -Wa,-gdwarf-2
+endif
 
 ifdef CONFIG_DEBUG_INFO_DWARF4
 DEBUG_CFLAGS	+= -gdwarf-4
commit a716bd7432106aed82a751409d7be851a23022ac
Author: Denys Zagorui <dzagorui at cisco.com>
Date:   Mon Nov 2 04:08:53 2020 -0800

    kbuild: use -fmacro-prefix-map for .S sources
    
    Follow-up to commit a73619a845d5 ("kbuild: use -fmacro-prefix-map to
    make __FILE__ a relative path"). Assembler sources also use __FILE__
    macro so this flag should be also applied to those sources.
    
    Signed-off-by: Denys Zagorui <dzagorui at cisco.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/Makefile b/Makefile
index ed081e3eb800..87d659d3c8de 100644
--- a/Makefile
+++ b/Makefile
@@ -946,7 +946,7 @@ KBUILD_CFLAGS   += $(call cc-option,-Werror=incompatible-pointer-types)
 KBUILD_CFLAGS   += $(call cc-option,-Werror=designated-init)
 
 # change __FILE__ to the relative path from the srctree
-KBUILD_CFLAGS	+= $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
+KBUILD_CPPFLAGS += $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
 
 # ensure -fcf-protection is disabled when using retpoline as it is
 # incompatible with -mindirect-branch=thunk-extern
commit 095fbca0a94930b58f977284ef1b759b98700f8b
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 23:03:13 2020 +0100

    Makefile.extrawarn: move -Wcast-align to W=3
    
    This warning behaves differently depending on the architecture
    and compiler. Using x86 gcc, we get no output at all because
    gcc knows the architecture can handle unaligned accesses.
    
    Using x86 clang, or gcc on an architecture that needs to
    manually deal with unaligned accesses, the build log is
    completely flooded with these warnings, as they are commonly
    invoked by inline functions of networking headers, e.g.
    
    include/linux/skbuff.h:1426:26: warning: cast increases required alignment of target type [-Wcast-align]
    
    The compiler is correct to point this out, as we are dealing
    with undefined behavior that does cause problems in practice,
    but there is also no good way to rewrite the code in commonly
    included headers to a safer method.
    
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Reviewed-by: Nathan Chancellor <natechancellor at gmail.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
index 95e4cdb94fe9..6baee1200615 100644
--- a/scripts/Makefile.extrawarn
+++ b/scripts/Makefile.extrawarn
@@ -60,7 +60,6 @@ endif
 #
 ifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),)
 
-KBUILD_CFLAGS += -Wcast-align
 KBUILD_CFLAGS += -Wdisabled-optimization
 KBUILD_CFLAGS += -Wnested-externs
 KBUILD_CFLAGS += -Wshadow
@@ -80,6 +79,7 @@ endif
 ifneq ($(findstring 3, $(KBUILD_EXTRA_WARN)),)
 
 KBUILD_CFLAGS += -Wbad-function-cast
+KBUILD_CFLAGS += -Wcast-align
 KBUILD_CFLAGS += -Wcast-qual
 KBUILD_CFLAGS += -Wconversion
 KBUILD_CFLAGS += -Wpacked
commit a14c6b0eef771c017c3549490fc321f3cd5c0e32
Author: Lukas F. Hartmann <lukas at mntre.com>
Date:   Tue Nov 24 18:26:04 2020 +0100

    panel-simple: add Innolux N125HCE-GN1
    
    The Innolux N125HCE-GN1 display is used in the MNT Reform 2.0 laptop,
    attached via eDP to a SN65DSI86 MIPI-DSI to eDP bridge.
    
    Signed-off-by: Lukas F. Hartmann <lukas at mntre.com>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201124172604.981746-1-lukas@mntre.com

diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 597f676a6591..41bbec72b2da 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -2267,6 +2267,31 @@ static const struct panel_desc innolux_n116bge = {
 	},
 };
 
+static const struct drm_display_mode innolux_n125hce_gn1_mode = {
+	.clock = 162000,
+	.hdisplay = 1920,
+	.hsync_start = 1920 + 40,
+	.hsync_end = 1920 + 40 + 40,
+	.htotal = 1920 + 40 + 40 + 80,
+	.vdisplay = 1080,
+	.vsync_start = 1080 + 4,
+	.vsync_end = 1080 + 4 + 4,
+	.vtotal = 1080 + 4 + 4 + 24,
+};
+
+static const struct panel_desc innolux_n125hce_gn1 = {
+	.modes = &innolux_n125hce_gn1_mode,
+	.num_modes = 1,
+	.bpc = 8,
+	.size = {
+		.width = 276,
+		.height = 155,
+	},
+	.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+	.bus_flags = DRM_BUS_FLAG_DATA_MSB_TO_LSB,
+	.connector_type = DRM_MODE_CONNECTOR_eDP,
+};
+
 static const struct drm_display_mode innolux_n156bge_l21_mode = {
 	.clock = 69300,
 	.hdisplay = 1366,
@@ -4122,6 +4147,9 @@ static const struct of_device_id platform_of_match[] = {
 	}, {
 		.compatible = "innolux,n116bge",
 		.data = &innolux_n116bge,
+	}, {
+		.compatible = "innolux,n125hce-gn1",
+		.data = &innolux_n125hce_gn1,
 	}, {
 		.compatible = "innolux,n156bge-l21",
 		.data = &innolux_n156bge_l21,
commit bcca3e0328fa675b7d0552da15adeef038cace79
Author: Lukas F. Hartmann <lukas at mntre.com>
Date:   Tue Nov 24 18:26:06 2020 +0100

    dt-bindings: display/panel: add Innolux N125HCE-GN1
    
    The Innolux N125HCE-GN1 display is used in the MNT Reform 2.0 laptop,
    attached via eDP to a SN65DSI86 MIPI-DSI to eDP bridge. This patch
    contains the DT binding for "innolux,n125hce-gn1".
    
    Signed-off-by: Lukas F. Hartmann <lukas at mntre.com>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    [reorder so comments comes before the compatible]
    Link: https://patchwork.freedesktop.org/patch/msgid/20201124172604.981746-2-lukas@mntre.com

diff --git a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
index f9750b0b6708..27fffafe5b5c 100644
--- a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
+++ b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
@@ -159,6 +159,8 @@ properties:
       - innolux,g121x1-l03
         # Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
       - innolux,n116bge
+        # InnoLux 13.3" FHD (1920x1080) eDP TFT LCD panel
+      - innolux,n125hce-gn1
         # InnoLux 15.6" WXGA TFT LCD panel
       - innolux,n156bge-l21
         # Innolux Corporation 7.0" WSVGA (1024x600) TFT LCD panel
commit 60734bd54679d7998a24a257b0403f7644005572
Author: Likun Gao <Likun.Gao at amd.com>
Date:   Mon Nov 23 10:28:46 2020 +0800

    drm/amdgpu: update golden setting for sienna_cichlid
    
    Update golden setting for sienna_cichlid.
    
    Signed-off-by: Likun Gao <Likun.Gao at amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org # 5.9.x

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index 3579565e0eab..55f4b8c3b933 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -3105,6 +3105,8 @@ static const struct soc15_reg_golden golden_settings_gc_10_3[] =
 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000280),
 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x00800000),
 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_EXCEPTION_CONTROL, 0x7fff0f1f, 0x00b80000),
+	SOC15_REG_GOLDEN_VALUE(GC, 0 ,mmGCEA_SDP_TAG_RESERVE0, 0xffffffff, 0x10100100),
+	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCEA_SDP_TAG_RESERVE1, 0xffffffff, 0x17000088),
 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL_Sienna_Cichlid, 0x1ff1ffff, 0x00000500),
 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGE_PC_CNTL, 0x003fffff, 0x00280400),
 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2A_ADDR_MATCH_MASK, 0xffffffff, 0xffffffcf),
commit d661155bfca329851a27bb5120fab027db43bd23
Author: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
Date:   Tue Nov 17 15:25:48 2020 -0500

    drm/amd/display: Avoid HDCP initialization in devices without output
    
    The HDCP feature requires at least one connector attached to the device;
    however, some GPUs do not have a physical output, making the HDCP
    initialization irrelevant. This patch disables HDCP initialization when
    the graphic card does not have output.
    
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0e7118000919..9b6809f309f4 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1041,7 +1041,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
 	amdgpu_dm_init_color_mod();
 
 #ifdef CONFIG_DRM_AMD_DC_HDCP
-	if (adev->asic_type >= CHIP_RAVEN) {
+	if (adev->dm.dc->caps.max_links > 0 && adev->asic_type >= CHIP_RAVEN) {
 		adev->dm.hdcp_workqueue = hdcp_create_workqueue(adev, &init_params.cp_psp, adev->dm.dc);
 
 		if (!adev->dm.hdcp_workqueue)
commit 280ffdb6ddb5de85eddd476a3bcdc19c9a80f089
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 23 11:37:17 2020 +0000

    drm/i915/gt: Free stale request on destroying the virtual engine
    
    Since preempt-to-busy, we may unsubmit a request while it is still on
    the HW and completes asynchronously. That means it may be retired and in
    the process destroy the virtual engine (as the user has closed their
    context), but that engine may still be holding onto the unsubmitted
    compelted request. Therefore we need to potentially cleanup the old
    request on destroying the virtual engine. We also have to keep the
    virtual_engine alive until after the sibling's execlists_dequeue() have
    finished peeking into the virtual engines, for which we serialise with
    RCU.
    
    v2: Be paranoid and flush the tasklet as well.
    v3: And flush the tasklet before the engines, as the tasklet may
    re-attach an rb_node after our removal from the siblings.
    
    Fixes: 6d06779e8672 ("drm/i915: Load balancing across a virtual engine")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201123113717.20500-4-chris@chris-wilson.co.uk
    (cherry picked from commit 46eecfccb4c2b0f258adbafb2e53ca3b822cd663)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 9bb16bdf93cf..0952bf157234 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -182,6 +182,7 @@
 struct virtual_engine {
 	struct intel_engine_cs base;
 	struct intel_context context;
+	struct rcu_work rcu;
 
 	/*
 	 * We allow only a single request through the virtual engine at a time
@@ -5425,33 +5426,57 @@ static struct list_head *virtual_queue(struct virtual_engine *ve)
 	return &ve->base.execlists.default_priolist.requests[0];
 }
 
-static void virtual_context_destroy(struct kref *kref)
+static void rcu_virtual_context_destroy(struct work_struct *wrk)
 {
 	struct virtual_engine *ve =
-		container_of(kref, typeof(*ve), context.ref);
+		container_of(wrk, typeof(*ve), rcu.work);
 	unsigned int n;
 
-	GEM_BUG_ON(!list_empty(virtual_queue(ve)));
-	GEM_BUG_ON(ve->request);
 	GEM_BUG_ON(ve->context.inflight);
 
+	/* Preempt-to-busy may leave a stale request behind. */
+	if (unlikely(ve->request)) {
+		struct i915_request *old;
+
+		spin_lock_irq(&ve->base.active.lock);
+
+		old = fetch_and_zero(&ve->request);
+		if (old) {
+			GEM_BUG_ON(!i915_request_completed(old));
+			__i915_request_submit(old);
+			i915_request_put(old);
+		}
+
+		spin_unlock_irq(&ve->base.active.lock);
+	}
+
+	/*
+	 * Flush the tasklet in case it is still running on another core.
+	 *
+	 * This needs to be done before we remove ourselves from the siblings'
+	 * rbtrees as in the case it is running in parallel, it may reinsert
+	 * the rb_node into a sibling.
+	 */
+	tasklet_kill(&ve->base.execlists.tasklet);
+
+	/* Decouple ourselves from the siblings, no more access allowed. */
 	for (n = 0; n < ve->num_siblings; n++) {
 		struct intel_engine_cs *sibling = ve->siblings[n];
 		struct rb_node *node = &ve->nodes[sibling->id].rb;
-		unsigned long flags;
 
 		if (RB_EMPTY_NODE(node))
 			continue;
 
-		spin_lock_irqsave(&sibling->active.lock, flags);
+		spin_lock_irq(&sibling->active.lock);
 
 		/* Detachment is lazily performed in the execlists tasklet */
 		if (!RB_EMPTY_NODE(node))
 			rb_erase_cached(node, &sibling->execlists.virtual);
 
-		spin_unlock_irqrestore(&sibling->active.lock, flags);
+		spin_unlock_irq(&sibling->active.lock);
 	}
 	GEM_BUG_ON(__tasklet_is_scheduled(&ve->base.execlists.tasklet));
+	GEM_BUG_ON(!list_empty(virtual_queue(ve)));
 
 	if (ve->context.state)
 		__execlists_context_fini(&ve->context);
@@ -5464,6 +5489,27 @@ static void virtual_context_destroy(struct kref *kref)
 	kfree(ve);
 }
 
+static void virtual_context_destroy(struct kref *kref)
+{
+	struct virtual_engine *ve =
+		container_of(kref, typeof(*ve), context.ref);
+
+	GEM_BUG_ON(!list_empty(&ve->context.signals));
+
+	/*
+	 * When destroying the virtual engine, we have to be aware that
+	 * it may still be in use from an hardirq/softirq context causing
+	 * the resubmission of a completed request (background completion
+	 * due to preempt-to-busy). Before we can free the engine, we need
+	 * to flush the submission code and tasklets that are still potentially
+	 * accessing the engine. Flushing the tasklets requires process context,
+	 * and since we can guard the resubmit onto the engine with an RCU read
+	 * lock, we can delegate the free of the engine to an RCU worker.
+	 */
+	INIT_RCU_WORK(&ve->rcu, rcu_virtual_context_destroy);
+	queue_rcu_work(system_wq, &ve->rcu);
+}
+
 static void virtual_engine_initial_hint(struct virtual_engine *ve)
 {
 	int swp;
commit 2e6ce8313a53b757b28b288bf4bb930df786e899
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 23 11:37:16 2020 +0000

    drm/i915/gt: Don't cancel the interrupt shadow too early
    
    We currently want to keep the interrupt enabled until the interrupt after
    which we have no more work to do. This heuristic was broken by us
    kicking the irq-work on adding a completed request without attaching a
    signaler -- hence it appearing to the irq-worker that an interrupt had
    fired when we were idle.
    
    Fixes: 2854d866327a ("drm/i915/gt: Replace intel_engine_transfer_stale_breadcrumbs")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201123113717.20500-3-chris@chris-wilson.co.uk
    (cherry picked from commit 3aef910d26ef48b8a79d48b006dc04383b86dd31)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index 43cfabb102ea..cf6e05ea4d8f 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -229,7 +229,7 @@ static void signal_irq_work(struct irq_work *work)
 	 * interrupt draw less ire from other users of the system and tools
 	 * like powertop.
 	 */
-	if (b->irq_armed && list_empty(&b->signalers))
+	if (!signal && b->irq_armed && list_empty(&b->signalers))
 		__intel_breadcrumbs_disarm_irq(b);
 
 	list_for_each_entry_safe(ce, cn, &b->signalers, signal_link) {
commit eb0104ee498d7f83ff98b8783181613685b8df6e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 23 11:37:15 2020 +0000

    drm/i915/gt: Track signaled breadcrumbs outside of the breadcrumb spinlock
    
    Make b->signaled_requests a lockless-list so that we can manipulate it
    outside of the b->irq_lock.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201123113717.20500-2-chris@chris-wilson.co.uk
    (cherry picked from commit 6cfe66eb71b638968350b5f0fff051fd25eb75fb)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index 8d85683314e1..43cfabb102ea 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -173,26 +173,34 @@ static void add_retire(struct intel_breadcrumbs *b, struct intel_timeline *tl)
 		intel_engine_add_retire(b->irq_engine, tl);
 }
 
-static bool __signal_request(struct i915_request *rq, struct list_head *signals)
+static bool __signal_request(struct i915_request *rq)
 {
-	clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
-
 	if (!__dma_fence_signal(&rq->fence)) {
 		i915_request_put(rq);
 		return false;
 	}
 
-	list_add_tail(&rq->signal_link, signals);
 	return true;
 }
 
+static struct llist_node *
+slist_add(struct llist_node *node, struct llist_node *head)
+{
+	node->next = head;
+	return node;
+}
+
 static void signal_irq_work(struct irq_work *work)
 {
 	struct intel_breadcrumbs *b = container_of(work, typeof(*b), irq_work);
 	const ktime_t timestamp = ktime_get();
+	struct llist_node *signal, *sn;
 	struct intel_context *ce, *cn;
 	struct list_head *pos, *next;
-	LIST_HEAD(signal);
+
+	signal = NULL;
+	if (unlikely(!llist_empty(&b->signaled_requests)))
+		signal = llist_del_all(&b->signaled_requests);
 
 	spin_lock(&b->irq_lock);
 
@@ -224,8 +232,6 @@ static void signal_irq_work(struct irq_work *work)
 	if (b->irq_armed && list_empty(&b->signalers))
 		__intel_breadcrumbs_disarm_irq(b);
 
-	list_splice_init(&b->signaled_requests, &signal);
-
 	list_for_each_entry_safe(ce, cn, &b->signalers, signal_link) {
 		GEM_BUG_ON(list_empty(&ce->signals));
 
@@ -242,7 +248,10 @@ static void signal_irq_work(struct irq_work *work)
 			 * spinlock as the callback chain may end up adding
 			 * more signalers to the same context or engine.
 			 */
-			__signal_request(rq, &signal);
+			clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
+			if (__signal_request(rq))
+				/* We own signal_node now, xfer to local list */
+				signal = slist_add(&rq->signal_node, signal);
 		}
 
 		/*
@@ -262,9 +271,9 @@ static void signal_irq_work(struct irq_work *work)
 
 	spin_unlock(&b->irq_lock);
 
-	list_for_each_safe(pos, next, &signal) {
+	llist_for_each_safe(signal, sn, signal) {
 		struct i915_request *rq =
-			list_entry(pos, typeof(*rq), signal_link);
+			llist_entry(signal, typeof(*rq), signal_node);
 		struct list_head cb_list;
 
 		spin_lock(&rq->lock);
@@ -291,7 +300,7 @@ intel_breadcrumbs_create(struct intel_engine_cs *irq_engine)
 
 	spin_lock_init(&b->irq_lock);
 	INIT_LIST_HEAD(&b->signalers);
-	INIT_LIST_HEAD(&b->signaled_requests);
+	init_llist_head(&b->signaled_requests);
 
 	init_irq_work(&b->irq_work, signal_irq_work);
 
@@ -355,7 +364,8 @@ static void insert_breadcrumb(struct i915_request *rq,
 	 * its signal completion.
 	 */
 	if (__request_completed(rq)) {
-		if (__signal_request(rq, &b->signaled_requests))
+		if (__signal_request(rq) &&
+		    llist_add(&rq->signal_node, &b->signaled_requests))
 			irq_work_queue(&b->irq_work);
 		return;
 	}
diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
index 8e53b9942695..3fa19820b37a 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
@@ -35,7 +35,7 @@ struct intel_breadcrumbs {
 	struct intel_engine_cs *irq_engine;
 
 	struct list_head signalers;
-	struct list_head signaled_requests;
+	struct llist_head signaled_requests;
 
 	struct irq_work irq_work; /* for use from inside irq_lock */
 
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h
index 16b721080195..874af6db6103 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -176,7 +176,11 @@ struct i915_request {
 	struct intel_context *context;
 	struct intel_ring *ring;
 	struct intel_timeline __rcu *timeline;
-	struct list_head signal_link;
+
+	union {
+		struct list_head signal_link;
+		struct llist_node signal_node;
+	};
 
 	/*
 	 * The rcu epoch of when this request was allocated. Used to judiciously
commit dbbf2728d50343b7947001a81f4c8cc98e4b44e5
Author: Sonny Jiang <sonny.jiang at amd.com>
Date:   Fri Nov 20 02:38:09 2020 -0500

    drm/amdgpu: fix a page fault
    
    The UVD firmware is copied to cpu addr in uvd_resume, so it
    should be used after that. This is to fix a bug introduced by
    patch drm/amdgpu: fix SI UVD firmware validate resume fail.
    
    Signed-off-by: Sonny Jiang <sonny.jiang at amd.com>
    Reviewed-by: Leo Liu <leo.liu at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    CC: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c b/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
index 3a5dce634cda..41800fcad410 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
@@ -555,13 +555,6 @@ static int uvd_v3_1_sw_init(void *handle)
 	if (r)
 		return r;
 
-	/* Retrieval firmware validate key */
-	ptr = adev->uvd.inst[0].cpu_addr;
-	ptr += 192 + 16;
-	memcpy(&ucode_len, ptr, 4);
-	ptr += ucode_len;
-	memcpy(&adev->uvd.keyselect, ptr, 4);
-
 	ring = &adev->uvd.inst->ring;
 	sprintf(ring->name, "uvd");
 	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0,
@@ -573,6 +566,13 @@ static int uvd_v3_1_sw_init(void *handle)
 	if (r)
 		return r;
 
+	/* Retrieval firmware validate key */
+	ptr = adev->uvd.inst[0].cpu_addr;
+	ptr += 192 + 16;
+	memcpy(&ucode_len, ptr, 4);
+	ptr += ucode_len;
+	memcpy(&adev->uvd.keyselect, ptr, 4);
+
 	r = amdgpu_uvd_entity_init(adev);
 
 	return r;
commit 4d6a95366117b241bb3298e1c318a36ebb7544d0
Author: Sonny Jiang <sonny.jiang at amd.com>
Date:   Fri Nov 6 16:42:47 2020 -0500

    drm/amdgpu: fix SI UVD firmware validate resume fail
    
    The SI UVD firmware validate key is stored at the end of firmware,
    which is changed during resume while playing video. So get the key
    at sw_init and store it for fw validate using.
    
    Signed-off-by: Sonny Jiang <sonny.jiang at amd.com>
    Reviewed-by: Leo Liu <leo.liu at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
index 5eb63288d157..edbb8194ee81 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
@@ -67,6 +67,7 @@ struct amdgpu_uvd {
 	unsigned		harvest_config;
 	/* store image width to adjust nb memory state */
 	unsigned		decode_image_width;
+	uint32_t                keyselect;
 };
 
 int amdgpu_uvd_sw_init(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c b/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
index 7cf4b11a65c5..3a5dce634cda 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
@@ -277,15 +277,8 @@ static void uvd_v3_1_mc_resume(struct amdgpu_device *adev)
  */
 static int uvd_v3_1_fw_validate(struct amdgpu_device *adev)
 {
-	void *ptr;
-	uint32_t ucode_len, i;
-	uint32_t keysel;
-
-	ptr = adev->uvd.inst[0].cpu_addr;
-	ptr += 192 + 16;
-	memcpy(&ucode_len, ptr, 4);
-	ptr += ucode_len;
-	memcpy(&keysel, ptr, 4);
+	int i;
+	uint32_t keysel = adev->uvd.keyselect;
 
 	WREG32(mmUVD_FW_START, keysel);
 
@@ -550,6 +543,8 @@ static int uvd_v3_1_sw_init(void *handle)
 	struct amdgpu_ring *ring;
 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 	int r;
+	void *ptr;
+	uint32_t ucode_len;
 
 	/* UVD TRAP */
 	r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 124, &adev->uvd.inst->irq);
@@ -560,6 +555,13 @@ static int uvd_v3_1_sw_init(void *handle)
 	if (r)
 		return r;
 
+	/* Retrieval firmware validate key */
+	ptr = adev->uvd.inst[0].cpu_addr;
+	ptr += 192 + 16;
+	memcpy(&ucode_len, ptr, 4);
+	ptr += ucode_len;
+	memcpy(&adev->uvd.keyselect, ptr, 4);
+
 	ring = &adev->uvd.inst->ring;
 	sprintf(ring->name, "uvd");
 	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0,
commit 7acc79eb5f78d3d1aa5dd21fc0a0329f1b7f2be5
Author: Kenneth Feng <kenneth.feng at amd.com>
Date:   Tue Nov 17 21:10:59 2020 +0800

    drm/amd/amdgpu: fix null pointer in runtime pm
    
    fix the null pointer issue when runtime pm is triggered.
    
    Signed-off-by: Kenneth Feng <kenneth.feng at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index e3783f5a459d..026789b466db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -4852,7 +4852,7 @@ int amdgpu_device_baco_enter(struct drm_device *dev)
 	if (!amdgpu_device_supports_baco(adev_to_drm(adev)))
 		return -ENOTSUPP;
 
-	if (ras && ras->supported)
+	if (ras && ras->supported && adev->nbio.funcs->enable_doorbell_interrupt)
 		adev->nbio.funcs->enable_doorbell_interrupt(adev, false);
 
 	return amdgpu_dpm_baco_enter(adev);
@@ -4871,7 +4871,7 @@ int amdgpu_device_baco_exit(struct drm_device *dev)
 	if (ret)
 		return ret;
 
-	if (ras && ras->supported)
+	if (ras && ras->supported && adev->nbio.funcs->enable_doorbell_interrupt)
 		adev->nbio.funcs->enable_doorbell_interrupt(adev, true);
 
 	return 0;
commit 08b49e14ec4f88f87a3a8443fca944dc2768066b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 23 11:37:14 2020 +0000

    drm/i915/gt: Defer enabling the breadcrumb interrupt to after submission
    
    Move the register slow register write and readback from out of the
    critical path for execlists submission and delay it until the following
    worker, shaving off around 200us. Note that the same signal_irq_work() is
    allowed to run concurrently on each CPU (but it will only be queued once,
    once running though it can be requeued and reexecuted) so we have to
    remember to lock the global interactions as we cannot rely on the
    signal_irq_work() itself providing the serialisation (in constrast to a
    tasklet).
    
    By pushing the arm/disarm into the central signaling worker we can close
    the race for disarming the interrupt (and dropping its associated
    GT wakeref) on parking the engine. If we loose the race, that GT wakeref
    may be held indefinitely, preventing the machine from sleeping while
    the GPU is ostensibly idle.
    
    v2: Move the self-arming parking of the signal_irq_work to a flush of
    the irq-work from intel_breadcrumbs_park().
    
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2271
    Fixes: e23005604b2f ("drm/i915/gt: Hold context/request reference while breadcrumbs are active")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201123113717.20500-1-chris@chris-wilson.co.uk
    (cherry picked from commit 9d5612ca165a58aacc160465532e7998b9aab270)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index d8b206e53660..8d85683314e1 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -30,18 +30,21 @@
 #include "i915_trace.h"
 #include "intel_breadcrumbs.h"
 #include "intel_context.h"
+#include "intel_engine_pm.h"
 #include "intel_gt_pm.h"
 #include "intel_gt_requests.h"
 
-static void irq_enable(struct intel_engine_cs *engine)
+static bool irq_enable(struct intel_engine_cs *engine)
 {
 	if (!engine->irq_enable)
-		return;
+		return false;
 
 	/* Caller disables interrupts */
 	spin_lock(&engine->gt->irq_lock);
 	engine->irq_enable(engine);
 	spin_unlock(&engine->gt->irq_lock);
+
+	return true;
 }
 
 static void irq_disable(struct intel_engine_cs *engine)
@@ -57,12 +60,11 @@ static void irq_disable(struct intel_engine_cs *engine)
 
 static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
 {
-	lockdep_assert_held(&b->irq_lock);
-
-	if (!b->irq_engine || b->irq_armed)
-		return;
-
-	if (!intel_gt_pm_get_if_awake(b->irq_engine->gt))
+	/*
+	 * Since we are waiting on a request, the GPU should be busy
+	 * and should have its own rpm reference.
+	 */
+	if (GEM_WARN_ON(!intel_gt_pm_get_if_awake(b->irq_engine->gt)))
 		return;
 
 	/*
@@ -73,25 +75,24 @@ static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
 	 */
 	WRITE_ONCE(b->irq_armed, true);
 
-	/*
-	 * Since we are waiting on a request, the GPU should be busy
-	 * and should have its own rpm reference. This is tracked
-	 * by i915->gt.awake, we can forgo holding our own wakref
-	 * for the interrupt as before i915->gt.awake is released (when
-	 * the driver is idle) we disarm the breadcrumbs.
-	 */
-
-	if (!b->irq_enabled++)
-		irq_enable(b->irq_engine);
+	/* Requests may have completed before we could enable the interrupt. */
+	if (!b->irq_enabled++ && irq_enable(b->irq_engine))
+		irq_work_queue(&b->irq_work);
 }
 
-static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b)
+static void intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
 {
-	lockdep_assert_held(&b->irq_lock);
-
-	if (!b->irq_engine || !b->irq_armed)
+	if (!b->irq_engine)
 		return;
 
+	spin_lock(&b->irq_lock);
+	if (!b->irq_armed)
+		__intel_breadcrumbs_arm_irq(b);
+	spin_unlock(&b->irq_lock);
+}
+
+static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b)
+{
 	GEM_BUG_ON(!b->irq_enabled);
 	if (!--b->irq_enabled)
 		irq_disable(b->irq_engine);
@@ -105,8 +106,6 @@ static void add_signaling_context(struct intel_breadcrumbs *b,
 {
 	intel_context_get(ce);
 	list_add_tail(&ce->signal_link, &b->signalers);
-	if (list_is_first(&ce->signal_link, &b->signalers))
-		__intel_breadcrumbs_arm_irq(b);
 }
 
 static void remove_signaling_context(struct intel_breadcrumbs *b,
@@ -197,7 +196,32 @@ static void signal_irq_work(struct irq_work *work)
 
 	spin_lock(&b->irq_lock);
 
-	if (list_empty(&b->signalers))
+	/*
+	 * Keep the irq armed until the interrupt after all listeners are gone.
+	 *
+	 * Enabling/disabling the interrupt is rather costly, roughly a couple
+	 * of hundred microseconds. If we are proactive and enable/disable
+	 * the interrupt around every request that wants a breadcrumb, we
+	 * quickly drown in the extra orders of magnitude of latency imposed
+	 * on request submission.
+	 *
+	 * So we try to be lazy, and keep the interrupts enabled until no
+	 * more listeners appear within a breadcrumb interrupt interval (that
+	 * is until a request completes that no one cares about). The
+	 * observation is that listeners come in batches, and will often
+	 * listen to a bunch of requests in succession. Though note on icl+,
+	 * interrupts are always enabled due to concerns with rc6 being
+	 * dysfunctional with per-engine interrupt masking.
+	 *
+	 * We also try to avoid raising too many interrupts, as they may
+	 * be generated by userspace batches and it is unfortunately rather
+	 * too easy to drown the CPU under a flood of GPU interrupts. Thus
+	 * whenever no one appears to be listening, we turn off the interrupts.
+	 * Fewer interrupts should conserve power -- at the very least, fewer
+	 * interrupt draw less ire from other users of the system and tools
+	 * like powertop.
+	 */
+	if (b->irq_armed && list_empty(&b->signalers))
 		__intel_breadcrumbs_disarm_irq(b);
 
 	list_splice_init(&b->signaled_requests, &signal);
@@ -251,6 +275,9 @@ static void signal_irq_work(struct irq_work *work)
 
 		i915_request_put(rq);
 	}
+
+	if (!READ_ONCE(b->irq_armed) && !list_empty(&b->signalers))
+		intel_breadcrumbs_arm_irq(b);
 }
 
 struct intel_breadcrumbs *
@@ -292,21 +319,22 @@ void intel_breadcrumbs_reset(struct intel_breadcrumbs *b)
 
 void intel_breadcrumbs_park(struct intel_breadcrumbs *b)
 {
-	unsigned long flags;
-
-	if (!READ_ONCE(b->irq_armed))
-		return;
-
-	spin_lock_irqsave(&b->irq_lock, flags);
-	__intel_breadcrumbs_disarm_irq(b);
-	spin_unlock_irqrestore(&b->irq_lock, flags);
-
-	if (!list_empty(&b->signalers))
-		irq_work_queue(&b->irq_work);
+	/* Kick the work once more to drain the signalers */
+	irq_work_sync(&b->irq_work);
+	while (unlikely(READ_ONCE(b->irq_armed))) {
+		local_irq_disable();
+		signal_irq_work(&b->irq_work);
+		local_irq_enable();
+		cond_resched();
+	}
+	GEM_BUG_ON(!list_empty(&b->signalers));
 }
 
 void intel_breadcrumbs_free(struct intel_breadcrumbs *b)
 {
+	irq_work_sync(&b->irq_work);
+	GEM_BUG_ON(!list_empty(&b->signalers));
+	GEM_BUG_ON(b->irq_armed);
 	kfree(b);
 }
 
@@ -362,9 +390,12 @@ static void insert_breadcrumb(struct i915_request *rq,
 	GEM_BUG_ON(!check_signal_order(ce, rq));
 	set_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
 
-	/* Check after attaching to irq, interrupt may have already fired. */
-	if (__request_completed(rq))
-		irq_work_queue(&b->irq_work);
+	/*
+	 * Defer enabling the interrupt to after HW submission and recheck
+	 * the request as it may have completed and raised the interrupt as
+	 * we were attaching it into the lists.
+	 */
+	irq_work_queue(&b->irq_work);
 }
 
 bool i915_request_enable_breadcrumb(struct i915_request *rq)
commit b5e420f4595003c8c4669b2274bc5fa3856fc1be
Author: Yan Zhao <yan.y.zhao at intel.com>
Date:   Thu Sep 10 11:54:05 2020 +0800

    drm/i915/gvt: correct a false comment of flag F_UNALIGN
    
    Correct falsely removed comment of flag F_UNALIGN.
    
    Fixes: a6c5817a38cf ("drm/i915/gvt: remove flag F_CMD_ACCESSED")
    Reviewed-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Signed-off-by: Yan Zhao <yan.y.zhao at intel.com>
    Signed-off-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20200910035405.20273-1-yan.y.zhao@intel.com
    (cherry picked from commit 6594094f819e0020e926e137e47e2edb97ba500b)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index 9831361f181e..a81cf0f01e78 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -255,7 +255,7 @@ struct intel_gvt_mmio {
 #define F_CMD_ACCESS	(1 << 3)
 /* This reg has been accessed by a VM */
 #define F_ACCESSED	(1 << 4)
-/* This reg has been accessed through GPU commands */
+/* This reg could be accessed by unaligned address */
 #define F_UNALIGN	(1 << 6)
 /* This reg is in GVT's mmio save-restor list and in hardware
  * logical context image
commit 0305613dbcf42b6b27ddf516fea2738dfbfdb7c0
Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Tue Nov 17 15:01:24 2020 +0200

    drm/i915/perf: workaround register corruption in OATAILPTR
    
    After having written the entire OA buffer with reports, the HW will
    write again at the beginning of the OA buffer. It'll indicate it by
    setting the WRAP bits in the OASTATUS register.
    
    When a wrap happens and that at the end of the read vfunc we write the
    OASTATUS register back to clear the REPORT_LOST bit, we sometimes see
    that the OATAILPTR register is reset to a previous position on Gen8/9
    (apparently not the case on Gen11+). This leads the next call to the
    read vfunc to process reports we've already read. Because we've marked
    those as read by clearing the reason & timestamp dwords, they're
    discarded and a "Skipping spurious, invalid OA report" message is
    emitted.
    
    The workaround to avoid this OATAILPTR value reset seems to be to set
    the wrap bits when writing back OASTATUS.
    
    This change has no impact on userspace, it only avoids a bunch of
    DRM_NOTE("Skipping spurious, invalid OA report\n") messages.
    
    Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
    Fixes: 19f81df2859eb1 ("drm/i915/perf: Add OA unit support for Gen 8+")
    Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117130124.829979-1-lionel.g.landwerlin@intel.com
    (cherry picked from commit 059a0beb486344a577ff476acce75e69eab704be)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index e94976976571..3640d0e229d2 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -909,8 +909,13 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
 				       DRM_I915_PERF_RECORD_OA_REPORT_LOST);
 		if (ret)
 			return ret;
-		intel_uncore_write(uncore, oastatus_reg,
-				   oastatus & ~GEN8_OASTATUS_REPORT_LOST);
+
+		intel_uncore_rmw(uncore, oastatus_reg,
+				 GEN8_OASTATUS_COUNTER_OVERFLOW |
+				 GEN8_OASTATUS_REPORT_LOST,
+				 IS_GEN_RANGE(uncore->i915, 8, 10) ?
+				 (GEN8_OASTATUS_HEAD_POINTER_WRAP |
+				  GEN8_OASTATUS_TAIL_POINTER_WRAP) : 0);
 	}
 
 	return gen8_append_oa_reports(stream, buf, count, offset);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 664f3bf9af03..5cd83eac940c 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -676,6 +676,8 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define  GEN7_OASTATUS2_MEM_SELECT_GGTT     (1 << 0) /* 0: PPGTT, 1: GGTT */
 
 #define GEN8_OASTATUS _MMIO(0x2b08)
+#define  GEN8_OASTATUS_TAIL_POINTER_WRAP    (1 << 17)
+#define  GEN8_OASTATUS_HEAD_POINTER_WRAP    (1 << 16)
 #define  GEN8_OASTATUS_OVERRUN_STATUS	    (1 << 3)
 #define  GEN8_OASTATUS_COUNTER_OVERFLOW     (1 << 2)
 #define  GEN8_OASTATUS_OABUFFER_OVERFLOW    (1 << 1)
commit 6e1d2bc675bd57640f5658a4a657ae488db4c204
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Nov 20 11:28:35 2020 +0100

    intel_idle: Fix intel_idle() vs tracing
    
    cpuidle->enter() callbacks should not call into tracing because RCU
    has already been disabled. Instead of doing the broadcast thing
    itself, simply advertise to the cpuidle core that those states stop
    the timer.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
    Link: https://lkml.kernel.org/r/20201123143510.GR3021@hirez.programming.kicks-ass.net

diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index 01bace49a962..7ee7ffe22ae3 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -126,26 +126,9 @@ static __cpuidle int intel_idle(struct cpuidle_device *dev,
 	struct cpuidle_state *state = &drv->states[index];
 	unsigned long eax = flg2MWAIT(state->flags);
 	unsigned long ecx = 1; /* break on interrupt flag */
-	bool tick;
-
-	if (!static_cpu_has(X86_FEATURE_ARAT)) {
-		/*
-		 * Switch over to one-shot tick broadcast if the target C-state
-		 * is deeper than C1.
-		 */
-		if ((eax >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK) {
-			tick = true;
-			tick_broadcast_enter();
-		} else {
-			tick = false;
-		}
-	}
 
 	mwait_idle_with_hints(eax, ecx);
 
-	if (!static_cpu_has(X86_FEATURE_ARAT) && tick)
-		tick_broadcast_exit();
-
 	return index;
 }
 
@@ -1227,6 +1210,20 @@ static bool __init intel_idle_acpi_cst_extract(void)
 	return false;
 }
 
+static bool __init intel_idle_state_needs_timer_stop(struct cpuidle_state *state)
+{
+	unsigned long eax = flg2MWAIT(state->flags);
+
+	if (boot_cpu_has(X86_FEATURE_ARAT))
+		return false;
+
+	/*
+	 * Switch over to one-shot tick broadcast if the target C-state
+	 * is deeper than C1.
+	 */
+	return !!((eax >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK);
+}
+
 static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv)
 {
 	int cstate, limit = min_t(int, CPUIDLE_STATE_MAX, acpi_state_table.count);
@@ -1269,6 +1266,9 @@ static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv)
 		if (disabled_states_mask & BIT(cstate))
 			state->flags |= CPUIDLE_FLAG_OFF;
 
+		if (intel_idle_state_needs_timer_stop(state))
+			state->flags |= CPUIDLE_FLAG_TIMER_STOP;
+
 		state->enter = intel_idle;
 		state->enter_s2idle = intel_idle_s2idle;
 	}
@@ -1507,6 +1507,9 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
 		     !(cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_ALWAYS_ENABLE)))
 			drv->states[drv->state_count].flags |= CPUIDLE_FLAG_OFF;
 
+		if (intel_idle_state_needs_timer_stop(&drv->states[drv->state_count]))
+			drv->states[drv->state_count].flags |= CPUIDLE_FLAG_TIMER_STOP;
+
 		drv->state_count++;
 	}
 
commit 58c644ba512cfbc2e39b758dd979edd1d6d00e27
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Nov 20 11:50:35 2020 +0100

    sched/idle: Fix arch_cpu_idle() vs tracing
    
    We call arch_cpu_idle() with RCU disabled, but then use
    local_irq_{en,dis}able(), which invokes tracing, which relies on RCU.
    
    Switch all arch_cpu_idle() implementations to use
    raw_local_irq_{en,dis}able() and carefully manage the
    lockdep,rcu,tracing state like we do in entry.
    
    (XXX: we really should change arch_cpu_idle() to not return with
    interrupts enabled)
    
    Reported-by: Sven Schnelle <svens at linux.ibm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Reviewed-by: Mark Rutland <mark.rutland at arm.com>
    Tested-by: Mark Rutland <mark.rutland at arm.com>
    Link: https://lkml.kernel.org/r/20201120114925.594122626@infradead.org

diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index 7462a7911002..4c7b0414a3ff 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -57,7 +57,7 @@ EXPORT_SYMBOL(pm_power_off);
 void arch_cpu_idle(void)
 {
 	wtint(0);
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 void arch_cpu_idle_dead(void)
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 8e6ace03e960..9f199b1e8383 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -71,7 +71,7 @@ void arch_cpu_idle(void)
 		arm_pm_idle();
 	else
 		cpu_do_idle();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 void arch_cpu_idle_prepare(void)
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 4784011cecac..9ebe02574127 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -126,7 +126,7 @@ void arch_cpu_idle(void)
 	 * tricks
 	 */
 	cpu_do_idle();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
diff --git a/arch/csky/kernel/process.c b/arch/csky/kernel/process.c
index f730869e21ee..69af6bc87e64 100644
--- a/arch/csky/kernel/process.c
+++ b/arch/csky/kernel/process.c
@@ -102,6 +102,6 @@ void arch_cpu_idle(void)
 #ifdef CONFIG_CPU_PM_STOP
 	asm volatile("stop\n");
 #endif
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 #endif
diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
index aea0a40b77a9..bc1364db58fe 100644
--- a/arch/h8300/kernel/process.c
+++ b/arch/h8300/kernel/process.c
@@ -57,7 +57,7 @@ asmlinkage void ret_from_kernel_thread(void);
  */
 void arch_cpu_idle(void)
 {
-	local_irq_enable();
+	raw_local_irq_enable();
 	__asm__("sleep");
 }
 
diff --git a/arch/hexagon/kernel/process.c b/arch/hexagon/kernel/process.c
index 5a0a95d93ddb..67767c5ed98c 100644
--- a/arch/hexagon/kernel/process.c
+++ b/arch/hexagon/kernel/process.c
@@ -44,7 +44,7 @@ void arch_cpu_idle(void)
 {
 	__vmwait();
 	/*  interrupts wake us up, but irqs are still disabled */
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /*
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index 6b61a703bcf5..c9ff8796b509 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -239,7 +239,7 @@ void arch_cpu_idle(void)
 	if (mark_idle)
 		(*mark_idle)(1);
 
-	safe_halt();
+	raw_safe_halt();
 
 	if (mark_idle)
 		(*mark_idle)(0);
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c
index a9e46e525cd0..f99860771ff4 100644
--- a/arch/microblaze/kernel/process.c
+++ b/arch/microblaze/kernel/process.c
@@ -149,5 +149,5 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs)
 
 void arch_cpu_idle(void)
 {
-       local_irq_enable();
+       raw_local_irq_enable();
 }
diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c
index 5bc3b04693c7..18e69ebf5691 100644
--- a/arch/mips/kernel/idle.c
+++ b/arch/mips/kernel/idle.c
@@ -33,19 +33,19 @@ static void __cpuidle r3081_wait(void)
 {
 	unsigned long cfg = read_c0_conf();
 	write_c0_conf(cfg | R30XX_CONF_HALT);
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 static void __cpuidle r39xx_wait(void)
 {
 	if (!need_resched())
 		write_c0_conf(read_c0_conf() | TX39_CONF_HALT);
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 void __cpuidle r4k_wait(void)
 {
-	local_irq_enable();
+	raw_local_irq_enable();
 	__r4k_wait();
 }
 
@@ -64,7 +64,7 @@ void __cpuidle r4k_wait_irqoff(void)
 		"	.set	arch=r4000	\n"
 		"	wait			\n"
 		"	.set	pop		\n");
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /*
@@ -84,7 +84,7 @@ static void __cpuidle rm7k_wait_irqoff(void)
 		"	wait						\n"
 		"	mtc0	$1, $12		# stalls until W stage	\n"
 		"	.set	pop					\n");
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /*
@@ -257,7 +257,7 @@ void arch_cpu_idle(void)
 	if (cpu_wait)
 		cpu_wait();
 	else
-		local_irq_enable();
+		raw_local_irq_enable();
 }
 
 #ifdef CONFIG_CPU_IDLE
diff --git a/arch/nios2/kernel/process.c b/arch/nios2/kernel/process.c
index 4ffe857e6ada..50b4eb19a6cc 100644
--- a/arch/nios2/kernel/process.c
+++ b/arch/nios2/kernel/process.c
@@ -33,7 +33,7 @@ EXPORT_SYMBOL(pm_power_off);
 
 void arch_cpu_idle(void)
 {
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /*
diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
index 0ff391f00334..3c98728cce24 100644
--- a/arch/openrisc/kernel/process.c
+++ b/arch/openrisc/kernel/process.c
@@ -79,7 +79,7 @@ void machine_power_off(void)
  */
 void arch_cpu_idle(void)
 {
-	local_irq_enable();
+	raw_local_irq_enable();
 	if (mfspr(SPR_UPR) & SPR_UPR_PMP)
 		mtspr(SPR_PMR, mfspr(SPR_PMR) | SPR_PMR_DME);
 }
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
index f196d96e2f9f..a92a23d6acd9 100644
--- a/arch/parisc/kernel/process.c
+++ b/arch/parisc/kernel/process.c
@@ -169,7 +169,7 @@ void __cpuidle arch_cpu_idle_dead(void)
 
 void __cpuidle arch_cpu_idle(void)
 {
-	local_irq_enable();
+	raw_local_irq_enable();
 
 	/* nop on real hardware, qemu will idle sleep. */
 	asm volatile("or %%r10,%%r10,%%r10\n":::);
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c
index ae0e2632393d..1f835539fda4 100644
--- a/arch/powerpc/kernel/idle.c
+++ b/arch/powerpc/kernel/idle.c
@@ -52,9 +52,9 @@ void arch_cpu_idle(void)
 		 * interrupts enabled, some don't.
 		 */
 		if (irqs_disabled())
-			local_irq_enable();
+			raw_local_irq_enable();
 	} else {
-		local_irq_enable();
+		raw_local_irq_enable();
 		/*
 		 * Go into low thread priority and possibly
 		 * low power mode.
diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
index 19225ec65db6..dd5f985b1f40 100644
--- a/arch/riscv/kernel/process.c
+++ b/arch/riscv/kernel/process.c
@@ -36,7 +36,7 @@ extern asmlinkage void ret_from_kernel_thread(void);
 void arch_cpu_idle(void)
 {
 	wait_for_interrupt();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 void show_regs(struct pt_regs *regs)
diff --git a/arch/s390/kernel/idle.c b/arch/s390/kernel/idle.c
index f7f1e64e0d98..2b85096964f8 100644
--- a/arch/s390/kernel/idle.c
+++ b/arch/s390/kernel/idle.c
@@ -33,10 +33,10 @@ void enabled_wait(void)
 		PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;
 	clear_cpu_flag(CIF_NOHZ_DELAY);
 
-	local_irq_save(flags);
+	raw_local_irq_save(flags);
 	/* Call the assembler magic in entry.S */
 	psw_idle(idle, psw_mask);
-	local_irq_restore(flags);
+	raw_local_irq_restore(flags);
 
 	/* Account time spent with enabled wait psw loaded as idle time. */
 	raw_write_seqcount_begin(&idle->seqcount);
@@ -123,7 +123,7 @@ void arch_cpu_idle_enter(void)
 void arch_cpu_idle(void)
 {
 	enabled_wait();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 void arch_cpu_idle_exit(void)
diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c
index 0dc0f52f9bb8..f59814983bd5 100644
--- a/arch/sh/kernel/idle.c
+++ b/arch/sh/kernel/idle.c
@@ -22,7 +22,7 @@ static void (*sh_idle)(void);
 void default_idle(void)
 {
 	set_bl_bit();
-	local_irq_enable();
+	raw_local_irq_enable();
 	/* Isn't this racy ? */
 	cpu_sleep();
 	clear_bl_bit();
diff --git a/arch/sparc/kernel/leon_pmc.c b/arch/sparc/kernel/leon_pmc.c
index 065e2d4b7290..396f46bca52e 100644
--- a/arch/sparc/kernel/leon_pmc.c
+++ b/arch/sparc/kernel/leon_pmc.c
@@ -50,7 +50,7 @@ static void pmc_leon_idle_fixup(void)
 	register unsigned int address = (unsigned int)leon3_irqctrl_regs;
 
 	/* Interrupts need to be enabled to not hang the CPU */
-	local_irq_enable();
+	raw_local_irq_enable();
 
 	__asm__ __volatile__ (
 		"wr	%%g0, %%asr19\n"
@@ -66,7 +66,7 @@ static void pmc_leon_idle_fixup(void)
 static void pmc_leon_idle(void)
 {
 	/* Interrupts need to be enabled to not hang the CPU */
-	local_irq_enable();
+	raw_local_irq_enable();
 
 	/* For systems without power-down, this will be no-op */
 	__asm__ __volatile__ ("wr	%g0, %asr19\n\t");
diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c
index adfcaeab3ddc..a02363735915 100644
--- a/arch/sparc/kernel/process_32.c
+++ b/arch/sparc/kernel/process_32.c
@@ -74,7 +74,7 @@ void arch_cpu_idle(void)
 {
 	if (sparc_idle)
 		(*sparc_idle)();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
index a75093b993f9..6f8c7822fc06 100644
--- a/arch/sparc/kernel/process_64.c
+++ b/arch/sparc/kernel/process_64.c
@@ -62,11 +62,11 @@ void arch_cpu_idle(void)
 {
 	if (tlb_type != hypervisor) {
 		touch_nmi_watchdog();
-		local_irq_enable();
+		raw_local_irq_enable();
 	} else {
 		unsigned long pstate;
 
-		local_irq_enable();
+		raw_local_irq_enable();
 
                 /* The sun4v sleeping code requires that we have PSTATE.IE cleared over
                  * the cpu sleep hypervisor call.
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index 3bed09538dd9..9505a7e87396 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -217,7 +217,7 @@ void arch_cpu_idle(void)
 {
 	cpu_tasks[current_thread_info()->cpu].pid = os_getpid();
 	um_idle_sleep();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 int __cant_sleep(void) {
diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h
index e039a933aca3..29dd27b5a339 100644
--- a/arch/x86/include/asm/mwait.h
+++ b/arch/x86/include/asm/mwait.h
@@ -88,8 +88,6 @@ static inline void __mwaitx(unsigned long eax, unsigned long ebx,
 
 static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
 {
-	trace_hardirqs_on();
-
 	mds_idle_clear_cpu_buffers();
 	/* "mwait %eax, %ecx;" */
 	asm volatile("sti; .byte 0x0f, 0x01, 0xc9;"
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index ba4593a913fa..145a7ac0c19a 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -685,7 +685,7 @@ void arch_cpu_idle(void)
  */
 void __cpuidle default_idle(void)
 {
-	safe_halt();
+	raw_safe_halt();
 }
 #if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
 EXPORT_SYMBOL(default_idle);
@@ -736,6 +736,8 @@ void stop_this_cpu(void *dummy)
 /*
  * AMD Erratum 400 aware idle routine. We handle it the same way as C3 power
  * states (local apic timer and TSC stop).
+ *
+ * XXX this function is completely buggered vs RCU and tracing.
  */
 static void amd_e400_idle(void)
 {
@@ -757,9 +759,9 @@ static void amd_e400_idle(void)
 	 * The switch back from broadcast mode needs to be called with
 	 * interrupts disabled.
 	 */
-	local_irq_disable();
+	raw_local_irq_disable();
 	tick_broadcast_exit();
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /*
@@ -801,9 +803,9 @@ static __cpuidle void mwait_idle(void)
 		if (!need_resched())
 			__sti_mwait(0, 0);
 		else
-			local_irq_enable();
+			raw_local_irq_enable();
 	} else {
-		local_irq_enable();
+		raw_local_irq_enable();
 	}
 	__current_clr_polling();
 }
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index 24d0ee26377d..c6932b8f4467 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -78,7 +78,7 @@ void __weak arch_cpu_idle_dead(void) { }
 void __weak arch_cpu_idle(void)
 {
 	cpu_idle_force_poll = 1;
-	local_irq_enable();
+	raw_local_irq_enable();
 }
 
 /**
@@ -94,9 +94,35 @@ void __cpuidle default_idle_call(void)
 
 		trace_cpu_idle(1, smp_processor_id());
 		stop_critical_timings();
+
+		/*
+		 * arch_cpu_idle() is supposed to enable IRQs, however
+		 * we can't do that because of RCU and tracing.
+		 *
+		 * Trace IRQs enable here, then switch off RCU, and have
+		 * arch_cpu_idle() use raw_local_irq_enable(). Note that
+		 * rcu_idle_enter() relies on lockdep IRQ state, so switch that
+		 * last -- this is very similar to the entry code.
+		 */
+		trace_hardirqs_on_prepare();
+		lockdep_hardirqs_on_prepare(_THIS_IP_);
 		rcu_idle_enter();
+		lockdep_hardirqs_on(_THIS_IP_);
+
 		arch_cpu_idle();
+
+		/*
+		 * OK, so IRQs are enabled here, but RCU needs them disabled to
+		 * turn itself back on.. funny thing is that disabling IRQs
+		 * will cause tracing, which needs RCU. Jump through hoops to
+		 * make it 'work'.
+		 */
+		raw_local_irq_disable();
+		lockdep_hardirqs_off(_THIS_IP_);
 		rcu_idle_exit();
+		lockdep_hardirqs_on(_THIS_IP_);
+		raw_local_irq_enable();
+
 		start_critical_timings();
 		trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
 	}
commit 1187ffc41bcad915b5defdfd0ddad4acab9670d0
Author: Simon Ser <contact at emersion.fr>
Date:   Fri Nov 20 11:06:22 2020 +0000

    drm: fix kernel-doc warnings for SCALING_FILTER
    
    This patch fixes the following kernel-doc warnings:
    
        /home/simon/src/linux/Documentation/gpu/drm-kms:466: ./drivers/gpu/drm/drm_crtc.c:236: WARNING: Unexpected indentation.
        /home/simon/src/linux/Documentation/gpu/drm-kms:466: ./drivers/gpu/drm/drm_crtc.c:237: WARNING: Block quote ends without a blank line; unexpected unindent.
        /home/simon/src/linux/Documentation/gpu/drm-kms:472: ./drivers/gpu/drm/drm_blend.c:203: WARNING: Unexpected indentation.
        /home/simon/src/linux/Documentation/gpu/drm-kms:472: ./drivers/gpu/drm/drm_blend.c:204: WARNING: Block quote ends without a blank line; unexpected unindent.
    
    Signed-off-by: Simon Ser <contact at emersion.fr>
    Fixes: 5c759eda9b04 ("drm: Introduce plane and CRTC scaling filter properties")
    Cc: Pankaj Bharadiya <pankaj.laxminarayan.bharadiya at intel.com>
    Cc: Jani Nikula <jani.nikula at intel.com>
    Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Cc: Uma Shankar <uma.shankar at intel.com>
    Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/zJEUxNx4GwiY4FnqlVsuXdAWuH624SQ9VfN54NeH5E@cp7-web-043.plabs.ch

diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index ae2234aae93d..5c2141e9a9f4 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -196,10 +196,10 @@
  * exposed and assumed to be black).
  *
  * SCALING_FILTER:
- *
  *     Indicates scaling filter to be used for plane scaler
  *
  *     The value of this property can be one of the following:
+ *
  *     Default:
  *             Driver's default scaling filter
  *     Nearest Neighbor:
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index f927976eca50..74090fc3aa55 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -230,14 +230,14 @@ struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc)
  *
  * 	Setting MODE_ID to 0 will release reserved resources for the CRTC.
  * SCALING_FILTER:
- *	Atomic property for setting the scaling filter for CRTC scaler
+ * 	Atomic property for setting the scaling filter for CRTC scaler
  *
- *	The value of this property can be one of the following:
- *	Default:
- *		Driver's default scaling filter
- *	Nearest Neighbor:
- *		Nearest Neighbor scaling filter
+ * 	The value of this property can be one of the following:
  *
+ * 	Default:
+ * 		Driver's default scaling filter
+ * 	Nearest Neighbor:
+ * 		Nearest Neighbor scaling filter
  */
 
 /**
commit 9c3a205c5ffa36e96903c2e37eb5f41c0f03c43e
Author: Pavel Begunkov <asml.silence at gmail.com>
Date:   Mon Nov 23 23:20:27 2020 +0000

    io_uring: fix ITER_BVEC check
    
    iov_iter::type is a bitmask that also keeps direction etc., so it
    shouldn't be directly compared against ITER_*. Use proper helper.
    
    Fixes: ff6165b2d7f6 ("io_uring: retain iov_iter state over io_read/io_write calls")
    Reported-by: David Howells <dhowells at redhat.com>
    Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
    Cc: <stable at vger.kernel.org> # 5.9
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index f971589878bc..ff6deffe5aa9 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -3193,7 +3193,7 @@ static void io_req_map_rw(struct io_kiocb *req, const struct iovec *iovec,
 	rw->free_iovec = iovec;
 	rw->bytes_done = 0;
 	/* can only be fixed buffers, no need to do anything */
-	if (iter->type == ITER_BVEC)
+	if (iov_iter_is_bvec(iter))
 		return;
 	if (!iovec) {
 		unsigned iov_off = 0;
commit eb2667b343361863da7b79be26de641e22844ba0
Author: Joseph Qi <joseph.qi at linux.alibaba.com>
Date:   Tue Nov 24 15:03:03 2020 +0800

    io_uring: fix shift-out-of-bounds when round up cq size
    
    Abaci Fuzz reported a shift-out-of-bounds BUG in io_uring_create():
    
    [ 59.598207] UBSAN: shift-out-of-bounds in ./include/linux/log2.h:57:13
    [ 59.599665] shift exponent 64 is too large for 64-bit type 'long unsigned int'
    [ 59.601230] CPU: 0 PID: 963 Comm: a.out Not tainted 5.10.0-rc4+ #3
    [ 59.602502] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    [ 59.603673] Call Trace:
    [ 59.604286] dump_stack+0x107/0x163
    [ 59.605237] ubsan_epilogue+0xb/0x5a
    [ 59.606094] __ubsan_handle_shift_out_of_bounds.cold+0xb2/0x20e
    [ 59.607335] ? lock_downgrade+0x6c0/0x6c0
    [ 59.608182] ? rcu_read_lock_sched_held+0xaf/0xe0
    [ 59.609166] io_uring_create.cold+0x99/0x149
    [ 59.610114] io_uring_setup+0xd6/0x140
    [ 59.610975] ? io_uring_create+0x2510/0x2510
    [ 59.611945] ? lockdep_hardirqs_on_prepare+0x286/0x400
    [ 59.613007] ? syscall_enter_from_user_mode+0x27/0x80
    [ 59.614038] ? trace_hardirqs_on+0x5b/0x180
    [ 59.615056] do_syscall_64+0x2d/0x40
    [ 59.615940] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 59.617007] RIP: 0033:0x7f2bb8a0b239
    
    This is caused by roundup_pow_of_two() if the input entries larger
    enough, e.g. 2^32-1. For sq_entries, it will check first and we allow
    at most IORING_MAX_ENTRIES, so it is okay. But for cq_entries, we do
    round up first, that may overflow and truncate it to 0, which is not
    the expected behavior. So check the cq size first and then do round up.
    
    Fixes: 88ec3211e463 ("io_uring: round-up cq size before comparing with rounded sq size")
    Reported-by: Abaci Fuzz <abaci at linux.alibaba.com>
    Signed-off-by: Joseph Qi <joseph.qi at linux.alibaba.com>
    Reviewed-by: Stefano Garzarella <sgarzare at redhat.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index a8c136a1cf4e..f971589878bc 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -9252,14 +9252,16 @@ static int io_uring_create(unsigned entries, struct io_uring_params *p,
 		 * to a power-of-two, if it isn't already. We do NOT impose
 		 * any cq vs sq ring sizing.
 		 */
-		p->cq_entries = roundup_pow_of_two(p->cq_entries);
-		if (p->cq_entries < p->sq_entries)
+		if (!p->cq_entries)
 			return -EINVAL;
 		if (p->cq_entries > IORING_MAX_CQ_ENTRIES) {
 			if (!(p->flags & IORING_SETUP_CLAMP))
 				return -EINVAL;
 			p->cq_entries = IORING_MAX_CQ_ENTRIES;
 		}
+		p->cq_entries = roundup_pow_of_two(p->cq_entries);
+		if (p->cq_entries < p->sq_entries)
+			return -EINVAL;
 	} else {
 		p->cq_entries = 2 * p->sq_entries;
 	}
commit a7361b9c4615951f52ffd2b1afa09a1384c7b4e4
Author: Adam Sampson <ats at offog.org>
Date:   Mon Nov 23 17:47:39 2020 +0000

    ARM: dts: sun7i: pcduino3-nano: enable RGMII RX/TX delay on PHY
    
    The RX/TX delays for the Ethernet PHY on the Linksprite pcDuino 3 Nano
    are configured in hardware, using resistors that are populated to pull
    the RTL8211E's RXDLY/TXDLY pins low or high as needed.
    
    phy-mode should be set to rgmii-id to reflect this. Previously it was
    set to rgmii, which used to work but now results in the delays being
    disabled again as a result of the bugfix in commit bbc4d71d6354 ("net:
    phy: realtek: fix rtl8211e rx/tx delay config").
    
    Tested on two pcDuino 3 Nano boards purchased in 2015. Without this fix,
    Ethernet works unreliably on one board and doesn't work at all on the
    other.
    
    Fixes: 061035d456c9 ("ARM: dts: sun7i: Add dts file for pcDuino 3 Nano board")
    Signed-off-by: Adam Sampson <ats at offog.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Andrew Lunn <andrew at lunn.ch>
    Acked-by: Chen-Yu Tsai <wens at csie.org>
    Link: https://lore.kernel.org/r/20201123174739.6809-1-ats@offog.org

diff --git a/arch/arm/boot/dts/sun7i-a20-pcduino3-nano.dts b/arch/arm/boot/dts/sun7i-a20-pcduino3-nano.dts
index fce2f7fcd084..bf38c66c1815 100644
--- a/arch/arm/boot/dts/sun7i-a20-pcduino3-nano.dts
+++ b/arch/arm/boot/dts/sun7i-a20-pcduino3-nano.dts
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Adam Sampson <ats at offog.org>
+ * Copyright 2015-2020 Adam Sampson <ats at offog.org>
  *
  * This file is dual-licensed: you can use it either under the terms
  * of the GPL or the X11 license, at your option. Note that this dual
@@ -115,7 +115,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit 7cd71202961090d8f2d2b863ec66b25ae43e1d39
Author: Clark Wang <xiaoning.wang at nxp.com>
Date:   Tue Nov 24 16:52:47 2020 +0800

    spi: imx: fix the unbalanced spi runtime pm management
    
    If set active without increase the usage count of pm, the dont use
    autosuspend function will call the suspend callback to close the two
    clocks of spi because the usage count is reduced to -1.
    This will cause the warning dump below when the defer-probe occurs.
    
    [  129.379701] ecspi2_root_clk already disabled
    [  129.384005] WARNING: CPU: 1 PID: 33 at drivers/clk/clk.c:952 clk_core_disable+0xa4/0xb0
    
    So add the get noresume function before set active.
    
    Fixes: 43b6bf406cd0 spi: imx: fix runtime pm support for !CONFIG_PM
    Signed-off-by: Clark Wang <xiaoning.wang at nxp.com>
    Link: https://lore.kernel.org/r/20201124085247.18025-1-xiaoning.wang@nxp.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 4b80e27ecdbf..0b597905ee72 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -1686,6 +1686,7 @@ static int spi_imx_probe(struct platform_device *pdev)
 
 	pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT);
 	pm_runtime_use_autosuspend(spi_imx->dev);
+	pm_runtime_get_noresume(spi_imx->dev);
 	pm_runtime_set_active(spi_imx->dev);
 	pm_runtime_enable(spi_imx->dev);
 
commit acfdd18591eaac25446e976a0c0d190f8b3dbfb1
Author: Amit Sunil Dhamne <amit.sunil.dhamne at xilinx.com>
Date:   Mon Nov 23 21:52:41 2020 -0800

    firmware: xilinx: Use hash-table for api feature check
    
    Currently array of fix length PM_API_MAX is used to cache
    the pm_api version (valid or invalid). However ATF based
    PM APIs values are much higher then PM_API_MAX.
    So to include ATF based PM APIs also, use hash-table to
    store the pm_api version status.
    
    Signed-off-by: Amit Sunil Dhamne <amit.sunil.dhamne at xilinx.com>
    Reported-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Ravi Patel <ravi.patel at xilinx.com>
    Signed-off-by: Rajan Vaja <rajan.vaja at xilinx.com>
    Reviewed-by: Arnd Bergmann <arnd at arndb.de>
    Tested-by: Michal Simek <michal.simek at xilinx.com>
    Fixes: f3217d6f2f7a ("firmware: xilinx: fix out-of-bounds access")
    Cc: stable <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/1606197161-25976-1-git-send-email-rajan.vaja@xilinx.com
    Signed-off-by: Michal Simek <michal.simek at xilinx.com>

diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c
index 5828302c7c5c..d08ac824c993 100644
--- a/drivers/firmware/xilinx/zynqmp.c
+++ b/drivers/firmware/xilinx/zynqmp.c
@@ -20,12 +20,28 @@
 #include <linux/of_platform.h>
 #include <linux/slab.h>
 #include <linux/uaccess.h>
+#include <linux/hashtable.h>
 
 #include <linux/firmware/xlnx-zynqmp.h>
 #include "zynqmp-debug.h"
 
+/* Max HashMap Order for PM API feature check (1<<7 = 128) */
+#define PM_API_FEATURE_CHECK_MAX_ORDER  7
+
 static bool feature_check_enabled;
-static u32 zynqmp_pm_features[PM_API_MAX];
+DEFINE_HASHTABLE(pm_api_features_map, PM_API_FEATURE_CHECK_MAX_ORDER);
+
+/**
+ * struct pm_api_feature_data - PM API Feature data
+ * @pm_api_id:		PM API Id, used as key to index into hashmap
+ * @feature_status:	status of PM API feature: valid, invalid
+ * @hentry:		hlist_node that hooks this entry into hashtable
+ */
+struct pm_api_feature_data {
+	u32 pm_api_id;
+	int feature_status;
+	struct hlist_node hentry;
+};
 
 static const struct mfd_cell firmware_devs[] = {
 	{
@@ -142,29 +158,37 @@ static int zynqmp_pm_feature(u32 api_id)
 	int ret;
 	u32 ret_payload[PAYLOAD_ARG_CNT];
 	u64 smc_arg[2];
+	struct pm_api_feature_data *feature_data;
 
 	if (!feature_check_enabled)
 		return 0;
 
-	/* Return value if feature is already checked */
-	if (api_id > ARRAY_SIZE(zynqmp_pm_features))
-		return PM_FEATURE_INVALID;
+	/* Check for existing entry in hash table for given api */
+	hash_for_each_possible(pm_api_features_map, feature_data, hentry,
+			       api_id) {
+		if (feature_data->pm_api_id == api_id)
+			return feature_data->feature_status;
+	}
 
-	if (zynqmp_pm_features[api_id] != PM_FEATURE_UNCHECKED)
-		return zynqmp_pm_features[api_id];
+	/* Add new entry if not present */
+	feature_data = kmalloc(sizeof(*feature_data), GFP_KERNEL);
+	if (!feature_data)
+		return -ENOMEM;
 
+	feature_data->pm_api_id = api_id;
 	smc_arg[0] = PM_SIP_SVC | PM_FEATURE_CHECK;
 	smc_arg[1] = api_id;
 
 	ret = do_fw_call(smc_arg[0], smc_arg[1], 0, ret_payload);
-	if (ret) {
-		zynqmp_pm_features[api_id] = PM_FEATURE_INVALID;
-		return PM_FEATURE_INVALID;
-	}
+	if (ret)
+		ret = -EOPNOTSUPP;
+	else
+		ret = ret_payload[1];
 
-	zynqmp_pm_features[api_id] = ret_payload[1];
+	feature_data->feature_status = ret;
+	hash_add(pm_api_features_map, &feature_data->hentry, api_id);
 
-	return zynqmp_pm_features[api_id];
+	return ret;
 }
 
 /**
@@ -200,9 +224,12 @@ int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1,
 	 * Make sure to stay in x0 register
 	 */
 	u64 smc_arg[4];
+	int ret;
 
-	if (zynqmp_pm_feature(pm_api_id) == PM_FEATURE_INVALID)
-		return -ENOTSUPP;
+	/* Check if feature is supported or not */
+	ret = zynqmp_pm_feature(pm_api_id);
+	if (ret < 0)
+		return ret;
 
 	smc_arg[0] = PM_SIP_SVC | pm_api_id;
 	smc_arg[1] = ((u64)arg1 << 32) | arg0;
@@ -1252,9 +1279,17 @@ static int zynqmp_firmware_probe(struct platform_device *pdev)
 
 static int zynqmp_firmware_remove(struct platform_device *pdev)
 {
+	struct pm_api_feature_data *feature_data;
+	int i;
+
 	mfd_remove_devices(&pdev->dev);
 	zynqmp_pm_api_debugfs_exit();
 
+	hash_for_each(pm_api_features_map, i, feature_data, hentry) {
+		hash_del(&feature_data->hentry);
+		kfree(feature_data);
+	}
+
 	return 0;
 }
 
diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h
index 5968df82b991..41a1bab98b7e 100644
--- a/include/linux/firmware/xlnx-zynqmp.h
+++ b/include/linux/firmware/xlnx-zynqmp.h
@@ -50,10 +50,6 @@
 #define	ZYNQMP_PM_CAPABILITY_WAKEUP	0x4U
 #define	ZYNQMP_PM_CAPABILITY_UNUSABLE	0x8U
 
-/* Feature check status */
-#define PM_FEATURE_INVALID		-1
-#define PM_FEATURE_UNCHECKED		0
-
 /*
  * Firmware FPGA Manager flags
  * XILINX_ZYNQMP_PM_FPGA_FULL:	FPGA full reconfiguration
commit f4426311f927b01776edf8a45f6fad90feae4e72
Author: Manish Narani <manish.narani at xilinx.com>
Date:   Mon Nov 16 19:22:24 2020 +0530

    firmware: xilinx: Fix SD DLL node reset issue
    
    Fix the SD DLL node reset issue where incorrect node is being referenced
    instead of SD DLL node.
    
    Fixes: 426c8d85df7a ("firmware: xilinx: Use APIs instead of IOCTLs")
    
    Signed-off-by: Manish Narani <manish.narani at xilinx.com>
    Link: https://lore.kernel.org/r/1605534744-15649-1-git-send-email-manish.narani@xilinx.com
    Signed-off-by: Michal Simek <michal.simek at xilinx.com>

diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c
index efb8a66efc68..5828302c7c5c 100644
--- a/drivers/firmware/xilinx/zynqmp.c
+++ b/drivers/firmware/xilinx/zynqmp.c
@@ -615,7 +615,7 @@ EXPORT_SYMBOL_GPL(zynqmp_pm_set_sd_tapdelay);
  */
 int zynqmp_pm_sd_dll_reset(u32 node_id, u32 type)
 {
-	return zynqmp_pm_invoke_fn(PM_IOCTL, node_id, IOCTL_SET_SD_TAPDELAY,
+	return zynqmp_pm_invoke_fn(PM_IOCTL, node_id, IOCTL_SD_DLL_RESET,
 				   type, 0, NULL);
 }
 EXPORT_SYMBOL_GPL(zynqmp_pm_sd_dll_reset);
commit eeacd80fcb29b769ea915cd06b7dd35e0bf0bc25
Author: Jian-Hong Pan <jhp at endlessos.org>
Date:   Tue Nov 24 17:20:25 2020 +0800

    ALSA: hda/realtek: Enable headset of ASUS UX482EG & B9400CEA with ALC294
    
    Some laptops like ASUS UX482EG & B9400CEA's headset audio does not work
    until the quirk ALC294_FIXUP_ASUS_HPE is applied.
    
    Signed-off-by: Jian-Hong Pan <jhp at endlessos.org>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201124092024.179540-1-jhp@endlessos.org
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index b90cd4c65b58..34ad24d2c970 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -8625,6 +8625,9 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
 		ALC292_STANDARD_PINS,
 		{0x13, 0x90a60140}),
+	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
+		{0x17, 0x90170110},
+		{0x21, 0x04211020}),
 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
 		{0x14, 0x90170110},
 		{0x1b, 0x90a70130},
commit 758999246965eeb8b253d47e72f7bfe508804b16
Author: Xiaochen Shen <xiaochen.shen at intel.com>
Date:   Sat Oct 31 03:11:28 2020 +0800

    x86/resctrl: Add necessary kernfs_put() calls to prevent refcount leak
    
    On resource group creation via a mkdir an extra kernfs_node reference is
    obtained by kernfs_get() to ensure that the rdtgroup structure remains
    accessible for the rdtgroup_kn_unlock() calls where it is removed on
    deletion. Currently the extra kernfs_node reference count is only
    dropped by kernfs_put() in rdtgroup_kn_unlock() while the rdtgroup
    structure is removed in a few other locations that lack the matching
    reference drop.
    
    In call paths of rmdir and umount, when a control group is removed,
    kernfs_remove() is called to remove the whole kernfs nodes tree of the
    control group (including the kernfs nodes trees of all child monitoring
    groups), and then rdtgroup structure is freed by kfree(). The rdtgroup
    structures of all child monitoring groups under the control group are
    freed by kfree() in free_all_child_rdtgrp().
    
    Before calling kfree() to free the rdtgroup structures, the kernfs node
    of the control group itself as well as the kernfs nodes of all child
    monitoring groups still take the extra references which will never be
    dropped to 0 and the kernfs nodes will never be freed. It leads to
    reference count leak and kernfs_node_cache memory leak.
    
    For example, reference count leak is observed in these two cases:
      (1) mount -t resctrl resctrl /sys/fs/resctrl
          mkdir /sys/fs/resctrl/c1
          mkdir /sys/fs/resctrl/c1/mon_groups/m1
          umount /sys/fs/resctrl
    
      (2) mkdir /sys/fs/resctrl/c1
          mkdir /sys/fs/resctrl/c1/mon_groups/m1
          rmdir /sys/fs/resctrl/c1
    
    The same reference count leak issue also exists in the error exit paths
    of mkdir in mkdir_rdt_prepare() and rdtgroup_mkdir_ctrl_mon().
    
    Fix this issue by following changes to make sure the extra kernfs_node
    reference on rdtgroup is dropped before freeing the rdtgroup structure.
      (1) Introduce rdtgroup removal helper rdtgroup_remove() to wrap up
      kernfs_put() and kfree().
    
      (2) Call rdtgroup_remove() in rdtgroup removal path where the rdtgroup
      structure is about to be freed by kfree().
    
      (3) Call rdtgroup_remove() or kernfs_put() as appropriate in the error
      exit paths of mkdir where an extra reference is taken by kernfs_get().
    
    Fixes: f3cbeacaa06e ("x86/intel_rdt/cqm: Add rmdir support")
    Fixes: e02737d5b826 ("x86/intel_rdt: Add tasks files")
    Fixes: 60cf5e101fd4 ("x86/intel_rdt: Add mkdir to resctrl file system")
    Reported-by: Willem de Bruijn <willemb at google.com>
    Signed-off-by: Xiaochen Shen <xiaochen.shen at intel.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Reinette Chatre <reinette.chatre at intel.com>
    Cc: stable at vger.kernel.org
    Link: https://lkml.kernel.org/r/1604085088-31707-1-git-send-email-xiaochen.shen@intel.com

diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index 2ab1266a5f14..6f4ca4bea625 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -507,6 +507,24 @@ unlock:
 	return ret ?: nbytes;
 }
 
+/**
+ * rdtgroup_remove - the helper to remove resource group safely
+ * @rdtgrp: resource group to remove
+ *
+ * On resource group creation via a mkdir, an extra kernfs_node reference is
+ * taken to ensure that the rdtgroup structure remains accessible for the
+ * rdtgroup_kn_unlock() calls where it is removed.
+ *
+ * Drop the extra reference here, then free the rdtgroup structure.
+ *
+ * Return: void
+ */
+static void rdtgroup_remove(struct rdtgroup *rdtgrp)
+{
+	kernfs_put(rdtgrp->kn);
+	kfree(rdtgrp);
+}
+
 struct task_move_callback {
 	struct callback_head	work;
 	struct rdtgroup		*rdtgrp;
@@ -529,7 +547,7 @@ static void move_myself(struct callback_head *head)
 	    (rdtgrp->flags & RDT_DELETED)) {
 		current->closid = 0;
 		current->rmid = 0;
-		kfree(rdtgrp);
+		rdtgroup_remove(rdtgrp);
 	}
 
 	if (unlikely(current->flags & PF_EXITING))
@@ -2065,8 +2083,7 @@ void rdtgroup_kn_unlock(struct kernfs_node *kn)
 		    rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)
 			rdtgroup_pseudo_lock_remove(rdtgrp);
 		kernfs_unbreak_active_protection(kn);
-		kernfs_put(rdtgrp->kn);
-		kfree(rdtgrp);
+		rdtgroup_remove(rdtgrp);
 	} else {
 		kernfs_unbreak_active_protection(kn);
 	}
@@ -2341,7 +2358,7 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp)
 		if (atomic_read(&sentry->waitcount) != 0)
 			sentry->flags = RDT_DELETED;
 		else
-			kfree(sentry);
+			rdtgroup_remove(sentry);
 	}
 }
 
@@ -2383,7 +2400,7 @@ static void rmdir_all_sub(void)
 		if (atomic_read(&rdtgrp->waitcount) != 0)
 			rdtgrp->flags = RDT_DELETED;
 		else
-			kfree(rdtgrp);
+			rdtgroup_remove(rdtgrp);
 	}
 	/* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */
 	update_closid_rmid(cpu_online_mask, &rdtgroup_default);
@@ -2818,7 +2835,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
 	 * kernfs_remove() will drop the reference count on "kn" which
 	 * will free it. But we still need it to stick around for the
 	 * rdtgroup_kn_unlock(kn) call. Take one extra reference here,
-	 * which will be dropped inside rdtgroup_kn_unlock().
+	 * which will be dropped by kernfs_put() in rdtgroup_remove().
 	 */
 	kernfs_get(kn);
 
@@ -2859,6 +2876,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
 out_idfree:
 	free_rmid(rdtgrp->mon.rmid);
 out_destroy:
+	kernfs_put(rdtgrp->kn);
 	kernfs_remove(rdtgrp->kn);
 out_free_rgrp:
 	kfree(rdtgrp);
@@ -2871,7 +2889,7 @@ static void mkdir_rdt_prepare_clean(struct rdtgroup *rgrp)
 {
 	kernfs_remove(rgrp->kn);
 	free_rmid(rgrp->mon.rmid);
-	kfree(rgrp);
+	rdtgroup_remove(rgrp);
 }
 
 /*
commit fd8d9db3559a29fd737bcdb7c4fcbe1940caae34
Author: Xiaochen Shen <xiaochen.shen at intel.com>
Date:   Sat Oct 31 03:10:53 2020 +0800

    x86/resctrl: Remove superfluous kernfs_get() calls to prevent refcount leak
    
    Willem reported growing of kernfs_node_cache entries in slabtop when
    repeatedly creating and removing resctrl subdirectories as well as when
    repeatedly mounting and unmounting the resctrl filesystem.
    
    On resource group (control as well as monitoring) creation via a mkdir
    an extra kernfs_node reference is obtained to ensure that the rdtgroup
    structure remains accessible for the rdtgroup_kn_unlock() calls where it
    is removed on deletion. The kernfs_node reference count is dropped by
    kernfs_put() in rdtgroup_kn_unlock().
    
    With the above explaining the need for one kernfs_get()/kernfs_put()
    pair in resctrl there are more places where a kernfs_node reference is
    obtained without a corresponding release. The excessive amount of
    reference count on kernfs nodes will never be dropped to 0 and the
    kernfs nodes will never be freed in the call paths of rmdir and umount.
    It leads to reference count leak and kernfs_node_cache memory leak.
    
    Remove the superfluous kernfs_get() calls and expand the existing
    comments surrounding the remaining kernfs_get()/kernfs_put() pair that
    remains in use.
    
    Superfluous kernfs_get() calls are removed from two areas:
    
      (1) In call paths of mount and mkdir, when kernfs nodes for "info",
      "mon_groups" and "mon_data" directories and sub-directories are
      created, the reference count of newly created kernfs node is set to 1.
      But after kernfs_create_dir() returns, superfluous kernfs_get() are
      called to take an additional reference.
    
      (2) kernfs_get() calls in rmdir call paths.
    
    Fixes: 17eafd076291 ("x86/intel_rdt: Split resource group removal in two")
    Fixes: 4af4a88e0c92 ("x86/intel_rdt/cqm: Add mount,umount support")
    Fixes: f3cbeacaa06e ("x86/intel_rdt/cqm: Add rmdir support")
    Fixes: d89b7379015f ("x86/intel_rdt/cqm: Add mon_data")
    Fixes: c7d9aac61311 ("x86/intel_rdt/cqm: Add mkdir support for RDT monitoring")
    Fixes: 5dc1d5c6bac2 ("x86/intel_rdt: Simplify info and base file lists")
    Fixes: 60cf5e101fd4 ("x86/intel_rdt: Add mkdir to resctrl file system")
    Fixes: 4e978d06dedb ("x86/intel_rdt: Add "info" files to resctrl file system")
    Reported-by: Willem de Bruijn <willemb at google.com>
    Signed-off-by: Xiaochen Shen <xiaochen.shen at intel.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Reinette Chatre <reinette.chatre at intel.com>
    Tested-by: Willem de Bruijn <willemb at google.com>
    Cc: stable at vger.kernel.org
    Link: https://lkml.kernel.org/r/1604085053-31639-1-git-send-email-xiaochen.shen@intel.com

diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index af323e2e3100..2ab1266a5f14 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -1769,7 +1769,6 @@ static int rdtgroup_mkdir_info_resdir(struct rdt_resource *r, char *name,
 	if (IS_ERR(kn_subdir))
 		return PTR_ERR(kn_subdir);
 
-	kernfs_get(kn_subdir);
 	ret = rdtgroup_kn_set_ugid(kn_subdir);
 	if (ret)
 		return ret;
@@ -1792,7 +1791,6 @@ static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn)
 	kn_info = kernfs_create_dir(parent_kn, "info", parent_kn->mode, NULL);
 	if (IS_ERR(kn_info))
 		return PTR_ERR(kn_info);
-	kernfs_get(kn_info);
 
 	ret = rdtgroup_add_files(kn_info, RF_TOP_INFO);
 	if (ret)
@@ -1813,12 +1811,6 @@ static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn)
 			goto out_destroy;
 	}
 
-	/*
-	 * This extra ref will be put in kernfs_remove() and guarantees
-	 * that @rdtgrp->kn is always accessible.
-	 */
-	kernfs_get(kn_info);
-
 	ret = rdtgroup_kn_set_ugid(kn_info);
 	if (ret)
 		goto out_destroy;
@@ -1847,12 +1839,6 @@ mongroup_create_dir(struct kernfs_node *parent_kn, struct rdtgroup *prgrp,
 	if (dest_kn)
 		*dest_kn = kn;
 
-	/*
-	 * This extra ref will be put in kernfs_remove() and guarantees
-	 * that @rdtgrp->kn is always accessible.
-	 */
-	kernfs_get(kn);
-
 	ret = rdtgroup_kn_set_ugid(kn);
 	if (ret)
 		goto out_destroy;
@@ -2139,13 +2125,11 @@ static int rdt_get_tree(struct fs_context *fc)
 					  &kn_mongrp);
 		if (ret < 0)
 			goto out_info;
-		kernfs_get(kn_mongrp);
 
 		ret = mkdir_mondata_all(rdtgroup_default.kn,
 					&rdtgroup_default, &kn_mondata);
 		if (ret < 0)
 			goto out_mongrp;
-		kernfs_get(kn_mondata);
 		rdtgroup_default.mon.mon_data_kn = kn_mondata;
 	}
 
@@ -2499,11 +2483,6 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
 	if (IS_ERR(kn))
 		return PTR_ERR(kn);
 
-	/*
-	 * This extra ref will be put in kernfs_remove() and guarantees
-	 * that kn is always accessible.
-	 */
-	kernfs_get(kn);
 	ret = rdtgroup_kn_set_ugid(kn);
 	if (ret)
 		goto out_destroy;
@@ -2838,8 +2817,8 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
 	/*
 	 * kernfs_remove() will drop the reference count on "kn" which
 	 * will free it. But we still need it to stick around for the
-	 * rdtgroup_kn_unlock(kn} call below. Take one extra reference
-	 * here, which will be dropped inside rdtgroup_kn_unlock().
+	 * rdtgroup_kn_unlock(kn) call. Take one extra reference here,
+	 * which will be dropped inside rdtgroup_kn_unlock().
 	 */
 	kernfs_get(kn);
 
@@ -3049,11 +3028,6 @@ static int rdtgroup_rmdir_mon(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
 	WARN_ON(list_empty(&prdtgrp->mon.crdtgrp_list));
 	list_del(&rdtgrp->mon.crdtgrp_list);
 
-	/*
-	 * one extra hold on this, will drop when we kfree(rdtgrp)
-	 * in rdtgroup_kn_unlock()
-	 */
-	kernfs_get(kn);
 	kernfs_remove(rdtgrp->kn);
 
 	return 0;
@@ -3065,11 +3039,6 @@ static int rdtgroup_ctrl_remove(struct kernfs_node *kn,
 	rdtgrp->flags = RDT_DELETED;
 	list_del(&rdtgrp->rdtgroup_list);
 
-	/*
-	 * one extra hold on this, will drop when we kfree(rdtgrp)
-	 * in rdtgroup_kn_unlock()
-	 */
-	kernfs_get(kn);
 	kernfs_remove(rdtgrp->kn);
 	return 0;
 }
commit a42a7ec9bb99a17869c3b9f3d365aaf2bdb1a554
Author: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli at intel.com>
Date:   Wed Nov 18 20:01:20 2020 +0800

    mmc: sdhci-of-arasan: Fix clock registration error for Keem Bay SOC
    
    The commit 16ada730a759 ("mmc: sdhci-of-arasan: Modify clock operations
    handling") introduced support for platform specific clock operations.
    Around the same point in time the commit 36c6aadaae86 ("mmc:
    sdhci-of-arasan: Add support for Intel Keem Bay") was also  merged.
    Unfortunate it was not really tested on top of the previously mentioned
    commit, which causes clock registration failures for Keem Bay SOC devices.
    
    Let's fix this, by properly declaring the clock operation for Keem Bay SOC
    devices.
    
    Fixes: 36c6aadaae86 ("mmc: sdhci-of-arasan: Add support for Intel Keem Bay")
    Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli at intel.com>
    Reviewed-by: Adrian Hunter <adrian.hunter at intel.com>
    Link: https://lore.kernel.org/r/20201118120120.24908-2-muhammad.husaini.zulkifli@intel.com
    Cc: stable at vger.kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index d25a4b50c2f3..3b8d456e857d 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -1186,16 +1186,19 @@ static struct sdhci_arasan_of_data sdhci_arasan_versal_data = {
 static struct sdhci_arasan_of_data intel_keembay_emmc_data = {
 	.soc_ctl_map = &intel_keembay_soc_ctl_map,
 	.pdata = &sdhci_keembay_emmc_pdata,
+	.clk_ops = &arasan_clk_ops,
 };
 
 static struct sdhci_arasan_of_data intel_keembay_sd_data = {
 	.soc_ctl_map = &intel_keembay_soc_ctl_map,
 	.pdata = &sdhci_keembay_sd_pdata,
+	.clk_ops = &arasan_clk_ops,
 };
 
 static struct sdhci_arasan_of_data intel_keembay_sdio_data = {
 	.soc_ctl_map = &intel_keembay_soc_ctl_map,
 	.pdata = &sdhci_keembay_sdio_pdata,
+	.clk_ops = &arasan_clk_ops,
 };
 
 static const struct of_device_id sdhci_arasan_of_match[] = {
commit 903a72eca4abf241293dcc1385896fd428e15fe9
Author: yong mao <yong.mao at mediatek.com>
Date:   Thu Nov 19 11:02:37 2020 +0800

    mmc: mediatek: Extend recheck_sdio_irq fix to more variants
    
    The SDIO recheck fix is required for more of the supported variants. Let's
    add it to those that needs it.
    
    Reported-by: Fabien Parent <fparent at baylibre.com>
    Reported-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
    Signed-off-by: Yong Mao <yong.mao at mediatek.com>
    Link: https://lore.kernel.org/r/20201119030237.9414-1-yong.mao@mediatek.com
    Fixes: 9e2582e57407 ("mmc: mediatek: fix SDIO irq issue")
    Cc: stable at vger.kernel.org
    [Ulf: Clarified commitmsg ]
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index b40ec966288e..7eb99255ae3d 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -446,7 +446,7 @@ struct msdc_host {
 
 static const struct mtk_mmc_compatible mt8135_compat = {
 	.clk_div_bits = 8,
-	.recheck_sdio_irq = false,
+	.recheck_sdio_irq = true,
 	.hs400_tune = false,
 	.pad_tune_reg = MSDC_PAD_TUNE,
 	.async_fifo = false,
@@ -485,7 +485,7 @@ static const struct mtk_mmc_compatible mt8183_compat = {
 
 static const struct mtk_mmc_compatible mt2701_compat = {
 	.clk_div_bits = 12,
-	.recheck_sdio_irq = false,
+	.recheck_sdio_irq = true,
 	.hs400_tune = false,
 	.pad_tune_reg = MSDC_PAD_TUNE0,
 	.async_fifo = true,
@@ -511,7 +511,7 @@ static const struct mtk_mmc_compatible mt2712_compat = {
 
 static const struct mtk_mmc_compatible mt7622_compat = {
 	.clk_div_bits = 12,
-	.recheck_sdio_irq = false,
+	.recheck_sdio_irq = true,
 	.hs400_tune = false,
 	.pad_tune_reg = MSDC_PAD_TUNE0,
 	.async_fifo = true,
@@ -524,7 +524,7 @@ static const struct mtk_mmc_compatible mt7622_compat = {
 
 static const struct mtk_mmc_compatible mt8516_compat = {
 	.clk_div_bits = 12,
-	.recheck_sdio_irq = false,
+	.recheck_sdio_irq = true,
 	.hs400_tune = false,
 	.pad_tune_reg = MSDC_PAD_TUNE0,
 	.async_fifo = true,
@@ -535,7 +535,7 @@ static const struct mtk_mmc_compatible mt8516_compat = {
 
 static const struct mtk_mmc_compatible mt7620_compat = {
 	.clk_div_bits = 8,
-	.recheck_sdio_irq = false,
+	.recheck_sdio_irq = true,
 	.hs400_tune = false,
 	.pad_tune_reg = MSDC_PAD_TUNE,
 	.async_fifo = false,
@@ -548,6 +548,7 @@ static const struct mtk_mmc_compatible mt7620_compat = {
 
 static const struct mtk_mmc_compatible mt6779_compat = {
 	.clk_div_bits = 12,
+	.recheck_sdio_irq = false,
 	.hs400_tune = false,
 	.pad_tune_reg = MSDC_PAD_TUNE0,
 	.async_fifo = true,
commit 32228ff5f7e1b1c8916e811d525b6e15e3d21b3d
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:45 2020 +0100

    drm/fb-helper: Acquire modeset lock around shadow-buffer flushing
    
    Flushing the fbdev's shadow buffer requires vmap'ing the BO memory, which
    in turn requires pinning the BO. While being pinned, the BO cannot be moved
    into VRAM for scanout. Consequently, a concurrent modeset operation that
    involves the fbdev framebuffer would likely fail.
    
    Resolve this problem be acquiring the modeset lock of the planes that use
    the fbdev framebuffer. On non-atomic drivers, also acquire the mode-config
    lock. This serializes the flushing of the framebuffer with concurrent
    modeset operations.
    
    v2:
            * only acquire struct drm_fb_helper.lock in damage blitter (Daniel,
              Christian)
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Acked-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-11-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 0aac5450c8ad..4b8119510687 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -398,16 +398,32 @@ static int drm_fb_helper_damage_blit(struct drm_fb_helper *fb_helper,
 	struct dma_buf_map map, dst;
 	int ret;
 
+	/*
+	 * We have to pin the client buffer to its current location while
+	 * flushing the shadow buffer. In the general case, concurrent
+	 * modesetting operations could try to move the buffer and would
+	 * fail. The modeset has to be serialized by acquiring the reservation
+	 * object of the underlying BO here.
+	 *
+	 * For fbdev emulation, we only have to protect against fbdev modeset
+	 * operations. Nothing else will involve the client buffer's BO. So it
+	 * is sufficient to acquire struct drm_fb_helper.lock here.
+	 */
+	mutex_lock(&fb_helper->lock);
+
 	ret = drm_client_buffer_vmap(buffer, &map);
 	if (ret)
-		return ret;
+		goto out;
 
 	dst = map;
 	drm_fb_helper_damage_blit_real(fb_helper, clip, &dst);
 
 	drm_client_buffer_vunmap(buffer);
 
-	return 0;
+out:
+	mutex_unlock(&fb_helper->lock);
+
+	return ret;
 }
 
 static void drm_fb_helper_damage_work(struct work_struct *work)
commit 7d4d269c0973f7a8324d9cd2534b3b24e62c72ff
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:44 2020 +0100

    drm/fb-helper: Copy dma-buf map before flushing shadow fb
    
    Copy the vmap()'ed instance of struct dma_buf_map before modifying it,
    in case the implementation of vunmap() depends on the exact address.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Acked-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-10-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 314352683447..0aac5450c8ad 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -395,14 +395,15 @@ static int drm_fb_helper_damage_blit(struct drm_fb_helper *fb_helper,
 				     struct drm_clip_rect *clip)
 {
 	struct drm_client_buffer *buffer = fb_helper->buffer;
-	struct dma_buf_map map;
+	struct dma_buf_map map, dst;
 	int ret;
 
 	ret = drm_client_buffer_vmap(buffer, &map);
 	if (ret)
 		return ret;
 
-	drm_fb_helper_damage_blit_real(fb_helper, clip, &map);
+	dst = map;
+	drm_fb_helper_damage_blit_real(fb_helper, clip, &dst);
 
 	drm_client_buffer_vunmap(buffer);
 
commit 4270d6f60d68e99e2fefd4da98eead05d2df022c
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:43 2020 +0100

    drm/fb-helper: Restore damage area upon errors
    
    If the damage handling fails, restore the damage area. The next invocation
    of the damage worker will then perform the update.
    
    v3:
            * Use drm_WARN_ONCE() with an error message to print warning
    v2:
            * print a single warning if dirty callback fails (Daniel, Sebastian)
            * update comment
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Acked-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-9-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index fc709bc59b1a..314352683447 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -432,11 +432,28 @@ static void drm_fb_helper_damage_work(struct work_struct *work)
 	if (helper->buffer) {
 		ret = drm_fb_helper_damage_blit(helper, &clip_copy);
 		if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret))
-			return;
+			goto err;
+	}
+
+	if (helper->fb->funcs->dirty) {
+		ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
+		if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
+			goto err;
 	}
 
-	if (helper->fb->funcs->dirty)
-		helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
+	return;
+
+err:
+	/*
+	 * Restore damage clip rectangle on errors. The next run
+	 * of the damage worker will perform the update.
+	 */
+	spin_lock_irqsave(&helper->damage_lock, flags);
+	clip->x1 = min_t(u32, clip->x1, clip_copy.x1);
+	clip->y1 = min_t(u32, clip->y1, clip_copy.y1);
+	clip->x2 = max_t(u32, clip->x2, clip_copy.x2);
+	clip->y2 = max_t(u32, clip->y2, clip_copy.y2);
+	spin_unlock_irqrestore(&helper->damage_lock, flags);
 }
 
 /**
commit 1d46491d4a08d7ee657e09808f87d169444a2652
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:42 2020 +0100

    drm/fb-helper: Move damage blit code and its setup into separate routine
    
    Introduce a separate function for the blit code and its vmap setup. Done
    in preparation of additional changes. No functional changes are made.
    
    v3:
            * Use drm_WARN_ONCE() with an error message to print warning
    v2:
            * print a single warning if damage blitter fails
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-8-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index bdfdf60e7bd8..fc709bc59b1a 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -391,14 +391,32 @@ static void drm_fb_helper_damage_blit_real(struct drm_fb_helper *fb_helper,
 	}
 }
 
+static int drm_fb_helper_damage_blit(struct drm_fb_helper *fb_helper,
+				     struct drm_clip_rect *clip)
+{
+	struct drm_client_buffer *buffer = fb_helper->buffer;
+	struct dma_buf_map map;
+	int ret;
+
+	ret = drm_client_buffer_vmap(buffer, &map);
+	if (ret)
+		return ret;
+
+	drm_fb_helper_damage_blit_real(fb_helper, clip, &map);
+
+	drm_client_buffer_vunmap(buffer);
+
+	return 0;
+}
+
 static void drm_fb_helper_damage_work(struct work_struct *work)
 {
 	struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper,
 						    damage_work);
+	struct drm_device *dev = helper->dev;
 	struct drm_clip_rect *clip = &helper->damage_clip;
 	struct drm_clip_rect clip_copy;
 	unsigned long flags;
-	struct dma_buf_map map;
 	int ret;
 
 	spin_lock_irqsave(&helper->damage_lock, flags);
@@ -411,13 +429,10 @@ static void drm_fb_helper_damage_work(struct work_struct *work)
 	if (!(clip_copy.x1 < clip_copy.x2 && clip_copy.y1 < clip_copy.y2))
 		return;
 
-	/* Generic fbdev uses a shadow buffer */
 	if (helper->buffer) {
-		ret = drm_client_buffer_vmap(helper->buffer, &map);
-		if (ret)
+		ret = drm_fb_helper_damage_blit(helper, &clip_copy);
+		if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret))
 			return;
-		drm_fb_helper_damage_blit_real(helper, &clip_copy, &map);
-		drm_client_buffer_vunmap(helper->buffer);
 	}
 
 	if (helper->fb->funcs->dirty)
commit fd2d856538bb3880ec78eae71bbbd928962bee35
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:41 2020 +0100

    drm/fb-helper: Separate shadow-buffer flushing and calling dirty callback
    
    Flushing the shadow framebuffer and invoking the dirty callback are two
    separate operations, so do them separately. The flush operation is paired
    with calls to vmap and vunmap. They are not needed for the dirty callback,
    which performs its own invocations if necessary.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-7-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index c9018ffff5f9..bdfdf60e7bd8 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -417,13 +417,11 @@ static void drm_fb_helper_damage_work(struct work_struct *work)
 		if (ret)
 			return;
 		drm_fb_helper_damage_blit_real(helper, &clip_copy, &map);
+		drm_client_buffer_vunmap(helper->buffer);
 	}
 
 	if (helper->fb->funcs->dirty)
 		helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
-
-	if (helper->buffer)
-		drm_client_buffer_vunmap(helper->buffer);
 }
 
 /**
commit 2b5f31aaa8d10b72aa1ca3098ac5427ff2e47cd0
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:40 2020 +0100

    drm/fb-helper: Return early in damage worker
    
    Returning early in the damage worker if no update is required. Makes the
    code more readable. No functional changes are being made.
    
    v3:
            * s/dirty/damage in commit message (Sam)
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-6-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 87d4759de04a..c9018ffff5f9 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -407,24 +407,23 @@ static void drm_fb_helper_damage_work(struct work_struct *work)
 	clip->x2 = clip->y2 = 0;
 	spin_unlock_irqrestore(&helper->damage_lock, flags);
 
-	/* call dirty callback only when it has been really touched */
-	if (clip_copy.x1 < clip_copy.x2 && clip_copy.y1 < clip_copy.y2) {
-
-		/* Generic fbdev uses a shadow buffer */
-		if (helper->buffer) {
-			ret = drm_client_buffer_vmap(helper->buffer, &map);
-			if (ret)
-				return;
-			drm_fb_helper_damage_blit_real(helper, &clip_copy, &map);
-		}
-
-		if (helper->fb->funcs->dirty)
-			helper->fb->funcs->dirty(helper->fb, NULL, 0, 0,
-						 &clip_copy, 1);
+	/* Call damage handlers only if necessary */
+	if (!(clip_copy.x1 < clip_copy.x2 && clip_copy.y1 < clip_copy.y2))
+		return;
 
-		if (helper->buffer)
-			drm_client_buffer_vunmap(helper->buffer);
+	/* Generic fbdev uses a shadow buffer */
+	if (helper->buffer) {
+		ret = drm_client_buffer_vmap(helper->buffer, &map);
+		if (ret)
+			return;
+		drm_fb_helper_damage_blit_real(helper, &clip_copy, &map);
 	}
+
+	if (helper->fb->funcs->dirty)
+		helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
+
+	if (helper->buffer)
+		drm_client_buffer_vunmap(helper->buffer);
 }
 
 /**
commit 9622349ea1b6234d24f2348552bffa1de1c7c2d1
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:39 2020 +0100

    drm/fb-helper: Rename dirty worker to damage worker
    
    The dirty worker handles all damage updates, instead of just calling
    the framebuffer's dirty callback. Rename it to damage worker. Also
    rename related variables accordingly. No functional changes are made.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-5-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index aa7af463c50d..87d4759de04a 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -371,9 +371,9 @@ static void drm_fb_helper_resume_worker(struct work_struct *work)
 	console_unlock();
 }
 
-static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper,
-					  struct drm_clip_rect *clip,
-					  struct dma_buf_map *dst)
+static void drm_fb_helper_damage_blit_real(struct drm_fb_helper *fb_helper,
+					   struct drm_clip_rect *clip,
+					   struct dma_buf_map *dst)
 {
 	struct drm_framebuffer *fb = fb_helper->fb;
 	unsigned int cpp = fb->format->cpp[0];
@@ -391,21 +391,21 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper,
 	}
 }
 
-static void drm_fb_helper_dirty_work(struct work_struct *work)
+static void drm_fb_helper_damage_work(struct work_struct *work)
 {
 	struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper,
-						    dirty_work);
-	struct drm_clip_rect *clip = &helper->dirty_clip;
+						    damage_work);
+	struct drm_clip_rect *clip = &helper->damage_clip;
 	struct drm_clip_rect clip_copy;
 	unsigned long flags;
 	struct dma_buf_map map;
 	int ret;
 
-	spin_lock_irqsave(&helper->dirty_lock, flags);
+	spin_lock_irqsave(&helper->damage_lock, flags);
 	clip_copy = *clip;
 	clip->x1 = clip->y1 = ~0;
 	clip->x2 = clip->y2 = 0;
-	spin_unlock_irqrestore(&helper->dirty_lock, flags);
+	spin_unlock_irqrestore(&helper->damage_lock, flags);
 
 	/* call dirty callback only when it has been really touched */
 	if (clip_copy.x1 < clip_copy.x2 && clip_copy.y1 < clip_copy.y2) {
@@ -415,7 +415,7 @@ static void drm_fb_helper_dirty_work(struct work_struct *work)
 			ret = drm_client_buffer_vmap(helper->buffer, &map);
 			if (ret)
 				return;
-			drm_fb_helper_dirty_blit_real(helper, &clip_copy, &map);
+			drm_fb_helper_damage_blit_real(helper, &clip_copy, &map);
 		}
 
 		if (helper->fb->funcs->dirty)
@@ -440,10 +440,10 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
 			   const struct drm_fb_helper_funcs *funcs)
 {
 	INIT_LIST_HEAD(&helper->kernel_fb_list);
-	spin_lock_init(&helper->dirty_lock);
+	spin_lock_init(&helper->damage_lock);
 	INIT_WORK(&helper->resume_work, drm_fb_helper_resume_worker);
-	INIT_WORK(&helper->dirty_work, drm_fb_helper_dirty_work);
-	helper->dirty_clip.x1 = helper->dirty_clip.y1 = ~0;
+	INIT_WORK(&helper->damage_work, drm_fb_helper_damage_work);
+	helper->damage_clip.x1 = helper->damage_clip.y1 = ~0;
 	mutex_init(&helper->lock);
 	helper->funcs = funcs;
 	helper->dev = dev;
@@ -579,7 +579,7 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
 		return;
 
 	cancel_work_sync(&fb_helper->resume_work);
-	cancel_work_sync(&fb_helper->dirty_work);
+	cancel_work_sync(&fb_helper->damage_work);
 
 	info = fb_helper->fbdev;
 	if (info) {
@@ -614,30 +614,30 @@ static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper)
 	       fb->funcs->dirty;
 }
 
-static void drm_fb_helper_dirty(struct fb_info *info, u32 x, u32 y,
-				u32 width, u32 height)
+static void drm_fb_helper_damage(struct fb_info *info, u32 x, u32 y,
+				 u32 width, u32 height)
 {
 	struct drm_fb_helper *helper = info->par;
-	struct drm_clip_rect *clip = &helper->dirty_clip;
+	struct drm_clip_rect *clip = &helper->damage_clip;
 	unsigned long flags;
 
 	if (!drm_fbdev_use_shadow_fb(helper))
 		return;
 
-	spin_lock_irqsave(&helper->dirty_lock, flags);
+	spin_lock_irqsave(&helper->damage_lock, flags);
 	clip->x1 = min_t(u32, clip->x1, x);
 	clip->y1 = min_t(u32, clip->y1, y);
 	clip->x2 = max_t(u32, clip->x2, x + width);
 	clip->y2 = max_t(u32, clip->y2, y + height);
-	spin_unlock_irqrestore(&helper->dirty_lock, flags);
+	spin_unlock_irqrestore(&helper->damage_lock, flags);
 
-	schedule_work(&helper->dirty_work);
+	schedule_work(&helper->damage_work);
 }
 
 /**
  * drm_fb_helper_deferred_io() - fbdev deferred_io callback function
  * @info: fb_info struct pointer
- * @pagelist: list of dirty mmap framebuffer pages
+ * @pagelist: list of mmap framebuffer pages that have to be flushed
  *
  * This function is used as the &fb_deferred_io.deferred_io
  * callback function for flushing the fbdev mmap writes.
@@ -662,7 +662,7 @@ void drm_fb_helper_deferred_io(struct fb_info *info,
 		y1 = min / info->fix.line_length;
 		y2 = min_t(u32, DIV_ROUND_UP(max, info->fix.line_length),
 			   info->var.yres);
-		drm_fb_helper_dirty(info, 0, y1, info->var.xres, y2 - y1);
+		drm_fb_helper_damage(info, 0, y1, info->var.xres, y2 - y1);
 	}
 }
 EXPORT_SYMBOL(drm_fb_helper_deferred_io);
@@ -699,8 +699,7 @@ ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
 
 	ret = fb_sys_write(info, buf, count, ppos);
 	if (ret > 0)
-		drm_fb_helper_dirty(info, 0, 0, info->var.xres,
-				    info->var.yres);
+		drm_fb_helper_damage(info, 0, 0, info->var.xres, info->var.yres);
 
 	return ret;
 }
@@ -717,8 +716,7 @@ void drm_fb_helper_sys_fillrect(struct fb_info *info,
 				const struct fb_fillrect *rect)
 {
 	sys_fillrect(info, rect);
-	drm_fb_helper_dirty(info, rect->dx, rect->dy,
-			    rect->width, rect->height);
+	drm_fb_helper_damage(info, rect->dx, rect->dy, rect->width, rect->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_fillrect);
 
@@ -733,8 +731,7 @@ void drm_fb_helper_sys_copyarea(struct fb_info *info,
 				const struct fb_copyarea *area)
 {
 	sys_copyarea(info, area);
-	drm_fb_helper_dirty(info, area->dx, area->dy,
-			    area->width, area->height);
+	drm_fb_helper_damage(info, area->dx, area->dy, area->width, area->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_copyarea);
 
@@ -749,8 +746,7 @@ void drm_fb_helper_sys_imageblit(struct fb_info *info,
 				 const struct fb_image *image)
 {
 	sys_imageblit(info, image);
-	drm_fb_helper_dirty(info, image->dx, image->dy,
-			    image->width, image->height);
+	drm_fb_helper_damage(info, image->dx, image->dy, image->width, image->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_imageblit);
 
@@ -765,8 +761,7 @@ void drm_fb_helper_cfb_fillrect(struct fb_info *info,
 				const struct fb_fillrect *rect)
 {
 	cfb_fillrect(info, rect);
-	drm_fb_helper_dirty(info, rect->dx, rect->dy,
-			    rect->width, rect->height);
+	drm_fb_helper_damage(info, rect->dx, rect->dy, rect->width, rect->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_cfb_fillrect);
 
@@ -781,8 +776,7 @@ void drm_fb_helper_cfb_copyarea(struct fb_info *info,
 				const struct fb_copyarea *area)
 {
 	cfb_copyarea(info, area);
-	drm_fb_helper_dirty(info, area->dx, area->dy,
-			    area->width, area->height);
+	drm_fb_helper_damage(info, area->dx, area->dy, area->width, area->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_cfb_copyarea);
 
@@ -797,8 +791,7 @@ void drm_fb_helper_cfb_imageblit(struct fb_info *info,
 				 const struct fb_image *image)
 {
 	cfb_imageblit(info, image);
-	drm_fb_helper_dirty(info, image->dx, image->dy,
-			    image->width, image->height);
+	drm_fb_helper_damage(info, image->dx, image->dy, image->width, image->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_cfb_imageblit);
 
@@ -2195,7 +2188,7 @@ static ssize_t drm_fbdev_fb_write(struct fb_info *info, const char __user *buf,
 		*ppos += ret;
 
 	if (ret > 0)
-		drm_fb_helper_dirty(info, 0, 0, info->var.xres_virtual, info->var.yres_virtual);
+		drm_fb_helper_damage(info, 0, 0, info->var.xres_virtual, info->var.yres_virtual);
 
 	return ret ? ret : err;
 }
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
index 306aa3a60be9..3b273f9ca39a 100644
--- a/include/drm/drm_fb_helper.h
+++ b/include/drm/drm_fb_helper.h
@@ -100,10 +100,10 @@ struct drm_fb_helper_funcs {
  * @funcs: driver callbacks for fb helper
  * @fbdev: emulated fbdev device info struct
  * @pseudo_palette: fake palette of 16 colors
- * @dirty_clip: clip rectangle used with deferred_io to accumulate damage to
- *              the screen buffer
- * @dirty_lock: spinlock protecting @dirty_clip
- * @dirty_work: worker used to flush the framebuffer
+ * @damage_clip: clip rectangle used with deferred_io to accumulate damage to
+ *                the screen buffer
+ * @damage_lock: spinlock protecting @damage_clip
+ * @damage_work: worker used to flush the framebuffer
  * @resume_work: worker used during resume if the console lock is already taken
  *
  * This is the main structure used by the fbdev helpers. Drivers supporting
@@ -131,9 +131,9 @@ struct drm_fb_helper {
 	const struct drm_fb_helper_funcs *funcs;
 	struct fb_info *fbdev;
 	u32 pseudo_palette[17];
-	struct drm_clip_rect dirty_clip;
-	spinlock_t dirty_lock;
-	struct work_struct dirty_work;
+	struct drm_clip_rect damage_clip;
+	spinlock_t damage_lock;
+	struct work_struct damage_work;
 	struct work_struct resume_work;
 
 	/**
commit c1acbf08eb49721246f64fb55a78e416840dfcf3
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:38 2020 +0100

    drm/client: Depend on GEM object kmap ref-counting
    
    DRM client's vmap/vunmap functions don't allow for multiple vmap
    operations. Calling drm_client_buffer_vmap() twice returns the same
    mapping, then calling drm_client_buffer_vunmap() twice already unmaps
    on the first call. This leads to unbalanced vmap refcounts. Fix this
    by calling drm_gem_vmap() unconditionally in drm_client_buffer_vmap().
    
    All drivers that support DRM clients have to implement correct ref-
    counting for their vmap operations, or not vunmap at all. This is the
    case for drivers that use CMA, SHMEM and VRAM helpers, and QXL. Other
    drivers are not affected.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-4-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index fe573acf1067..ce45e380f4a2 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -314,9 +314,6 @@ drm_client_buffer_vmap(struct drm_client_buffer *buffer, struct dma_buf_map *map
 	struct dma_buf_map *map = &buffer->map;
 	int ret;
 
-	if (dma_buf_map_is_set(map))
-		goto out;
-
 	/*
 	 * FIXME: The dependency on GEM here isn't required, we could
 	 * convert the driver handle to a dma-buf instead and use the
@@ -329,7 +326,6 @@ drm_client_buffer_vmap(struct drm_client_buffer *buffer, struct dma_buf_map *map
 	if (ret)
 		return ret;
 
-out:
 	*map_copy = *map;
 
 	return 0;
commit 763aea17bf575ecea62e4e18c29a8452a770cb1e
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:37 2020 +0100

    drm/fb-helper: Unmap client buffer during shutdown
    
    The fbdev helper's generic probe function establishes a mapping for
    framebuffers without shadow buffer. The clean-up function did not unmap
    the buffer object. Add the unmap operation.
    
    As fbdev devices are usally released during system shutdown, this has
    not been a problem in practice.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-3-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 9c673f33d222..aa7af463c50d 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1988,14 +1988,19 @@ static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper)
 	if (!fb_helper->dev)
 		return;
 
-	if (fbi && fbi->fbdefio) {
-		fb_deferred_io_cleanup(fbi);
-		shadow = fbi->screen_buffer;
+	if (fbi) {
+		if (fbi->fbdefio)
+			fb_deferred_io_cleanup(fbi);
+		if (drm_fbdev_use_shadow_fb(fb_helper))
+			shadow = fbi->screen_buffer;
 	}
 
 	drm_fb_helper_fini(fb_helper);
 
-	vfree(shadow);
+	if (shadow)
+		vfree(shadow);
+	else
+		drm_client_buffer_vunmap(fb_helper->buffer);
 
 	drm_client_framebuffer_delete(fb_helper->buffer);
 }
commit a102172c7f818bfb32c0652552983e262d11990e
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Fri Nov 20 11:25:36 2020 +0100

    drm/fb-helper: Call dirty helper after writing to fbdev
    
    If fbdev uses a shadow framebuffer, call the damage handler. Otherwise
    the update might not make it to the screen.
    
    v2:
            * mark virtual screen as dirty (Ville)
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Fixes: 222ec45f4c69 ("drm/fb_helper: Support framebuffers in I/O memory")
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Acked-by: Sam Ravnborg <sam at ravnborg.org>
    Cc: Thomas Zimmermann <tzimmermann at suse.de>
    Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
    Cc: Sam Ravnborg <sam at ravnborg.org>
    Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
    Cc: Maxime Ripard <mripard at kernel.org>
    Cc: David Airlie <airlied at linux.ie>
    Cc: Daniel Vetter <daniel at ffwll.ch>
    Cc: Gerd Hoffmann <kraxel at redhat.com>
    Cc: dri-devel at lists.freedesktop.org
    Cc: virtualization at lists.linux-foundation.org
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120102545.4047-2-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 25edf670867c..9c673f33d222 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -2189,6 +2189,9 @@ static ssize_t drm_fbdev_fb_write(struct fb_info *info, const char __user *buf,
 	if (ret > 0)
 		*ppos += ret;
 
+	if (ret > 0)
+		drm_fb_helper_dirty(info, 0, 0, info->var.xres_virtual, info->var.yres_virtual);
+
 	return ret ? ret : err;
 }
 
commit 2f04636f496d723f4ab685d44aad12c257e832c6
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Tue Nov 17 14:31:56 2020 +0100

    drm/shmem-helper: Removed drm_gem_shmem_create_object_cached()
    
    Cached page mappings are now the default for SHMEM GEM objects. Remove
    the obsolete create function for cached mappings.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117133156.26822-3-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index b1c7a316f232..9825c378dfa6 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -479,32 +479,6 @@ bool drm_gem_shmem_purge(struct drm_gem_object *obj)
 }
 EXPORT_SYMBOL(drm_gem_shmem_purge);
 
-/**
- * drm_gem_shmem_create_object_cached - Create a shmem buffer object with
- *                                      cached mappings
- * @dev: DRM device
- * @size: Size of the object to allocate
- *
- * By default, shmem buffer objects use writecombine mappings. This
- * function implements struct drm_driver.gem_create_object for shmem
- * buffer objects with cached mappings.
- *
- * Returns:
- * A struct drm_gem_shmem_object * on success or NULL negative on failure.
- */
-struct drm_gem_object *
-drm_gem_shmem_create_object_cached(struct drm_device *dev, size_t size)
-{
-	struct drm_gem_shmem_object *shmem;
-
-	shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
-	if (!shmem)
-		return NULL;
-
-	return &shmem->base;
-}
-EXPORT_SYMBOL(drm_gem_shmem_create_object_cached);
-
 /**
  * drm_gem_shmem_dumb_create - Create a dumb shmem buffer object
  * @file: DRM file structure to create the dumb buffer for
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 0f07f259503d..a977c9f49719 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -37,7 +37,6 @@ static const struct drm_driver mgag200_driver = {
 	.major = DRIVER_MAJOR,
 	.minor = DRIVER_MINOR,
 	.patchlevel = DRIVER_PATCHLEVEL,
-	.gem_create_object = drm_gem_shmem_create_object_cached,
 	DRM_GEM_SHMEM_DRIVER_OPS,
 };
 
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index b5a8dd9fdf02..9269092697d8 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -38,8 +38,6 @@ static const struct drm_driver driver = {
 	.driver_features = DRIVER_ATOMIC | DRIVER_GEM | DRIVER_MODESET,
 
 	/* GEM hooks */
-	.gem_create_object = drm_gem_shmem_create_object_cached,
-
 	.fops = &udl_driver_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
 
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 1a1b5bc8e121..d4d39227f2ed 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -82,7 +82,6 @@ static const struct drm_driver vkms_driver = {
 	.driver_features	= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
 	.release		= vkms_release,
 	.fops			= &vkms_driver_fops,
-	.gem_create_object = drm_gem_shmem_create_object_cached,
 	DRM_GEM_SHMEM_DRIVER_OPS,
 
 	.name			= DRIVER_NAME,
diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
index f32801db3203..434328d8a0d9 100644
--- a/include/drm/drm_gem_shmem_helper.h
+++ b/include/drm/drm_gem_shmem_helper.h
@@ -133,9 +133,6 @@ drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
 				 struct drm_device *dev, size_t size,
 				 uint32_t *handle);
 
-struct drm_gem_object *
-drm_gem_shmem_create_object_cached(struct drm_device *dev, size_t size);
-
 int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
 			      struct drm_mode_create_dumb *args);
 
commit 0cf2ef46c6c0f1a0b475a63633706af8194484df
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Tue Nov 17 14:31:55 2020 +0100

    drm/shmem-helper: Use cached mappings by default
    
    SHMEM-buffer backing storage is allocated from system memory; which is
    typically cachable. The default mode for SHMEM objects is writecombine
    though.
    
    Unify SHMEM semantics by defaulting to cached mappings. The exception
    is pages imported via dma-buf. DMA memory is usually not cached.
    
    DRM drivers that require write-combined mappings set the map_wc flag
    in struct drm_gem_shmem_object to true. This currently affects lima,
    panfrost and v3d.
    
    The drivers mgag200, udl, virtio and vkms continue to use default
    shmem mappings.
    
    The drivers cirrus and gm12u320 change caching flags. Both used
    writecombine and now switch over to shmem defaults. Both drivers use
    SHMEM objects as shadow buffers for internal video memory, so cached
    mappings will not affect them negatively.
    
    v3:
            * set value of shmem pointer before dereferencing it in
              __drm_gem_shmem_create() (Dan, kernel test robot)
    v2:
            * recreate patch on top of latest SHMEM helpers
            * update lima, panfrost, v3d to select writecombine (Daniel, Rob)
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117133156.26822-2-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 499189c48f0b..b1c7a316f232 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -51,13 +51,17 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
+	shmem = to_drm_gem_shmem_obj(obj);
+
 	if (!obj->funcs)
 		obj->funcs = &drm_gem_shmem_funcs;
 
-	if (private)
+	if (private) {
 		drm_gem_private_object_init(dev, obj, size);
-	else
+		shmem->map_wc = false; /* dma-buf mappings use always writecombine */
+	} else {
 		ret = drm_gem_object_init(dev, obj, size);
+	}
 	if (ret)
 		goto err_free;
 
@@ -65,7 +69,6 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
 	if (ret)
 		goto err_release;
 
-	shmem = to_drm_gem_shmem_obj(obj);
 	mutex_init(&shmem->pages_lock);
 	mutex_init(&shmem->vmap_lock);
 	INIT_LIST_HEAD(&shmem->madv_list);
@@ -284,7 +287,7 @@ static int drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem, struct
 		if (ret)
 			goto err_zero_use;
 
-		if (!shmem->map_cached)
+		if (shmem->map_wc)
 			prot = pgprot_writecombine(prot);
 		shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT,
 				    VM_MAP, prot);
@@ -497,7 +500,6 @@ drm_gem_shmem_create_object_cached(struct drm_device *dev, size_t size)
 	shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
 	if (!shmem)
 		return NULL;
-	shmem->map_cached = true;
 
 	return &shmem->base;
 }
@@ -626,7 +628,7 @@ int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 
 	vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND;
 	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
-	if (!shmem->map_cached)
+	if (shmem->map_wc)
 		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
 	vma->vm_ops = &drm_gem_shmem_vm_ops;
 
diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
index 832e5280a6ed..de62966243cd 100644
--- a/drivers/gpu/drm/lima/lima_gem.c
+++ b/drivers/gpu/drm/lima/lima_gem.c
@@ -225,7 +225,7 @@ struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t siz
 
 	mutex_init(&bo->lock);
 	INIT_LIST_HEAD(&bo->va);
-
+	bo->base.map_wc = true;
 	bo->base.base.funcs = &lima_gem_funcs;
 
 	return &bo->base.base;
diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c
index 57a31dd0ffed..3e0723bc36bd 100644
--- a/drivers/gpu/drm/panfrost/panfrost_gem.c
+++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
@@ -228,7 +228,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t
 	INIT_LIST_HEAD(&obj->mappings.list);
 	mutex_init(&obj->mappings.lock);
 	obj->base.base.funcs = &panfrost_gem_funcs;
-	obj->base.map_cached = pfdev->coherent;
+	obj->base.map_wc = !pfdev->coherent;
 
 	return &obj->base.base;
 }
diff --git a/drivers/gpu/drm/v3d/v3d_bo.c b/drivers/gpu/drm/v3d/v3d_bo.c
index 8b52cb25877c..6a8731ab9d7d 100644
--- a/drivers/gpu/drm/v3d/v3d_bo.c
+++ b/drivers/gpu/drm/v3d/v3d_bo.c
@@ -78,7 +78,7 @@ struct drm_gem_object *v3d_create_object(struct drm_device *dev, size_t size)
 	obj = &bo->base.base;
 
 	obj->funcs = &v3d_gem_funcs;
-
+	bo->base.map_wc = true;
 	INIT_LIST_HEAD(&bo->unref_head);
 
 	return &bo->base.base;
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index d9ad27e00905..d69a5b6da553 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -144,7 +144,6 @@ struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev,
 
 	dshmem = &shmem->base.base;
 	dshmem->base.funcs = &virtio_gpu_shmem_funcs;
-	dshmem->map_cached = true;
 	return &dshmem->base;
 }
 
diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
index 3449a0353fe0..f32801db3203 100644
--- a/include/drm/drm_gem_shmem_helper.h
+++ b/include/drm/drm_gem_shmem_helper.h
@@ -98,9 +98,9 @@ struct drm_gem_shmem_object {
 	unsigned int vmap_use_count;
 
 	/**
-	 * @map_cached: map object cached (instead of using writecombine).
+	 * @map_wc: map object write-combined (instead of using shmem defaults).
 	 */
-	bool map_cached;
+	bool map_wc;
 };
 
 #define to_drm_gem_shmem_obj(obj) \
commit d549699048b4b5c22dd710455bcdb76966e55aa3
Author: Eyal Birger <eyal.birger at gmail.com>
Date:   Sat Nov 21 08:28:17 2020 +0200

    net/packet: fix packet receive on L3 devices without visible hard header
    
    In the patchset merged by commit b9fcf0a0d826
    ("Merge branch 'support-AF_PACKET-for-layer-3-devices'") L3 devices which
    did not have header_ops were given one for the purpose of protocol parsing
    on af_packet transmit path.
    
    That change made af_packet receive path regard these devices as having a
    visible L3 header and therefore aligned incoming skb->data to point to the
    skb's mac_header. Some devices, such as ipip, xfrmi, and others, do not
    reset their mac_header prior to ingress and therefore their incoming
    packets became malformed.
    
    Ideally these devices would reset their mac headers, or af_packet would be
    able to rely on dev->hard_header_len being 0 for such cases, but it seems
    this is not the case.
    
    Fix by changing af_packet RX ll visibility criteria to include the
    existence of a '.create()' header operation, which is used when creating
    a device hard header - via dev_hard_header() - by upper layers, and does
    not exist in these L3 devices.
    
    As this predicate may be useful in other situations, add it as a common
    dev_has_header() helper in netdevice.h.
    
    Fixes: b9fcf0a0d826 ("Merge branch 'support-AF_PACKET-for-layer-3-devices'")
    Signed-off-by: Eyal Birger <eyal.birger at gmail.com>
    Acked-by: Jason A. Donenfeld <Jason at zx2c4.com>
    Acked-by: Willem de Bruijn <willemb at google.com>
    Link: https://lore.kernel.org/r/20201121062817.3178900-1-eyal.birger@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 964b494b0e8d..fa275a054f46 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3137,6 +3137,11 @@ static inline bool dev_validate_header(const struct net_device *dev,
 	return false;
 }
 
+static inline bool dev_has_header(const struct net_device *dev)
+{
+	return dev->header_ops && dev->header_ops->create;
+}
+
 typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr,
 			   int len, int size);
 int register_gifconf(unsigned int family, gifconf_func_t *gifconf);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index cefbd50c1090..7a18ffff8551 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -93,8 +93,8 @@
 
 /*
    Assumptions:
-   - If the device has no dev->header_ops, there is no LL header visible
-     above the device. In this case, its hard_header_len should be 0.
+   - If the device has no dev->header_ops->create, there is no LL header
+     visible above the device. In this case, its hard_header_len should be 0.
      The device may prepend its own header internally. In this case, its
      needed_headroom should be set to the space needed for it to add its
      internal header.
@@ -108,26 +108,26 @@
 On receive:
 -----------
 
-Incoming, dev->header_ops != NULL
+Incoming, dev_has_header(dev) == true
    mac_header -> ll header
    data       -> data
 
-Outgoing, dev->header_ops != NULL
+Outgoing, dev_has_header(dev) == true
    mac_header -> ll header
    data       -> ll header
 
-Incoming, dev->header_ops == NULL
+Incoming, dev_has_header(dev) == false
    mac_header -> data
      However drivers often make it point to the ll header.
      This is incorrect because the ll header should be invisible to us.
    data       -> data
 
-Outgoing, dev->header_ops == NULL
+Outgoing, dev_has_header(dev) == false
    mac_header -> data. ll header is invisible to us.
    data       -> data
 
 Resume
-  If dev->header_ops == NULL we are unable to restore the ll header,
+  If dev_has_header(dev) == false we are unable to restore the ll header,
     because it is invisible to us.
 
 
@@ -2069,7 +2069,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
 
 	skb->dev = dev;
 
-	if (dev->header_ops) {
+	if (dev_has_header(dev)) {
 		/* The device has an explicit notion of ll header,
 		 * exported to higher levels.
 		 *
@@ -2198,7 +2198,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
 	if (!net_eq(dev_net(dev), sock_net(sk)))
 		goto drop;
 
-	if (dev->header_ops) {
+	if (dev_has_header(dev)) {
 		if (sk->sk_type != SOCK_DGRAM)
 			skb_push(skb, skb->data - skb_mac_header(skb));
 		else if (skb->pkt_type == PACKET_OUTGOING) {
commit 2663b3388551230cbc4606a40fabf3331ceb59e4
Author: Hao Si <si.hao at zte.com.cn>
Date:   Tue Oct 20 10:18:32 2020 +0800

    soc: fsl: dpio: Get the cpumask through cpumask_of(cpu)
    
    The local variable 'cpumask_t mask' is in the stack memory, and its address
    is assigned to 'desc->affinity' in 'irq_set_affinity_hint()'.
    But the memory area where this variable is located is at risk of being
    modified.
    
    During LTP testing, the following error was generated:
    
    Unable to handle kernel paging request at virtual address ffff000012e9b790
    Mem abort info:
      ESR = 0x96000007
      Exception class = DABT (current EL), IL = 32 bits
      SET = 0, FnV = 0
      EA = 0, S1PTW = 0
    Data abort info:
      ISV = 0, ISS = 0x00000007
      CM = 0, WnR = 0
    swapper pgtable: 4k pages, 48-bit VAs, pgdp = 0000000075ac5e07
    [ffff000012e9b790] pgd=00000027dbffe003, pud=00000027dbffd003,
    pmd=00000027b6d61003, pte=0000000000000000
    Internal error: Oops: 96000007 [#1] PREEMPT SMP
    Modules linked in: xt_conntrack
    Process read_all (pid: 20171, stack limit = 0x0000000044ea4095)
    CPU: 14 PID: 20171 Comm: read_all Tainted: G    B   W
    Hardware name: NXP Layerscape LX2160ARDB (DT)
    pstate: 80000085 (Nzcv daIf -PAN -UAO)
    pc : irq_affinity_hint_proc_show+0x54/0xb0
    lr : irq_affinity_hint_proc_show+0x4c/0xb0
    sp : ffff00001138bc10
    x29: ffff00001138bc10 x28: 0000ffffd131d1e0
    x27: 00000000007000c0 x26: ffff8025b9480dc0
    x25: ffff8025b9480da8 x24: 00000000000003ff
    x23: ffff8027334f8300 x22: ffff80272e97d000
    x21: ffff80272e97d0b0 x20: ffff8025b9480d80
    x19: ffff000009a49000 x18: 0000000000000000
    x17: 0000000000000000 x16: 0000000000000000
    x15: 0000000000000000 x14: 0000000000000000
    x13: 0000000000000000 x12: 0000000000000040
    x11: 0000000000000000 x10: ffff802735b79b88
    x9 : 0000000000000000 x8 : 0000000000000000
    x7 : ffff000009a49848 x6 : 0000000000000003
    x5 : 0000000000000000 x4 : ffff000008157d6c
    x3 : ffff00001138bc10 x2 : ffff000012e9b790
    x1 : 0000000000000000 x0 : 0000000000000000
    Call trace:
     irq_affinity_hint_proc_show+0x54/0xb0
     seq_read+0x1b0/0x440
     proc_reg_read+0x80/0xd8
     __vfs_read+0x60/0x178
     vfs_read+0x94/0x150
     ksys_read+0x74/0xf0
     __arm64_sys_read+0x24/0x30
     el0_svc_common.constprop.0+0xd8/0x1a0
     el0_svc_handler+0x34/0x88
     el0_svc+0x10/0x14
    Code: f9001bbf 943e0732 f94066c2 b4000062 (f9400041)
    ---[ end trace b495bdcb0b3b732b ]---
    Kernel panic - not syncing: Fatal exception
    SMP: stopping secondary CPUs
    SMP: failed to stop secondary CPUs 0,2-4,6,8,11,13-15
    Kernel Offset: disabled
    CPU features: 0x0,21006008
    Memory Limit: none
    ---[ end Kernel panic - not syncing: Fatal exception ]---
    
    Fix it by using 'cpumask_of(cpu)' to get the cpumask.
    
    Signed-off-by: Hao Si <si.hao at zte.com.cn>
    Signed-off-by: Lin Chen <chen.lin5 at zte.com.cn>
    Signed-off-by: Yi Wang <wang.yi59 at zte.com.cn>
    Signed-off-by: Li Yang <leoyang.li at nxp.com>

diff --git a/drivers/soc/fsl/dpio/dpio-driver.c b/drivers/soc/fsl/dpio/dpio-driver.c
index 7b642c330977..7f397b4ad878 100644
--- a/drivers/soc/fsl/dpio/dpio-driver.c
+++ b/drivers/soc/fsl/dpio/dpio-driver.c
@@ -95,7 +95,6 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
 {
 	int error;
 	struct fsl_mc_device_irq *irq;
-	cpumask_t mask;
 
 	irq = dpio_dev->irqs[0];
 	error = devm_request_irq(&dpio_dev->dev,
@@ -112,9 +111,7 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
 	}
 
 	/* set the affinity hint */
-	cpumask_clear(&mask);
-	cpumask_set_cpu(cpu, &mask);
-	if (irq_set_affinity_hint(irq->msi_desc->irq, &mask))
+	if (irq_set_affinity_hint(irq->msi_desc->irq, cpumask_of(cpu)))
 		dev_err(&dpio_dev->dev,
 			"irq_set_affinity failed irq %d cpu %d\n",
 			irq->msi_desc->irq, cpu);
commit 2980cbd4dce7b1e9bf57df3ced43a7b184986f50
Author: Sylwester Dziedziuch <sylwesterx.dziedziuch at intel.com>
Date:   Fri Nov 20 10:06:40 2020 -0800

    i40e: Fix removing driver while bare-metal VFs pass traffic
    
    Prevent VFs from resetting when PF driver is being unloaded:
    - introduce new pf state: __I40E_VF_RESETS_DISABLED;
    - check if pf state has __I40E_VF_RESETS_DISABLED state set,
      if so, disable any further VFLR event notifications;
    - when i40e_remove (rmmod i40e) is called, disable any resets on
      the VFs;
    
    Previously if there were bare-metal VFs passing traffic and PF
    driver was removed, there was a possibility of VFs triggering a Tx
    timeout right before iavf_remove. This was causing iavf_close to
    not be called because there is a check in the beginning of  iavf_remove
    that bails out early if adapter->state < IAVF_DOWN_PENDING. This
    makes it so some resources do not get cleaned up.
    
    Fixes: 6a9ddb36eeb8 ("i40e: disable IOV before freeing resources")
    Signed-off-by: Slawomir Laba <slawomirx.laba at intel.com>
    Signed-off-by: Brett Creeley <brett.creeley at intel.com>
    Signed-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch at intel.com>
    Tested-by: Konrad Jankowski <konrad0.jankowski at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>
    Link: https://lore.kernel.org/r/20201120180640.3654474-1-anthony.l.nguyen@intel.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 537300e762f0..d231a2cdd98f 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -140,6 +140,7 @@ enum i40e_state_t {
 	__I40E_CLIENT_RESET,
 	__I40E_VIRTCHNL_OP_PENDING,
 	__I40E_RECOVERY_MODE,
+	__I40E_VF_RESETS_DISABLED,	/* disable resets during i40e_remove */
 	/* This must be last as it determines the size of the BITMAP */
 	__I40E_STATE_SIZE__,
 };
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 4f8a2154b93f..1337686bd099 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -4010,8 +4010,16 @@ static irqreturn_t i40e_intr(int irq, void *data)
 	}
 
 	if (icr0 & I40E_PFINT_ICR0_VFLR_MASK) {
-		ena_mask &= ~I40E_PFINT_ICR0_ENA_VFLR_MASK;
-		set_bit(__I40E_VFLR_EVENT_PENDING, pf->state);
+		/* disable any further VFLR event notifications */
+		if (test_bit(__I40E_VF_RESETS_DISABLED, pf->state)) {
+			u32 reg = rd32(hw, I40E_PFINT_ICR0_ENA);
+
+			reg &= ~I40E_PFINT_ICR0_VFLR_MASK;
+			wr32(hw, I40E_PFINT_ICR0_ENA, reg);
+		} else {
+			ena_mask &= ~I40E_PFINT_ICR0_ENA_VFLR_MASK;
+			set_bit(__I40E_VFLR_EVENT_PENDING, pf->state);
+		}
 	}
 
 	if (icr0 & I40E_PFINT_ICR0_GRST_MASK) {
@@ -15311,6 +15319,11 @@ static void i40e_remove(struct pci_dev *pdev)
 	while (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state))
 		usleep_range(1000, 2000);
 
+	if (pf->flags & I40E_FLAG_SRIOV_ENABLED) {
+		set_bit(__I40E_VF_RESETS_DISABLED, pf->state);
+		i40e_free_vfs(pf);
+		pf->flags &= ~I40E_FLAG_SRIOV_ENABLED;
+	}
 	/* no more scheduling of any task */
 	set_bit(__I40E_SUSPENDED, pf->state);
 	set_bit(__I40E_DOWN, pf->state);
@@ -15337,11 +15350,6 @@ static void i40e_remove(struct pci_dev *pdev)
 	 */
 	i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false);
 
-	if (pf->flags & I40E_FLAG_SRIOV_ENABLED) {
-		i40e_free_vfs(pf);
-		pf->flags &= ~I40E_FLAG_SRIOV_ENABLED;
-	}
-
 	i40e_fdir_teardown(pf);
 
 	/* If there is a switch structure or any orphans, remove them.
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 4919d22d7b6b..1b5390ec3d78 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -1403,7 +1403,8 @@ static void i40e_cleanup_reset_vf(struct i40e_vf *vf)
  * @vf: pointer to the VF structure
  * @flr: VFLR was issued or not
  *
- * Returns true if the VF is reset, false otherwise.
+ * Returns true if the VF is in reset, resets successfully, or resets
+ * are disabled and false otherwise.
  **/
 bool i40e_reset_vf(struct i40e_vf *vf, bool flr)
 {
@@ -1413,11 +1414,14 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr)
 	u32 reg;
 	int i;
 
+	if (test_bit(__I40E_VF_RESETS_DISABLED, pf->state))
+		return true;
+
 	/* If the VFs have been disabled, this means something else is
 	 * resetting the VF, so we shouldn't continue.
 	 */
 	if (test_and_set_bit(__I40E_VF_DISABLE, pf->state))
-		return false;
+		return true;
 
 	i40e_trigger_vf_reset(vf, flr);
 
@@ -1581,6 +1585,15 @@ void i40e_free_vfs(struct i40e_pf *pf)
 
 	i40e_notify_client_of_vf_enable(pf, 0);
 
+	/* Disable IOV before freeing resources. This lets any VF drivers
+	 * running in the host get themselves cleaned up before we yank
+	 * the carpet out from underneath their feet.
+	 */
+	if (!pci_vfs_assigned(pf->pdev))
+		pci_disable_sriov(pf->pdev);
+	else
+		dev_warn(&pf->pdev->dev, "VFs are assigned - not disabling SR-IOV\n");
+
 	/* Amortize wait time by stopping all VFs at the same time */
 	for (i = 0; i < pf->num_alloc_vfs; i++) {
 		if (test_bit(I40E_VF_STATE_INIT, &pf->vf[i].vf_states))
@@ -1596,15 +1609,6 @@ void i40e_free_vfs(struct i40e_pf *pf)
 		i40e_vsi_wait_queues_disabled(pf->vsi[pf->vf[i].lan_vsi_idx]);
 	}
 
-	/* Disable IOV before freeing resources. This lets any VF drivers
-	 * running in the host get themselves cleaned up before we yank
-	 * the carpet out from underneath their feet.
-	 */
-	if (!pci_vfs_assigned(pf->pdev))
-		pci_disable_sriov(pf->pdev);
-	else
-		dev_warn(&pf->pdev->dev, "VFs are assigned - not disabling SR-IOV\n");
-
 	/* free up VF resources */
 	tmp = pf->num_alloc_vfs;
 	pf->num_alloc_vfs = 0;
commit 3fe356d58efae54dade9ec94ea7c919ed20cf4db
Author: Stefano Garzarella <sgarzare at redhat.com>
Date:   Fri Nov 20 11:47:36 2020 +0100

    vsock/virtio: discard packets only when socket is really closed
    
    Starting from commit 8692cefc433f ("virtio_vsock: Fix race condition
    in virtio_transport_recv_pkt"), we discard packets in
    virtio_transport_recv_pkt() if the socket has been released.
    
    When the socket is connected, we schedule a delayed work to wait the
    RST packet from the other peer, also if SHUTDOWN_MASK is set in
    sk->sk_shutdown.
    This is done to complete the virtio-vsock shutdown algorithm, releasing
    the port assigned to the socket definitively only when the other peer
    has consumed all the packets.
    
    If we discard the RST packet received, the socket will be closed only
    when the VSOCK_CLOSE_TIMEOUT is reached.
    
    Sergio discovered the issue while running ab(1) HTTP benchmark using
    libkrun [1] and observing a latency increase with that commit.
    
    To avoid this issue, we discard packet only if the socket is really
    closed (SOCK_DONE flag is set).
    We also set SOCK_DONE in virtio_transport_release() when we don't need
    to wait any packets from the other peer (we didn't schedule the delayed
    work). In this case we remove the socket from the vsock lists, releasing
    the port assigned.
    
    [1] https://github.com/containers/libkrun
    
    Fixes: 8692cefc433f ("virtio_vsock: Fix race condition in virtio_transport_recv_pkt")
    Cc: justin.he at arm.com
    Reported-by: Sergio Lopez <slp at redhat.com>
    Tested-by: Sergio Lopez <slp at redhat.com>
    Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
    Acked-by: Jia He <justin.he at arm.com>
    Link: https://lore.kernel.org/r/20201120104736.73749-1-sgarzare@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
index 0edda1edf988..5956939eebb7 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -841,8 +841,10 @@ void virtio_transport_release(struct vsock_sock *vsk)
 		virtio_transport_free_pkt(pkt);
 	}
 
-	if (remove_sock)
+	if (remove_sock) {
+		sock_set_flag(sk, SOCK_DONE);
 		vsock_remove_sock(vsk);
+	}
 }
 EXPORT_SYMBOL_GPL(virtio_transport_release);
 
@@ -1132,8 +1134,8 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,
 
 	lock_sock(sk);
 
-	/* Check if sk has been released before lock_sock */
-	if (sk->sk_shutdown == SHUTDOWN_MASK) {
+	/* Check if sk has been closed before lock_sock */
+	if (sock_flag(sk, SOCK_DONE)) {
 		(void)virtio_transport_reset_no_sock(t, pkt);
 		release_sock(sk);
 		sock_put(sk);
commit 01770a166165738a6e05c3d911fb4609cc4eb416
Author: Ricardo Dias <rdias at singlestore.com>
Date:   Fri Nov 20 11:11:33 2020 +0000

    tcp: fix race condition when creating child sockets from syncookies
    
    When the TCP stack is in SYN flood mode, the server child socket is
    created from the SYN cookie received in a TCP packet with the ACK flag
    set.
    
    The child socket is created when the server receives the first TCP
    packet with a valid SYN cookie from the client. Usually, this packet
    corresponds to the final step of the TCP 3-way handshake, the ACK
    packet. But is also possible to receive a valid SYN cookie from the
    first TCP data packet sent by the client, and thus create a child socket
    from that SYN cookie.
    
    Since a client socket is ready to send data as soon as it receives the
    SYN+ACK packet from the server, the client can send the ACK packet (sent
    by the TCP stack code), and the first data packet (sent by the userspace
    program) almost at the same time, and thus the server will equally
    receive the two TCP packets with valid SYN cookies almost at the same
    instant.
    
    When such event happens, the TCP stack code has a race condition that
    occurs between the momement a lookup is done to the established
    connections hashtable to check for the existence of a connection for the
    same client, and the moment that the child socket is added to the
    established connections hashtable. As a consequence, this race condition
    can lead to a situation where we add two child sockets to the
    established connections hashtable and deliver two sockets to the
    userspace program to the same client.
    
    This patch fixes the race condition by checking if an existing child
    socket exists for the same client when we are adding the second child
    socket to the established connections socket. If an existing child
    socket exists, we drop the packet and discard the second child socket
    to the same client.
    
    Signed-off-by: Ricardo Dias <rdias at singlestore.com>
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Link: https://lore.kernel.org/r/20201120111133.GA67501@rdias-suse-pc.lan
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h
index 92560974ea67..ca6a3ea9057e 100644
--- a/include/net/inet_hashtables.h
+++ b/include/net/inet_hashtables.h
@@ -247,8 +247,9 @@ void inet_hashinfo2_init(struct inet_hashinfo *h, const char *name,
 			 unsigned long high_limit);
 int inet_hashinfo2_init_mod(struct inet_hashinfo *h);
 
-bool inet_ehash_insert(struct sock *sk, struct sock *osk);
-bool inet_ehash_nolisten(struct sock *sk, struct sock *osk);
+bool inet_ehash_insert(struct sock *sk, struct sock *osk, bool *found_dup_sk);
+bool inet_ehash_nolisten(struct sock *sk, struct sock *osk,
+			 bool *found_dup_sk);
 int __inet_hash(struct sock *sk, struct sock *osk);
 int inet_hash(struct sock *sk);
 void inet_unhash(struct sock *sk);
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index bb3d70664dde..b0b6e6a4784e 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -427,7 +427,7 @@ struct sock *dccp_v4_request_recv_sock(const struct sock *sk,
 
 	if (__inet_inherit_port(sk, newsk) < 0)
 		goto put_and_exit;
-	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash));
+	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash), NULL);
 	if (*own_req)
 		ireq->ireq_opt = NULL;
 	else
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index ef4ab28cfde0..78ee1b5acf1f 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -533,7 +533,7 @@ static struct sock *dccp_v6_request_recv_sock(const struct sock *sk,
 		dccp_done(newsk);
 		goto out;
 	}
-	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash));
+	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash), NULL);
 	/* Clone pktoptions received with SYN, if we own the req */
 	if (*own_req && ireq->pktopts) {
 		newnp->pktoptions = skb_clone(ireq->pktopts, GFP_ATOMIC);
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index 4148f5f78f31..f60869acbef0 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -787,7 +787,7 @@ static void reqsk_queue_hash_req(struct request_sock *req,
 	timer_setup(&req->rsk_timer, reqsk_timer_handler, TIMER_PINNED);
 	mod_timer(&req->rsk_timer, jiffies + timeout);
 
-	inet_ehash_insert(req_to_sk(req), NULL);
+	inet_ehash_insert(req_to_sk(req), NULL, NULL);
 	/* before letting lookups find us, make sure all req fields
 	 * are committed to memory and refcnt initialized.
 	 */
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c
index 8cbe74313f38..45fb450b4522 100644
--- a/net/ipv4/inet_hashtables.c
+++ b/net/ipv4/inet_hashtables.c
@@ -20,6 +20,9 @@
 #include <net/addrconf.h>
 #include <net/inet_connection_sock.h>
 #include <net/inet_hashtables.h>
+#if IS_ENABLED(CONFIG_IPV6)
+#include <net/inet6_hashtables.h>
+#endif
 #include <net/secure_seq.h>
 #include <net/ip.h>
 #include <net/tcp.h>
@@ -508,10 +511,52 @@ static u32 inet_sk_port_offset(const struct sock *sk)
 					  inet->inet_dport);
 }
 
-/* insert a socket into ehash, and eventually remove another one
- * (The another one can be a SYN_RECV or TIMEWAIT
+/* Searches for an exsiting socket in the ehash bucket list.
+ * Returns true if found, false otherwise.
  */
-bool inet_ehash_insert(struct sock *sk, struct sock *osk)
+static bool inet_ehash_lookup_by_sk(struct sock *sk,
+				    struct hlist_nulls_head *list)
+{
+	const __portpair ports = INET_COMBINED_PORTS(sk->sk_dport, sk->sk_num);
+	const int sdif = sk->sk_bound_dev_if;
+	const int dif = sk->sk_bound_dev_if;
+	const struct hlist_nulls_node *node;
+	struct net *net = sock_net(sk);
+	struct sock *esk;
+
+	INET_ADDR_COOKIE(acookie, sk->sk_daddr, sk->sk_rcv_saddr);
+
+	sk_nulls_for_each_rcu(esk, node, list) {
+		if (esk->sk_hash != sk->sk_hash)
+			continue;
+		if (sk->sk_family == AF_INET) {
+			if (unlikely(INET_MATCH(esk, net, acookie,
+						sk->sk_daddr,
+						sk->sk_rcv_saddr,
+						ports, dif, sdif))) {
+				return true;
+			}
+		}
+#if IS_ENABLED(CONFIG_IPV6)
+		else if (sk->sk_family == AF_INET6) {
+			if (unlikely(INET6_MATCH(esk, net,
+						 &sk->sk_v6_daddr,
+						 &sk->sk_v6_rcv_saddr,
+						 ports, dif, sdif))) {
+				return true;
+			}
+		}
+#endif
+	}
+	return false;
+}
+
+/* Insert a socket into ehash, and eventually remove another one
+ * (The another one can be a SYN_RECV or TIMEWAIT)
+ * If an existing socket already exists, socket sk is not inserted,
+ * and sets found_dup_sk parameter to true.
+ */
+bool inet_ehash_insert(struct sock *sk, struct sock *osk, bool *found_dup_sk)
 {
 	struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo;
 	struct hlist_nulls_head *list;
@@ -530,16 +575,23 @@ bool inet_ehash_insert(struct sock *sk, struct sock *osk)
 	if (osk) {
 		WARN_ON_ONCE(sk->sk_hash != osk->sk_hash);
 		ret = sk_nulls_del_node_init_rcu(osk);
+	} else if (found_dup_sk) {
+		*found_dup_sk = inet_ehash_lookup_by_sk(sk, list);
+		if (*found_dup_sk)
+			ret = false;
 	}
+
 	if (ret)
 		__sk_nulls_add_node_rcu(sk, list);
+
 	spin_unlock(lock);
+
 	return ret;
 }
 
-bool inet_ehash_nolisten(struct sock *sk, struct sock *osk)
+bool inet_ehash_nolisten(struct sock *sk, struct sock *osk, bool *found_dup_sk)
 {
-	bool ok = inet_ehash_insert(sk, osk);
+	bool ok = inet_ehash_insert(sk, osk, found_dup_sk);
 
 	if (ok) {
 		sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
@@ -583,7 +635,7 @@ int __inet_hash(struct sock *sk, struct sock *osk)
 	int err = 0;
 
 	if (sk->sk_state != TCP_LISTEN) {
-		inet_ehash_nolisten(sk, osk);
+		inet_ehash_nolisten(sk, osk, NULL);
 		return 0;
 	}
 	WARN_ON(!sk_unhashed(sk));
@@ -679,7 +731,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
 		tb = inet_csk(sk)->icsk_bind_hash;
 		spin_lock_bh(&head->lock);
 		if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
-			inet_ehash_nolisten(sk, NULL);
+			inet_ehash_nolisten(sk, NULL, NULL);
 			spin_unlock_bh(&head->lock);
 			return 0;
 		}
@@ -758,7 +810,7 @@ ok:
 	inet_bind_hash(sk, tb, port);
 	if (sk_unhashed(sk)) {
 		inet_sk(sk)->inet_sport = htons(port);
-		inet_ehash_nolisten(sk, (struct sock *)tw);
+		inet_ehash_nolisten(sk, (struct sock *)tw, NULL);
 	}
 	if (tw)
 		inet_twsk_bind_unhash(tw, hinfo);
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 25d35a56ceba..c95fcdfeed42 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1499,6 +1499,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
 				  bool *own_req)
 {
 	struct inet_request_sock *ireq;
+	bool found_dup_sk = false;
 	struct inet_sock *newinet;
 	struct tcp_sock *newtp;
 	struct sock *newsk;
@@ -1576,12 +1577,22 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
 
 	if (__inet_inherit_port(sk, newsk) < 0)
 		goto put_and_exit;
-	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash));
+	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash),
+				       &found_dup_sk);
 	if (likely(*own_req)) {
 		tcp_move_syn(newtp, req);
 		ireq->ireq_opt = NULL;
 	} else {
-		newinet->inet_opt = NULL;
+		if (!req_unhash && found_dup_sk) {
+			/* This code path should only be executed in the
+			 * syncookie case only
+			 */
+			bh_unlock_sock(newsk);
+			sock_put(newsk);
+			newsk = NULL;
+		} else {
+			newinet->inet_opt = NULL;
+		}
 	}
 	return newsk;
 
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 3d49e8d0afee..d2502911b7fa 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1193,6 +1193,7 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
 	const struct ipv6_pinfo *np = tcp_inet6_sk(sk);
 	struct ipv6_txoptions *opt;
 	struct inet_sock *newinet;
+	bool found_dup_sk = false;
 	struct tcp_sock *newtp;
 	struct sock *newsk;
 #ifdef CONFIG_TCP_MD5SIG
@@ -1368,7 +1369,8 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
 		tcp_done(newsk);
 		goto out;
 	}
-	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash));
+	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash),
+				       &found_dup_sk);
 	if (*own_req) {
 		tcp_move_syn(newtp, req);
 
@@ -1383,6 +1385,15 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
 				skb_set_owner_r(newnp->pktoptions, newsk);
 			}
 		}
+	} else {
+		if (!req_unhash && found_dup_sk) {
+			/* This code path should only be executed in the
+			 * syncookie case only
+			 */
+			bh_unlock_sock(newsk);
+			sock_put(newsk);
+			newsk = NULL;
+		}
 	}
 
 	return newsk;
commit d5beb3140f91b1c8a3d41b14d729aefa4dcc58bc
Merge: 418baf2c28f3 5f1251a48c17
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 23 15:29:03 2020 -0800

    Merge tag 'hyperv-fixes-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux
    
    Pull Hyper-V fix from Wei Liu:
     "One patch from Dexuan to fix VRAM cache type in Hyper-V framebuffer
      driver"
    
    * tag 'hyperv-fixes-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux:
      video: hyperv_fb: Fix the cache type when mapping the VRAM

commit 3a78f064a679e44cbd77df9fcb30ebac32f5b46a
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Thu Nov 19 15:07:07 2020 +0100

    drm/mcde: Fix uninitialized value
    
    "val" isn't initialized on the default: errorpath.
    Just return from the function if this happens.
    
    Reported-by: kernel test robot <lkp at intel.com>
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201119140707.1008407-1-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/mcde/mcde_display.c b/drivers/gpu/drm/mcde/mcde_display.c
index 192e11c88d72..d941026b940c 100644
--- a/drivers/gpu/drm/mcde/mcde_display.c
+++ b/drivers/gpu/drm/mcde/mcde_display.c
@@ -569,7 +569,7 @@ static void mcde_configure_channel(struct mcde *mcde, enum mcde_channel ch,
 	default:
 		dev_err(mcde->dev, "unknown flow mode %d\n",
 			mcde->flow_mode);
-		break;
+		return;
 	}
 
 	writel(val, mcde->regs + sync);
commit d795fd322063246f23ca20ba0125cf3ed89cc1d3
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Thu Nov 12 15:29:25 2020 +0100

    drm/mcde: Support DPI output
    
    This implements support for DPI output using the port node
    in the device tree to connect a DPI LCD display to the
    MCDE. The block also supports TV-out but we leave that
    for another day when we have a hardware using it.
    
    We implement parsing and handling of the "port" node,
    and follow that to the DPI endpoint.
    
    The clock divider used by the MCDE to divide down the
    "lcdclk" (this has been designed for TV-like frequencies)
    is represented by an ordinary clock provider internally
    in the MCDE. This idea was inspired by the PL111 solution
    by Eric Anholt: the divider also works very similar to
    the Pl111 clock divider.
    
    We take care to clear up some errors regarding the number
    of available formatters and their type. We have 6 DSI
    formatters and 2 DPI formatters.
    
    Tested on the Samsung GT-I9070 Janice mobile phone.
    
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Acked-by: Sam Ravnborg <sam at ravnborg.org>
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Cc: phone-devel at vger.kernel.org
    Cc: upstreaming at lists.sr.ht
    Link: https://patchwork.freedesktop.org/patch/msgid/20201112142925.2571179-2-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/mcde/Kconfig b/drivers/gpu/drm/mcde/Kconfig
index b3990126562c..71c689b573c9 100644
--- a/drivers/gpu/drm/mcde/Kconfig
+++ b/drivers/gpu/drm/mcde/Kconfig
@@ -4,6 +4,7 @@ config DRM_MCDE
 	depends on CMA
 	depends on ARM || COMPILE_TEST
 	depends on OF
+	depends on COMMON_CLK
 	select MFD_SYSCON
 	select DRM_MIPI_DSI
 	select DRM_BRIDGE
diff --git a/drivers/gpu/drm/mcde/Makefile b/drivers/gpu/drm/mcde/Makefile
index fe28f4e0fe46..15d9c89a3273 100644
--- a/drivers/gpu/drm/mcde/Makefile
+++ b/drivers/gpu/drm/mcde/Makefile
@@ -1,3 +1,3 @@
-mcde_drm-y +=	mcde_drv.o mcde_dsi.o mcde_display.o
+mcde_drm-y +=	mcde_drv.o mcde_dsi.o mcde_clk_div.o mcde_display.o
 
 obj-$(CONFIG_DRM_MCDE) += mcde_drm.o
diff --git a/drivers/gpu/drm/mcde/mcde_clk_div.c b/drivers/gpu/drm/mcde/mcde_clk_div.c
new file mode 100644
index 000000000000..038821d2ef80
--- /dev/null
+++ b/drivers/gpu/drm/mcde/mcde_clk_div.c
@@ -0,0 +1,192 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/regulator/consumer.h>
+
+#include "mcde_drm.h"
+#include "mcde_display_regs.h"
+
+/* The MCDE internal clock dividers for FIFO A and B */
+struct mcde_clk_div {
+	struct clk_hw hw;
+	struct mcde *mcde;
+	u32 cr;
+	u32 cr_div;
+};
+
+static int mcde_clk_div_enable(struct clk_hw *hw)
+{
+	struct mcde_clk_div *cdiv = container_of(hw, struct mcde_clk_div, hw);
+	struct mcde *mcde = cdiv->mcde;
+	u32 val;
+
+	spin_lock(&mcde->fifo_crx1_lock);
+	val = readl(mcde->regs + cdiv->cr);
+	/*
+	 * Select the PLL72 (LCD) clock as parent
+	 * FIXME: implement other parents.
+	 */
+	val &= ~MCDE_CRX1_CLKSEL_MASK;
+	val |= MCDE_CRX1_CLKSEL_CLKPLL72 << MCDE_CRX1_CLKSEL_SHIFT;
+	/* Internal clock */
+	val |= MCDE_CRA1_CLKTYPE_TVXCLKSEL1;
+
+	/* Clear then set the divider */
+	val &= ~(MCDE_CRX1_BCD | MCDE_CRX1_PCD_MASK);
+	val |= cdiv->cr_div;
+
+	writel(val, mcde->regs + cdiv->cr);
+	spin_unlock(&mcde->fifo_crx1_lock);
+
+	return 0;
+}
+
+static int mcde_clk_div_choose_div(struct clk_hw *hw, unsigned long rate,
+				   unsigned long *prate, bool set_parent)
+{
+	int best_div = 1, div;
+	struct clk_hw *parent = clk_hw_get_parent(hw);
+	unsigned long best_prate = 0;
+	unsigned long best_diff = ~0ul;
+	int max_div = (1 << MCDE_CRX1_PCD_BITS) - 1;
+
+	for (div = 1; div < max_div; div++) {
+		unsigned long this_prate, div_rate, diff;
+
+		if (set_parent)
+			this_prate = clk_hw_round_rate(parent, rate * div);
+		else
+			this_prate = *prate;
+		div_rate = DIV_ROUND_UP_ULL(this_prate, div);
+		diff = abs(rate - div_rate);
+
+		if (diff < best_diff) {
+			best_div = div;
+			best_diff = diff;
+			best_prate = this_prate;
+		}
+	}
+
+	*prate = best_prate;
+	return best_div;
+}
+
+static long mcde_clk_div_round_rate(struct clk_hw *hw, unsigned long rate,
+				     unsigned long *prate)
+{
+	int div = mcde_clk_div_choose_div(hw, rate, prate, true);
+
+	return DIV_ROUND_UP_ULL(*prate, div);
+}
+
+static unsigned long mcde_clk_div_recalc_rate(struct clk_hw *hw,
+					       unsigned long prate)
+{
+	struct mcde_clk_div *cdiv = container_of(hw, struct mcde_clk_div, hw);
+	struct mcde *mcde = cdiv->mcde;
+	u32 cr;
+	int div;
+
+	/*
+	 * If the MCDE is not powered we can't access registers.
+	 * It will come up with 0 in the divider register bits, which
+	 * means "divide by 2".
+	 */
+	if (!regulator_is_enabled(mcde->epod))
+		return DIV_ROUND_UP_ULL(prate, 2);
+
+	cr = readl(mcde->regs + cdiv->cr);
+	if (cr & MCDE_CRX1_BCD)
+		return prate;
+
+	/* 0 in the PCD means "divide by 2", 1 means "divide by 3" etc */
+	div = cr & MCDE_CRX1_PCD_MASK;
+	div += 2;
+
+	return DIV_ROUND_UP_ULL(prate, div);
+}
+
+static int mcde_clk_div_set_rate(struct clk_hw *hw, unsigned long rate,
+				  unsigned long prate)
+{
+	struct mcde_clk_div *cdiv = container_of(hw, struct mcde_clk_div, hw);
+	int div = mcde_clk_div_choose_div(hw, rate, &prate, false);
+	u32 cr = 0;
+
+	/*
+	 * We cache the CR bits to set the divide in the state so that
+	 * we can call this before we can even write to the hardware.
+	 */
+	if (div == 1) {
+		/* Bypass clock divider */
+		cr |= MCDE_CRX1_BCD;
+	} else {
+		div -= 2;
+		cr |= div & MCDE_CRX1_PCD_MASK;
+	}
+	cdiv->cr_div = cr;
+
+	return 0;
+}
+
+static const struct clk_ops mcde_clk_div_ops = {
+	.enable = mcde_clk_div_enable,
+	.recalc_rate = mcde_clk_div_recalc_rate,
+	.round_rate = mcde_clk_div_round_rate,
+	.set_rate = mcde_clk_div_set_rate,
+};
+
+int mcde_init_clock_divider(struct mcde *mcde)
+{
+	struct device *dev = mcde->dev;
+	struct mcde_clk_div *fifoa;
+	struct mcde_clk_div *fifob;
+	const char *parent_name;
+	struct clk_init_data fifoa_init = {
+		.name = "fifoa",
+		.ops = &mcde_clk_div_ops,
+		.parent_names = &parent_name,
+		.num_parents = 1,
+		.flags = CLK_SET_RATE_PARENT,
+	};
+	struct clk_init_data fifob_init = {
+		.name = "fifob",
+		.ops = &mcde_clk_div_ops,
+		.parent_names = &parent_name,
+		.num_parents = 1,
+		.flags = CLK_SET_RATE_PARENT,
+	};
+	int ret;
+
+	spin_lock_init(&mcde->fifo_crx1_lock);
+	parent_name = __clk_get_name(mcde->lcd_clk);
+
+	/* Allocate 2 clocks */
+	fifoa = devm_kzalloc(dev, sizeof(*fifoa), GFP_KERNEL);
+	if (!fifoa)
+		return -ENOMEM;
+	fifob = devm_kzalloc(dev, sizeof(*fifob), GFP_KERNEL);
+	if (!fifob)
+		return -ENOMEM;
+
+	fifoa->mcde = mcde;
+	fifoa->cr = MCDE_CRA1;
+	fifoa->hw.init = &fifoa_init;
+	ret = devm_clk_hw_register(dev, &fifoa->hw);
+	if (ret) {
+		dev_err(dev, "error registering FIFO A clock divider\n");
+		return ret;
+	}
+	mcde->fifoa_clk = fifoa->hw.clk;
+
+	fifob->mcde = mcde;
+	fifob->cr = MCDE_CRB1;
+	fifob->hw.init = &fifob_init;
+	ret = devm_clk_hw_register(dev, &fifob->hw);
+	if (ret) {
+		dev_err(dev, "error registering FIFO B clock divider\n");
+		return ret;
+	}
+	mcde->fifob_clk = fifob->hw.clk;
+
+	return 0;
+}
diff --git a/drivers/gpu/drm/mcde/mcde_display.c b/drivers/gpu/drm/mcde/mcde_display.c
index f461c594993c..192e11c88d72 100644
--- a/drivers/gpu/drm/mcde/mcde_display.c
+++ b/drivers/gpu/drm/mcde/mcde_display.c
@@ -8,6 +8,7 @@
 #include <linux/delay.h>
 #include <linux/dma-buf.h>
 #include <linux/regulator/consumer.h>
+#include <linux/media-bus-format.h>
 
 #include <drm/drm_device.h>
 #include <drm/drm_fb_cma_helper.h>
@@ -16,6 +17,7 @@
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_simple_kms_helper.h>
+#include <drm/drm_bridge.h>
 #include <drm/drm_vblank.h>
 #include <video/mipi_display.h>
 
@@ -57,10 +59,15 @@ enum mcde_overlay {
 	MCDE_OVERLAY_5,
 };
 
-enum mcde_dsi_formatter {
+enum mcde_formatter {
 	MCDE_DSI_FORMATTER_0 = 0,
 	MCDE_DSI_FORMATTER_1,
 	MCDE_DSI_FORMATTER_2,
+	MCDE_DSI_FORMATTER_3,
+	MCDE_DSI_FORMATTER_4,
+	MCDE_DSI_FORMATTER_5,
+	MCDE_DPI_FORMATTER_0,
+	MCDE_DPI_FORMATTER_1,
 };
 
 void mcde_display_irq(struct mcde *mcde)
@@ -81,7 +88,7 @@ void mcde_display_irq(struct mcde *mcde)
 	 *
 	 * TODO: Currently only one DSI link is supported.
 	 */
-	if (mcde_dsi_irq(mcde->mdsi)) {
+	if (!mcde->dpi_output && mcde_dsi_irq(mcde->mdsi)) {
 		u32 val;
 
 		/*
@@ -553,6 +560,7 @@ static void mcde_configure_channel(struct mcde *mcde, enum mcde_channel ch,
 			<< MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
 		break;
 	case MCDE_VIDEO_FORMATTER_FLOW:
+	case MCDE_DPI_FORMATTER_FLOW:
 		val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_HARDWARE
 			<< MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
 		val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_FORMATTER
@@ -591,10 +599,35 @@ static void mcde_configure_channel(struct mcde *mcde, enum mcde_channel ch,
 		       mcde->regs + mux);
 		break;
 	}
+
+	/*
+	 * If using DPI configure the sync event.
+	 * TODO: this is for LCD only, it does not cover TV out.
+	 */
+	if (mcde->dpi_output) {
+		u32 stripwidth;
+
+		stripwidth = 0xF000 / (mode->vdisplay * 4);
+		dev_info(mcde->dev, "stripwidth: %d\n", stripwidth);
+
+		val = MCDE_SYNCHCONF_HWREQVEVENT_ACTIVE_VIDEO |
+			(mode->hdisplay - 1 - stripwidth) << MCDE_SYNCHCONF_HWREQVCNT_SHIFT |
+			MCDE_SYNCHCONF_SWINTVEVENT_ACTIVE_VIDEO |
+			(mode->hdisplay - 1 - stripwidth) << MCDE_SYNCHCONF_SWINTVCNT_SHIFT;
+
+		switch (fifo) {
+		case MCDE_FIFO_A:
+			writel(val, mcde->regs + MCDE_SYNCHCONFA);
+			break;
+		case MCDE_FIFO_B:
+			writel(val, mcde->regs + MCDE_SYNCHCONFB);
+			break;
+		}
+	}
 }
 
 static void mcde_configure_fifo(struct mcde *mcde, enum mcde_fifo fifo,
-				enum mcde_dsi_formatter fmt,
+				enum mcde_formatter fmt,
 				int fifo_wtrmrk)
 {
 	u32 val;
@@ -615,12 +648,49 @@ static void mcde_configure_fifo(struct mcde *mcde, enum mcde_fifo fifo,
 	}
 
 	val = fifo_wtrmrk << MCDE_CTRLX_FIFOWTRMRK_SHIFT;
-	/* We only support DSI formatting for now */
-	val |= MCDE_CTRLX_FORMTYPE_DSI <<
-		MCDE_CTRLX_FORMTYPE_SHIFT;
 
-	/* Select the formatter to use for this FIFO */
-	val |= fmt << MCDE_CTRLX_FORMID_SHIFT;
+	/*
+	 * Select the formatter to use for this FIFO
+	 *
+	 * The register definitions imply that different IDs should be used
+	 * by the DSI formatters depending on if they are in VID or CMD
+	 * mode, and the manual says they are dedicated but identical.
+	 * The vendor code uses them as it seems fit.
+	 */
+	switch (fmt) {
+	case MCDE_DSI_FORMATTER_0:
+		val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DSI0VID << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DSI_FORMATTER_1:
+		val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DSI0CMD << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DSI_FORMATTER_2:
+		val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DSI1VID << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DSI_FORMATTER_3:
+		val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DSI1CMD << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DSI_FORMATTER_4:
+		val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DSI2VID << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DSI_FORMATTER_5:
+		val |= MCDE_CTRLX_FORMTYPE_DSI << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DSI2CMD << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DPI_FORMATTER_0:
+		val |= MCDE_CTRLX_FORMTYPE_DPITV << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DPIA << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	case MCDE_DPI_FORMATTER_1:
+		val |= MCDE_CTRLX_FORMTYPE_DPITV << MCDE_CTRLX_FORMTYPE_SHIFT;
+		val |= MCDE_CTRLX_FORMID_DPIB << MCDE_CTRLX_FORMID_SHIFT;
+		break;
+	}
 	writel(val, mcde->regs + ctrl);
 
 	/* Blend source with Alpha 0xff on FIFO */
@@ -628,17 +698,54 @@ static void mcde_configure_fifo(struct mcde *mcde, enum mcde_fifo fifo,
 		0xff << MCDE_CRX0_ALPHABLEND_SHIFT;
 	writel(val, mcde->regs + cr0);
 
-	/* Set-up from mcde_fmtr_dsi.c, fmtr_dsi_enable_video() */
-
-	/* Use the MCDE clock for this FIFO */
-	val = MCDE_CRX1_CLKSEL_MCDECLK << MCDE_CRX1_CLKSEL_SHIFT;
+	spin_lock(&mcde->fifo_crx1_lock);
+	val = readl(mcde->regs + cr1);
+	/*
+	 * Set-up from mcde_fmtr_dsi.c, fmtr_dsi_enable_video()
+	 * FIXME: a different clock needs to be selected for TV out.
+	 */
+	if (mcde->dpi_output) {
+		struct drm_connector *connector = drm_panel_bridge_connector(mcde->bridge);
+		u32 bus_format;
+
+		/* Assume RGB888 24 bit if we have no further info */
+		if (!connector->display_info.num_bus_formats) {
+			dev_info(mcde->dev, "panel does not specify bus format, assume RGB888\n");
+			bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+		} else {
+			bus_format = connector->display_info.bus_formats[0];
+		}
 
-	/* TODO: when adding DPI support add OUTBPP etc here */
+		/*
+		 * Set up the CDWIN and OUTBPP for the LCD
+		 *
+		 * FIXME: fill this in if you know the correspondance between the MIPI
+		 * DPI specification and the media bus formats.
+		 */
+		val &= ~MCDE_CRX1_CDWIN_MASK;
+		val &= ~MCDE_CRX1_OUTBPP_MASK;
+		switch (bus_format) {
+		case MEDIA_BUS_FMT_RGB888_1X24:
+			val |= MCDE_CRX1_CDWIN_24BPP << MCDE_CRX1_CDWIN_SHIFT;
+			val |= MCDE_CRX1_OUTBPP_24BPP << MCDE_CRX1_OUTBPP_SHIFT;
+			break;
+		default:
+			dev_err(mcde->dev, "unknown bus format, assume RGB888\n");
+			val |= MCDE_CRX1_CDWIN_24BPP << MCDE_CRX1_CDWIN_SHIFT;
+			val |= MCDE_CRX1_OUTBPP_24BPP << MCDE_CRX1_OUTBPP_SHIFT;
+			break;
+		}
+	} else {
+		/* Use the MCDE clock for DSI */
+		val &= ~MCDE_CRX1_CLKSEL_MASK;
+		val = MCDE_CRX1_CLKSEL_MCDECLK << MCDE_CRX1_CLKSEL_SHIFT;
+	}
 	writel(val, mcde->regs + cr1);
+	spin_unlock(&mcde->fifo_crx1_lock);
 };
 
 static void mcde_configure_dsi_formatter(struct mcde *mcde,
-					 enum mcde_dsi_formatter fmt,
+					 enum mcde_formatter fmt,
 					 u32 formatter_frame,
 					 int pkt_size)
 {
@@ -678,6 +785,9 @@ static void mcde_configure_dsi_formatter(struct mcde *mcde,
 		delay0 = MCDE_DSIVID2DELAY0;
 		delay1 = MCDE_DSIVID2DELAY1;
 		break;
+	default:
+		dev_err(mcde->dev, "tried to configure a non-DSI formatter as DSI\n");
+		return;
 	}
 
 	/*
@@ -859,6 +969,103 @@ static int mcde_dsi_get_pkt_div(int ppl, int fifo_size)
 	return 1;
 }
 
+static void mcde_setup_dpi(struct mcde *mcde, const struct drm_display_mode *mode,
+			   int *fifo_wtrmrk_lvl)
+{
+	struct drm_connector *connector = drm_panel_bridge_connector(mcde->bridge);
+	u32 hsw, hfp, hbp;
+	u32 vsw, vfp, vbp;
+	u32 val;
+
+	/* FIXME: we only support LCD, implement TV out */
+	hsw = mode->hsync_end - mode->hsync_start;
+	hfp = mode->hsync_start - mode->hdisplay;
+	hbp = mode->htotal - mode->hsync_end;
+	vsw = mode->vsync_end - mode->vsync_start;
+	vfp = mode->vsync_start - mode->vdisplay;
+	vbp = mode->vtotal - mode->vsync_end;
+
+	dev_info(mcde->dev, "output on DPI LCD from channel A\n");
+	/* Display actual values */
+	dev_info(mcde->dev, "HSW: %d, HFP: %d, HBP: %d, VSW: %d, VFP: %d, VBP: %d\n",
+		 hsw, hfp, hbp, vsw, vfp, vbp);
+
+	/*
+	 * The pixel fetcher is 128 64-bit words deep = 1024 bytes.
+	 * One overlay of 32bpp (4 cpp) assumed, fetch 160 pixels.
+	 * 160 * 4 = 640 bytes.
+	 */
+	*fifo_wtrmrk_lvl = 640;
+
+	/* Set up the main control, watermark level at 7 */
+	val = 7 << MCDE_CONF0_IFIFOCTRLWTRMRKLVL_SHIFT;
+
+	/*
+	 * This sets up the internal silicon muxing of the DPI
+	 * lines. This is how the silicon connects out to the
+	 * external pins, then the pins need to be further
+	 * configured into "alternate functions" using pin control
+	 * to actually get the signals out.
+	 *
+	 * FIXME: this is hardcoded to the only setting found in
+	 * the wild. If we need to use different settings for
+	 * different DPI displays, make this parameterizable from
+	 * the device tree.
+	 */
+	/* 24 bits DPI: connect Ch A LSB to D[0:7] */
+	val |= 0 << MCDE_CONF0_OUTMUX0_SHIFT;
+	/* 24 bits DPI: connect Ch A MID to D[8:15] */
+	val |= 1 << MCDE_CONF0_OUTMUX1_SHIFT;
+	/* Don't care about this muxing */
+	val |= 0 << MCDE_CONF0_OUTMUX2_SHIFT;
+	/* Don't care about this muxing */
+	val |= 0 << MCDE_CONF0_OUTMUX3_SHIFT;
+	/* 24 bits DPI: connect Ch A MSB to D[32:39] */
+	val |= 2 << MCDE_CONF0_OUTMUX4_SHIFT;
+	/* Syncmux bits zero: DPI channel A */
+	writel(val, mcde->regs + MCDE_CONF0);
+
+	/* This hammers us into LCD mode */
+	writel(0, mcde->regs + MCDE_TVCRA);
+
+	/* Front porch and sync width */
+	val = (vsw << MCDE_TVBL1_BEL1_SHIFT);
+	val |= (vfp << MCDE_TVBL1_BSL1_SHIFT);
+	writel(val, mcde->regs + MCDE_TVBL1A);
+	/* The vendor driver sets the same value into TVBL2A */
+	writel(val, mcde->regs + MCDE_TVBL2A);
+
+	/* Vertical back porch */
+	val = (vbp << MCDE_TVDVO_DVO1_SHIFT);
+	/* The vendor drivers sets the same value into TVDVOA */
+	val |= (vbp << MCDE_TVDVO_DVO2_SHIFT);
+	writel(val, mcde->regs + MCDE_TVDVOA);
+
+	/* Horizontal back porch, as 0 = 1 cycle we need to subtract 1 */
+	writel((hbp - 1), mcde->regs + MCDE_TVTIM1A);
+
+	/* Horizongal sync width and horizonal front porch, 0 = 1 cycle */
+	val = ((hsw - 1) << MCDE_TVLBALW_LBW_SHIFT);
+	val |= ((hfp - 1) << MCDE_TVLBALW_ALW_SHIFT);
+	writel(val, mcde->regs + MCDE_TVLBALWA);
+
+	/* Blank some TV registers we don't use */
+	writel(0, mcde->regs + MCDE_TVISLA);
+	writel(0, mcde->regs + MCDE_TVBLUA);
+
+	/* Set up sync inversion etc */
+	val = 0;
+	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+		val |= MCDE_LCDTIM1B_IHS;
+	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+		val |= MCDE_LCDTIM1B_IVS;
+	if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
+		val |= MCDE_LCDTIM1B_IOE;
+	if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
+		val |= MCDE_LCDTIM1B_IPC;
+	writel(val, mcde->regs + MCDE_LCDTIM1A);
+}
+
 static void mcde_setup_dsi(struct mcde *mcde, const struct drm_display_mode *mode,
 			   int cpp, int *fifo_wtrmrk_lvl, int *dsi_formatter_frame,
 			   int *dsi_pkt_size)
@@ -976,8 +1183,11 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
 	writel(0, mcde->regs + MCDE_IMSCERR);
 	writel(0xFFFFFFFF, mcde->regs + MCDE_RISERR);
 
-	mcde_setup_dsi(mcde, mode, cpp, &fifo_wtrmrk,
-		       &dsi_formatter_frame, &dsi_pkt_size);
+	if (mcde->dpi_output)
+		mcde_setup_dpi(mcde, mode, &fifo_wtrmrk);
+	else
+		mcde_setup_dsi(mcde, mode, cpp, &fifo_wtrmrk,
+			       &dsi_formatter_frame, &dsi_pkt_size);
 
 	mcde->stride = mode->hdisplay * cpp;
 	dev_dbg(drm->dev, "Overlay line stride: %u bytes\n",
@@ -1009,29 +1219,47 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
 	 */
 	mcde_configure_channel(mcde, MCDE_CHANNEL_0, MCDE_FIFO_A, mode);
 
-	/* Configure FIFO A to use DSI formatter 0 */
-	mcde_configure_fifo(mcde, MCDE_FIFO_A, MCDE_DSI_FORMATTER_0,
-			    fifo_wtrmrk);
+	if (mcde->dpi_output) {
+		unsigned long lcd_freq;
+
+		/* Configure FIFO A to use DPI formatter 0 */
+		mcde_configure_fifo(mcde, MCDE_FIFO_A, MCDE_DPI_FORMATTER_0,
+				    fifo_wtrmrk);
+
+		/* Set up and enable the LCD clock */
+		lcd_freq = clk_round_rate(mcde->fifoa_clk, mode->clock * 1000);
+		ret = clk_set_rate(mcde->fifoa_clk, lcd_freq);
+		if (ret)
+			dev_err(mcde->dev, "failed to set LCD clock rate %lu Hz\n",
+				lcd_freq);
+		ret = clk_prepare_enable(mcde->fifoa_clk);
+		if (ret) {
+			dev_err(mcde->dev, "failed to enable FIFO A DPI clock\n");
+			return;
+		}
+		dev_info(mcde->dev, "LCD FIFO A clk rate %lu Hz\n",
+			 clk_get_rate(mcde->fifoa_clk));
+	} else {
+		/* Configure FIFO A to use DSI formatter 0 */
+		mcde_configure_fifo(mcde, MCDE_FIFO_A, MCDE_DSI_FORMATTER_0,
+				    fifo_wtrmrk);
 
-	/*
-	 * This brings up the DSI bridge which is tightly connected
-	 * to the MCDE DSI formatter.
-	 *
-	 * FIXME: if we want to use another formatter, such as DPI,
-	 * we need to be more elaborate here and select the appropriate
-	 * bridge.
-	 */
-	mcde_dsi_enable(mcde->bridge);
+		/*
+		 * This brings up the DSI bridge which is tightly connected
+		 * to the MCDE DSI formatter.
+		 */
+		mcde_dsi_enable(mcde->bridge);
 
-	/* Configure the DSI formatter 0 for the DSI panel output */
-	mcde_configure_dsi_formatter(mcde, MCDE_DSI_FORMATTER_0,
-				     dsi_formatter_frame, dsi_pkt_size);
+		/* Configure the DSI formatter 0 for the DSI panel output */
+		mcde_configure_dsi_formatter(mcde, MCDE_DSI_FORMATTER_0,
+					     dsi_formatter_frame, dsi_pkt_size);
+	}
 
 	switch (mcde->flow_mode) {
 	case MCDE_COMMAND_TE_FLOW:
 	case MCDE_COMMAND_BTA_TE_FLOW:
 	case MCDE_VIDEO_TE_FLOW:
-		/* We are using TE in some comination */
+		/* We are using TE in some combination */
 		if (mode->flags & DRM_MODE_FLAG_NVSYNC)
 			val = MCDE_VSCRC_VSPOL;
 		else
@@ -1083,8 +1311,12 @@ static void mcde_display_disable(struct drm_simple_display_pipe *pipe)
 	/* Disable FIFO A flow */
 	mcde_disable_fifo(mcde, MCDE_FIFO_A, true);
 
-	/* This disables the DSI bridge */
-	mcde_dsi_disable(mcde->bridge);
+	if (mcde->dpi_output) {
+		clk_disable_unprepare(mcde->fifoa_clk);
+	} else {
+		/* This disables the DSI bridge */
+		mcde_dsi_disable(mcde->bridge);
+	}
 
 	event = crtc->state->event;
 	if (event) {
@@ -1275,6 +1507,10 @@ int mcde_display_init(struct drm_device *drm)
 		DRM_FORMAT_YUV422,
 	};
 
+	ret = mcde_init_clock_divider(mcde);
+	if (ret)
+		return ret;
+
 	ret = drm_simple_display_pipe_init(drm, &mcde->pipe,
 					   &mcde_display_funcs,
 					   formats, ARRAY_SIZE(formats),
diff --git a/drivers/gpu/drm/mcde/mcde_display_regs.h b/drivers/gpu/drm/mcde/mcde_display_regs.h
index 3dc9b99c7c96..2ad78c59d627 100644
--- a/drivers/gpu/drm/mcde/mcde_display_regs.h
+++ b/drivers/gpu/drm/mcde/mcde_display_regs.h
@@ -215,6 +215,80 @@
 #define MCDE_OVLXCOMP_Z_SHIFT 27
 #define MCDE_OVLXCOMP_Z_MASK 0x78000000
 
+/* DPI/TV configuration registers, channel A and B */
+#define MCDE_TVCRA 0x00000838
+#define MCDE_TVCRB 0x00000A38
+#define MCDE_TVCR_MOD_TV BIT(0) /* 0 = LCD mode */
+#define MCDE_TVCR_INTEREN BIT(1)
+#define MCDE_TVCR_IFIELD BIT(2)
+#define MCDE_TVCR_TVMODE_SDTV_656P (0 << 3)
+#define MCDE_TVCR_TVMODE_SDTV_656P_LE (3 << 3)
+#define MCDE_TVCR_TVMODE_SDTV_656P_BE (4 << 3)
+#define MCDE_TVCR_SDTVMODE_Y0CBY1CR (0 << 6)
+#define MCDE_TVCR_SDTVMODE_CBY0CRY1 (1 << 6)
+#define MCDE_TVCR_AVRGEN BIT(8)
+#define MCDE_TVCR_CKINV BIT(9)
+
+/* TV blanking control register 1, channel A and B */
+#define MCDE_TVBL1A 0x0000083C
+#define MCDE_TVBL1B 0x00000A3C
+#define MCDE_TVBL1_BEL1_SHIFT 0 /* VFP vertical front porch 11 bits */
+#define MCDE_TVBL1_BSL1_SHIFT 16 /* VSW vertical sync pulse width 11 bits */
+
+/* Pixel processing TV start line, channel A and B */
+#define MCDE_TVISLA 0x00000840
+#define MCDE_TVISLB 0x00000A40
+#define MCDE_TVISL_FSL1_SHIFT 0 /* Field 1 identification start line 11 bits */
+#define MCDE_TVISL_FSL2_SHIFT 16 /* Field 2 identification start line 11 bits */
+
+/* Pixel processing TV DVO offset */
+#define MCDE_TVDVOA 0x00000844
+#define MCDE_TVDVOB 0x00000A44
+#define MCDE_TVDVO_DVO1_SHIFT 0 /* VBP vertical back porch 0 = 0 */
+#define MCDE_TVDVO_DVO2_SHIFT 16
+
+/*
+ * Pixel processing TV Timing 1
+ * HBP horizontal back porch 11 bits horizontal offset
+ * 0 = 1 pixel HBP, 255 = 256 pixels, so actual value - 1
+ */
+#define MCDE_TVTIM1A 0x0000084C
+#define MCDE_TVTIM1B 0x00000A4C
+
+/* Pixel processing TV LBALW */
+/* 0 = 1 clock cycle, 255 = 256 clock cycles */
+#define MCDE_TVLBALWA 0x00000850
+#define MCDE_TVLBALWB 0x00000A50
+#define MCDE_TVLBALW_LBW_SHIFT 0 /* HSW horizonal sync width, line blanking width 11 bits */
+#define MCDE_TVLBALW_ALW_SHIFT 16 /* HFP horizontal front porch, active line width 11 bits */
+
+/* TV blanking control register 1, channel A and B */
+#define MCDE_TVBL2A 0x00000854
+#define MCDE_TVBL2B 0x00000A54
+#define MCDE_TVBL2_BEL2_SHIFT 0 /* Field 2 blanking end line 11 bits */
+#define MCDE_TVBL2_BSL2_SHIFT 16 /* Field 2 blanking start line 11 bits */
+
+/* Pixel processing TV background */
+#define MCDE_TVBLUA 0x00000858
+#define MCDE_TVBLUB 0x00000A58
+#define MCDE_TVBLU_TVBLU_SHIFT 0 /* 8 bits luminance */
+#define MCDE_TVBLU_TVBCB_SHIFT 8 /* 8 bits Cb chrominance */
+#define MCDE_TVBLU_TVBCR_SHIFT 16 /* 8 bits Cr chrominance */
+
+/* Pixel processing LCD timing 1 */
+#define MCDE_LCDTIM1A 0x00000860
+#define MCDE_LCDTIM1B 0x00000A60
+/* inverted vertical sync pulse for HRTFT 0 = active low, 1 active high */
+#define MCDE_LCDTIM1B_IVP BIT(19)
+/* inverted vertical sync, 0 = active high (the normal), 1 = active low */
+#define MCDE_LCDTIM1B_IVS BIT(20)
+/* inverted horizontal sync, 0 = active high (the normal), 1 = active low */
+#define MCDE_LCDTIM1B_IHS BIT(21)
+/* inverted panel clock 0 = rising edge data out, 1 = falling edge data out */
+#define MCDE_LCDTIM1B_IPC BIT(22)
+/* invert output enable 0 = active high, 1 = active low */
+#define MCDE_LCDTIM1B_IOE BIT(23)
+
 #define MCDE_CRC 0x00000C00
 #define MCDE_CRC_C1EN BIT(2)
 #define MCDE_CRC_C2EN BIT(3)
@@ -360,6 +434,7 @@
 #define MCDE_CRB1 0x00000A04
 #define MCDE_CRX1_PCD_SHIFT 0
 #define MCDE_CRX1_PCD_MASK 0x000003FF
+#define MCDE_CRX1_PCD_BITS 10
 #define MCDE_CRX1_CLKSEL_SHIFT 10
 #define MCDE_CRX1_CLKSEL_MASK 0x00001C00
 #define MCDE_CRX1_CLKSEL_CLKPLL72 0
@@ -421,8 +496,20 @@
 #define MCDE_ROTACONF 0x0000087C
 #define MCDE_ROTBCONF 0x00000A7C
 
+/* Synchronization event configuration */
 #define MCDE_SYNCHCONFA 0x00000880
 #define MCDE_SYNCHCONFB 0x00000A80
+#define MCDE_SYNCHCONF_HWREQVEVENT_SHIFT 0
+#define MCDE_SYNCHCONF_HWREQVEVENT_VSYNC (0 << 0)
+#define MCDE_SYNCHCONF_HWREQVEVENT_BACK_PORCH (1 << 0)
+#define MCDE_SYNCHCONF_HWREQVEVENT_ACTIVE_VIDEO (2 << 0)
+#define MCDE_SYNCHCONF_HWREQVEVENT_FRONT_PORCH (3 << 0)
+#define MCDE_SYNCHCONF_HWREQVCNT_SHIFT 2 /* 14 bits */
+#define MCDE_SYNCHCONF_SWINTVEVENT_VSYNC (0 << 16)
+#define MCDE_SYNCHCONF_SWINTVEVENT_BACK_PORCH (1 << 16)
+#define MCDE_SYNCHCONF_SWINTVEVENT_ACTIVE_VIDEO (2 << 16)
+#define MCDE_SYNCHCONF_SWINTVEVENT_FRONT_PORCH (3 << 16)
+#define MCDE_SYNCHCONF_SWINTVCNT_SHIFT 18 /* 14 bits */
 
 /* Channel A+B control registers */
 #define MCDE_CTRLA 0x00000884
diff --git a/drivers/gpu/drm/mcde/mcde_drm.h b/drivers/gpu/drm/mcde/mcde_drm.h
index 8253e2f9993e..ecb70b4b737c 100644
--- a/drivers/gpu/drm/mcde/mcde_drm.h
+++ b/drivers/gpu/drm/mcde/mcde_drm.h
@@ -62,6 +62,8 @@ enum mcde_flow_mode {
 	MCDE_VIDEO_TE_FLOW,
 	/* Video mode with the formatter itself as sync source */
 	MCDE_VIDEO_FORMATTER_FLOW,
+	/* DPI video with the formatter itsels as sync source */
+	MCDE_DPI_FORMATTER_FLOW,
 };
 
 struct mcde {
@@ -72,6 +74,7 @@ struct mcde {
 	struct drm_connector *connector;
 	struct drm_simple_display_pipe pipe;
 	struct mipi_dsi_device *mdsi;
+	bool dpi_output;
 	s16 stride;
 	enum mcde_flow_mode flow_mode;
 	unsigned int flow_active;
@@ -82,6 +85,11 @@ struct mcde {
 	struct clk *mcde_clk;
 	struct clk *lcd_clk;
 	struct clk *hdmi_clk;
+	/* Handles to the clock dividers for FIFO A and B */
+	struct clk *fifoa_clk;
+	struct clk *fifob_clk;
+	/* Locks the MCDE FIFO control register A and B */
+	spinlock_t fifo_crx1_lock;
 
 	struct regulator *epod;
 	struct regulator *vana;
@@ -105,4 +113,6 @@ void mcde_display_irq(struct mcde *mcde);
 void mcde_display_disable_irqs(struct mcde *mcde);
 int mcde_display_init(struct drm_device *drm);
 
+int mcde_init_clock_divider(struct mcde *mcde);
+
 #endif /* _MCDE_DRM_H_ */
diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c
index 870626e04ec0..7196a437952b 100644
--- a/drivers/gpu/drm/mcde/mcde_drv.c
+++ b/drivers/gpu/drm/mcde/mcde_drv.c
@@ -22,13 +22,13 @@
  * The hardware has four display pipes, and the layout is a little
  * bit like this::
  *
- *   Memory     -> Overlay -> Channel -> FIFO -> 5 formatters -> DSI/DPI
- *   External      0..5       0..3       A,B,    3 x DSI         bridge
+ *   Memory     -> Overlay -> Channel -> FIFO -> 8 formatters -> DSI/DPI
+ *   External      0..5       0..3       A,B,    6 x DSI         bridge
  *   source 0..9                         C0,C1   2 x DPI
  *
  * FIFOs A and B are for LCD and HDMI while FIFO CO/C1 are for
  * panels with embedded buffer.
- * 3 of the formatters are for DSI.
+ * 6 of the formatters are for DSI, 3 pairs for VID/CMD respectively.
  * 2 of the formatters are for DPI.
  *
  * Behind the formatters are the DSI or DPI ports that route to
@@ -130,9 +130,37 @@ static int mcde_modeset_init(struct drm_device *drm)
 	struct mcde *mcde = to_mcde(drm);
 	int ret;
 
+	/*
+	 * If no other bridge was found, check if we have a DPI panel or
+	 * any other bridge connected directly to the MCDE DPI output.
+	 * If a DSI bridge is found, DSI will take precedence.
+	 *
+	 * TODO: more elaborate bridge selection if we have more than one
+	 * thing attached to the system.
+	 */
 	if (!mcde->bridge) {
-		dev_err(drm->dev, "no display output bridge yet\n");
-		return -EPROBE_DEFER;
+		struct drm_panel *panel;
+		struct drm_bridge *bridge;
+
+		ret = drm_of_find_panel_or_bridge(drm->dev->of_node,
+						  0, 0, &panel, &bridge);
+		if (ret) {
+			dev_err(drm->dev,
+				"Could not locate any output bridge or panel\n");
+			return ret;
+		}
+		if (panel) {
+			bridge = drm_panel_bridge_add_typed(panel,
+					DRM_MODE_CONNECTOR_DPI);
+			if (IS_ERR(bridge)) {
+				dev_err(drm->dev,
+					"Could not connect panel bridge\n");
+				return PTR_ERR(bridge);
+			}
+		}
+		mcde->dpi_output = true;
+		mcde->bridge = bridge;
+		mcde->flow_mode = MCDE_DPI_FORMATTER_FLOW;
 	}
 
 	mode_config = &drm->mode_config;
@@ -156,13 +184,7 @@ static int mcde_modeset_init(struct drm_device *drm)
 		return ret;
 	}
 
-	/*
-	 * Attach the DSI bridge
-	 *
-	 * TODO: when adding support for the DPI bridge or several DSI bridges,
-	 * we selectively connect the bridge(s) here instead of this simple
-	 * attachment.
-	 */
+	/* Attach the bridge. */
 	ret = drm_simple_display_pipe_attach_bridge(&mcde->pipe,
 						    mcde->bridge);
 	if (ret) {
commit bfbc5e3b1774073ec92129995c7a6291015008af
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Thu Nov 12 15:29:24 2020 +0100

    drm/mcde: Break out DSI set-up routine
    
    To be able to support DPI without messing things up we
    first break out the DSI set-up to a separate function.
    
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Acked-by: Sam Ravnborg <sam at ravnborg.org>
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Cc: phone-devel at vger.kernel.org
    Cc: upstreaming at lists.sr.ht
    Link: https://patchwork.freedesktop.org/patch/msgid/20201112142925.2571179-1-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/mcde/mcde_display.c b/drivers/gpu/drm/mcde/mcde_display.c
index 48841d51d53a..f461c594993c 100644
--- a/drivers/gpu/drm/mcde/mcde_display.c
+++ b/drivers/gpu/drm/mcde/mcde_display.c
@@ -859,74 +859,44 @@ static int mcde_dsi_get_pkt_div(int ppl, int fifo_size)
 	return 1;
 }
 
-static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
-				struct drm_crtc_state *cstate,
-				struct drm_plane_state *plane_state)
+static void mcde_setup_dsi(struct mcde *mcde, const struct drm_display_mode *mode,
+			   int cpp, int *fifo_wtrmrk_lvl, int *dsi_formatter_frame,
+			   int *dsi_pkt_size)
 {
-	struct drm_crtc *crtc = &pipe->crtc;
-	struct drm_plane *plane = &pipe->plane;
-	struct drm_device *drm = crtc->dev;
-	struct mcde *mcde = to_mcde(drm);
-	const struct drm_display_mode *mode = &cstate->mode;
-	struct drm_framebuffer *fb = plane->state->fb;
-	u32 format = fb->format->format;
 	u32 formatter_ppl = mode->hdisplay; /* pixels per line */
 	u32 formatter_lpf = mode->vdisplay; /* lines per frame */
-	int pkt_size, fifo_wtrmrk;
-	int cpp = fb->format->cpp[0];
+	int formatter_frame;
 	int formatter_cpp;
-	struct drm_format_name_buf tmp;
-	u32 formatter_frame;
+	int fifo_wtrmrk;
 	u32 pkt_div;
+	int pkt_size;
 	u32 val;
-	int ret;
 
-	/* This powers up the entire MCDE block and the DSI hardware */
-	ret = regulator_enable(mcde->epod);
-	if (ret) {
-		dev_err(drm->dev, "can't re-enable EPOD regulator\n");
-		return;
-	}
-
-	dev_info(drm->dev, "enable MCDE, %d x %d format %s\n",
-		 mode->hdisplay, mode->vdisplay,
-		 drm_get_format_name(format, &tmp));
-	if (!mcde->mdsi) {
-		/* TODO: deal with this for non-DSI output */
-		dev_err(drm->dev, "no DSI master attached!\n");
-		return;
-	}
+	dev_info(mcde->dev, "output in %s mode, format %dbpp\n",
+		 (mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) ?
+		 "VIDEO" : "CMD",
+		 mipi_dsi_pixel_format_to_bpp(mcde->mdsi->format));
+	formatter_cpp =
+		mipi_dsi_pixel_format_to_bpp(mcde->mdsi->format) / 8;
+	dev_info(mcde->dev, "Overlay CPP: %d bytes, DSI formatter CPP %d bytes\n",
+		 cpp, formatter_cpp);
 
 	/* Set up the main control, watermark level at 7 */
 	val = 7 << MCDE_CONF0_IFIFOCTRLWTRMRKLVL_SHIFT;
-	/* 24 bits DPI: connect LSB Ch B to D[0:7] */
+
+	/*
+	 * This is the internal silicon muxing of the DPI
+	 * (parallell display) lines. Since we are not using
+	 * this at all (we are using DSI) these are just
+	 * dummy values from the vendor tree.
+	 */
 	val |= 3 << MCDE_CONF0_OUTMUX0_SHIFT;
-	/* TV out: connect LSB Ch B to D[8:15] */
 	val |= 3 << MCDE_CONF0_OUTMUX1_SHIFT;
-	/* Don't care about this muxing */
 	val |= 0 << MCDE_CONF0_OUTMUX2_SHIFT;
-	/* 24 bits DPI: connect MID Ch B to D[24:31] */
 	val |= 4 << MCDE_CONF0_OUTMUX3_SHIFT;
-	/* 5: 24 bits DPI: connect MSB Ch B to D[32:39] */
 	val |= 5 << MCDE_CONF0_OUTMUX4_SHIFT;
-	/* Syncmux bits zero: DPI channel A and B on output pins A and B resp */
 	writel(val, mcde->regs + MCDE_CONF0);
 
-	/* Clear any pending interrupts */
-	mcde_display_disable_irqs(mcde);
-	writel(0, mcde->regs + MCDE_IMSCERR);
-	writel(0xFFFFFFFF, mcde->regs + MCDE_RISERR);
-
-	dev_info(drm->dev, "output in %s mode, format %dbpp\n",
-		 (mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) ?
-		 "VIDEO" : "CMD",
-		 mipi_dsi_pixel_format_to_bpp(mcde->mdsi->format));
-	formatter_cpp =
-		mipi_dsi_pixel_format_to_bpp(mcde->mdsi->format) / 8;
-	dev_info(drm->dev, "overlay CPP %d bytes, DSI CPP %d bytes\n",
-		 cpp,
-		 formatter_cpp);
-
 	/* Calculations from mcde_fmtr_dsi.c, fmtr_dsi_enable_video() */
 
 	/*
@@ -947,9 +917,9 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
 		/* The FIFO is 640 entries deep on this v3 hardware */
 		pkt_div = mcde_dsi_get_pkt_div(mode->hdisplay, 640);
 	}
-	dev_dbg(drm->dev, "FIFO watermark after flooring: %d bytes\n",
+	dev_dbg(mcde->dev, "FIFO watermark after flooring: %d bytes\n",
 		fifo_wtrmrk);
-	dev_dbg(drm->dev, "Packet divisor: %d bytes\n", pkt_div);
+	dev_dbg(mcde->dev, "Packet divisor: %d bytes\n", pkt_div);
 
 	/* NOTE: pkt_div is 1 for video mode */
 	pkt_size = (formatter_ppl * formatter_cpp) / pkt_div;
@@ -957,16 +927,61 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
 	if (!(mcde->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO))
 		pkt_size++;
 
-	dev_dbg(drm->dev, "DSI packet size: %d * %d bytes per line\n",
+	dev_dbg(mcde->dev, "DSI packet size: %d * %d bytes per line\n",
 		pkt_size, pkt_div);
-	dev_dbg(drm->dev, "Overlay frame size: %u bytes\n",
+	dev_dbg(mcde->dev, "Overlay frame size: %u bytes\n",
 		mode->hdisplay * mode->vdisplay * cpp);
-	mcde->stride = mode->hdisplay * cpp;
-	dev_dbg(drm->dev, "Overlay line stride: %u bytes\n",
-		mcde->stride);
 	/* NOTE: pkt_div is 1 for video mode */
 	formatter_frame = pkt_size * pkt_div * formatter_lpf;
-	dev_dbg(drm->dev, "Formatter frame size: %u bytes\n", formatter_frame);
+	dev_dbg(mcde->dev, "Formatter frame size: %u bytes\n", formatter_frame);
+
+	*fifo_wtrmrk_lvl = fifo_wtrmrk;
+	*dsi_pkt_size = pkt_size;
+	*dsi_formatter_frame = formatter_frame;
+}
+
+static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
+				struct drm_crtc_state *cstate,
+				struct drm_plane_state *plane_state)
+{
+	struct drm_crtc *crtc = &pipe->crtc;
+	struct drm_plane *plane = &pipe->plane;
+	struct drm_device *drm = crtc->dev;
+	struct mcde *mcde = to_mcde(drm);
+	const struct drm_display_mode *mode = &cstate->mode;
+	struct drm_framebuffer *fb = plane->state->fb;
+	u32 format = fb->format->format;
+	int dsi_pkt_size;
+	int fifo_wtrmrk;
+	int cpp = fb->format->cpp[0];
+	struct drm_format_name_buf tmp;
+	u32 dsi_formatter_frame;
+	u32 val;
+	int ret;
+
+	/* This powers up the entire MCDE block and the DSI hardware */
+	ret = regulator_enable(mcde->epod);
+	if (ret) {
+		dev_err(drm->dev, "can't re-enable EPOD regulator\n");
+		return;
+	}
+
+	dev_info(drm->dev, "enable MCDE, %d x %d format %s\n",
+		 mode->hdisplay, mode->vdisplay,
+		 drm_get_format_name(format, &tmp));
+
+
+	/* Clear any pending interrupts */
+	mcde_display_disable_irqs(mcde);
+	writel(0, mcde->regs + MCDE_IMSCERR);
+	writel(0xFFFFFFFF, mcde->regs + MCDE_RISERR);
+
+	mcde_setup_dsi(mcde, mode, cpp, &fifo_wtrmrk,
+		       &dsi_formatter_frame, &dsi_pkt_size);
+
+	mcde->stride = mode->hdisplay * cpp;
+	dev_dbg(drm->dev, "Overlay line stride: %u bytes\n",
+		 mcde->stride);
 
 	/* Drain the FIFO A + channel 0 pipe so we have a clean slate */
 	mcde_drain_pipe(mcde, MCDE_FIFO_A, MCDE_CHANNEL_0);
@@ -1010,7 +1025,7 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
 
 	/* Configure the DSI formatter 0 for the DSI panel output */
 	mcde_configure_dsi_formatter(mcde, MCDE_DSI_FORMATTER_0,
-				     formatter_frame, pkt_size);
+				     dsi_formatter_frame, dsi_pkt_size);
 
 	switch (mcde->flow_mode) {
 	case MCDE_COMMAND_TE_FLOW:
commit 77f512bde99ad1ebc88f094d18702fa9589c2206
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 17 18:54:13 2020 +0100

    drm/mcde: Fix RGB/BGR bug
    
    I was confused when the graphics came out with blue
    penguins on the DPI panel.
    
    It turns out that the so-called "packed RGB666" mode
    on the DSI formatter is incorrect: this mode is the
    actual RGB888 mode, and the mode called RGB888 is
    BGR888.
    
    The claims that the MCDE had inverse RGB/BGR buffer
    formats was wrong, so correct this and the buggy
    register and everything is much more consistent, and
    graphics look good on all targets, both DPI and
    DSI.
    
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Cc: phone-devel at vger.kernel.org
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117175413.869871-1-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/mcde/mcde_display.c b/drivers/gpu/drm/mcde/mcde_display.c
index c271e5bf042e..48841d51d53a 100644
--- a/drivers/gpu/drm/mcde/mcde_display.c
+++ b/drivers/gpu/drm/mcde/mcde_display.c
@@ -243,73 +243,70 @@ static int mcde_configure_extsrc(struct mcde *mcde, enum mcde_extsrc src,
 	val = 0 << MCDE_EXTSRCXCONF_BUF_ID_SHIFT;
 	val |= 1 << MCDE_EXTSRCXCONF_BUF_NB_SHIFT;
 	val |= 0 << MCDE_EXTSRCXCONF_PRI_OVLID_SHIFT;
-	/*
-	 * MCDE has inverse semantics from DRM on RBG/BGR which is why
-	 * all the modes are inversed here.
-	 */
+
 	switch (format) {
 	case DRM_FORMAT_ARGB8888:
 		val |= MCDE_EXTSRCXCONF_BPP_ARGB8888 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_ABGR8888:
 		val |= MCDE_EXTSRCXCONF_BPP_ARGB8888 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_XRGB8888:
 		val |= MCDE_EXTSRCXCONF_BPP_XRGB8888 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_XBGR8888:
 		val |= MCDE_EXTSRCXCONF_BPP_XRGB8888 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_RGB888:
 		val |= MCDE_EXTSRCXCONF_BPP_RGB888 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_BGR888:
 		val |= MCDE_EXTSRCXCONF_BPP_RGB888 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_ARGB4444:
 		val |= MCDE_EXTSRCXCONF_BPP_ARGB4444 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_ABGR4444:
 		val |= MCDE_EXTSRCXCONF_BPP_ARGB4444 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_XRGB4444:
 		val |= MCDE_EXTSRCXCONF_BPP_RGB444 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_XBGR4444:
 		val |= MCDE_EXTSRCXCONF_BPP_RGB444 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_XRGB1555:
 		val |= MCDE_EXTSRCXCONF_BPP_IRGB1555 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_XBGR1555:
 		val |= MCDE_EXTSRCXCONF_BPP_IRGB1555 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_RGB565:
 		val |= MCDE_EXTSRCXCONF_BPP_RGB565 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
-		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_BGR565:
 		val |= MCDE_EXTSRCXCONF_BPP_RGB565 <<
 			MCDE_EXTSRCXCONF_BPP_SHIFT;
+		val |= MCDE_EXTSRCXCONF_BGR;
 		break;
 	case DRM_FORMAT_YUV422:
 		val |= MCDE_EXTSRCXCONF_BPP_YCBCR422 <<
@@ -700,7 +697,9 @@ static void mcde_configure_dsi_formatter(struct mcde *mcde,
 			MCDE_DSICONF0_PACKING_SHIFT;
 		break;
 	case MIPI_DSI_FMT_RGB666_PACKED:
-		val |= MCDE_DSICONF0_PACKING_RGB666_PACKED <<
+		dev_err(mcde->dev,
+			"we cannot handle the packed RGB666 format\n");
+		val |= MCDE_DSICONF0_PACKING_RGB666 <<
 			MCDE_DSICONF0_PACKING_SHIFT;
 		break;
 	case MIPI_DSI_FMT_RGB565:
diff --git a/drivers/gpu/drm/mcde/mcde_display_regs.h b/drivers/gpu/drm/mcde/mcde_display_regs.h
index d3ac7ef5ff9a..3dc9b99c7c96 100644
--- a/drivers/gpu/drm/mcde/mcde_display_regs.h
+++ b/drivers/gpu/drm/mcde/mcde_display_regs.h
@@ -465,8 +465,8 @@
 #define MCDE_DSICONF0_PACKING_MASK 0x00700000
 #define MCDE_DSICONF0_PACKING_RGB565 0
 #define MCDE_DSICONF0_PACKING_RGB666 1
-#define MCDE_DSICONF0_PACKING_RGB666_PACKED 2
-#define MCDE_DSICONF0_PACKING_RGB888 3
+#define MCDE_DSICONF0_PACKING_RGB888 2
+#define MCDE_DSICONF0_PACKING_BGR888 3
 #define MCDE_DSICONF0_PACKING_HDTV 4
 
 #define MCDE_DSIVID0FRAME 0x00000E04
commit 1eae77bfad7a0ded0f70d56f360ca59571a8cf4d
Merge: f9b036532108 fe56d05ee6c8
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Nov 23 14:59:40 2020 -0800

    Merge tag 'wireless-drivers-2020-11-23' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers
    
    Kalle Valo says:
    
    ====================
    wireless-drivers fixes for v5.10
    
    First set of fixes for v5.10. One fix for iwlwifi kernel panic, others
    less notable.
    
    rtw88
    
    * fix a bogus test found by clang
    
    iwlwifi
    
    * fix long memory reads causing soft lockup warnings
    
    * fix kernel panic during Channel Switch Announcement (CSA)
    
    * other smaller fixes
    
    MAINTAINERS
    
    * email address updates
    
    * tag 'wireless-drivers-2020-11-23' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers:
      iwlwifi: mvm: fix kernel panic in case of assert during CSA
      iwlwifi: pcie: set LTR to avoid completion timeout
      iwlwifi: mvm: write queue_sync_state only for sync
      iwlwifi: mvm: properly cancel a session protection for P2P
      iwlwifi: mvm: use the HOT_SPOT_CMD to cancel an AUX ROC
      iwlwifi: sta: set max HE max A-MPDU according to HE capa
      MAINTAINERS: update maintainers list for Cypress
      MAINTAINERS: update Yan-Hsuan's email address
      iwlwifi: pcie: limit memory read spin time
      rtw88: fix fw_fifo_addr check
    ====================
    
    Link: https://lore.kernel.org/r/20201123161037.C11D1C43460@smtp.codeaurora.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 6830ff853a5764c75e56750d59d0bbb6b26f1835
Author: Xiongfeng Wang <wangxiongfeng2 at huawei.com>
Date:   Fri Nov 20 09:57:02 2020 +0800

    IB/mthca: fix return value of error branch in mthca_init_cq()
    
    We return 'err' in the error branch, but this variable may be set as zero
    by the above code. Fix it by setting 'err' as a negative value before we
    goto the error label.
    
    Fixes: 74c2174e7be5 ("IB uverbs: add mthca user CQ support")
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Link: https://lore.kernel.org/r/1605837422-42724-1-git-send-email-wangxiongfeng2@huawei.com
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Xiongfeng Wang <wangxiongfeng2 at huawei.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c
index c3cfea243af8..119b2573c9a0 100644
--- a/drivers/infiniband/hw/mthca/mthca_cq.c
+++ b/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -803,8 +803,10 @@ int mthca_init_cq(struct mthca_dev *dev, int nent,
 	}
 
 	mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
-	if (IS_ERR(mailbox))
+	if (IS_ERR(mailbox)) {
+		err = PTR_ERR(mailbox);
 		goto err_out_arm;
+	}
 
 	cq_context = mailbox->buf;
 
@@ -846,9 +848,9 @@ int mthca_init_cq(struct mthca_dev *dev, int nent,
 	}
 
 	spin_lock_irq(&dev->cq_table.lock);
-	if (mthca_array_set(&dev->cq_table.cq,
-			    cq->cqn & (dev->limits.num_cqs - 1),
-			    cq)) {
+	err = mthca_array_set(&dev->cq_table.cq,
+			      cq->cqn & (dev->limits.num_cqs - 1), cq);
+	if (err) {
 		spin_unlock_irq(&dev->cq_table.lock);
 		goto err_out_free_mr;
 	}
commit a855fbe69229078cd8aecd8974fb996a5ca651e6
Author: Filipe Manana <fdmanana at suse.com>
Date:   Mon Nov 23 18:31:02 2020 +0000

    btrfs: fix lockdep splat when enabling and disabling qgroups
    
    When running test case btrfs/017 from fstests, lockdep reported the
    following splat:
    
      [ 1297.067385] ======================================================
      [ 1297.067708] WARNING: possible circular locking dependency detected
      [ 1297.068022] 5.10.0-rc4-btrfs-next-73 #1 Not tainted
      [ 1297.068322] ------------------------------------------------------
      [ 1297.068629] btrfs/189080 is trying to acquire lock:
      [ 1297.068929] ffff9f2725731690 (sb_internal#2){.+.+}-{0:0}, at: btrfs_quota_enable+0xaf/0xa70 [btrfs]
      [ 1297.069274]
                     but task is already holding lock:
      [ 1297.069868] ffff9f2702b61a08 (&fs_info->qgroup_ioctl_lock){+.+.}-{3:3}, at: btrfs_quota_enable+0x3b/0xa70 [btrfs]
      [ 1297.070219]
                     which lock already depends on the new lock.
    
      [ 1297.071131]
                     the existing dependency chain (in reverse order) is:
      [ 1297.071721]
                     -> #1 (&fs_info->qgroup_ioctl_lock){+.+.}-{3:3}:
      [ 1297.072375]        lock_acquire+0xd8/0x490
      [ 1297.072710]        __mutex_lock+0xa3/0xb30
      [ 1297.073061]        btrfs_qgroup_inherit+0x59/0x6a0 [btrfs]
      [ 1297.073421]        create_subvol+0x194/0x990 [btrfs]
      [ 1297.073780]        btrfs_mksubvol+0x3fb/0x4a0 [btrfs]
      [ 1297.074133]        __btrfs_ioctl_snap_create+0x119/0x1a0 [btrfs]
      [ 1297.074498]        btrfs_ioctl_snap_create+0x58/0x80 [btrfs]
      [ 1297.074872]        btrfs_ioctl+0x1a90/0x36f0 [btrfs]
      [ 1297.075245]        __x64_sys_ioctl+0x83/0xb0
      [ 1297.075617]        do_syscall_64+0x33/0x80
      [ 1297.075993]        entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [ 1297.076380]
                     -> #0 (sb_internal#2){.+.+}-{0:0}:
      [ 1297.077166]        check_prev_add+0x91/0xc60
      [ 1297.077572]        __lock_acquire+0x1740/0x3110
      [ 1297.077984]        lock_acquire+0xd8/0x490
      [ 1297.078411]        start_transaction+0x3c5/0x760 [btrfs]
      [ 1297.078853]        btrfs_quota_enable+0xaf/0xa70 [btrfs]
      [ 1297.079323]        btrfs_ioctl+0x2c60/0x36f0 [btrfs]
      [ 1297.079789]        __x64_sys_ioctl+0x83/0xb0
      [ 1297.080232]        do_syscall_64+0x33/0x80
      [ 1297.080680]        entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [ 1297.081139]
                     other info that might help us debug this:
    
      [ 1297.082536]  Possible unsafe locking scenario:
    
      [ 1297.083510]        CPU0                    CPU1
      [ 1297.084005]        ----                    ----
      [ 1297.084500]   lock(&fs_info->qgroup_ioctl_lock);
      [ 1297.084994]                                lock(sb_internal#2);
      [ 1297.085485]                                lock(&fs_info->qgroup_ioctl_lock);
      [ 1297.085974]   lock(sb_internal#2);
      [ 1297.086454]
                      *** DEADLOCK ***
      [ 1297.087880] 3 locks held by btrfs/189080:
      [ 1297.088324]  #0: ffff9f2725731470 (sb_writers#14){.+.+}-{0:0}, at: btrfs_ioctl+0xa73/0x36f0 [btrfs]
      [ 1297.088799]  #1: ffff9f2702b60cc0 (&fs_info->subvol_sem){++++}-{3:3}, at: btrfs_ioctl+0x1f4d/0x36f0 [btrfs]
      [ 1297.089284]  #2: ffff9f2702b61a08 (&fs_info->qgroup_ioctl_lock){+.+.}-{3:3}, at: btrfs_quota_enable+0x3b/0xa70 [btrfs]
      [ 1297.089771]
                     stack backtrace:
      [ 1297.090662] CPU: 5 PID: 189080 Comm: btrfs Not tainted 5.10.0-rc4-btrfs-next-73 #1
      [ 1297.091132] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
      [ 1297.092123] Call Trace:
      [ 1297.092629]  dump_stack+0x8d/0xb5
      [ 1297.093115]  check_noncircular+0xff/0x110
      [ 1297.093596]  check_prev_add+0x91/0xc60
      [ 1297.094076]  ? kvm_clock_read+0x14/0x30
      [ 1297.094553]  ? kvm_sched_clock_read+0x5/0x10
      [ 1297.095029]  __lock_acquire+0x1740/0x3110
      [ 1297.095510]  lock_acquire+0xd8/0x490
      [ 1297.095993]  ? btrfs_quota_enable+0xaf/0xa70 [btrfs]
      [ 1297.096476]  start_transaction+0x3c5/0x760 [btrfs]
      [ 1297.096962]  ? btrfs_quota_enable+0xaf/0xa70 [btrfs]
      [ 1297.097451]  btrfs_quota_enable+0xaf/0xa70 [btrfs]
      [ 1297.097941]  ? btrfs_ioctl+0x1f4d/0x36f0 [btrfs]
      [ 1297.098429]  btrfs_ioctl+0x2c60/0x36f0 [btrfs]
      [ 1297.098904]  ? do_user_addr_fault+0x20c/0x430
      [ 1297.099382]  ? kvm_clock_read+0x14/0x30
      [ 1297.099854]  ? kvm_sched_clock_read+0x5/0x10
      [ 1297.100328]  ? sched_clock+0x5/0x10
      [ 1297.100801]  ? sched_clock_cpu+0x12/0x180
      [ 1297.101272]  ? __x64_sys_ioctl+0x83/0xb0
      [ 1297.101739]  __x64_sys_ioctl+0x83/0xb0
      [ 1297.102207]  do_syscall_64+0x33/0x80
      [ 1297.102673]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [ 1297.103148] RIP: 0033:0x7f773ff65d87
    
    This is because during the quota enable ioctl we lock first the mutex
    qgroup_ioctl_lock and then start a transaction, and starting a transaction
    acquires a fs freeze semaphore (at the VFS level). However, every other
    code path, except for the quota disable ioctl path, we do the opposite:
    we start a transaction and then lock the mutex.
    
    So fix this by making the quota enable and disable paths to start the
    transaction without having the mutex locked, and then, after starting the
    transaction, lock the mutex and check if some other task already enabled
    or disabled the quotas, bailing with success if that was the case.
    
    Signed-off-by: Filipe Manana <fdmanana at suse.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 0378933d163c..0b29bdb25105 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -878,7 +878,10 @@ struct btrfs_fs_info {
 	 */
 	struct ulist *qgroup_ulist;
 
-	/* protect user change for quota operations */
+	/*
+	 * Protect user change for quota operations. If a transaction is needed,
+	 * it must be started before locking this lock.
+	 */
 	struct mutex qgroup_ioctl_lock;
 
 	/* list of dirty qgroups to be written at next commit */
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index d690ef702522..87bd37b70738 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -937,6 +937,7 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info)
 	struct btrfs_key found_key;
 	struct btrfs_qgroup *qgroup = NULL;
 	struct btrfs_trans_handle *trans = NULL;
+	struct ulist *ulist = NULL;
 	int ret = 0;
 	int slot;
 
@@ -944,8 +945,8 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info)
 	if (fs_info->quota_root)
 		goto out;
 
-	fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL);
-	if (!fs_info->qgroup_ulist) {
+	ulist = ulist_alloc(GFP_KERNEL);
+	if (!ulist) {
 		ret = -ENOMEM;
 		goto out;
 	}
@@ -953,6 +954,22 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info)
 	ret = btrfs_sysfs_add_qgroups(fs_info);
 	if (ret < 0)
 		goto out;
+
+	/*
+	 * Unlock qgroup_ioctl_lock before starting the transaction. This is to
+	 * avoid lock acquisition inversion problems (reported by lockdep) between
+	 * qgroup_ioctl_lock and the vfs freeze semaphores, acquired when we
+	 * start a transaction.
+	 * After we started the transaction lock qgroup_ioctl_lock again and
+	 * check if someone else created the quota root in the meanwhile. If so,
+	 * just return success and release the transaction handle.
+	 *
+	 * Also we don't need to worry about someone else calling
+	 * btrfs_sysfs_add_qgroups() after we unlock and getting an error because
+	 * that function returns 0 (success) when the sysfs entries already exist.
+	 */
+	mutex_unlock(&fs_info->qgroup_ioctl_lock);
+
 	/*
 	 * 1 for quota root item
 	 * 1 for BTRFS_QGROUP_STATUS item
@@ -962,12 +979,20 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info)
 	 * would be a lot of overkill.
 	 */
 	trans = btrfs_start_transaction(tree_root, 2);
+
+	mutex_lock(&fs_info->qgroup_ioctl_lock);
 	if (IS_ERR(trans)) {
 		ret = PTR_ERR(trans);
 		trans = NULL;
 		goto out;
 	}
 
+	if (fs_info->quota_root)
+		goto out;
+
+	fs_info->qgroup_ulist = ulist;
+	ulist = NULL;
+
 	/*
 	 * initially create the quota tree
 	 */
@@ -1125,11 +1150,14 @@ out:
 	if (ret) {
 		ulist_free(fs_info->qgroup_ulist);
 		fs_info->qgroup_ulist = NULL;
-		if (trans)
-			btrfs_end_transaction(trans);
 		btrfs_sysfs_del_qgroups(fs_info);
 	}
 	mutex_unlock(&fs_info->qgroup_ioctl_lock);
+	if (ret && trans)
+		btrfs_end_transaction(trans);
+	else if (trans)
+		ret = btrfs_end_transaction(trans);
+	ulist_free(ulist);
 	return ret;
 }
 
@@ -1142,19 +1170,29 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
 	mutex_lock(&fs_info->qgroup_ioctl_lock);
 	if (!fs_info->quota_root)
 		goto out;
+	mutex_unlock(&fs_info->qgroup_ioctl_lock);
 
 	/*
 	 * 1 For the root item
 	 *
 	 * We should also reserve enough items for the quota tree deletion in
 	 * btrfs_clean_quota_tree but this is not done.
+	 *
+	 * Also, we must always start a transaction without holding the mutex
+	 * qgroup_ioctl_lock, see btrfs_quota_enable().
 	 */
 	trans = btrfs_start_transaction(fs_info->tree_root, 1);
+
+	mutex_lock(&fs_info->qgroup_ioctl_lock);
 	if (IS_ERR(trans)) {
 		ret = PTR_ERR(trans);
+		trans = NULL;
 		goto out;
 	}
 
+	if (!fs_info->quota_root)
+		goto out;
+
 	clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
 	btrfs_qgroup_wait_for_completion(fs_info, false);
 	spin_lock(&fs_info->qgroup_lock);
@@ -1168,13 +1206,13 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
 	ret = btrfs_clean_quota_tree(trans, quota_root);
 	if (ret) {
 		btrfs_abort_transaction(trans, ret);
-		goto end_trans;
+		goto out;
 	}
 
 	ret = btrfs_del_root(trans, &quota_root->root_key);
 	if (ret) {
 		btrfs_abort_transaction(trans, ret);
-		goto end_trans;
+		goto out;
 	}
 
 	list_del(&quota_root->dirty_list);
@@ -1186,10 +1224,13 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
 
 	btrfs_put_root(quota_root);
 
-end_trans:
-	ret = btrfs_end_transaction(trans);
 out:
 	mutex_unlock(&fs_info->qgroup_ioctl_lock);
+	if (ret && trans)
+		btrfs_end_transaction(trans);
+	else if (trans)
+		ret = btrfs_end_transaction(trans);
+
 	return ret;
 }
 
commit 7aa6d359845a9dbf7ad90b0b1b6347ef4764621f
Author: Filipe Manana <fdmanana at suse.com>
Date:   Mon Nov 23 18:30:54 2020 +0000

    btrfs: do nofs allocations when adding and removing qgroup relations
    
    When adding or removing a qgroup relation we are doing a GFP_KERNEL
    allocation which is not safe because we are holding a transaction
    handle open and that can make us deadlock if the allocator needs to
    recurse into the filesystem. So just surround those calls with a
    nofs context.
    
    Signed-off-by: Filipe Manana <fdmanana at suse.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index a3f0d209fce5..d690ef702522 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -11,6 +11,7 @@
 #include <linux/slab.h>
 #include <linux/workqueue.h>
 #include <linux/btrfs.h>
+#include <linux/sched/mm.h>
 
 #include "ctree.h"
 #include "transaction.h"
@@ -1324,13 +1325,17 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
 	struct btrfs_qgroup *member;
 	struct btrfs_qgroup_list *list;
 	struct ulist *tmp;
+	unsigned int nofs_flag;
 	int ret = 0;
 
 	/* Check the level of src and dst first */
 	if (btrfs_qgroup_level(src) >= btrfs_qgroup_level(dst))
 		return -EINVAL;
 
+	/* We hold a transaction handle open, must do a NOFS allocation. */
+	nofs_flag = memalloc_nofs_save();
 	tmp = ulist_alloc(GFP_KERNEL);
+	memalloc_nofs_restore(nofs_flag);
 	if (!tmp)
 		return -ENOMEM;
 
@@ -1387,10 +1392,14 @@ static int __del_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
 	struct btrfs_qgroup_list *list;
 	struct ulist *tmp;
 	bool found = false;
+	unsigned int nofs_flag;
 	int ret = 0;
 	int ret2;
 
+	/* We hold a transaction handle open, must do a NOFS allocation. */
+	nofs_flag = memalloc_nofs_save();
 	tmp = ulist_alloc(GFP_KERNEL);
+	memalloc_nofs_restore(nofs_flag);
 	if (!tmp)
 		return -ENOMEM;
 
commit 3d05cad3c357a2b749912914356072b38435edfa
Author: Filipe Manana <fdmanana at suse.com>
Date:   Mon Nov 23 14:28:44 2020 +0000

    btrfs: fix lockdep splat when reading qgroup config on mount
    
    Lockdep reported the following splat when running test btrfs/190 from
    fstests:
    
      [ 9482.126098] ======================================================
      [ 9482.126184] WARNING: possible circular locking dependency detected
      [ 9482.126281] 5.10.0-rc4-btrfs-next-73 #1 Not tainted
      [ 9482.126365] ------------------------------------------------------
      [ 9482.126456] mount/24187 is trying to acquire lock:
      [ 9482.126534] ffffa0c869a7dac0 (&fs_info->qgroup_rescan_lock){+.+.}-{3:3}, at: qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.126647]
                     but task is already holding lock:
      [ 9482.126777] ffffa0c892ebd3a0 (btrfs-quota-00){++++}-{3:3}, at: __btrfs_tree_read_lock+0x27/0x120 [btrfs]
      [ 9482.126886]
                     which lock already depends on the new lock.
    
      [ 9482.127078]
                     the existing dependency chain (in reverse order) is:
      [ 9482.127213]
                     -> #1 (btrfs-quota-00){++++}-{3:3}:
      [ 9482.127366]        lock_acquire+0xd8/0x490
      [ 9482.127436]        down_read_nested+0x45/0x220
      [ 9482.127528]        __btrfs_tree_read_lock+0x27/0x120 [btrfs]
      [ 9482.127613]        btrfs_read_lock_root_node+0x41/0x130 [btrfs]
      [ 9482.127702]        btrfs_search_slot+0x514/0xc30 [btrfs]
      [ 9482.127788]        update_qgroup_status_item+0x72/0x140 [btrfs]
      [ 9482.127877]        btrfs_qgroup_rescan_worker+0xde/0x680 [btrfs]
      [ 9482.127964]        btrfs_work_helper+0xf1/0x600 [btrfs]
      [ 9482.128039]        process_one_work+0x24e/0x5e0
      [ 9482.128110]        worker_thread+0x50/0x3b0
      [ 9482.128181]        kthread+0x153/0x170
      [ 9482.128256]        ret_from_fork+0x22/0x30
      [ 9482.128327]
                     -> #0 (&fs_info->qgroup_rescan_lock){+.+.}-{3:3}:
      [ 9482.128464]        check_prev_add+0x91/0xc60
      [ 9482.128551]        __lock_acquire+0x1740/0x3110
      [ 9482.128623]        lock_acquire+0xd8/0x490
      [ 9482.130029]        __mutex_lock+0xa3/0xb30
      [ 9482.130590]        qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.131577]        btrfs_read_qgroup_config+0x43a/0x550 [btrfs]
      [ 9482.132175]        open_ctree+0x1228/0x18a0 [btrfs]
      [ 9482.132756]        btrfs_mount_root.cold+0x13/0xed [btrfs]
      [ 9482.133325]        legacy_get_tree+0x30/0x60
      [ 9482.133866]        vfs_get_tree+0x28/0xe0
      [ 9482.134392]        fc_mount+0xe/0x40
      [ 9482.134908]        vfs_kern_mount.part.0+0x71/0x90
      [ 9482.135428]        btrfs_mount+0x13b/0x3e0 [btrfs]
      [ 9482.135942]        legacy_get_tree+0x30/0x60
      [ 9482.136444]        vfs_get_tree+0x28/0xe0
      [ 9482.136949]        path_mount+0x2d7/0xa70
      [ 9482.137438]        do_mount+0x75/0x90
      [ 9482.137923]        __x64_sys_mount+0x8e/0xd0
      [ 9482.138400]        do_syscall_64+0x33/0x80
      [ 9482.138873]        entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [ 9482.139346]
                     other info that might help us debug this:
    
      [ 9482.140735]  Possible unsafe locking scenario:
    
      [ 9482.141594]        CPU0                    CPU1
      [ 9482.142011]        ----                    ----
      [ 9482.142411]   lock(btrfs-quota-00);
      [ 9482.142806]                                lock(&fs_info->qgroup_rescan_lock);
      [ 9482.143216]                                lock(btrfs-quota-00);
      [ 9482.143629]   lock(&fs_info->qgroup_rescan_lock);
      [ 9482.144056]
                      *** DEADLOCK ***
    
      [ 9482.145242] 2 locks held by mount/24187:
      [ 9482.145637]  #0: ffffa0c8411c40e8 (&type->s_umount_key#44/1){+.+.}-{3:3}, at: alloc_super+0xb9/0x400
      [ 9482.146061]  #1: ffffa0c892ebd3a0 (btrfs-quota-00){++++}-{3:3}, at: __btrfs_tree_read_lock+0x27/0x120 [btrfs]
      [ 9482.146509]
                     stack backtrace:
      [ 9482.147350] CPU: 1 PID: 24187 Comm: mount Not tainted 5.10.0-rc4-btrfs-next-73 #1
      [ 9482.147788] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
      [ 9482.148709] Call Trace:
      [ 9482.149169]  dump_stack+0x8d/0xb5
      [ 9482.149628]  check_noncircular+0xff/0x110
      [ 9482.150090]  check_prev_add+0x91/0xc60
      [ 9482.150561]  ? kvm_clock_read+0x14/0x30
      [ 9482.151017]  ? kvm_sched_clock_read+0x5/0x10
      [ 9482.151470]  __lock_acquire+0x1740/0x3110
      [ 9482.151941]  ? __btrfs_tree_read_lock+0x27/0x120 [btrfs]
      [ 9482.152402]  lock_acquire+0xd8/0x490
      [ 9482.152887]  ? qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.153354]  __mutex_lock+0xa3/0xb30
      [ 9482.153826]  ? qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.154301]  ? qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.154768]  ? qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.155226]  qgroup_rescan_init+0x43/0xf0 [btrfs]
      [ 9482.155690]  btrfs_read_qgroup_config+0x43a/0x550 [btrfs]
      [ 9482.156160]  open_ctree+0x1228/0x18a0 [btrfs]
      [ 9482.156643]  btrfs_mount_root.cold+0x13/0xed [btrfs]
      [ 9482.157108]  ? rcu_read_lock_sched_held+0x5d/0x90
      [ 9482.157567]  ? kfree+0x31f/0x3e0
      [ 9482.158030]  legacy_get_tree+0x30/0x60
      [ 9482.158489]  vfs_get_tree+0x28/0xe0
      [ 9482.158947]  fc_mount+0xe/0x40
      [ 9482.159403]  vfs_kern_mount.part.0+0x71/0x90
      [ 9482.159875]  btrfs_mount+0x13b/0x3e0 [btrfs]
      [ 9482.160335]  ? rcu_read_lock_sched_held+0x5d/0x90
      [ 9482.160805]  ? kfree+0x31f/0x3e0
      [ 9482.161260]  ? legacy_get_tree+0x30/0x60
      [ 9482.161714]  legacy_get_tree+0x30/0x60
      [ 9482.162166]  vfs_get_tree+0x28/0xe0
      [ 9482.162616]  path_mount+0x2d7/0xa70
      [ 9482.163070]  do_mount+0x75/0x90
      [ 9482.163525]  __x64_sys_mount+0x8e/0xd0
      [ 9482.163986]  do_syscall_64+0x33/0x80
      [ 9482.164437]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [ 9482.164902] RIP: 0033:0x7f51e907caaa
    
    This happens because at btrfs_read_qgroup_config() we can call
    qgroup_rescan_init() while holding a read lock on a quota btree leaf,
    acquired by the previous call to btrfs_search_slot_for_read(), and
    qgroup_rescan_init() acquires the mutex qgroup_rescan_lock.
    
    A qgroup rescan worker does the opposite: it acquires the mutex
    qgroup_rescan_lock, at btrfs_qgroup_rescan_worker(), and then tries to
    update the qgroup status item in the quota btree through the call to
    update_qgroup_status_item(). This inversion of locking order
    between the qgroup_rescan_lock mutex and quota btree locks causes the
    splat.
    
    Fix this simply by releasing and freeing the path before calling
    qgroup_rescan_init() at btrfs_read_qgroup_config().
    
    CC: stable at vger.kernel.org # 4.4+
    Signed-off-by: Filipe Manana <fdmanana at suse.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 4621b8043021..a3f0d209fce5 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -497,13 +497,13 @@ next2:
 			break;
 	}
 out:
+	btrfs_free_path(path);
 	fs_info->qgroup_flags |= flags;
 	if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON))
 		clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
 	else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN &&
 		 ret >= 0)
 		ret = qgroup_rescan_init(fs_info, rescan_progress, 0);
-	btrfs_free_path(path);
 
 	if (ret < 0) {
 		ulist_free(fs_info->qgroup_ulist);
commit 6d06b0ad94d3dd7e3503d8ad39c39c4634884611
Author: David Sterba <dsterba at suse.com>
Date:   Mon Nov 16 19:53:52 2020 +0100

    btrfs: tree-checker: add missing returns after data_ref alignment checks
    
    There are sectorsize alignment checks that are reported but then
    check_extent_data_ref continues. This was not intended, wrong alignment
    is not a minor problem and we should return with error.
    
    CC: stable at vger.kernel.org # 5.4+
    Fixes: 0785a9aacf9d ("btrfs: tree-checker: Add EXTENT_DATA_REF check")
    Reviewed-by: Qu Wenruo <wqu at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
index 6cefabd27209..ea2bb4cb5890 100644
--- a/fs/btrfs/tree-checker.c
+++ b/fs/btrfs/tree-checker.c
@@ -1424,6 +1424,7 @@ static int check_extent_data_ref(struct extent_buffer *leaf,
 	"invalid item size, have %u expect aligned to %zu for key type %u",
 			    btrfs_item_size_nr(leaf, slot),
 			    sizeof(*dref), key->type);
+		return -EUCLEAN;
 	}
 	if (!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize)) {
 		generic_err(leaf, slot,
@@ -1452,6 +1453,7 @@ static int check_extent_data_ref(struct extent_buffer *leaf,
 			extent_err(leaf, slot,
 	"invalid extent data backref offset, have %llu expect aligned to %u",
 				   offset, leaf->fs_info->sectorsize);
+			return -EUCLEAN;
 		}
 	}
 	return 0;
commit 0697d9a610998b8bdee6b2390836cb2391d8fd1a
Author: Johannes Thumshirn <johannes.thumshirn at wdc.com>
Date:   Wed Nov 18 18:03:26 2020 +0900

    btrfs: don't access possibly stale fs_info data for printing duplicate device
    
    Syzbot reported a possible use-after-free when printing a duplicate device
    warning device_list_add().
    
    At this point it can happen that a btrfs_device::fs_info is not correctly
    setup yet, so we're accessing stale data, when printing the warning
    message using the btrfs_printk() wrappers.
    
      ==================================================================
      BUG: KASAN: use-after-free in btrfs_printk+0x3eb/0x435 fs/btrfs/super.c:245
      Read of size 8 at addr ffff8880878e06a8 by task syz-executor225/7068
    
      CPU: 1 PID: 7068 Comm: syz-executor225 Not tainted 5.9.0-rc5-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      Call Trace:
       __dump_stack lib/dump_stack.c:77 [inline]
       dump_stack+0x1d6/0x29e lib/dump_stack.c:118
       print_address_description+0x66/0x620 mm/kasan/report.c:383
       __kasan_report mm/kasan/report.c:513 [inline]
       kasan_report+0x132/0x1d0 mm/kasan/report.c:530
       btrfs_printk+0x3eb/0x435 fs/btrfs/super.c:245
       device_list_add+0x1a88/0x1d60 fs/btrfs/volumes.c:943
       btrfs_scan_one_device+0x196/0x490 fs/btrfs/volumes.c:1359
       btrfs_mount_root+0x48f/0xb60 fs/btrfs/super.c:1634
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x88/0x270 fs/super.c:1547
       fc_mount fs/namespace.c:978 [inline]
       vfs_kern_mount+0xc9/0x160 fs/namespace.c:1008
       btrfs_mount+0x33c/0xae0 fs/btrfs/super.c:1732
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x88/0x270 fs/super.c:1547
       do_new_mount fs/namespace.c:2875 [inline]
       path_mount+0x179d/0x29e0 fs/namespace.c:3192
       do_mount fs/namespace.c:3205 [inline]
       __do_sys_mount fs/namespace.c:3413 [inline]
       __se_sys_mount+0x126/0x180 fs/namespace.c:3390
       do_syscall_64+0x31/0x70 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
      RIP: 0033:0x44840a
      RSP: 002b:00007ffedfffd608 EFLAGS: 00000293 ORIG_RAX: 00000000000000a5
      RAX: ffffffffffffffda RBX: 00007ffedfffd670 RCX: 000000000044840a
      RDX: 0000000020000000 RSI: 0000000020000100 RDI: 00007ffedfffd630
      RBP: 00007ffedfffd630 R08: 00007ffedfffd670 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000293 R12: 000000000000001a
      R13: 0000000000000004 R14: 0000000000000003 R15: 0000000000000003
    
      Allocated by task 6945:
       kasan_save_stack mm/kasan/common.c:48 [inline]
       kasan_set_track mm/kasan/common.c:56 [inline]
       __kasan_kmalloc+0x100/0x130 mm/kasan/common.c:461
       kmalloc_node include/linux/slab.h:577 [inline]
       kvmalloc_node+0x81/0x110 mm/util.c:574
       kvmalloc include/linux/mm.h:757 [inline]
       kvzalloc include/linux/mm.h:765 [inline]
       btrfs_mount_root+0xd0/0xb60 fs/btrfs/super.c:1613
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x88/0x270 fs/super.c:1547
       fc_mount fs/namespace.c:978 [inline]
       vfs_kern_mount+0xc9/0x160 fs/namespace.c:1008
       btrfs_mount+0x33c/0xae0 fs/btrfs/super.c:1732
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x88/0x270 fs/super.c:1547
       do_new_mount fs/namespace.c:2875 [inline]
       path_mount+0x179d/0x29e0 fs/namespace.c:3192
       do_mount fs/namespace.c:3205 [inline]
       __do_sys_mount fs/namespace.c:3413 [inline]
       __se_sys_mount+0x126/0x180 fs/namespace.c:3390
       do_syscall_64+0x31/0x70 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
      Freed by task 6945:
       kasan_save_stack mm/kasan/common.c:48 [inline]
       kasan_set_track+0x3d/0x70 mm/kasan/common.c:56
       kasan_set_free_info+0x17/0x30 mm/kasan/generic.c:355
       __kasan_slab_free+0xdd/0x110 mm/kasan/common.c:422
       __cache_free mm/slab.c:3418 [inline]
       kfree+0x113/0x200 mm/slab.c:3756
       deactivate_locked_super+0xa7/0xf0 fs/super.c:335
       btrfs_mount_root+0x72b/0xb60 fs/btrfs/super.c:1678
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x88/0x270 fs/super.c:1547
       fc_mount fs/namespace.c:978 [inline]
       vfs_kern_mount+0xc9/0x160 fs/namespace.c:1008
       btrfs_mount+0x33c/0xae0 fs/btrfs/super.c:1732
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x88/0x270 fs/super.c:1547
       do_new_mount fs/namespace.c:2875 [inline]
       path_mount+0x179d/0x29e0 fs/namespace.c:3192
       do_mount fs/namespace.c:3205 [inline]
       __do_sys_mount fs/namespace.c:3413 [inline]
       __se_sys_mount+0x126/0x180 fs/namespace.c:3390
       do_syscall_64+0x31/0x70 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
      The buggy address belongs to the object at ffff8880878e0000
       which belongs to the cache kmalloc-16k of size 16384
      The buggy address is located 1704 bytes inside of
       16384-byte region [ffff8880878e0000, ffff8880878e4000)
      The buggy address belongs to the page:
      page:0000000060704f30 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x878e0
      head:0000000060704f30 order:3 compound_mapcount:0 compound_pincount:0
      flags: 0xfffe0000010200(slab|head)
      raw: 00fffe0000010200 ffffea00028e9a08 ffffea00021e3608 ffff8880aa440b00
      raw: 0000000000000000 ffff8880878e0000 0000000100000001 0000000000000000
      page dumped because: kasan: bad access detected
    
      Memory state around the buggy address:
       ffff8880878e0580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
       ffff8880878e0600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      >ffff8880878e0680: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                                        ^
       ffff8880878e0700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
       ffff8880878e0780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      ==================================================================
    
    The syzkaller reproducer for this use-after-free crafts a filesystem image
    and loop mounts it twice in a loop. The mount will fail as the crafted
    image has an invalid chunk tree. When this happens btrfs_mount_root() will
    call deactivate_locked_super(), which then cleans up fs_info and
    fs_info::sb. If a second thread now adds the same block-device to the
    filesystem, it will get detected as a duplicate device and
    device_list_add() will reject the duplicate and print a warning. But as
    the fs_info pointer passed in is non-NULL this will result in a
    use-after-free.
    
    Instead of printing possibly uninitialized or already freed memory in
    btrfs_printk(), explicitly pass in a NULL fs_info so the printing of the
    device name will be skipped altogether.
    
    There was a slightly different approach discussed in
    https://lore.kernel.org/linux-btrfs/20200114060920.4527-1-anand.jain@oracle.com/t/#u
    
    Link: https://lore.kernel.org/linux-btrfs/000000000000c9e14b05afcc41ba@google.com
    Reported-by: syzbot+582e66e5edf36a22c7b0 at syzkaller.appspotmail.com
    CC: stable at vger.kernel.org # 4.19+
    Reviewed-by: Nikolay Borisov <nborisov at suse.com>
    Reviewed-by: Anand Jain <anand.jain at oracle.com>
    Signed-off-by: Johannes Thumshirn <johannes.thumshirn at wdc.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index a6406b3b8c2b..78637665166e 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -940,7 +940,13 @@ static noinline struct btrfs_device *device_list_add(const char *path,
 			if (device->bdev != path_bdev) {
 				bdput(path_bdev);
 				mutex_unlock(&fs_devices->device_list_mutex);
-				btrfs_warn_in_rcu(device->fs_info,
+				/*
+				 * device->fs_info may not be reliable here, so
+				 * pass in a NULL instead. This avoids a
+				 * possible use-after-free when the fs_info and
+				 * fs_info->sb are already torn down.
+				 */
+				btrfs_warn_in_rcu(NULL,
 	"duplicate device %s devid %llu generation %llu scanned by %s (%d)",
 						  path, devid, found_transid,
 						  current->comm,
commit 4daeb2ae5cd8a7552ea9805792c86036298ed33d
Merge: ef3f0caf2430 652b44453ea9
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Mon Nov 23 19:51:56 2020 +0100

    Merge tag 'misc-habanalabs-fixes-2020-11-23' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux into char-misc-linus
    
    Oded writes:
    
    This tag contains the following habanalabs driver fix for 5.10-rc6:
    
    - Add missing statements and break; in case switch of ECC handling. Without
      this fix, the handling of that interrupt will be erroneous.
    
    * tag 'misc-habanalabs-fixes-2020-11-23' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux:
      habanalabs/gaudi: fix missing code in ECC handling

commit b1824968221ccc498625750d8c49cf0d7d39a4de
Author: Srinivasa Rao Mandadapu <srivasam at codeaurora.org>
Date:   Mon Nov 23 21:47:53 2020 +0530

    ASoC: qcom: Fix enabling BCLK and LRCLK in LPAIF invalid state
    
    Fix enabling BCLK and LRCLK only when LPAIF is invalid state and
    bit clock in enable state.
    In device suspend/resume scenario LPAIF is going to reset state.
    which is causing LRCLK disable and BCLK enable.
    Avoid such inconsitency by removing unnecessary cpu dai prepare API,
    which is doing LRCLK enable, and by maintaining BLCK  state information.
    
    Fixes: 7e6799d8f87d ("ASoC: qcom: lpass-cpu: Enable MI2S BCLK and LRCLK together")
    
    Signed-off-by: V Sujith Kumar Reddy <vsujithk at codeaurora.org>
    Signed-off-by: Srinivasa Rao Mandadapu <srivasam at codeaurora.org>
    Link: https://lore.kernel.org/r/1606148273-17325-1-git-send-email-srivasam@codeaurora.org
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c
index 9d17c87445a9..426235a217ec 100644
--- a/sound/soc/qcom/lpass-cpu.c
+++ b/sound/soc/qcom/lpass-cpu.c
@@ -263,28 +263,6 @@ static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream,
 	return 0;
 }
 
-static int lpass_cpu_daiops_prepare(struct snd_pcm_substream *substream,
-		struct snd_soc_dai *dai)
-{
-	struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
-	struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
-	unsigned int id = dai->driver->id;
-	int ret;
-
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-		ret = regmap_fields_write(i2sctl->spken, id,
-					 LPAIF_I2SCTL_SPKEN_ENABLE);
-	} else {
-		ret = regmap_fields_write(i2sctl->micen, id,
-					 LPAIF_I2SCTL_MICEN_ENABLE);
-	}
-
-	if (ret)
-		dev_err(dai->dev, "error writing to i2sctl enable: %d\n", ret);
-
-	return ret;
-}
-
 static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
 		int cmd, struct snd_soc_dai *dai)
 {
@@ -292,6 +270,18 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
 	struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
 	unsigned int id = dai->driver->id;
 	int ret = -EINVAL;
+	unsigned int val = 0;
+
+	ret = regmap_read(drvdata->lpaif_map,
+				LPAIF_I2SCTL_REG(drvdata->variant, dai->driver->id), &val);
+	if (ret) {
+		dev_err(dai->dev, "error reading from i2sctl reg: %d\n", ret);
+		return ret;
+	}
+	if (val == LPAIF_I2SCTL_RESET_STATE) {
+		dev_err(dai->dev, "error in i2sctl register state\n");
+		return -ENOTRECOVERABLE;
+	}
 
 	switch (cmd) {
 	case SNDRV_PCM_TRIGGER_START:
@@ -308,11 +298,14 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
 			dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
 				ret);
 
-		ret = clk_enable(drvdata->mi2s_bit_clk[id]);
-		if (ret) {
-			dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
-			clk_disable(drvdata->mi2s_osr_clk[id]);
-			return ret;
+		if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_DISABLE) {
+			ret = clk_enable(drvdata->mi2s_bit_clk[id]);
+			if (ret) {
+				dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
+				clk_disable(drvdata->mi2s_osr_clk[id]);
+				return ret;
+			}
+			drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_ENABLE;
 		}
 
 		break;
@@ -329,7 +322,10 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
 		if (ret)
 			dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
 				ret);
-		clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
+		if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_ENABLE) {
+			clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
+			drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_DISABLE;
+		}
 		break;
 	}
 
@@ -341,7 +337,6 @@ const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops = {
 	.startup	= lpass_cpu_daiops_startup,
 	.shutdown	= lpass_cpu_daiops_shutdown,
 	.hw_params	= lpass_cpu_daiops_hw_params,
-	.prepare	= lpass_cpu_daiops_prepare,
 	.trigger	= lpass_cpu_daiops_trigger,
 };
 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_ops);
@@ -459,16 +454,20 @@ static bool lpass_cpu_regmap_volatile(struct device *dev, unsigned int reg)
 	struct lpass_variant *v = drvdata->variant;
 	int i;
 
+	for (i = 0; i < v->i2s_ports; ++i)
+		if (reg == LPAIF_I2SCTL_REG(v, i))
+			return true;
 	for (i = 0; i < v->irq_ports; ++i)
 		if (reg == LPAIF_IRQSTAT_REG(v, i))
 			return true;
 
 	for (i = 0; i < v->rdma_channels; ++i)
-		if (reg == LPAIF_RDMACURR_REG(v, i))
+		if (reg == LPAIF_RDMACURR_REG(v, i) || reg == LPAIF_RDMACTL_REG(v, i))
 			return true;
 
 	for (i = 0; i < v->wrdma_channels; ++i)
-		if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start))
+		if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start) ||
+			reg == LPAIF_WRDMACTL_REG(v, i + v->wrdma_channel_start))
 			return true;
 
 	return false;
@@ -861,6 +860,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
 				PTR_ERR(drvdata->mi2s_bit_clk[dai_id]));
 			return PTR_ERR(drvdata->mi2s_bit_clk[dai_id]);
 		}
+		drvdata->bit_clk_state[dai_id] = LPAIF_BIT_CLK_DISABLE;
 	}
 
 	/* Allocation for i2sctl regmap fields */
diff --git a/sound/soc/qcom/lpass-lpaif-reg.h b/sound/soc/qcom/lpass-lpaif-reg.h
index 08f3fe508b85..405542832e99 100644
--- a/sound/soc/qcom/lpass-lpaif-reg.h
+++ b/sound/soc/qcom/lpass-lpaif-reg.h
@@ -60,6 +60,13 @@
 #define LPAIF_I2SCTL_BITWIDTH_24	1
 #define LPAIF_I2SCTL_BITWIDTH_32	2
 
+#define LPAIF_BIT_CLK_DISABLE		0
+#define LPAIF_BIT_CLK_ENABLE		1
+
+#define LPAIF_I2SCTL_RESET_STATE	0x003C0004
+#define LPAIF_DMACTL_RESET_STATE	0x00200000
+
+
 /* LPAIF IRQ */
 #define LPAIF_IRQ_REG_ADDR(v, addr, port) \
 	(v->irq_reg_base + (addr) + v->irq_reg_stride * (port))
diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c
index 7a3fdf89968a..80b09dede5f9 100644
--- a/sound/soc/qcom/lpass-platform.c
+++ b/sound/soc/qcom/lpass-platform.c
@@ -110,6 +110,7 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
 	struct regmap *map;
 	unsigned int dai_id = cpu_dai->driver->id;
 
+	component->id = dai_id;
 	data = kzalloc(sizeof(*data), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
@@ -451,19 +452,34 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component,
 	unsigned int reg_irqclr = 0, val_irqclr = 0;
 	unsigned int  reg_irqen = 0, val_irqen = 0, val_mask = 0;
 	unsigned int dai_id = cpu_dai->driver->id;
+	unsigned int dma_ctrl_reg = 0;
 
 	ch = pcm_data->dma_ch;
 	if (dir ==  SNDRV_PCM_STREAM_PLAYBACK) {
 		id = pcm_data->dma_ch;
-		if (dai_id == LPASS_DP_RX)
+		if (dai_id == LPASS_DP_RX) {
 			dmactl = drvdata->hdmi_rd_dmactl;
-		else
+			map = drvdata->hdmiif_map;
+		} else {
 			dmactl = drvdata->rd_dmactl;
+			map = drvdata->lpaif_map;
+		}
 	} else {
 		dmactl = drvdata->wr_dmactl;
 		id = pcm_data->dma_ch - v->wrdma_channel_start;
+		map = drvdata->lpaif_map;
+	}
+	ret = regmap_read(map, LPAIF_DMACTL_REG(v, ch, dir, dai_id), &dma_ctrl_reg);
+	if (ret) {
+		dev_err(soc_runtime->dev, "error reading from rdmactl reg: %d\n", ret);
+		return ret;
 	}
 
+	if (dma_ctrl_reg == LPAIF_DMACTL_RESET_STATE ||
+		dma_ctrl_reg == LPAIF_DMACTL_RESET_STATE + 1) {
+		dev_err(soc_runtime->dev, "error in rdmactl register state\n");
+		return -ENOTRECOVERABLE;
+	}
 	switch (cmd) {
 	case SNDRV_PCM_TRIGGER_START:
 	case SNDRV_PCM_TRIGGER_RESUME:
diff --git a/sound/soc/qcom/lpass.h b/sound/soc/qcom/lpass.h
index b4830f353796..bccd1a05d771 100644
--- a/sound/soc/qcom/lpass.h
+++ b/sound/soc/qcom/lpass.h
@@ -68,6 +68,7 @@ struct lpass_data {
 	unsigned int mi2s_playback_sd_mode[LPASS_MAX_MI2S_PORTS];
 	unsigned int mi2s_capture_sd_mode[LPASS_MAX_MI2S_PORTS];
 	int hdmi_port_enable;
+	int bit_clk_state[LPASS_MAX_MI2S_PORTS];
 
 	/* low-power audio interface (LPAIF) registers */
 	void __iomem *lpaif;
commit 652b44453ea953d3157f02a7f17e18e329952649
Author: Oded Gabbay <ogabbay at kernel.org>
Date:   Sat Nov 21 14:35:35 2020 +0200

    habanalabs/gaudi: fix missing code in ECC handling
    
    There is missing statement and missing "break;" in the ECC handling
    code in gaudi.c
    This will cause a wrong behavior upon certain ECC interrupts.
    
    Signed-off-by: Oded Gabbay <ogabbay at kernel.org>

diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c
index 2519a34e25b7..7ea6b4368a91 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi.c
@@ -5436,6 +5436,8 @@ static void gaudi_handle_ecc_event(struct hl_device *hdev, u16 event_type,
 		params.num_memories = 33;
 		params.derr = true;
 		params.disable_clock_gating = true;
+		extract_info_from_fw = false;
+		break;
 	default:
 		return;
 	}
commit 2820526dd5c27326d9c0d2c831a34b8f14e7c404
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Fri Nov 20 15:42:45 2020 +0100

    drm/vc4: kms: Don't disable the muxing of an active CRTC
    
    The current HVS muxing code will consider the CRTCs in a given state to
    setup their muxing in the HVS, and disable the other CRTCs muxes.
    
    However, it's valid to only update a single CRTC with a state, and in this
    situation we would mux out a CRTC that was enabled but left untouched by
    the new state.
    
    Fix this by setting a flag on the CRTC state when the muxing has been
    changed, and only change the muxing configuration when that flag is there.
    
    Fixes: 87ebcd42fb7b ("drm/vc4: crtc: Assign output to channel automatically")
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120144245.398711-3-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index fcfeef0949af..c5f2944d5bc6 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -532,6 +532,9 @@ struct vc4_crtc_state {
 		unsigned int top;
 		unsigned int bottom;
 	} margins;
+
+	/* Transitional state below, only valid during atomic commits */
+	bool update_muxing;
 };
 
 #define VC4_HVS_CHANNEL_DISABLED ((unsigned int)-1)
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 0bbd7b554275..ba310c0ab5f6 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -239,10 +239,7 @@ static void vc5_hvs_pv_muxing_commit(struct vc4_dev *vc4,
 {
 	struct drm_crtc_state *crtc_state;
 	struct drm_crtc *crtc;
-	unsigned char dsp2_mux = 0;
-	unsigned char dsp3_mux = 3;
-	unsigned char dsp4_mux = 3;
-	unsigned char dsp5_mux = 3;
+	unsigned char mux;
 	unsigned int i;
 	u32 reg;
 
@@ -250,50 +247,59 @@ static void vc5_hvs_pv_muxing_commit(struct vc4_dev *vc4,
 		struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state);
 		struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
 
-		if (!crtc_state->active)
+		if (!vc4_state->update_muxing)
 			continue;
 
 		switch (vc4_crtc->data->hvs_output) {
 		case 2:
-			dsp2_mux = (vc4_state->assigned_channel == 2) ? 0 : 1;
+			mux = (vc4_state->assigned_channel == 2) ? 0 : 1;
+			reg = HVS_READ(SCALER_DISPECTRL);
+			HVS_WRITE(SCALER_DISPECTRL,
+				  (reg & ~SCALER_DISPECTRL_DSP2_MUX_MASK) |
+				  VC4_SET_FIELD(mux, SCALER_DISPECTRL_DSP2_MUX));
 			break;
 
 		case 3:
-			dsp3_mux = vc4_state->assigned_channel;
+			if (vc4_state->assigned_channel == VC4_HVS_CHANNEL_DISABLED)
+				mux = 3;
+			else
+				mux = vc4_state->assigned_channel;
+
+			reg = HVS_READ(SCALER_DISPCTRL);
+			HVS_WRITE(SCALER_DISPCTRL,
+				  (reg & ~SCALER_DISPCTRL_DSP3_MUX_MASK) |
+				  VC4_SET_FIELD(mux, SCALER_DISPCTRL_DSP3_MUX));
 			break;
 
 		case 4:
-			dsp4_mux = vc4_state->assigned_channel;
+			if (vc4_state->assigned_channel == VC4_HVS_CHANNEL_DISABLED)
+				mux = 3;
+			else
+				mux = vc4_state->assigned_channel;
+
+			reg = HVS_READ(SCALER_DISPEOLN);
+			HVS_WRITE(SCALER_DISPEOLN,
+				  (reg & ~SCALER_DISPEOLN_DSP4_MUX_MASK) |
+				  VC4_SET_FIELD(mux, SCALER_DISPEOLN_DSP4_MUX));
+
 			break;
 
 		case 5:
-			dsp5_mux = vc4_state->assigned_channel;
+			if (vc4_state->assigned_channel == VC4_HVS_CHANNEL_DISABLED)
+				mux = 3;
+			else
+				mux = vc4_state->assigned_channel;
+
+			reg = HVS_READ(SCALER_DISPDITHER);
+			HVS_WRITE(SCALER_DISPDITHER,
+				  (reg & ~SCALER_DISPDITHER_DSP5_MUX_MASK) |
+				  VC4_SET_FIELD(mux, SCALER_DISPDITHER_DSP5_MUX));
 			break;
 
 		default:
 			break;
 		}
 	}
-
-	reg = HVS_READ(SCALER_DISPECTRL);
-	HVS_WRITE(SCALER_DISPECTRL,
-		  (reg & ~SCALER_DISPECTRL_DSP2_MUX_MASK) |
-		  VC4_SET_FIELD(dsp2_mux, SCALER_DISPECTRL_DSP2_MUX));
-
-	reg = HVS_READ(SCALER_DISPCTRL);
-	HVS_WRITE(SCALER_DISPCTRL,
-		  (reg & ~SCALER_DISPCTRL_DSP3_MUX_MASK) |
-		  VC4_SET_FIELD(dsp3_mux, SCALER_DISPCTRL_DSP3_MUX));
-
-	reg = HVS_READ(SCALER_DISPEOLN);
-	HVS_WRITE(SCALER_DISPEOLN,
-		  (reg & ~SCALER_DISPEOLN_DSP4_MUX_MASK) |
-		  VC4_SET_FIELD(dsp4_mux, SCALER_DISPEOLN_DSP4_MUX));
-
-	reg = HVS_READ(SCALER_DISPDITHER);
-	HVS_WRITE(SCALER_DISPDITHER,
-		  (reg & ~SCALER_DISPDITHER_DSP5_MUX_MASK) |
-		  VC4_SET_FIELD(dsp5_mux, SCALER_DISPDITHER_DSP5_MUX));
 }
 
 static void
@@ -789,16 +795,19 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 		struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
 		unsigned int matching_channels;
 
-		if (old_crtc_state->enable && !new_crtc_state->enable) {
-			hvs_new_state->unassigned_channels |= BIT(old_vc4_crtc_state->assigned_channel);
-			new_vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED;
-		}
-
-		if (!new_crtc_state->enable)
+		/* Nothing to do here, let's skip it */
+		if (old_crtc_state->enable == new_crtc_state->enable)
 			continue;
 
-		if (new_vc4_crtc_state->assigned_channel != VC4_HVS_CHANNEL_DISABLED)
+		/* Muxing will need to be modified, mark it as such */
+		new_vc4_crtc_state->update_muxing = true;
+
+		/* If we're disabling our CRTC, we put back our channel */
+		if (!new_crtc_state->enable) {
+			hvs_new_state->unassigned_channels |= BIT(old_vc4_crtc_state->assigned_channel);
+			new_vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED;
 			continue;
+		}
 
 		/*
 		 * The problem we have to solve here is that we have
commit f2df84e096a8254ddb18c531b185fc2a45879077
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Fri Nov 20 15:42:44 2020 +0100

    drm/vc4: kms: Store the unassigned channel list in the state
    
    If a CRTC is enabled but not active, and that we're then doing a page
    flip on another CRTC, drm_atomic_get_crtc_state will bring the first
    CRTC state into the global state, and will make us wait for its vblank
    as well, even though that might never occur.
    
    Instead of creating the list of the free channels each time atomic_check
    is called, and calling drm_atomic_get_crtc_state to retrieve the
    allocated channels, let's create a private state object in the main
    atomic state, and use it to store the available channels.
    
    Since vc4 has a semaphore (with a value of 1, so a lock) in its commit
    implementation to serialize all the commits, even the nonblocking ones, we
    are free from the use-after-free race if two subsequent commits are not ran
    in their submission order.
    
    Fixes: 87ebcd42fb7b ("drm/vc4: crtc: Assign output to channel automatically")
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120144245.398711-2-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 19b75bebd35f..fcfeef0949af 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -219,6 +219,7 @@ struct vc4_dev {
 
 	struct drm_modeset_lock ctm_state_lock;
 	struct drm_private_obj ctm_manager;
+	struct drm_private_obj hvs_channels;
 	struct drm_private_obj load_tracker;
 
 	/* List of vc4_debugfs_info_entry for adding to debugfs once
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 0f44fc526fd2..0bbd7b554275 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -37,6 +37,17 @@ static struct vc4_ctm_state *to_vc4_ctm_state(struct drm_private_state *priv)
 	return container_of(priv, struct vc4_ctm_state, base);
 }
 
+struct vc4_hvs_state {
+	struct drm_private_state base;
+	unsigned int unassigned_channels;
+};
+
+static struct vc4_hvs_state *
+to_vc4_hvs_state(struct drm_private_state *priv)
+{
+	return container_of(priv, struct vc4_hvs_state, base);
+}
+
 struct vc4_load_tracker_state {
 	struct drm_private_state base;
 	u64 hvs_load;
@@ -171,6 +182,19 @@ vc4_ctm_commit(struct vc4_dev *vc4, struct drm_atomic_state *state)
 		  VC4_SET_FIELD(ctm_state->fifo, SCALER_OLEDOFFS_DISPFIFO));
 }
 
+static struct vc4_hvs_state *
+vc4_hvs_get_global_state(struct drm_atomic_state *state)
+{
+	struct vc4_dev *vc4 = to_vc4_dev(state->dev);
+	struct drm_private_state *priv_state;
+
+	priv_state = drm_atomic_get_private_obj_state(state, &vc4->hvs_channels);
+	if (IS_ERR(priv_state))
+		return ERR_CAST(priv_state);
+
+	return to_vc4_hvs_state(priv_state);
+}
+
 static void vc4_hvs_pv_muxing_commit(struct vc4_dev *vc4,
 				     struct drm_atomic_state *state)
 {
@@ -662,6 +686,59 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
 }
 
+static struct drm_private_state *
+vc4_hvs_channels_duplicate_state(struct drm_private_obj *obj)
+{
+	struct vc4_hvs_state *old_state = to_vc4_hvs_state(obj->state);
+	struct vc4_hvs_state *state;
+
+	state = kzalloc(sizeof(*state), GFP_KERNEL);
+	if (!state)
+		return NULL;
+
+	__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
+
+	state->unassigned_channels = old_state->unassigned_channels;
+
+	return &state->base;
+}
+
+static void vc4_hvs_channels_destroy_state(struct drm_private_obj *obj,
+					   struct drm_private_state *state)
+{
+	struct vc4_hvs_state *hvs_state = to_vc4_hvs_state(state);
+
+	kfree(hvs_state);
+}
+
+static const struct drm_private_state_funcs vc4_hvs_state_funcs = {
+	.atomic_duplicate_state = vc4_hvs_channels_duplicate_state,
+	.atomic_destroy_state = vc4_hvs_channels_destroy_state,
+};
+
+static void vc4_hvs_channels_obj_fini(struct drm_device *dev, void *unused)
+{
+	struct vc4_dev *vc4 = to_vc4_dev(dev);
+
+	drm_atomic_private_obj_fini(&vc4->hvs_channels);
+}
+
+static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
+{
+	struct vc4_hvs_state *state;
+
+	state = kzalloc(sizeof(*state), GFP_KERNEL);
+	if (!state)
+		return -ENOMEM;
+
+	state->unassigned_channels = GENMASK(HVS_NUM_CHANNELS - 1, 0);
+	drm_atomic_private_obj_init(&vc4->base, &vc4->hvs_channels,
+				    &state->base,
+				    &vc4_hvs_state_funcs);
+
+	return drmm_add_action_or_reset(&vc4->base, vc4_hvs_channels_obj_fini, NULL);
+}
+
 /*
  * The BCM2711 HVS has up to 7 outputs connected to the pixelvalves and
  * the TXP (and therefore all the CRTCs found on that platform).
@@ -678,6 +755,14 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
  *   need to consider all the running CRTCs in the DRM device to assign
  *   a FIFO, not just the one in the state.
  *
+ * - To fix the above, we can't use drm_atomic_get_crtc_state on all
+ *   enabled CRTCs to pull their CRTC state into the global state, since
+ *   a page flip would start considering their vblank to complete. Since
+ *   we don't have a guarantee that they are actually active, that
+ *   vblank might never happen, and shouldn't even be considered if we
+ *   want to do a page flip on a single CRTC. That can be tested by
+ *   doing a modetest -v first on HDMI1 and then on HDMI0.
+ *
  * - Since we need the pixelvalve to be disabled and enabled back when
  *   the FIFO is changed, we should keep the FIFO assigned for as long
  *   as the CRTC is enabled, only considering it free again once that
@@ -687,46 +772,33 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 				      struct drm_atomic_state *state)
 {
-	unsigned long unassigned_channels = GENMASK(HVS_NUM_CHANNELS - 1, 0);
+	struct vc4_hvs_state *hvs_new_state;
 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 	struct drm_crtc *crtc;
 	unsigned int i;
 
-	/*
-	 * Since the HVS FIFOs are shared across all the pixelvalves and
-	 * the TXP (and thus all the CRTCs), we need to pull the current
-	 * state of all the enabled CRTCs so that an update to a single
-	 * CRTC still keeps the previous FIFOs enabled and assigned to
-	 * the same CRTCs, instead of evaluating only the CRTC being
-	 * modified.
-	 */
-	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-		struct drm_crtc_state *crtc_state;
-
-		if (!crtc->state->enable)
-			continue;
-
-		crtc_state = drm_atomic_get_crtc_state(state, crtc);
-		if (IS_ERR(crtc_state))
-			return PTR_ERR(crtc_state);
-	}
+	hvs_new_state = vc4_hvs_get_global_state(state);
+	if (!hvs_new_state)
+		return -EINVAL;
 
 	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
+		struct vc4_crtc_state *old_vc4_crtc_state =
+			to_vc4_crtc_state(old_crtc_state);
 		struct vc4_crtc_state *new_vc4_crtc_state =
 			to_vc4_crtc_state(new_crtc_state);
 		struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
 		unsigned int matching_channels;
 
-		if (old_crtc_state->enable && !new_crtc_state->enable)
+		if (old_crtc_state->enable && !new_crtc_state->enable) {
+			hvs_new_state->unassigned_channels |= BIT(old_vc4_crtc_state->assigned_channel);
 			new_vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED;
+		}
 
 		if (!new_crtc_state->enable)
 			continue;
 
-		if (new_vc4_crtc_state->assigned_channel != VC4_HVS_CHANNEL_DISABLED) {
-			unassigned_channels &= ~BIT(new_vc4_crtc_state->assigned_channel);
+		if (new_vc4_crtc_state->assigned_channel != VC4_HVS_CHANNEL_DISABLED)
 			continue;
-		}
 
 		/*
 		 * The problem we have to solve here is that we have
@@ -752,12 +824,12 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 		 * the future, we will need to have something smarter,
 		 * but it works so far.
 		 */
-		matching_channels = unassigned_channels & vc4_crtc->data->hvs_available_channels;
+		matching_channels = hvs_new_state->unassigned_channels & vc4_crtc->data->hvs_available_channels;
 		if (matching_channels) {
 			unsigned int channel = ffs(matching_channels) - 1;
 
 			new_vc4_crtc_state->assigned_channel = channel;
-			unassigned_channels &= ~BIT(channel);
+			hvs_new_state->unassigned_channels &= ~BIT(channel);
 		} else {
 			return -EINVAL;
 		}
@@ -841,6 +913,10 @@ int vc4_kms_load(struct drm_device *dev)
 	if (ret)
 		return ret;
 
+	ret = vc4_hvs_channels_obj_init(vc4);
+	if (ret)
+		return ret;
+
 	drm_mode_config_reset(dev);
 
 	drm_kms_helper_poll_init(dev);
commit ef3f0caf243075ac255b69054cbf48b65eadb0d4
Merge: 09162bc32c88 017496af28e2
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Mon Nov 23 17:35:57 2020 +0100

    Merge tag 'icc-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc into char-misc-linus
    
    Georgi writes:
    
    interconnect fixes for v5.10
    
    This contains a few driver fixes and one core fix:
    - Fix an excessive of_node_put() in the core.
    - Fix boot regression and integer overflow on msm8974 platforms.
    - Fix a minor issue on qcs404 and msm8916 platforms.
    
    Signed-off-by: Georgi Djakov <georgi.djakov at linaro.org>
    
    * tag 'icc-5.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc:
      interconnect: fix memory trashing in of_count_icc_providers()
      interconnect: qcom: qcs404: Remove GPU and display RPM IDs
      interconnect: qcom: msm8916: Remove rpm-ids from non-RPM nodes
      interconnect: qcom: msm8974: Don't boost the NoC rate during boot
      interconnect: qcom: msm8974: Prevent integer overflow in rate

commit 4765df4d3a132764077a83ed0df4ee4cc7866fbb
Merge: c464e26f2375 7327c8b98e2e
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Nov 23 17:30:24 2020 +0100

    Merge tag 'v5.10-rockchip-dtsfixes1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into arm/fixes
    
    Fixed ordering for MMC devices on rk3399, due to a mmc change jumbling
    all ordering, a fix to make the Odroig Go Advance actually power down
    and using the correct clock name on the NanoPi R2S.
    
    * tag 'v5.10-rockchip-dtsfixes1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip:
      arm64: dts: rockchip: Reorder LED triggers from mmc devices on rk3399-roc-pc.
      arm64: dts: rockchip: Assign a fixed index to mmc devices on rk3399 boards.
      arm64: dts: rockchip: Remove system-power-controller from pmic on Odroid Go Advance
      arm64: dts: rockchip: fix NanoPi R2S GMAC clock name
    
    Link: https://lore.kernel.org/r/11641389.O9o76ZdvQC@phil
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit ff1712f953e27f0b0718762ec17d0adb15c9fd0b
Author: Will Deacon <will at kernel.org>
Date:   Fri Nov 20 13:57:48 2020 +0000

    arm64: pgtable: Ensure dirty bit is preserved across pte_wrprotect()
    
    With hardware dirty bit management, calling pte_wrprotect() on a writable,
    dirty PTE will lose the dirty state and return a read-only, clean entry.
    
    Move the logic from ptep_set_wrprotect() into pte_wrprotect() to ensure that
    the dirty bit is preserved for writable entries, as this is required for
    soft-dirty bit management if we enable it in the future.
    
    Cc: <stable at vger.kernel.org>
    Fixes: 2f4b829c625e ("arm64: Add support for hardware updates of the access and dirty pte bits")
    Reviewed-by: Catalin Marinas <catalin.marinas at arm.com>
    Link: https://lore.kernel.org/r/20201120143557.6715-3-will@kernel.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index 326c34677e86..5628289b9d5e 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -165,13 +165,6 @@ static inline pmd_t set_pmd_bit(pmd_t pmd, pgprot_t prot)
 	return pmd;
 }
 
-static inline pte_t pte_wrprotect(pte_t pte)
-{
-	pte = clear_pte_bit(pte, __pgprot(PTE_WRITE));
-	pte = set_pte_bit(pte, __pgprot(PTE_RDONLY));
-	return pte;
-}
-
 static inline pte_t pte_mkwrite(pte_t pte)
 {
 	pte = set_pte_bit(pte, __pgprot(PTE_WRITE));
@@ -197,6 +190,20 @@ static inline pte_t pte_mkdirty(pte_t pte)
 	return pte;
 }
 
+static inline pte_t pte_wrprotect(pte_t pte)
+{
+	/*
+	 * If hardware-dirty (PTE_WRITE/DBM bit set and PTE_RDONLY
+	 * clear), set the PTE_DIRTY bit.
+	 */
+	if (pte_hw_dirty(pte))
+		pte = pte_mkdirty(pte);
+
+	pte = clear_pte_bit(pte, __pgprot(PTE_WRITE));
+	pte = set_pte_bit(pte, __pgprot(PTE_RDONLY));
+	return pte;
+}
+
 static inline pte_t pte_mkold(pte_t pte)
 {
 	return clear_pte_bit(pte, __pgprot(PTE_AF));
@@ -846,12 +853,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres
 	pte = READ_ONCE(*ptep);
 	do {
 		old_pte = pte;
-		/*
-		 * If hardware-dirty (PTE_WRITE/DBM bit set and PTE_RDONLY
-		 * clear), set the PTE_DIRTY bit.
-		 */
-		if (pte_hw_dirty(pte))
-			pte = pte_mkdirty(pte);
 		pte = pte_wrprotect(pte);
 		pte_val(pte) = cmpxchg_relaxed(&pte_val(*ptep),
 					       pte_val(old_pte), pte_val(pte));
commit 07509e10dcc77627f8b6a57381e878fe269958d3
Author: Will Deacon <will at kernel.org>
Date:   Fri Nov 20 13:28:01 2020 +0000

    arm64: pgtable: Fix pte_accessible()
    
    pte_accessible() is used by ptep_clear_flush() to figure out whether TLB
    invalidation is necessary when unmapping pages for reclaim. Although our
    implementation is correct according to the architecture, returning true
    only for valid, young ptes in the absence of racing page-table
    modifications, this is in fact flawed due to lazy invalidation of old
    ptes in ptep_clear_flush_young() where we elide the expensive DSB
    instruction for completing the TLB invalidation.
    
    Rather than penalise the aging path, adjust pte_accessible() to return
    true for any valid pte, even if the access flag is cleared.
    
    Cc: <stable at vger.kernel.org>
    Fixes: 76c714be0e5e ("arm64: pgtable: implement pte_accessible()")
    Reported-by: Yu Zhao <yuzhao at google.com>
    Acked-by: Yu Zhao <yuzhao at google.com>
    Reviewed-by: Minchan Kim <minchan at kernel.org>
    Reviewed-by: Catalin Marinas <catalin.marinas at arm.com>
    Link: https://lore.kernel.org/r/20201120143557.6715-2-will@kernel.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index 4ff12a7adcfd..326c34677e86 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -115,8 +115,6 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
 #define pte_valid(pte)		(!!(pte_val(pte) & PTE_VALID))
 #define pte_valid_not_user(pte) \
 	((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
-#define pte_valid_young(pte) \
-	((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))
 #define pte_valid_user(pte) \
 	((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
 
@@ -124,9 +122,12 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
  * Could the pte be present in the TLB? We must check mm_tlb_flush_pending
  * so that we don't erroneously return false for pages that have been
  * remapped as PROT_NONE but are yet to be flushed from the TLB.
+ * Note that we can't make any assumptions based on the state of the access
+ * flag, since ptep_clear_flush_young() elides a DSB when invalidating the
+ * TLB.
  */
 #define pte_accessible(mm, pte)	\
-	(mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid_young(pte))
+	(mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid(pte))
 
 /*
  * p??_access_permitted() is true for valid user mappings (subject to the
commit 77c38c8cf52ef715bfc5cab3d14222d4f3e776e2
Author: Shameer Kolothum <shameerali.kolothum.thodi at huawei.com>
Date:   Thu Nov 19 16:58:46 2020 +0000

    iommu: Check return of __iommu_attach_device()
    
    Currently iommu_create_device_direct_mappings() is called
    without checking the return of __iommu_attach_device(). This
    may result in failures in iommu driver if dev attach returns
    error.
    
    Fixes: ce574c27ae27 ("iommu: Move iommu_group_create_direct_mappings() out of iommu_group_add_device()")
    Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi at huawei.com>
    Link: https://lore.kernel.org/r/20201119165846.34180-1-shameerali.kolothum.thodi@huawei.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index b53446bb8c6b..0f4dc25d46c9 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -264,16 +264,18 @@ int iommu_probe_device(struct device *dev)
 	 */
 	iommu_alloc_default_domain(group, dev);
 
-	if (group->default_domain)
+	if (group->default_domain) {
 		ret = __iommu_attach_device(group->default_domain, dev);
+		if (ret) {
+			iommu_group_put(group);
+			goto err_release;
+		}
+	}
 
 	iommu_create_device_direct_mappings(group, dev);
 
 	iommu_group_put(group);
 
-	if (ret)
-		goto err_release;
-
 	if (ops->probe_finalize)
 		ops->probe_finalize(dev);
 
commit 72b55c96f3a5ae6e486c20b5dacf5114060ed042
Author: John Stultz <john.stultz at linaro.org>
Date:   Thu Nov 12 22:05:19 2020 +0000

    arm-smmu-qcom: Ensure the qcom_scm driver has finished probing
    
    Robin Murphy pointed out that if the arm-smmu driver probes before
    the qcom_scm driver, we may call qcom_scm_qsmmu500_wait_safe_toggle()
    before the __scm is initialized.
    
    Now, getting this to happen is a bit contrived, as in my efforts it
    required enabling asynchronous probing for both drivers, moving the
    firmware dts node to the end of the dtsi file, as well as forcing a
    long delay in the qcom_scm_probe function.
    
    With those tweaks we ran into the following crash:
    [    2.631040] arm-smmu 15000000.iommu:         Stage-1: 48-bit VA -> 48-bit IPA
    [    2.633372] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
    ...
    [    2.633402] [0000000000000000] user address but active_mm is swapper
    [    2.633409] Internal error: Oops: 96000005 [#1] PREEMPT SMP
    [    2.633415] Modules linked in:
    [    2.633427] CPU: 5 PID: 117 Comm: kworker/u16:2 Tainted: G        W         5.10.0-rc1-mainline-00025-g272a618fc36-dirty #3971
    [    2.633430] Hardware name: Thundercomm Dragonboard 845c (DT)
    [    2.633448] Workqueue: events_unbound async_run_entry_fn
    [    2.633456] pstate: 80c00005 (Nzcv daif +PAN +UAO -TCO BTYPE=--)
    [    2.633465] pc : qcom_scm_qsmmu500_wait_safe_toggle+0x78/0xb0
    [    2.633473] lr : qcom_smmu500_reset+0x58/0x78
    [    2.633476] sp : ffffffc0105a3b60
    ...
    [    2.633567] Call trace:
    [    2.633572]  qcom_scm_qsmmu500_wait_safe_toggle+0x78/0xb0
    [    2.633576]  qcom_smmu500_reset+0x58/0x78
    [    2.633581]  arm_smmu_device_reset+0x194/0x270
    [    2.633585]  arm_smmu_device_probe+0xc94/0xeb8
    [    2.633592]  platform_drv_probe+0x58/0xa8
    [    2.633597]  really_probe+0xec/0x398
    [    2.633601]  driver_probe_device+0x5c/0xb8
    [    2.633606]  __driver_attach_async_helper+0x64/0x88
    [    2.633610]  async_run_entry_fn+0x4c/0x118
    [    2.633617]  process_one_work+0x20c/0x4b0
    [    2.633621]  worker_thread+0x48/0x460
    [    2.633628]  kthread+0x14c/0x158
    [    2.633634]  ret_from_fork+0x10/0x18
    [    2.633642] Code: a9034fa0 d0007f73 29107fa0 91342273 (f9400020)
    
    To avoid this, this patch adds a check on qcom_scm_is_available() in
    the qcom_smmu_impl_init() function, returning -EPROBE_DEFER if its
    not ready.
    
    This allows the driver to try to probe again later after qcom_scm has
    finished probing.
    
    Reported-by: Robin Murphy <robin.murphy at arm.com>
    Signed-off-by: John Stultz <john.stultz at linaro.org>
    Reviewed-by: Robin Murphy <robin.murphy at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Cc: Andy Gross <agross at kernel.org>
    Cc: Maulik Shah <mkshah at codeaurora.org>
    Cc: Bjorn Andersson <bjorn.andersson at linaro.org>
    Cc: Saravana Kannan <saravanak at google.com>
    Cc: Marc Zyngier <maz at kernel.org>
    Cc: Lina Iyer <ilina at codeaurora.org>
    Cc: iommu at lists.linux-foundation.org
    Cc: linux-arm-msm <linux-arm-msm at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201112220520.48159-1-john.stultz@linaro.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
index be4318044f96..702fbaa6c9ad 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
@@ -69,6 +69,10 @@ struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
 {
 	struct qcom_smmu *qsmmu;
 
+	/* Check to make sure qcom_scm has finished probing */
+	if (!qcom_scm_is_available())
+		return ERR_PTR(-EPROBE_DEFER);
+
 	qsmmu = devm_kzalloc(smmu->dev, sizeof(*qsmmu), GFP_KERNEL);
 	if (!qsmmu)
 		return ERR_PTR(-ENOMEM);
commit 71d80563b0760a411cd90a3680536f5d887fff6b
Author: Ran Wang <ran.wang_1 at nxp.com>
Date:   Mon Nov 23 10:57:15 2020 +0800

    spi: spi-nxp-fspi: fix fspi panic by unexpected interrupts
    
    Given the case that bootloader(such as UEFI)'s FSPI driver might not
    handle all interrupts before loading kernel, those legacy interrupts
    would assert immidiately once kernel's FSPI driver enable them. Further,
    if it was FSPI_INTR_IPCMDDONE, the irq handler nxp_fspi_irq_handler()
    would call complete(&f->c) to notify others. However, f->c might not be
    initialized yet at that time, then cause kernel panic.
    
    Of cause, we should fix this issue within bootloader. But it would be
    better to have this pacth to make dirver more robust (by clearing all
    interrupt status bits before enabling interrupts).
    
    Suggested-by: Han Xu <han.xu at nxp.com>
    Signed-off-by: Ran Wang <ran.wang_1 at nxp.com>
    Link: https://lore.kernel.org/r/20201123025715.14635-1-ran.wang_1@nxp.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
index 0d41406c036d..ab9035662717 100644
--- a/drivers/spi/spi-nxp-fspi.c
+++ b/drivers/spi/spi-nxp-fspi.c
@@ -1001,6 +1001,7 @@ static int nxp_fspi_probe(struct platform_device *pdev)
 	struct resource *res;
 	struct nxp_fspi *f;
 	int ret;
+	u32 reg;
 
 	ctlr = spi_alloc_master(&pdev->dev, sizeof(*f));
 	if (!ctlr)
@@ -1032,6 +1033,12 @@ static int nxp_fspi_probe(struct platform_device *pdev)
 		goto err_put_ctrl;
 	}
 
+	/* Clear potential interrupts */
+	reg = fspi_readl(f, f->iobase + FSPI_INTR);
+	if (reg)
+		fspi_writel(f, reg, f->iobase + FSPI_INTR);
+
+
 	/* find the resources - controller memory mapped space */
 	if (is_acpi_node(f->dev->fwnode))
 		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
commit c0a2074ac575fff2848c8ef804bdc8590466c36c
Author: Wenbin Mei <wenbin.mei at mediatek.com>
Date:   Wed Nov 18 14:34:05 2020 +0800

    mmc: mediatek: Fix system suspend/resume support for CQHCI
    
    Before we got these errors on MT8192 platform:
    [   59.153891] Restarting tasks ...
    [   59.154540] done.
    [   59.159175] PM: suspend exit
    [   59.218724] mtk-msdc 11f60000.mmc: phase: [map:fffffffe] [maxlen:31]
    [final:16]
    [  119.776083] mmc0: cqhci: timeout for tag 9
    [  119.780196] mmc0: cqhci: ============ CQHCI REGISTER DUMP ===========
    [  119.786709] mmc0: cqhci: Caps:      0x100020b6 | Version:  0x00000510
    [  119.793225] mmc0: cqhci: Config:    0x00000101 | Control:  0x00000000
    [  119.799706] mmc0: cqhci: Int stat:  0x00000000 | Int enab: 0x00000000
    [  119.806177] mmc0: cqhci: Int sig:   0x00000000 | Int Coal: 0x00000000
    [  119.812670] mmc0: cqhci: TDL base:  0x00000000 | TDL up32: 0x00000000
    [  119.819149] mmc0: cqhci: Doorbell:  0x003ffc00 | TCN:      0x00000200
    [  119.825656] mmc0: cqhci: Dev queue: 0x00000000 | Dev Pend: 0x00000000
    [  119.832155] mmc0: cqhci: Task clr:  0x00000000 | SSC1:     0x00001000
    [  119.838627] mmc0: cqhci: SSC2:      0x00000000 | DCMD rsp: 0x00000000
    [  119.845174] mmc0: cqhci: RED mask:  0xfdf9a080 | TERRI:    0x0000891c
    [  119.851654] mmc0: cqhci: Resp idx:  0x00000000 | Resp arg: 0x00000000
    [  119.865773] mmc0: cqhci: : ===========================================
    [  119.872358] mmc0: running CQE recovery
    From these logs, we found TDL base was back to the default value.
    
    After suspend, the mmc host is powered off by HW, and bring CQE register
    to the default value, so we add system suspend/resume interface, then bring
    CQE to deactivated state before suspend, it will be enabled by CQE first
    request after resume.
    
    Signed-off-by: Wenbin Mei <wenbin.mei at mediatek.com>
    Link: https://lore.kernel.org/r/20201118063405.24906-1-wenbin.mei@mediatek.com
    Fixes: 88bd652b3c74 ("mmc: mediatek: command queue support")
    Cc: stable at vger.kernel.org
    [Ulf: Renamed functions]
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index a704745e5882..b40ec966288e 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2681,11 +2681,29 @@ static int msdc_runtime_resume(struct device *dev)
 	msdc_restore_reg(host);
 	return 0;
 }
+
+static int msdc_suspend(struct device *dev)
+{
+	struct mmc_host *mmc = dev_get_drvdata(dev);
+	int ret;
+
+	if (mmc->caps2 & MMC_CAP2_CQE) {
+		ret = cqhci_suspend(mmc);
+		if (ret)
+			return ret;
+	}
+
+	return pm_runtime_force_suspend(dev);
+}
+
+static int msdc_resume(struct device *dev)
+{
+	return pm_runtime_force_resume(dev);
+}
 #endif
 
 static const struct dev_pm_ops msdc_dev_pm_ops = {
-	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
-				pm_runtime_force_resume)
+	SET_SYSTEM_SLEEP_PM_OPS(msdc_suspend, msdc_resume)
 	SET_RUNTIME_PM_OPS(msdc_runtime_suspend, msdc_runtime_resume, NULL)
 };
 
commit 6d39bdee238f9799718653a9d4d61ebf2922e23d
Author: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
Date:   Thu Nov 5 14:58:32 2020 +0000

    iommu/amd: Enforce 4k mapping for certain IOMMU data structures
    
    AMD IOMMU requires 4k-aligned pages for the event log, the PPR log,
    and the completion wait write-back regions. However, when allocating
    the pages, they could be part of large mapping (e.g. 2M) page.
    This causes #PF due to the SNP RMP hardware enforces the check based
    on the page level for these data structures.
    
    So, fix by calling set_memory_4k() on the allocated pages.
    
    Fixes: c69d89aff393 ("iommu/amd: Use 4K page for completion wait write-back semaphore")
    Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
    Cc: Brijesh Singh <brijesh.singh at amd.com>
    Link: https://lore.kernel.org/r/20201105145832.3065-1-suravee.suthikulpanit@amd.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 82e4af8f09bb..23a790f8f550 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -29,6 +29,7 @@
 #include <asm/iommu_table.h>
 #include <asm/io_apic.h>
 #include <asm/irq_remapping.h>
+#include <asm/set_memory.h>
 
 #include <linux/crash_dump.h>
 
@@ -672,11 +673,27 @@ static void __init free_command_buffer(struct amd_iommu *iommu)
 	free_pages((unsigned long)iommu->cmd_buf, get_order(CMD_BUFFER_SIZE));
 }
 
+static void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu,
+					 gfp_t gfp, size_t size)
+{
+	int order = get_order(size);
+	void *buf = (void *)__get_free_pages(gfp, order);
+
+	if (buf &&
+	    iommu_feature(iommu, FEATURE_SNP) &&
+	    set_memory_4k((unsigned long)buf, (1 << order))) {
+		free_pages((unsigned long)buf, order);
+		buf = NULL;
+	}
+
+	return buf;
+}
+
 /* allocates the memory where the IOMMU will log its events to */
 static int __init alloc_event_buffer(struct amd_iommu *iommu)
 {
-	iommu->evt_buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
-						  get_order(EVT_BUFFER_SIZE));
+	iommu->evt_buf = iommu_alloc_4k_pages(iommu, GFP_KERNEL | __GFP_ZERO,
+					      EVT_BUFFER_SIZE);
 
 	return iommu->evt_buf ? 0 : -ENOMEM;
 }
@@ -715,8 +732,8 @@ static void __init free_event_buffer(struct amd_iommu *iommu)
 /* allocates the memory where the IOMMU will log its events to */
 static int __init alloc_ppr_log(struct amd_iommu *iommu)
 {
-	iommu->ppr_log = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
-						  get_order(PPR_LOG_SIZE));
+	iommu->ppr_log = iommu_alloc_4k_pages(iommu, GFP_KERNEL | __GFP_ZERO,
+					      PPR_LOG_SIZE);
 
 	return iommu->ppr_log ? 0 : -ENOMEM;
 }
@@ -838,7 +855,7 @@ static int iommu_init_ga(struct amd_iommu *iommu)
 
 static int __init alloc_cwwb_sem(struct amd_iommu *iommu)
 {
-	iommu->cmd_sem = (void *)get_zeroed_page(GFP_KERNEL);
+	iommu->cmd_sem = iommu_alloc_4k_pages(iommu, GFP_KERNEL | __GFP_ZERO, 1);
 
 	return iommu->cmd_sem ? 0 : -ENOMEM;
 }
commit 178648916e73e00de83150eb0c90c0d3a977a46a
Author: Marek Majtyka <marekx.majtyka at intel.com>
Date:   Fri Nov 20 16:14:43 2020 +0100

    xsk: Fix incorrect netdev reference count
    
    Fix incorrect netdev reference count in xsk_bind operation. Incorrect
    reference count of the device appears when a user calls bind with the
    XDP_ZEROCOPY flag on an interface which does not support zero-copy.
    In such a case, an error is returned but the reference count is not
    decreased. This change fixes the fault, by decreasing the reference count
    in case of such an error.
    
    The problem being corrected appeared in '162c820ed896' for the first time,
    and the code was moved to new file location over the time with commit
    'c2d3d6a47462'. This specific patch applies to all version starting
    from 'c2d3d6a47462'. The same solution should be applied but on different
    file (net/xdp/xdp_umem.c) and function (xdp_umem_assign_dev) for versions
    from '162c820ed896' to 'c2d3d6a47462' excluded.
    
    Fixes: 162c820ed896 ("xdp: hold device for umem regardless of zero-copy mode")
    Signed-off-by: Marek Majtyka <marekx.majtyka at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Link: https://lore.kernel.org/bpf/20201120151443.105903-1-marekx.majtyka@intel.com

diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c
index 3c5a1423d922..9287eddec52c 100644
--- a/net/xdp/xsk_buff_pool.c
+++ b/net/xdp/xsk_buff_pool.c
@@ -185,8 +185,10 @@ err_unreg_xsk:
 err_unreg_pool:
 	if (!force_zc)
 		err = 0; /* fallback to copy mode */
-	if (err)
+	if (err) {
 		xsk_clear_pool_at_qid(netdev, queue_id);
+		dev_put(netdev);
+	}
 	return err;
 }
 
commit 05b8955f43536c3e1e73edc39639aac9ae32edd8
Merge: 418baf2c28f3 f943849f7206
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Mon Nov 23 12:55:01 2020 +0100

    Merge branch 'cpufreq/arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm
    
    Pull SCMI cpufreq driver fix for 5.10-rc6 from Viresh Kumar:
    
    "This fixes a build issues with SCMI cpufreq driver in the
     !CONFIG_COMMON_CLK case."
    
    * 'cpufreq/arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
      cpufreq: scmi: Fix build for !CONFIG_COMMON_CLK

commit 774c4a3b5e5fd897909e24c0f7dd4c6579da833f
Author: Shiju Jose <shiju.jose at huawei.com>
Date:   Wed Oct 14 10:31:39 2020 +0100

    ACPI/IORT: Fix doc warnings in iort.c
    
    Fix following warnings caused by mismatch between
    function parameters and function comments.
    
    drivers/acpi/arm64/iort.c:55: warning: Function parameter or member 'iort_node' not described in 'iort_set_fwnode'
    drivers/acpi/arm64/iort.c:55: warning: Excess function parameter 'node' description in 'iort_set_fwnode'
    drivers/acpi/arm64/iort.c:682: warning: Function parameter or member 'id' not described in 'iort_get_device_domain'
    drivers/acpi/arm64/iort.c:682: warning: Function parameter or member 'bus_token' not described in 'iort_get_device_domain'
    drivers/acpi/arm64/iort.c:682: warning: Excess function parameter 'req_id' description in 'iort_get_device_domain'
    drivers/acpi/arm64/iort.c:1142: warning: Function parameter or member 'dma_size' not described in 'iort_dma_setup'
    drivers/acpi/arm64/iort.c:1142: warning: Excess function parameter 'size' description in 'iort_dma_setup'
    drivers/acpi/arm64/iort.c:1534: warning: Function parameter or member 'ops' not described in 'iort_add_platform_device'
    
    Signed-off-by: Shiju Jose <shiju.jose at huawei.com>
    Acked-by: Hanjun Guo <guohanjun at huawei.com>
    Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
    Link: https://lore.kernel.org/r/20201014093139.1580-1-shiju.jose@huawei.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 9929ff50c0c0..770d84071a32 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -44,7 +44,7 @@ static DEFINE_SPINLOCK(iort_fwnode_lock);
  * iort_set_fwnode() - Create iort_fwnode and use it to register
  *		       iommu data in the iort_fwnode_list
  *
- * @node: IORT table node associated with the IOMMU
+ * @iort_node: IORT table node associated with the IOMMU
  * @fwnode: fwnode associated with the IORT node
  *
  * Returns: 0 on success
@@ -673,7 +673,8 @@ static int iort_dev_find_its_id(struct device *dev, u32 id,
 /**
  * iort_get_device_domain() - Find MSI domain related to a device
  * @dev: The device.
- * @req_id: Requester ID for the device.
+ * @id: Requester ID for the device.
+ * @bus_token: irq domain bus token.
  *
  * Returns: the MSI domain for this device, NULL otherwise
  */
@@ -1136,7 +1137,7 @@ static int rc_dma_get_range(struct device *dev, u64 *size)
  *
  * @dev: device to configure
  * @dma_addr: device DMA address result pointer
- * @size: DMA range size result pointer
+ * @dma_size: DMA range size result pointer
  */
 void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size)
 {
@@ -1526,6 +1527,7 @@ static __init const struct iort_dev_config *iort_get_dev_cfg(
 /**
  * iort_add_platform_device() - Allocate a platform device for IORT node
  * @node: Pointer to device ACPI IORT node
+ * @ops: Pointer to IORT device config struct
  *
  * Returns: 0 on success, <0 failure
  */
commit 03659efe4287230b1d65b31c993708f335c8de82
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Sun Nov 22 20:45:10 2020 -0800

    arm64/fpsimd: add <asm/insn.h> to <asm/kprobes.h> to fix fpsimd build
    
    Adding <asm/exception.h> brought in <asm/kprobes.h> which uses
    <asm/probes.h>, which uses 'pstate_check_t' so the latter needs to
    #include <asm/insn.h> for this typedef.
    
    Fixes this build error:
    
      In file included from arch/arm64/include/asm/kprobes.h:24,
                        from arch/arm64/include/asm/exception.h:11,
                        from arch/arm64/kernel/fpsimd.c:35:
      arch/arm64/include/asm/probes.h:16:2: error: unknown type name 'pstate_check_t'
          16 |  pstate_check_t *pstate_cc;
    
    Fixes: c6b90d5cf637 ("arm64/fpsimd: Fix missing-prototypes in fpsimd.c")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: Will Deacon <will at kernel.org>
    Cc: Tian Tao <tiantao6 at hisilicon.com>
    Link: https://lore.kernel.org/r/20201123044510.9942-1-rdunlap@infradead.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/probes.h b/arch/arm64/include/asm/probes.h
index 4266262101fe..006946745352 100644
--- a/arch/arm64/include/asm/probes.h
+++ b/arch/arm64/include/asm/probes.h
@@ -7,6 +7,8 @@
 #ifndef _ARM_PROBES_H
 #define _ARM_PROBES_H
 
+#include <asm/insn.h>
+
 typedef u32 probe_opcode_t;
 typedef void (probes_handler_t) (u32 opcode, long addr, struct pt_regs *);
 
commit 1179f170b6f0af7bb0b3b7628136eaac450ddf31
Author: Sven Schnelle <svens at linux.ibm.com>
Date:   Fri Nov 20 14:17:52 2020 +0100

    s390: fix fpu restore in entry.S
    
    We need to disable interrupts in load_fpu_regs(). Otherwise an
    interrupt might come in after the registers are loaded, but before
    CIF_FPU is cleared in load_fpu_regs(). When the interrupt returns,
    CIF_FPU will be cleared and the registers will never be restored.
    
    The entry.S code usually saves the interrupt state in __SF_EMPTY on the
    stack when disabling/restoring interrupts. sie64a however saves the pointer
    to the sie control block in __SF_SIE_CONTROL, which references the same
    location.  This is non-obvious to the reader. To avoid thrashing the sie
    control block pointer in load_fpu_regs(), move the __SIE_* offsets eight
    bytes after __SF_EMPTY on the stack.
    
    Cc: <stable at vger.kernel.org> # 5.8
    Fixes: 0b0ed657fe00 ("s390: remove critical section cleanup from entry.S")
    Reported-by: Pierre Morel <pmorel at linux.ibm.com>
    Signed-off-by: Sven Schnelle <svens at linux.ibm.com>
    Acked-by: Christian Borntraeger <borntraeger at de.ibm.com>
    Reviewed-by: Heiko Carstens <hca at linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c
index 2012c1cf0853..483051e10db3 100644
--- a/arch/s390/kernel/asm-offsets.c
+++ b/arch/s390/kernel/asm-offsets.c
@@ -53,11 +53,11 @@ int main(void)
 	/* stack_frame offsets */
 	OFFSET(__SF_BACKCHAIN, stack_frame, back_chain);
 	OFFSET(__SF_GPRS, stack_frame, gprs);
-	OFFSET(__SF_EMPTY, stack_frame, empty1);
-	OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[0]);
-	OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[1]);
-	OFFSET(__SF_SIE_REASON, stack_frame, empty1[2]);
-	OFFSET(__SF_SIE_FLAGS, stack_frame, empty1[3]);
+	OFFSET(__SF_EMPTY, stack_frame, empty1[0]);
+	OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[1]);
+	OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[2]);
+	OFFSET(__SF_SIE_REASON, stack_frame, empty1[3]);
+	OFFSET(__SF_SIE_FLAGS, stack_frame, empty1[4]);
 	BLANK();
 	OFFSET(__VDSO_GETCPU_VAL, vdso_per_cpu_data, getcpu_val);
 	BLANK();
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 5346545b9860..26bb0603c5a1 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -1068,6 +1068,7 @@ EXPORT_SYMBOL(save_fpu_regs)
  *	%r4
  */
 load_fpu_regs:
+	stnsm	__SF_EMPTY(%r15),0xfc
 	lg	%r4,__LC_CURRENT
 	aghi	%r4,__TASK_thread
 	TSTMSK	__LC_CPU_FLAGS,_CIF_FPU
@@ -1099,6 +1100,7 @@ load_fpu_regs:
 .Lload_fpu_regs_done:
 	ni	__LC_CPU_FLAGS+7,255-_CIF_FPU
 .Lload_fpu_regs_exit:
+	ssm	__SF_EMPTY(%r15)
 	BR_EX	%r14
 .Lload_fpu_regs_end:
 ENDPROC(load_fpu_regs)
commit b6b79dd53082db11070b4368d85dd6699ff0b063
Author: Stephen Rothwell <sfr at canb.auug.org.au>
Date:   Mon Nov 23 18:40:16 2020 +1100

    powerpc/64s: Fix allnoconfig build since uaccess flush
    
    Using DECLARE_STATIC_KEY_FALSE needs linux/jump_table.h.
    
    Otherwise the build fails with eg:
    
      arch/powerpc/include/asm/book3s/64/kup-radix.h:66:1: warning: data definition has no type or storage class
         66 | DECLARE_STATIC_KEY_FALSE(uaccess_flush_key);
    
    Fixes: 9a32a7e78bd0 ("powerpc/64s: flush L1D after user accesses")
    Signed-off-by: Stephen Rothwell <sfr at canb.auug.org.au>
    [mpe: Massage change log]
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201123184016.693fe464@canb.auug.org.au

diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h
index 28716e2f13e3..a39e2d193fdc 100644
--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h
+++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h
@@ -63,6 +63,8 @@
 
 #else /* !__ASSEMBLY__ */
 
+#include <linux/jump_label.h>
+
 DECLARE_STATIC_KEY_FALSE(uaccess_flush_key);
 
 #ifdef CONFIG_PPC_KUAP
commit 962f8e64cd18a5353c34937436dd06b992f73c0a
Merge: cd81acc600a9 da631f7fd623
Author: Michael Ellerman <mpe at ellerman.id.au>
Date:   Mon Nov 23 21:16:27 2020 +1100

    Merge tag 'powerpc-cve-2020-4788' into fixes
    
    From Daniel's cover letter:
    
    IBM Power9 processors can speculatively operate on data in the L1 cache
    before it has been completely validated, via a way-prediction mechanism. It
    is not possible for an attacker to determine the contents of impermissible
    memory using this method, since these systems implement a combination of
    hardware and software security measures to prevent scenarios where
    protected data could be leaked.
    
    However these measures don't address the scenario where an attacker induces
    the operating system to speculatively execute instructions using data that
    the attacker controls. This can be used for example to speculatively bypass
    "kernel user access prevention" techniques, as discovered by Anthony
    Steinhauser of Google's Safeside Project. This is not an attack by itself,
    but there is a possibility it could be used in conjunction with
    side-channels or other weaknesses in the privileged code to construct an
    attack.
    
    This issue can be mitigated by flushing the L1 cache between privilege
    boundaries of concern.
    
    This patch series flushes the L1 cache on kernel entry (patch 2) and after the
    kernel performs any user accesses (patch 3). It also adds a self-test and
    performs some related cleanups.

commit f943849f720689214abb3930623c31ff91990be9
Author: Sudeep Holla <sudeep.holla at arm.com>
Date:   Fri Nov 20 10:12:52 2020 +0000

    cpufreq: scmi: Fix build for !CONFIG_COMMON_CLK
    
    Commit 8410e7f3b31e ("cpufreq: scmi: Fix OPP addition failure with a
    dummy clock provider") registers a dummy clock provider using
    devm_of_clk_add_hw_provider. These *_hw_provider functions are defined
    only when CONFIG_COMMON_CLK=y. One possible fix is to add the Kconfig
    dependency, but since we plan to move away from the clock dependency
    for scmi cpufreq, it is preferrable to avoid that.
    
    Let us just conditionally compile out the offending call to
    devm_of_clk_add_hw_provider. It also uses the variable 'dev' outside
    of the #ifdef block to avoid build warning.
    
    Fixes: 8410e7f3b31e ("cpufreq: scmi: Fix OPP addition failure with a dummy clock provider")
    Cc: Rafael J. Wysocki <rjw at rjwysocki.net>
    Cc: Viresh Kumar <viresh.kumar at linaro.org>
    Signed-off-by: Sudeep Holla <sudeep.holla at arm.com>
    Signed-off-by: Viresh Kumar <viresh.kumar at linaro.org>

diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
index 78318508a6d6..8286205c7165 100644
--- a/drivers/cpufreq/scmi-cpufreq.c
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -236,13 +236,15 @@ static int scmi_cpufreq_probe(struct scmi_device *sdev)
 	if (!handle || !handle->perf_ops)
 		return -ENODEV;
 
+#ifdef CONFIG_COMMON_CLK
 	/* dummy clock provider as needed by OPP if clocks property is used */
 	if (of_find_property(dev->of_node, "#clock-cells", NULL))
 		devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL);
+#endif
 
 	ret = cpufreq_register_driver(&scmi_cpufreq_driver);
 	if (ret) {
-		dev_err(&sdev->dev, "%s: registering cpufreq failed, err: %d\n",
+		dev_err(dev, "%s: registering cpufreq failed, err: %d\n",
 			__func__, ret);
 	}
 
commit e2d3d2e904ad3d381753798dcd5cae03e3c47242
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Mon Nov 16 18:53:00 2020 +0100

    drm/exynos: depend on COMMON_CLK to fix compile tests
    
    The Exynos DRM uses Common Clock Framework thus it cannot be built on
    platforms without it (e.g. compile test on MIPS with RALINK and
    SOC_RT305X):
    
        /usr/bin/mips-linux-gnu-ld: drivers/gpu/drm/exynos/exynos_mixer.o: in function `mixer_bind':
        exynos_mixer.c:(.text+0x958): undefined reference to `clk_set_parent'
    
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Signed-off-by: Inki Dae <inki.dae at samsung.com>

diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig
index 6417f374b923..951d5f708e92 100644
--- a/drivers/gpu/drm/exynos/Kconfig
+++ b/drivers/gpu/drm/exynos/Kconfig
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config DRM_EXYNOS
 	tristate "DRM Support for Samsung SoC Exynos Series"
-	depends on OF && DRM && (ARCH_S3C64XX || ARCH_S5PV210 || ARCH_EXYNOS || ARCH_MULTIPLATFORM || COMPILE_TEST)
+	depends on OF && DRM && COMMON_CLK
+	depends on ARCH_S3C64XX || ARCH_S5PV210 || ARCH_EXYNOS || ARCH_MULTIPLATFORM || COMPILE_TEST
 	depends on MMU
 	select DRM_KMS_HELPER
 	select VIDEOMODE_HELPERS
commit 418baf2c28f3473039f2f7377760bd8f6897ae18
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 15:36:08 2020 -0800

    Linux 5.10-rc5

diff --git a/Makefile b/Makefile
index e2c3f65c4721..ed081e3eb800 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 10
 SUBLEVEL = 0
-EXTRAVERSION = -rc4
+EXTRAVERSION = -rc5
 NAME = Kleptomaniac Octopus
 
 # *DOCUMENTATION*
commit d5530d82efc8631beff20480b1168b1c44294fe1
Merge: f4b936f5d6fd b4c00e797663
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 14:36:06 2020 -0800

    Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
    
    Pull HID fixes from Jiri Kosina:
    
     - Various functionality / regression fixes for Logitech devices from
       Hans de Goede
    
     - Fix for (recently added) GPIO support in mcp2221 driver from Lars
       Povlsen
    
     - Power management handling fix/quirk in i2c-hid driver for certain
       BIOSes that have strange aproach to power-cycle from Hans de Goede
    
     - a few device ID additions and device-specific quirks
    
    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
      HID: logitech-dj: Fix Dinovo Mini when paired with a MX5x00 receiver
      HID: logitech-dj: Fix an error in mse_bluetooth_descriptor
      HID: Add Logitech Dinovo Edge battery quirk
      HID: logitech-hidpp: Add HIDPP_CONSUMER_VENDOR_KEYS quirk for the Dinovo Edge
      HID: logitech-dj: Handle quad/bluetooth keyboards with a builtin trackpad
      HID: add HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE for Gamevice devices
      HID: mcp2221: Fix GPIO output handling
      HID: hid-sensor-hub: Fix issue with devices with no report ID
      HID: i2c-hid: Put ACPI enumerated devices in D3 on shutdown
      HID: add support for Sega Saturn
      HID: cypress: Support Varmilo Keyboards' media hotkeys
      HID: ite: Replace ABS_MISC 120/121 events with touchpad on/off keypresses
      HID: logitech-hidpp: Add PID for MX Anywhere 2
      HID: uclogic: Add ID for Trust Flex Design Tablet

commit 04295bc3362d4e4259cc48128c89657735768fbc
Author: Gustavo A. R. Silva <gustavoars at kernel.org>
Date:   Fri Nov 20 12:40:38 2020 -0600

    video: fbdev: pm2fb: Fix fall-through warnings for Clang
    
    In preparation to enable -Wimplicit-fallthrough for Clang, fix a warning
    by explicitly adding a fallthrough pseudo-keyword.
    
    Link: https://github.com/KSPP/linux/issues/115
    Signed-off-by: Gustavo A. R. Silva <gustavoars at kernel.org>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/0eedb3972a0032da4997a2a47cf0665fbe9c56ca.1605896060.git.gustavoars@kernel.org

diff --git a/drivers/video/fbdev/pm2fb.c b/drivers/video/fbdev/pm2fb.c
index 0642555289e0..27893fa139b0 100644
--- a/drivers/video/fbdev/pm2fb.c
+++ b/drivers/video/fbdev/pm2fb.c
@@ -239,6 +239,7 @@ static u32 to3264(u32 timing, int bpp, int is64)
 		fallthrough;
 	case 16:
 		timing >>= 1;
+		fallthrough;
 	case 32:
 		break;
 	}
commit 2c3a1e49696fd05b52ec5eeb7c006ac32724c915
Author: Gustavo A. R. Silva <gustavoars at kernel.org>
Date:   Fri Nov 20 12:40:32 2020 -0600

    video: fbdev: lxfb_ops: Fix fall-through warnings for Clang
    
    In preparation to enable -Wimplicit-fallthrough for Clang, fix a warning
    by explicitly adding a break statement instead of letting the code fall
    through to the next case.
    
    Link: https://github.com/KSPP/linux/issues/115
    Signed-off-by: Gustavo A. R. Silva <gustavoars at kernel.org>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/9c1dcb12aae7c7ff0907ffb99ffd227656cbe444.1605896060.git.gustavoars@kernel.org

diff --git a/drivers/video/fbdev/geode/lxfb_ops.c b/drivers/video/fbdev/geode/lxfb_ops.c
index b3a041fce570..32baaf59fcf7 100644
--- a/drivers/video/fbdev/geode/lxfb_ops.c
+++ b/drivers/video/fbdev/geode/lxfb_ops.c
@@ -682,6 +682,7 @@ static void lx_restore_display_ctlr(struct lxfb_par *par)
 		case DC_DV_CTL:
 			/* set all ram to dirty */
 			write_dc(par, i, par->dc[i] | DC_DV_CTL_CLEAR_DV_RAM);
+			break;
 
 		case DC_RSVD_1:
 		case DC_RSVD_2:
commit 0b08d08ddfb6e45a319084594f586003de08351c
Author: Gustavo A. R. Silva <gustavoars at kernel.org>
Date:   Fri Nov 20 12:35:54 2020 -0600

    drm/via: Fix fall-through warnings for Clang
    
    In preparation to enable -Wimplicit-fallthrough for Clang, fix a warning
    by explicitly adding a break statement instead of letting the code fall
    through to the next case.
    
    Link: https://github.com/KSPP/linux/issues/115
    Signed-off-by: Gustavo A. R. Silva <gustavoars at kernel.org>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/c21a588bf9e222826f6b138db91de26a2b21df33.1605896060.git.gustavoars@kernel.org

diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c
index 24cc445169e2..a3e0fb5b8671 100644
--- a/drivers/gpu/drm/via/via_irq.c
+++ b/drivers/gpu/drm/via/via_irq.c
@@ -364,6 +364,7 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
 		irqwait->request.sequence +=
 			atomic_read(&cur_irq->irq_received);
 		irqwait->request.type &= ~_DRM_VBLANK_RELATIVE;
+		break;
 	case VIA_IRQ_ABSOLUTE:
 		break;
 	default:
commit 8ce9daf8856df41c7c4f217e26bf33afa554e116
Author: Gustavo A. R. Silva <gustavoars at kernel.org>
Date:   Fri Nov 20 12:35:17 2020 -0600

    drm: Fix fall-through warnings for Clang
    
    In preparation to enable -Wimplicit-fallthrough for Clang, fix a warning
    by explicitly adding a break statement instead of letting the code fall
    through to the next case.
    
    Link: https://github.com/KSPP/linux/issues/115
    Signed-off-by: Gustavo A. R. Silva <gustavoars at kernel.org>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/111e9d3d55c686892357aa5269022024b4d48330.1605896059.git.gustavoars@kernel.org

diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
index 7a01d0918861..aeb1327e3077 100644
--- a/drivers/gpu/drm/drm_bufs.c
+++ b/drivers/gpu/drm/drm_bufs.c
@@ -77,6 +77,7 @@ static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
 			if ((entry->map->offset & 0xffffffff) ==
 			    (map->offset & 0xffffffff))
 				return entry;
+			break;
 		default: /* Make gcc happy */
 			;
 		}
commit f4b936f5d6fd0625a78a7b4b92e98739a2bdb6f7
Merge: 48da33058975 2279f540ea7d
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 13:26:07 2020 -0800

    Merge tag 'sched-urgent-2020-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull scheduler fixes from Thomas Gleixner:
     "A couple of scheduler fixes:
    
       - Make the conditional update of the overutilized state work
         correctly by caching the relevant flags state before overwriting
         them and checking them afterwards.
    
       - Fix a data race in the wakeup path which caused loadavg on ARM64
         platforms to become a random number generator.
    
       - Fix the ordering of the iowaiter accounting operations so it can't
         be decremented before it is incremented.
    
       - Fix a bug in the deadline scheduler vs. priority inheritance when a
         non-deadline task A has inherited the parameters of a deadline task
         B and then blocks on a non-deadline task C.
    
         The second inheritance step used the static deadline parameters of
         task A, which are usually 0, instead of further propagating task
         B's parameters. The zero initialized parameters trigger a bug in
         the deadline scheduler"
    
    * tag 'sched-urgent-2020-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      sched/deadline: Fix priority inheritance with multiple scheduling classes
      sched: Fix rq->nr_iowait ordering
      sched: Fix data-race in wakeup
      sched/fair: Fix overutilized update in enqueue_task_fair()

commit 48da33058975f3a3084390dbef6aecd9bda7db62
Merge: 855cf1ee4726 ebd19fc372e3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 13:23:43 2020 -0800

    Merge tag 'perf-urgent-2020-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull perf fix from Thomas Gleixner:
     "A single fix for the x86 perf sysfs interfaces which used kobject
      attributes instead of device attributes and therefore making clang's
      control flow integrity checker upset"
    
    * tag 'perf-urgent-2020-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      perf/x86: fix sysfs type mismatches

commit 855cf1ee4726bfa2077b2226bff507babe1c8dff
Merge: 68d3fa235fd8 43be4388e94b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 13:19:53 2020 -0800

    Merge tag 'locking-urgent-2020-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull locking fix from Thomas Gleixner:
     "A single fix for lockdep which makes the recursion protection cover
      graph lock/unlock"
    
    * tag 'locking-urgent-2020-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      lockdep: Put graph lock/unlock under lock_recursion protection

commit 68d3fa235fd83ab0fd36c367c0530d16c764051b
Merge: 7d53be55c9d7 c2fe61d8be49
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 13:05:48 2020 -0800

    Merge tag 'efi-urgent-for-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull EFI fixes from Borislav Petkov:
     "Forwarded EFI fixes from Ard Biesheuvel:
    
       - fix memory leak in efivarfs driver
    
       - fix HYP mode issue in 32-bit ARM version of the EFI stub when built
         in Thumb2 mode
    
       - avoid leaking EFI pgd pages on allocation failure"
    
    * tag 'efi-urgent-for-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      efi/x86: Free efi_pgd with free_pages()
      efivarfs: fix memory leak in efivarfs_create()
      efi/arm: set HSCTLR Thumb2 bit correctly for HVC calls from HYP

commit 7d53be55c9d78feb38b29fbcaf77af1343549cf1
Merge: 4a51c60a1115 01cf158e48d2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 12:55:50 2020 -0800

    Merge tag 'x86_urgent_for_v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull x86 fixes from Borislav Petkov:
    
     - An IOMMU VT-d build fix when CONFIG_PCI_ATS=n along with a revert of
       same because the proper one is going through the IOMMU tree (Thomas
       Gleixner)
    
     - An Intel microcode loader fix to save the correct microcode patch to
       apply during resume (Chen Yu)
    
     - A fix to not access user memory of other processes when dumping
       opcode bytes (Thomas Gleixner)
    
    * tag 'x86_urgent_for_v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      Revert "iommu/vt-d: Take CONFIG_PCI_ATS into account"
      x86/dumpstack: Do not try to access user space code of other tasks
      x86/microcode/intel: Check patch signature before saving microcode for early loading
      iommu/vt-d: Take CONFIG_PCI_ATS into account

commit 4a51c60a11158961f1291c5b95ff7e4cddfb0353
Merge: d27637ece80f 66383800df9c
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 12:14:46 2020 -0800

    Merge branch 'akpm' (patches from Andrew)
    
    Merge misc fixes from Andrew Morton:
     "8 patches.
    
      Subsystems affected by this patch series: mm (madvise, pagemap,
      readahead, memcg, userfaultfd), kbuild, and vfs"
    
    * emailed patches from Andrew Morton <akpm at linux-foundation.org>:
      mm: fix madvise WILLNEED performance problem
      libfs: fix error cast of negative value in simple_attr_write()
      mm/userfaultfd: do not access vma->vm_mm after calling handle_userfault()
      mm: memcg/slab: fix root memcg vmstats
      mm: fix readahead_page_batch for retry entries
      mm: fix phys_to_target_node() and memory_add_physaddr_to_nid() exports
      compiler-clang: remove version check for BPF Tracing
      mm/madvise: fix memory leak from process_madvise

commit d27637ece80f25124e0e6871b7b6cb855e1c670c
Merge: de7580357025 2dde2821b57f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 11:58:49 2020 -0800

    Merge tag 'staging-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
    
    Pull staging and IIO fixes from Greg KH:
     "Here are some small Staging and IIO driver fixes for 5.10-rc5. They
      include:
    
       - IIO fixes for reported regressions and problems
    
       - new device ids for IIO drivers
    
       - new device id for rtl8723bs driver
    
       - staging ralink driver Kconfig dependency fix
    
       - staging mt7621-pci bus resource fix
    
      All of these have been in linux-next all week with no reported issues"
    
    * tag 'staging-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
      iio: accel: kxcjk1013: Add support for KIOX010A ACPI DSM for setting tablet-mode
      iio: accel: kxcjk1013: Replace is_smo8500_device with an acpi_type enum
      docs: ABI: testing: iio: stm32: remove re-introduced unsupported ABI
      iio: light: fix kconfig dependency bug for VCNL4035
      iio/adc: ingenic: Fix AUX/VBAT readings when touchscreen is used
      iio/adc: ingenic: Fix battery VREF for JZ4770 SoC
      staging: rtl8723bs: Add 024c:0627 to the list of SDIO device-ids
      staging: ralink-gdma: fix kconfig dependency bug for DMA_RALINK
      staging: mt7621-pci: avoid to request pci bus resources
      iio: imu: st_lsm6dsx: set 10ms as min shub slave timeout
      counter/ti-eqep: Fix regmap max_register
      iio: adc: stm32-adc: fix a regression when using dma and irq
      iio: adc: mediatek: fix unset field
      iio: cros_ec: Use default frequencies when EC returns invalid information

commit de758035702576ac0e5ac0f93e3cce77144c3bd3
Merge: a7f07fc14f06 425af483523b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 11:52:10 2020 -0800

    Merge tag 'tty-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
    
    Pull tty fixes from Greg KH:
     "Here are some small tty/serial fixes for 5.10-rc5 that resolve some
      reported issues:
    
       - speakup crash when telling the kernel to use a device that isn't
         really there
    
       - imx serial driver fixes for reported problems
    
       - ar933x_uart driver fix for probe error handling path
    
      All have been in linux-next for a while with no reported issues"
    
    * tag 'tty-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
      serial: ar933x_uart: disable clk on error handling path in probe
      tty: serial: imx: keep console clocks always on
      speakup: Do not let the line discipline be used several times
      tty: serial: imx: fix potential deadlock

commit a7f07fc14f06f98fc5fe1208bac5f6f5bcda2c10
Merge: a9e5c87ca744 f902b2165010
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 22 11:39:32 2020 -0800

    Merge tag 'ext4_for_linus_fixes2' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
    
    Pull ext4 fixes from Ted Ts'o:
     "A final set of miscellaneous bug fixes for ext4"
    
    * tag 'ext4_for_linus_fixes2' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
      ext4: fix bogus warning in ext4_update_dx_flag()
      jbd2: fix kernel-doc markups
      ext4: drop fast_commit from /proc/mounts

commit a9e5c87ca7443d09fb530fffa4d96ce1c76dbe4d
Author: David Howells <dhowells at redhat.com>
Date:   Sun Nov 22 13:13:45 2020 +0000

    afs: Fix speculative status fetch going out of order wrt to modifications
    
    When doing a lookup in a directory, the afs filesystem uses a bulk
    status fetch to speculatively retrieve the statuses of up to 48 other
    vnodes found in the same directory and it will then either update extant
    inodes or create new ones - effectively doing 'lookup ahead'.
    
    To avoid the possibility of deadlocking itself, however, the filesystem
    doesn't lock all of those inodes; rather just the directory inode is
    locked (by the VFS).
    
    When the operation completes, afs_inode_init_from_status() or
    afs_apply_status() is called, depending on whether the inode already
    exists, to commit the new status.
    
    A case exists, however, where the speculative status fetch operation may
    straddle a modification operation on one of those vnodes.  What can then
    happen is that the speculative bulk status RPC retrieves the old status,
    and whilst that is happening, the modification happens - which returns
    an updated status, then the modification status is committed, then we
    attempt to commit the speculative status.
    
    This results in something like the following being seen in dmesg:
    
            kAFS: vnode modified {100058:861} 8->9 YFS.InlineBulkStatus
    
    showing that for vnode 861 on volume 100058, we saw YFS.InlineBulkStatus
    say that the vnode had data version 8 when we'd already recorded version
    9 due to a local modification.  This was causing the cache to be
    invalidated for that vnode when it shouldn't have been.  If it happens
    on a data file, this might lead to local changes being lost.
    
    Fix this by ignoring speculative status updates if the data version
    doesn't match the expected value.
    
    Note that it is possible to get a DV regression if a volume gets
    restored from a backup - but we should get a callback break in such a
    case that should trigger a recheck anyway.  It might be worth checking
    the volume creation time in the volsync info and, if a change is
    observed in that (as would happen on a restore), invalidate all caches
    associated with the volume.
    
    Fixes: 5cf9dd55a0ec ("afs: Prospectively look up extra files when doing a single lookup")
    Signed-off-by: David Howells <dhowells at redhat.com>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/afs/dir.c b/fs/afs/dir.c
index 1bb5b9d7f0a2..9068d5578a26 100644
--- a/fs/afs/dir.c
+++ b/fs/afs/dir.c
@@ -823,6 +823,7 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
 				vp->cb_break_before = afs_calc_vnode_cb_break(vnode);
 				vp->vnode = vnode;
 				vp->put_vnode = true;
+				vp->speculative = true; /* vnode not locked */
 			}
 		}
 	}
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 0fe8844b4bee..b0d7b892090d 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -294,6 +294,13 @@ void afs_vnode_commit_status(struct afs_operation *op, struct afs_vnode_param *v
 			op->flags &= ~AFS_OPERATION_DIR_CONFLICT;
 		}
 	} else if (vp->scb.have_status) {
+		if (vp->dv_before + vp->dv_delta != vp->scb.status.data_version &&
+		    vp->speculative)
+			/* Ignore the result of a speculative bulk status fetch
+			 * if it splits around a modification op, thereby
+			 * appearing to regress the data version.
+			 */
+			goto out;
 		afs_apply_status(op, vp);
 		if (vp->scb.have_cb)
 			afs_apply_callback(op, vp);
@@ -305,6 +312,7 @@ void afs_vnode_commit_status(struct afs_operation *op, struct afs_vnode_param *v
 		}
 	}
 
+out:
 	write_sequnlock(&vnode->cb_lock);
 
 	if (vp->scb.have_status)
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index 14d5d75f4b6e..0d150a29e39e 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -755,6 +755,7 @@ struct afs_vnode_param {
 	bool			update_ctime:1;	/* Need to update the ctime */
 	bool			set_size:1;	/* Must update i_size */
 	bool			op_unlinked:1;	/* True if file was unlinked by op */
+	bool			speculative:1;	/* T if speculative status fetch (no vnode lock) */
 };
 
 /*
commit 66383800df9cbdbf3b0c34d5a51bf35bcdb72fd2
Author: Matthew Wilcox (Oracle) <willy at infradead.org>
Date:   Sat Nov 21 22:17:22 2020 -0800

    mm: fix madvise WILLNEED performance problem
    
    The calculation of the end page index was incorrect, leading to a
    regression of 70% when running stress-ng.
    
    With this fix, we instead see a performance improvement of 3%.
    
    Fixes: e6e88712e43b ("mm: optimise madvise WILLNEED")
    Reported-by: kernel test robot <rong.a.chen at intel.com>
    Signed-off-by: Matthew Wilcox (Oracle) <willy at infradead.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Tested-by: Xing Zhengjun <zhengjun.xing at linux.intel.com>
    Acked-by: Johannes Weiner <hannes at cmpxchg.org>
    Cc: William Kucharski <william.kucharski at oracle.com>
    Cc: Feng Tang <feng.tang at intel.com>
    Cc: "Chen, Rong A" <rong.a.chen at intel.com>
    Link: https://lkml.kernel.org/r/20201109134851.29692-1-willy@infradead.org
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/madvise.c b/mm/madvise.c
index 7e773f949ef9..a8d8d48a57fe 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -226,7 +226,7 @@ static void force_shm_swapin_readahead(struct vm_area_struct *vma,
 		struct address_space *mapping)
 {
 	XA_STATE(xas, &mapping->i_pages, linear_page_index(vma, start));
-	pgoff_t end_index = end / PAGE_SIZE;
+	pgoff_t end_index = linear_page_index(vma, end + PAGE_SIZE - 1);
 	struct page *page;
 
 	rcu_read_lock();
commit 488dac0c9237647e9b8f788b6a342595bfa40bda
Author: Yicong Yang <yangyicong at hisilicon.com>
Date:   Sat Nov 21 22:17:19 2020 -0800

    libfs: fix error cast of negative value in simple_attr_write()
    
    The attr->set() receive a value of u64, but simple_strtoll() is used for
    doing the conversion.  It will lead to the error cast if user inputs a
    negative value.
    
    Use kstrtoull() instead of simple_strtoll() to convert a string got from
    the user to an unsigned value.  The former will return '-EINVAL' if it
    gets a negetive value, but the latter can't handle the situation
    correctly.  Make 'val' unsigned long long as what kstrtoull() takes,
    this will eliminate the compile warning on no 64-bit architectures.
    
    Fixes: f7b88631a897 ("fs/libfs.c: fix simple_attr_write() on 32bit machines")
    Signed-off-by: Yicong Yang <yangyicong at hisilicon.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Al Viro <viro at zeniv.linux.org.uk>
    Link: https://lkml.kernel.org/r/1605341356-11872-1-git-send-email-yangyicong@hisilicon.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/libfs.c b/fs/libfs.c
index fc34361c1489..7124c2e8df2f 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -959,7 +959,7 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
 			  size_t len, loff_t *ppos)
 {
 	struct simple_attr *attr;
-	u64 val;
+	unsigned long long val;
 	size_t size;
 	ssize_t ret;
 
@@ -977,7 +977,9 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
 		goto out;
 
 	attr->set_buf[size] = '\0';
-	val = simple_strtoll(attr->set_buf, NULL, 0);
+	ret = kstrtoull(attr->set_buf, 0, &val);
+	if (ret)
+		goto out;
 	ret = attr->set(attr->data, val);
 	if (ret == 0)
 		ret = len; /* on success, claim we got the whole input */
commit bfe8cc1db02ab243c62780f17fc57f65bde0afe1
Author: Gerald Schaefer <gerald.schaefer at linux.ibm.com>
Date:   Sat Nov 21 22:17:15 2020 -0800

    mm/userfaultfd: do not access vma->vm_mm after calling handle_userfault()
    
    Alexander reported a syzkaller / KASAN finding on s390, see below for
    complete output.
    
    In do_huge_pmd_anonymous_page(), the pre-allocated pagetable will be
    freed in some cases.  In the case of userfaultfd_missing(), this will
    happen after calling handle_userfault(), which might have released the
    mmap_lock.  Therefore, the following pte_free(vma->vm_mm, pgtable) will
    access an unstable vma->vm_mm, which could have been freed or re-used
    already.
    
    For all architectures other than s390 this will go w/o any negative
    impact, because pte_free() simply frees the page and ignores the
    passed-in mm.  The implementation for SPARC32 would also access
    mm->page_table_lock for pte_free(), but there is no THP support in
    SPARC32, so the buggy code path will not be used there.
    
    For s390, the mm->context.pgtable_list is being used to maintain the 2K
    pagetable fragments, and operating on an already freed or even re-used
    mm could result in various more or less subtle bugs due to list /
    pagetable corruption.
    
    Fix this by calling pte_free() before handle_userfault(), similar to how
    it is already done in __do_huge_pmd_anonymous_page() for the WRITE /
    non-huge_zero_page case.
    
    Commit 6b251fc96cf2c ("userfaultfd: call handle_userfault() for
    userfaultfd_missing() faults") actually introduced both, the
    do_huge_pmd_anonymous_page() and also __do_huge_pmd_anonymous_page()
    changes wrt to calling handle_userfault(), but only in the latter case
    it put the pte_free() before calling handle_userfault().
    
      BUG: KASAN: use-after-free in do_huge_pmd_anonymous_page+0xcda/0xd90 mm/huge_memory.c:744
      Read of size 8 at addr 00000000962d6988 by task syz-executor.0/9334
    
      CPU: 1 PID: 9334 Comm: syz-executor.0 Not tainted 5.10.0-rc1-syzkaller-07083-g4c9720875573 #0
      Hardware name: IBM 3906 M04 701 (KVM/Linux)
      Call Trace:
        do_huge_pmd_anonymous_page+0xcda/0xd90 mm/huge_memory.c:744
        create_huge_pmd mm/memory.c:4256 [inline]
        __handle_mm_fault+0xe6e/0x1068 mm/memory.c:4480
        handle_mm_fault+0x288/0x748 mm/memory.c:4607
        do_exception+0x394/0xae0 arch/s390/mm/fault.c:479
        do_dat_exception+0x34/0x80 arch/s390/mm/fault.c:567
        pgm_check_handler+0x1da/0x22c arch/s390/kernel/entry.S:706
        copy_from_user_mvcos arch/s390/lib/uaccess.c:111 [inline]
        raw_copy_from_user+0x3a/0x88 arch/s390/lib/uaccess.c:174
        _copy_from_user+0x48/0xa8 lib/usercopy.c:16
        copy_from_user include/linux/uaccess.h:192 [inline]
        __do_sys_sigaltstack kernel/signal.c:4064 [inline]
        __s390x_sys_sigaltstack+0xc8/0x240 kernel/signal.c:4060
        system_call+0xe0/0x28c arch/s390/kernel/entry.S:415
    
      Allocated by task 9334:
        slab_alloc_node mm/slub.c:2891 [inline]
        slab_alloc mm/slub.c:2899 [inline]
        kmem_cache_alloc+0x118/0x348 mm/slub.c:2904
        vm_area_dup+0x9c/0x2b8 kernel/fork.c:356
        __split_vma+0xba/0x560 mm/mmap.c:2742
        split_vma+0xca/0x108 mm/mmap.c:2800
        mlock_fixup+0x4ae/0x600 mm/mlock.c:550
        apply_vma_lock_flags+0x2c6/0x398 mm/mlock.c:619
        do_mlock+0x1aa/0x718 mm/mlock.c:711
        __do_sys_mlock2 mm/mlock.c:738 [inline]
        __s390x_sys_mlock2+0x86/0xa8 mm/mlock.c:728
        system_call+0xe0/0x28c arch/s390/kernel/entry.S:415
    
      Freed by task 9333:
        slab_free mm/slub.c:3142 [inline]
        kmem_cache_free+0x7c/0x4b8 mm/slub.c:3158
        __vma_adjust+0x7b2/0x2508 mm/mmap.c:960
        vma_merge+0x87e/0xce0 mm/mmap.c:1209
        userfaultfd_release+0x412/0x6b8 fs/userfaultfd.c:868
        __fput+0x22c/0x7a8 fs/file_table.c:281
        task_work_run+0x200/0x320 kernel/task_work.c:151
        tracehook_notify_resume include/linux/tracehook.h:188 [inline]
        do_notify_resume+0x100/0x148 arch/s390/kernel/signal.c:538
        system_call+0xe6/0x28c arch/s390/kernel/entry.S:416
    
      The buggy address belongs to the object at 00000000962d6948 which belongs to the cache vm_area_struct of size 200
      The buggy address is located 64 bytes inside of 200-byte region [00000000962d6948, 00000000962d6a10)
      The buggy address belongs to the page: page:00000000313a09fe refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x962d6 flags: 0x3ffff00000000200(slab)
      raw: 3ffff00000000200 000040000257e080 0000000c0000000c 000000008020ba00
      raw: 0000000000000000 000f001e00000000 ffffffff00000001 0000000096959501
      page dumped because: kasan: bad access detected
      page->mem_cgroup:0000000096959501
    
      Memory state around the buggy address:
       00000000962d6880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
       00000000962d6900: 00 fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb
      >00000000962d6980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                            ^
       00000000962d6a00: fb fb fc fc fc fc fc fc fc fc 00 00 00 00 00 00
       00000000962d6a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      ==================================================================
    
    Fixes: 6b251fc96cf2c ("userfaultfd: call handle_userfault() for userfaultfd_missing() faults")
    Reported-by: Alexander Egorenkov <egorenar at linux.ibm.com>
    Signed-off-by: Gerald Schaefer <gerald.schaefer at linux.ibm.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Andrea Arcangeli <aarcange at redhat.com>
    Cc: Heiko Carstens <hca at linux.ibm.com>
    Cc: <stable at vger.kernel.org>    [4.3+]
    Link: https://lkml.kernel.org/r/20201110190329.11920-1-gerald.schaefer@linux.ibm.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 9474dbc150ed..ec2bb93f7431 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -710,7 +710,6 @@ vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf)
 			transparent_hugepage_use_zero_page()) {
 		pgtable_t pgtable;
 		struct page *zero_page;
-		bool set;
 		vm_fault_t ret;
 		pgtable = pte_alloc_one(vma->vm_mm);
 		if (unlikely(!pgtable))
@@ -723,25 +722,25 @@ vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf)
 		}
 		vmf->ptl = pmd_lock(vma->vm_mm, vmf->pmd);
 		ret = 0;
-		set = false;
 		if (pmd_none(*vmf->pmd)) {
 			ret = check_stable_address_space(vma->vm_mm);
 			if (ret) {
 				spin_unlock(vmf->ptl);
+				pte_free(vma->vm_mm, pgtable);
 			} else if (userfaultfd_missing(vma)) {
 				spin_unlock(vmf->ptl);
+				pte_free(vma->vm_mm, pgtable);
 				ret = handle_userfault(vmf, VM_UFFD_MISSING);
 				VM_BUG_ON(ret & VM_FAULT_FALLBACK);
 			} else {
 				set_huge_zero_page(pgtable, vma->vm_mm, vma,
 						   haddr, vmf->pmd, zero_page);
 				spin_unlock(vmf->ptl);
-				set = true;
 			}
-		} else
+		} else {
 			spin_unlock(vmf->ptl);
-		if (!set)
 			pte_free(vma->vm_mm, pgtable);
+		}
 		return ret;
 	}
 	gfp = alloc_hugepage_direct_gfpmask(vma);
commit 8faeb1ffd79593c9cd8a2a80ecdda371e3b826cb
Author: Muchun Song <songmuchun at bytedance.com>
Date:   Sat Nov 21 22:17:12 2020 -0800

    mm: memcg/slab: fix root memcg vmstats
    
    If we reparent the slab objects to the root memcg, when we free the slab
    object, we need to update the per-memcg vmstats to keep it correct for
    the root memcg.  Now this at least affects the vmstat of
    NR_KERNEL_STACK_KB for !CONFIG_VMAP_STACK when the thread stack size is
    smaller than the PAGE_SIZE.
    
    David said:
     "I assume that without this fix that the root memcg's vmstat would
      always be inflated if we reparented"
    
    Fixes: ec9f02384f60 ("mm: workingset: fix vmstat counters for shadow nodes")
    Signed-off-by: Muchun Song <songmuchun at bytedance.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Shakeel Butt <shakeelb at google.com>
    Acked-by: Roman Gushchin <guro at fb.com>
    Acked-by: Johannes Weiner <hannes at cmpxchg.org>
    Acked-by: David Rientjes <rientjes at google.com>
    Cc: Michal Hocko <mhocko at kernel.org>
    Cc: Vladimir Davydov <vdavydov.dev at gmail.com>
    Cc: Christopher Lameter <cl at linux.com>
    Cc: Pekka Enberg <penberg at kernel.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim at lge.com>
    Cc: Roman Gushchin <guro at fb.com>
    Cc: Vlastimil Babka <vbabka at suse.cz>
    Cc: Yafang Shao <laoar.shao at gmail.com>
    Cc: Chris Down <chris at chrisdown.name>
    Cc: <stable at vger.kernel.org>    [5.3+]
    Link: https://lkml.kernel.org/r/20201110031015.15715-1-songmuchun@bytedance.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 3dcbf24d2227..29459a6ce1c7 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -867,8 +867,13 @@ void __mod_lruvec_slab_state(void *p, enum node_stat_item idx, int val)
 	rcu_read_lock();
 	memcg = mem_cgroup_from_obj(p);
 
-	/* Untracked pages have no memcg, no lruvec. Update only the node */
-	if (!memcg || memcg == root_mem_cgroup) {
+	/*
+	 * Untracked pages have no memcg, no lruvec. Update only the
+	 * node. If we reparent the slab objects to the root memcg,
+	 * when we free the slab object, we need to update the per-memcg
+	 * vmstats to keep it correct for the root memcg.
+	 */
+	if (!memcg) {
 		__mod_node_page_state(pgdat, idx, val);
 	} else {
 		lruvec = mem_cgroup_lruvec(memcg, pgdat);
commit 4349a83a3190c1d4414371161b0f4a4c3ccd3f9d
Author: Matthew Wilcox (Oracle) <willy at infradead.org>
Date:   Sat Nov 21 22:17:08 2020 -0800

    mm: fix readahead_page_batch for retry entries
    
    Both btrfs and fuse have reported faults caused by seeing a retry entry
    instead of the page they were looking for.  This was caused by a missing
    check in the iterator.
    
    As can be seen in the below panic log, the accessing 0x402 causes a
    panic.  In the xarray.h, 0x402 means RETRY_ENTRY.
    
      BUG: kernel NULL pointer dereference, address: 0000000000000402
      CPU: 14 PID: 306003 Comm: as Not tainted 5.9.0-1-amd64 #1 Debian 5.9.1-1
      Hardware name: Lenovo ThinkSystem SR665/7D2VCTO1WW, BIOS D8E106Q-1.01 05/30/2020
      RIP: 0010:fuse_readahead+0x152/0x470 [fuse]
      Code: 41 8b 57 18 4c 8d 54 10 ff 4c 89 d6 48 8d 7c 24 10 e8 d2 e3 28 f9 48 85 c0 0f 84 fe 00 00 00 44 89 f2 49 89 04 d4 44 8d 72 01 <48> 8b 10 41 8b 4f 1c 48 c1 ea 10 83 e2 01 80 fa 01 19 d2 81 e2 01
      RSP: 0018:ffffad99ceaebc50 EFLAGS: 00010246
      RAX: 0000000000000402 RBX: 0000000000000001 RCX: 0000000000000002
      RDX: 0000000000000000 RSI: ffff94c5af90bd98 RDI: ffffad99ceaebc60
      RBP: ffff94ddc1749a00 R08: 0000000000000402 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000100 R12: ffff94de6c429ce0
      R13: ffff94de6c4d3700 R14: 0000000000000001 R15: ffffad99ceaebd68
      FS:  00007f228c5c7040(0000) GS:ffff94de8ed80000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 0000000000000402 CR3: 0000001dbd9b4000 CR4: 0000000000350ee0
      Call Trace:
        read_pages+0x83/0x270
        page_cache_readahead_unbounded+0x197/0x230
        generic_file_buffered_read+0x57a/0xa20
        new_sync_read+0x112/0x1a0
        vfs_read+0xf8/0x180
        ksys_read+0x5f/0xe0
        do_syscall_64+0x33/0x80
        entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fixes: 042124cc64c3 ("mm: add new readahead_control API")
    Reported-by: David Sterba <dsterba at suse.com>
    Reported-by: Wonhyuk Yang <vvghjk1234 at gmail.com>
    Signed-off-by: Matthew Wilcox (Oracle) <willy at infradead.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201103142852.8543-1-willy@infradead.org
    Link: https://lkml.kernel.org/r/20201103124349.16722-1-vvghjk1234@gmail.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index e1e19c1f9ec9..d5570deff400 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -906,6 +906,8 @@ static inline unsigned int __readahead_batch(struct readahead_control *rac,
 	xas_set(&xas, rac->_index);
 	rcu_read_lock();
 	xas_for_each(&xas, page, rac->_index + rac->_nr_pages - 1) {
+		if (xas_retry(&xas, page))
+			continue;
 		VM_BUG_ON_PAGE(!PageLocked(page), page);
 		VM_BUG_ON_PAGE(PageTail(page), page);
 		array[i++] = page;
commit a927bd6ba952d13c52b8b385030943032f659a3e
Author: Dan Williams <dan.j.williams at intel.com>
Date:   Sat Nov 21 22:17:05 2020 -0800

    mm: fix phys_to_target_node() and memory_add_physaddr_to_nid() exports
    
    The core-mm has a default __weak implementation of phys_to_target_node()
    to mirror the weak definition of memory_add_physaddr_to_nid().  That
    symbol is exported for modules.  However, while the export in
    mm/memory_hotplug.c exported the symbol in the configuration cases of:
    
            CONFIG_NUMA_KEEP_MEMINFO=y
            CONFIG_MEMORY_HOTPLUG=y
    
    ...and:
    
            CONFIG_NUMA_KEEP_MEMINFO=n
            CONFIG_MEMORY_HOTPLUG=y
    
    ...it failed to export the symbol in the case of:
    
            CONFIG_NUMA_KEEP_MEMINFO=y
            CONFIG_MEMORY_HOTPLUG=n
    
    Not only is that broken, but Christoph points out that the kernel should
    not be exporting any __weak symbol, which means that
    memory_add_physaddr_to_nid() example that phys_to_target_node() copied
    is broken too.
    
    Rework the definition of phys_to_target_node() and
    memory_add_physaddr_to_nid() to not require weak symbols.  Move to the
    common arch override design-pattern of an asm header defining a symbol
    to replace the default implementation.
    
    The only common header that all memory_add_physaddr_to_nid() producing
    architectures implement is asm/sparsemem.h.  In fact, powerpc already
    defines its memory_add_physaddr_to_nid() helper in sparsemem.h.
    Double-down on that observation and define phys_to_target_node() where
    necessary in asm/sparsemem.h.  An alternate consideration that was
    discarded was to put this override in asm/numa.h, but that entangles
    with the definition of MAX_NUMNODES relative to the inclusion of
    linux/nodemask.h, and requires powerpc to grow a new header.
    
    The dependency on NUMA_KEEP_MEMINFO for DEV_DAX_HMEM_DEVICES is invalid
    now that the symbol is properly exported / stubbed in all combinations
    of CONFIG_NUMA_KEEP_MEMINFO and CONFIG_MEMORY_HOTPLUG.
    
    [dan.j.williams at intel.com: v4]
      Link: https://lkml.kernel.org/r/160461461867.1505359.5301571728749534585.stgit@dwillia2-desk3.amr.corp.intel.com
    [dan.j.williams at intel.com: powerpc: fix create_section_mapping compile warning]
      Link: https://lkml.kernel.org/r/160558386174.2948926.2740149041249041764.stgit@dwillia2-desk3.amr.corp.intel.com
    
    Fixes: a035b6bf863e ("mm/memory_hotplug: introduce default phys_to_target_node() implementation")
    Reported-by: Randy Dunlap <rdunlap at infradead.org>
    Reported-by: Thomas Gleixner <tglx at linutronix.de>
    Reported-by: kernel test robot <lkp at intel.com>
    Reported-by: Christoph Hellwig <hch at infradead.org>
    Signed-off-by: Dan Williams <dan.j.williams at intel.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Tested-by: Randy Dunlap <rdunlap at infradead.org>
    Tested-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Cc: Joao Martins <joao.m.martins at oracle.com>
    Cc: Tony Luck <tony.luck at intel.com>
    Cc: Fenghua Yu <fenghua.yu at intel.com>
    Cc: Michael Ellerman <mpe at ellerman.id.au>
    Cc: Benjamin Herrenschmidt <benh at kernel.crashing.org>
    Cc: Paul Mackerras <paulus at samba.org>
    Cc: Vishal Verma <vishal.l.verma at intel.com>
    Cc: Stephen Rothwell <sfr at canb.auug.org.au>
    Link: https://lkml.kernel.org/r/160447639846.1133764.7044090803980177548.stgit@dwillia2-desk3.amr.corp.intel.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/arch/ia64/include/asm/sparsemem.h b/arch/ia64/include/asm/sparsemem.h
index 336d0570e1fa..dd8c166ffd7b 100644
--- a/arch/ia64/include/asm/sparsemem.h
+++ b/arch/ia64/include/asm/sparsemem.h
@@ -18,4 +18,10 @@
 #endif
 
 #endif /* CONFIG_SPARSEMEM */
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+int memory_add_physaddr_to_nid(u64 addr);
+#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
+#endif
+
 #endif /* _ASM_IA64_SPARSEMEM_H */
diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h
index 91c69ff53a8a..6cda76b57c5d 100644
--- a/arch/powerpc/include/asm/mmzone.h
+++ b/arch/powerpc/include/asm/mmzone.h
@@ -46,5 +46,10 @@ u64 memory_hotplug_max(void);
 #define __HAVE_ARCH_RESERVED_KERNEL_PAGES
 #endif
 
+#ifdef CONFIG_MEMORY_HOTPLUG
+extern int create_section_mapping(unsigned long start, unsigned long end,
+				  int nid, pgprot_t prot);
+#endif
+
 #endif /* __KERNEL__ */
 #endif /* _ASM_MMZONE_H_ */
diff --git a/arch/powerpc/include/asm/sparsemem.h b/arch/powerpc/include/asm/sparsemem.h
index 1e6fa371cc38..d072866842e4 100644
--- a/arch/powerpc/include/asm/sparsemem.h
+++ b/arch/powerpc/include/asm/sparsemem.h
@@ -13,9 +13,9 @@
 #endif /* CONFIG_SPARSEMEM */
 
 #ifdef CONFIG_MEMORY_HOTPLUG
-extern int create_section_mapping(unsigned long start, unsigned long end,
-				  int nid, pgprot_t prot);
 extern int remove_section_mapping(unsigned long start, unsigned long end);
+extern int memory_add_physaddr_to_nid(u64 start);
+#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
 
 #ifdef CONFIG_NUMA
 extern int hot_add_scn_to_nid(unsigned long scn_addr);
@@ -26,6 +26,5 @@ static inline int hot_add_scn_to_nid(unsigned long scn_addr)
 }
 #endif /* CONFIG_NUMA */
 #endif /* CONFIG_MEMORY_HOTPLUG */
-
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_SPARSEMEM_H */
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 01ec2a252f09..3fc325bebe4d 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -50,6 +50,7 @@
 #include <asm/rtas.h>
 #include <asm/kasan.h>
 #include <asm/svm.h>
+#include <asm/mmzone.h>
 
 #include <mm/mmu_decl.h>
 
diff --git a/arch/x86/include/asm/sparsemem.h b/arch/x86/include/asm/sparsemem.h
index 6bfc878f6771..6a9ccc1b2be5 100644
--- a/arch/x86/include/asm/sparsemem.h
+++ b/arch/x86/include/asm/sparsemem.h
@@ -28,4 +28,14 @@
 #endif
 
 #endif /* CONFIG_SPARSEMEM */
+
+#ifndef __ASSEMBLY__
+#ifdef CONFIG_NUMA_KEEP_MEMINFO
+extern int phys_to_target_node(phys_addr_t start);
+#define phys_to_target_node phys_to_target_node
+extern int memory_add_physaddr_to_nid(u64 start);
+#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
+#endif
+#endif /* __ASSEMBLY__ */
+
 #endif /* _ASM_X86_SPARSEMEM_H */
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c
index 44148691d78b..5eb4dc2b97da 100644
--- a/arch/x86/mm/numa.c
+++ b/arch/x86/mm/numa.c
@@ -938,6 +938,7 @@ int phys_to_target_node(phys_addr_t start)
 
 	return meminfo_to_nid(&numa_reserved_meminfo, start);
 }
+EXPORT_SYMBOL_GPL(phys_to_target_node);
 
 int memory_add_physaddr_to_nid(u64 start)
 {
@@ -947,4 +948,5 @@ int memory_add_physaddr_to_nid(u64 start)
 		nid = numa_meminfo.blk[0].nid;
 	return nid;
 }
+EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
 #endif
diff --git a/drivers/dax/Kconfig b/drivers/dax/Kconfig
index 567428e10b7b..d2834c2cfa10 100644
--- a/drivers/dax/Kconfig
+++ b/drivers/dax/Kconfig
@@ -50,7 +50,6 @@ config DEV_DAX_HMEM
 	  Say M if unsure.
 
 config DEV_DAX_HMEM_DEVICES
-	depends on NUMA_KEEP_MEMINFO # for phys_to_target_node()
 	depends on DEV_DAX_HMEM && DAX=y
 	def_bool y
 
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index d65c6fdc5cfc..551093b74596 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -281,20 +281,6 @@ static inline bool movable_node_is_enabled(void)
 }
 #endif /* ! CONFIG_MEMORY_HOTPLUG */
 
-#ifdef CONFIG_NUMA
-extern int memory_add_physaddr_to_nid(u64 start);
-extern int phys_to_target_node(u64 start);
-#else
-static inline int memory_add_physaddr_to_nid(u64 start)
-{
-	return 0;
-}
-static inline int phys_to_target_node(u64 start)
-{
-	return 0;
-}
-#endif
-
 #if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_DEFERRED_STRUCT_PAGE_INIT)
 /*
  * pgdat resizing functions
diff --git a/include/linux/numa.h b/include/linux/numa.h
index 8cb33ccfb671..cb44cfe2b725 100644
--- a/include/linux/numa.h
+++ b/include/linux/numa.h
@@ -21,13 +21,41 @@
 #endif
 
 #ifdef CONFIG_NUMA
+#include <linux/printk.h>
+#include <asm/sparsemem.h>
+
 /* Generic implementation available */
 int numa_map_to_online_node(int node);
-#else
+
+#ifndef memory_add_physaddr_to_nid
+static inline int memory_add_physaddr_to_nid(u64 start)
+{
+	pr_info_once("Unknown online node for memory at 0x%llx, assuming node 0\n",
+			start);
+	return 0;
+}
+#endif
+#ifndef phys_to_target_node
+static inline int phys_to_target_node(u64 start)
+{
+	pr_info_once("Unknown target node for memory at 0x%llx, assuming node 0\n",
+			start);
+	return 0;
+}
+#endif
+#else /* !CONFIG_NUMA */
 static inline int numa_map_to_online_node(int node)
 {
 	return NUMA_NO_NODE;
 }
+static inline int memory_add_physaddr_to_nid(u64 start)
+{
+	return 0;
+}
+static inline int phys_to_target_node(u64 start)
+{
+	return 0;
+}
 #endif
 
 #endif /* _LINUX_NUMA_H */
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index b44d4c7ba73b..63b2e46b6555 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -350,24 +350,6 @@ int __ref __add_pages(int nid, unsigned long pfn, unsigned long nr_pages,
 	return err;
 }
 
-#ifdef CONFIG_NUMA
-int __weak memory_add_physaddr_to_nid(u64 start)
-{
-	pr_info_once("Unknown online node for memory at 0x%llx, assuming node 0\n",
-			start);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
-
-int __weak phys_to_target_node(u64 start)
-{
-	pr_info_once("Unknown target node for memory at 0x%llx, assuming node 0\n",
-			start);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(phys_to_target_node);
-#endif
-
 /* 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,
commit bc2dc4406c463174613047d8b7946e12c8808cda
Author: Nick Desaulniers <ndesaulniers at google.com>
Date:   Sat Nov 21 22:17:01 2020 -0800

    compiler-clang: remove version check for BPF Tracing
    
    bpftrace parses the kernel headers and uses Clang under the hood.
    
    Remove the version check when __BPF_TRACING__ is defined (as bpftrace
    does) so that this tool can continue to parse kernel headers, even with
    older clang sources.
    
    Fixes: commit 1f7a44f63e6c ("compiler-clang: add build check for clang 10.0.1")
    Reported-by: Chen Yu <yu.chen.surf at gmail.com>
    Reported-by: Jarkko Sakkinen <jarkko at kernel.org>
    Signed-off-by: Nick Desaulniers <ndesaulniers at google.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Tested-by: Jarkko Sakkinen <jarkko at kernel.org>
    Acked-by: Jarkko Sakkinen <jarkko at kernel.org>
    Acked-by: Song Liu <songliubraving at fb.com>
    Acked-by: Nathan Chancellor <natechancellor at gmail.com>
    Acked-by: Miguel Ojeda <ojeda at kernel.org>
    Link: https://lkml.kernel.org/r/20201104191052.390657-1-ndesaulniers@google.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
index dd7233c48bf3..98cff1b4b088 100644
--- a/include/linux/compiler-clang.h
+++ b/include/linux/compiler-clang.h
@@ -8,8 +8,10 @@
 		     + __clang_patchlevel__)
 
 #if CLANG_VERSION < 100001
+#ifndef __BPF_TRACING__
 # error Sorry, your version of Clang is too old - please use 10.0.1 or newer.
 #endif
+#endif
 
 /* Compiler specific definitions for Clang compiler */
 
commit 450677dcb0cce5cb751538360b7196c28b733f3e
Author: Eric Dumazet <edumazet at google.com>
Date:   Sat Nov 21 22:16:58 2020 -0800

    mm/madvise: fix memory leak from process_madvise
    
    The early return in process_madvise() will produce a memory leak.
    
    Fix it.
    
    Fixes: ecb8ac8b1f14 ("mm/madvise: introduce process_madvise() syscall: an external memory hinting API")
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Signed-off-by: Minchan Kim <minchan at kernel.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Link: https://lkml.kernel.org/r/20201116155132.GA3805951@google.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/madvise.c b/mm/madvise.c
index 416a56b8e757..7e773f949ef9 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1231,8 +1231,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
 		ret = total_len - iov_iter_count(&iter);
 
 	mmput(mm);
-	return ret;
-
 release_task:
 	put_task_struct(task);
 put_pid:
commit d963ab0f15fb0797ddd65b2653f3d65c2d7a08ec
Author: John Stultz <john.stultz at linaro.org>
Date:   Sat Nov 21 23:50:02 2020 +0000

    dma-buf: system_heap: Allocate higher order pages if available
    
    While the system heap can return non-contiguous pages,
    try to allocate larger order pages if possible.
    
    This will allow slight performance gains and make implementing
    page pooling easier.
    
    Cc: Sumit Semwal <sumit.semwal at linaro.org>
    Cc: Liam Mark <lmark at codeaurora.org>
    Cc: Laura Abbott <labbott at kernel.org>
    Cc: Brian Starkey <Brian.Starkey at arm.com>
    Cc: Hridya Valsaraju <hridya at google.com>
    Cc: Suren Baghdasaryan <surenb at google.com>
    Cc: Sandeep Patil <sspatil at google.com>
    Cc: Daniel Mentz <danielmentz at google.com>
    Cc: Chris Goldsworthy <cgoldswo at codeaurora.org>
    Cc: Ørjan Eide <orjan.eide at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: Ezequiel Garcia <ezequiel at collabora.com>
    Cc: Simon Ser <contact at emersion.fr>
    Cc: James Jones <jajones at nvidia.com>
    Cc: linux-media at vger.kernel.org
    Cc: dri-devel at lists.freedesktop.org
    Reviewed-by: Brian Starkey <brian.starkey at arm.com>
    Signed-off-by: John Stultz <john.stultz at linaro.org>
    Signed-off-by: Sumit Semwal <sumit.semwal at linaro.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201121235002.69945-6-john.stultz@linaro.org

diff --git a/drivers/dma-buf/heaps/system_heap.c b/drivers/dma-buf/heaps/system_heap.c
index 32b17a5c8079..17e0e9a68baf 100644
--- a/drivers/dma-buf/heaps/system_heap.c
+++ b/drivers/dma-buf/heaps/system_heap.c
@@ -40,6 +40,20 @@ struct dma_heap_attachment {
 	bool mapped;
 };
 
+#define HIGH_ORDER_GFP  (((GFP_HIGHUSER | __GFP_ZERO | __GFP_NOWARN \
+				| __GFP_NORETRY) & ~__GFP_RECLAIM) \
+				| __GFP_COMP)
+#define LOW_ORDER_GFP (GFP_HIGHUSER | __GFP_ZERO | __GFP_COMP)
+static gfp_t order_flags[] = {HIGH_ORDER_GFP, LOW_ORDER_GFP, LOW_ORDER_GFP};
+/*
+ * The selection of the orders used for allocation (1MB, 64K, 4K) is designed
+ * to match with the sizes often found in IOMMUs. Using order 4 pages instead
+ * of order 0 pages can significantly improve the performance of many IOMMUs
+ * by reducing TLB pressure and time spent updating page tables.
+ */
+static const unsigned int orders[] = {8, 4, 0};
+#define NUM_ORDERS ARRAY_SIZE(orders)
+
 static struct sg_table *dup_sg_table(struct sg_table *table)
 {
 	struct sg_table *new_table;
@@ -275,8 +289,11 @@ static void system_heap_dma_buf_release(struct dma_buf *dmabuf)
 	int i;
 
 	table = &buffer->sg_table;
-	for_each_sgtable_sg(table, sg, i)
-		__free_page(sg_page(sg));
+	for_each_sg(table->sgl, sg, table->nents, i) {
+		struct page *page = sg_page(sg);
+
+		__free_pages(page, compound_order(page));
+	}
 	sg_free_table(table);
 	kfree(buffer);
 }
@@ -294,6 +311,26 @@ static const struct dma_buf_ops system_heap_buf_ops = {
 	.release = system_heap_dma_buf_release,
 };
 
+static struct page *alloc_largest_available(unsigned long size,
+					    unsigned int max_order)
+{
+	struct page *page;
+	int i;
+
+	for (i = 0; i < NUM_ORDERS; i++) {
+		if (size <  (PAGE_SIZE << orders[i]))
+			continue;
+		if (max_order < orders[i])
+			continue;
+
+		page = alloc_pages(order_flags[i], orders[i]);
+		if (!page)
+			continue;
+		return page;
+	}
+	return NULL;
+}
+
 static int system_heap_allocate(struct dma_heap *heap,
 				unsigned long len,
 				unsigned long fd_flags,
@@ -301,11 +338,13 @@ static int system_heap_allocate(struct dma_heap *heap,
 {
 	struct system_heap_buffer *buffer;
 	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
+	unsigned long size_remaining = len;
+	unsigned int max_order = orders[0];
 	struct dma_buf *dmabuf;
 	struct sg_table *table;
 	struct scatterlist *sg;
-	pgoff_t pagecount;
-	pgoff_t pg;
+	struct list_head pages;
+	struct page *page, *tmp_page;
 	int i, ret = -ENOMEM;
 
 	buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
@@ -317,25 +356,35 @@ static int system_heap_allocate(struct dma_heap *heap,
 	buffer->heap = heap;
 	buffer->len = len;
 
-	table = &buffer->sg_table;
-	pagecount = len / PAGE_SIZE;
-	if (sg_alloc_table(table, pagecount, GFP_KERNEL))
-		goto free_buffer;
-
-	sg = table->sgl;
-	for (pg = 0; pg < pagecount; pg++) {
-		struct page *page;
+	INIT_LIST_HEAD(&pages);
+	i = 0;
+	while (size_remaining > 0) {
 		/*
 		 * Avoid trying to allocate memory if the process
 		 * has been killed by SIGKILL
 		 */
 		if (fatal_signal_pending(current))
-			goto free_pages;
-		page = alloc_page(GFP_KERNEL | __GFP_ZERO);
+			goto free_buffer;
+
+		page = alloc_largest_available(size_remaining, max_order);
 		if (!page)
-			goto free_pages;
+			goto free_buffer;
+
+		list_add_tail(&page->lru, &pages);
+		size_remaining -= page_size(page);
+		max_order = compound_order(page);
+		i++;
+	}
+
+	table = &buffer->sg_table;
+	if (sg_alloc_table(table, i, GFP_KERNEL))
+		goto free_buffer;
+
+	sg = table->sgl;
+	list_for_each_entry_safe(page, tmp_page, &pages, lru) {
 		sg_set_page(sg, page, page_size(page), 0);
 		sg = sg_next(sg);
+		list_del(&page->lru);
 	}
 
 	/* create the dmabuf */
@@ -355,14 +404,18 @@ static int system_heap_allocate(struct dma_heap *heap,
 		/* just return, as put will call release and that will free */
 		return ret;
 	}
-
 	return ret;
 
 free_pages:
-	for_each_sgtable_sg(table, sg, i)
-		__free_page(sg_page(sg));
+	for_each_sgtable_sg(table, sg, i) {
+		struct page *p = sg_page(sg);
+
+		__free_pages(p, compound_order(p));
+	}
 	sg_free_table(table);
 free_buffer:
+	list_for_each_entry_safe(page, tmp_page, &pages, lru)
+		__free_pages(page, compound_order(page));
 	kfree(buffer);
 
 	return ret;
commit 4c68e499bb9d6d9ec3e18fcb2f68641abb22464a
Author: John Stultz <john.stultz at linaro.org>
Date:   Sat Nov 21 23:50:01 2020 +0000

    dma-buf: heaps: Skip sync if not mapped
    
    This patch is basically a port of Ørjan Eide's similar patch for ION
     https://lore.kernel.org/lkml/20200414134629.54567-1-orjan.eide@arm.com/
    
    Only sync the sg-list of dma-buf heap attachment when the attachment
    is actually mapped on the device.
    
    dma-bufs may be synced at any time. It can be reached from user space
    via DMA_BUF_IOCTL_SYNC, so there are no guarantees from callers on when
    syncs may be attempted, and dma_buf_end_cpu_access() and
    dma_buf_begin_cpu_access() may not be paired.
    
    Since the sg_list's dma_address isn't set up until the buffer is used
    on the device, and dma_map_sg() is called on it, the dma_address will be
    NULL if sync is attempted on the dma-buf before it's mapped on a device.
    
    Before v5.0 (commit 55897af63091 ("dma-direct: merge swiotlb_dma_ops
    into the dma_direct code")) this was a problem as the dma-api (at least
    the swiotlb_dma_ops on arm64) would use the potentially invalid
    dma_address. How that failed depended on how the device handled physical
    address 0. If 0 was a valid address to physical ram, that page would get
    flushed a lot, while the actual pages in the buffer would not get synced
    correctly. While if 0 is an invalid physical address it may cause a
    fault and trigger a crash.
    
    In v5.0 this was incidentally fixed by commit 55897af63091 ("dma-direct:
    merge swiotlb_dma_ops into the dma_direct code"), as this moved the
    dma-api to use the page pointer in the sg_list, and (for Ion buffers at
    least) this will always be valid if the sg_list exists at all.
    
    But, this issue is re-introduced in v5.3 with
    commit 449fa54d6815 ("dma-direct: correct the physical addr in
    dma_direct_sync_sg_for_cpu/device") moves the dma-api back to the old
    behaviour and picks the dma_address that may be invalid.
    
    dma-buf core doesn't ensure that the buffer is mapped on the device, and
    thus have a valid sg_list, before calling the exporter's
    begin_cpu_access.
    
    Logic and commit message originally by: Ørjan Eide <orjan.eide at arm.com>
    
    Cc: Sumit Semwal <sumit.semwal at linaro.org>
    Cc: Liam Mark <lmark at codeaurora.org>
    Cc: Laura Abbott <labbott at kernel.org>
    Cc: Brian Starkey <Brian.Starkey at arm.com>
    Cc: Hridya Valsaraju <hridya at google.com>
    Cc: Suren Baghdasaryan <surenb at google.com>
    Cc: Sandeep Patil <sspatil at google.com>
    Cc: Daniel Mentz <danielmentz at google.com>
    Cc: Chris Goldsworthy <cgoldswo at codeaurora.org>
    Cc: Ørjan Eide <orjan.eide at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: Ezequiel Garcia <ezequiel at collabora.com>
    Cc: Simon Ser <contact at emersion.fr>
    Cc: James Jones <jajones at nvidia.com>
    Cc: linux-media at vger.kernel.org
    Cc: dri-devel at lists.freedesktop.org
    Reviewed-by: Brian Starkey <brian.starkey at arm.com>
    Signed-off-by: John Stultz <john.stultz at linaro.org>
    Signed-off-by: Sumit Semwal <sumit.semwal at linaro.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201121235002.69945-5-john.stultz@linaro.org

diff --git a/drivers/dma-buf/heaps/cma_heap.c b/drivers/dma-buf/heaps/cma_heap.c
index 05aaa4f29397..5e7c3436310c 100644
--- a/drivers/dma-buf/heaps/cma_heap.c
+++ b/drivers/dma-buf/heaps/cma_heap.c
@@ -43,6 +43,7 @@ struct dma_heap_attachment {
 	struct device *dev;
 	struct sg_table table;
 	struct list_head list;
+	bool mapped;
 };
 
 static int cma_heap_attach(struct dma_buf *dmabuf,
@@ -67,6 +68,7 @@ static int cma_heap_attach(struct dma_buf *dmabuf,
 
 	a->dev = attachment->dev;
 	INIT_LIST_HEAD(&a->list);
+	a->mapped = false;
 
 	attachment->priv = a;
 
@@ -101,6 +103,7 @@ static struct sg_table *cma_heap_map_dma_buf(struct dma_buf_attachment *attachme
 	ret = dma_map_sgtable(attachment->dev, table, direction, 0);
 	if (ret)
 		return ERR_PTR(-ENOMEM);
+	a->mapped = true;
 	return table;
 }
 
@@ -108,6 +111,9 @@ static void cma_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
 				   struct sg_table *table,
 				   enum dma_data_direction direction)
 {
+	struct dma_heap_attachment *a = attachment->priv;
+
+	a->mapped = false;
 	dma_unmap_sgtable(attachment->dev, table, direction, 0);
 }
 
@@ -122,6 +128,8 @@ static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
 
 	mutex_lock(&buffer->lock);
 	list_for_each_entry(a, &buffer->attachments, list) {
+		if (!a->mapped)
+			continue;
 		dma_sync_sgtable_for_cpu(a->dev, &a->table, direction);
 	}
 	mutex_unlock(&buffer->lock);
@@ -140,6 +148,8 @@ static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 
 	mutex_lock(&buffer->lock);
 	list_for_each_entry(a, &buffer->attachments, list) {
+		if (!a->mapped)
+			continue;
 		dma_sync_sgtable_for_device(a->dev, &a->table, direction);
 	}
 	mutex_unlock(&buffer->lock);
diff --git a/drivers/dma-buf/heaps/system_heap.c b/drivers/dma-buf/heaps/system_heap.c
index b2d02f50f9ed..32b17a5c8079 100644
--- a/drivers/dma-buf/heaps/system_heap.c
+++ b/drivers/dma-buf/heaps/system_heap.c
@@ -37,6 +37,7 @@ struct dma_heap_attachment {
 	struct device *dev;
 	struct sg_table *table;
 	struct list_head list;
+	bool mapped;
 };
 
 static struct sg_table *dup_sg_table(struct sg_table *table)
@@ -84,6 +85,7 @@ static int system_heap_attach(struct dma_buf *dmabuf,
 	a->table = table;
 	a->dev = attachment->dev;
 	INIT_LIST_HEAD(&a->list);
+	a->mapped = false;
 
 	attachment->priv = a;
 
@@ -120,6 +122,7 @@ static struct sg_table *system_heap_map_dma_buf(struct dma_buf_attachment *attac
 	if (ret)
 		return ERR_PTR(ret);
 
+	a->mapped = true;
 	return table;
 }
 
@@ -127,6 +130,9 @@ static void system_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
 				      struct sg_table *table,
 				      enum dma_data_direction direction)
 {
+	struct dma_heap_attachment *a = attachment->priv;
+
+	a->mapped = false;
 	dma_unmap_sgtable(attachment->dev, table, direction, 0);
 }
 
@@ -142,6 +148,8 @@ static int system_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
 		invalidate_kernel_vmap_range(buffer->vaddr, buffer->len);
 
 	list_for_each_entry(a, &buffer->attachments, list) {
+		if (!a->mapped)
+			continue;
 		dma_sync_sgtable_for_cpu(a->dev, a->table, direction);
 	}
 	mutex_unlock(&buffer->lock);
@@ -161,6 +169,8 @@ static int system_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 		flush_kernel_vmap_range(buffer->vaddr, buffer->len);
 
 	list_for_each_entry(a, &buffer->attachments, list) {
+		if (!a->mapped)
+			continue;
 		dma_sync_sgtable_for_device(a->dev, a->table, direction);
 	}
 	mutex_unlock(&buffer->lock);
commit 064fae53c068a13987733ef2898d12d93a34545c
Author: John Stultz <john.stultz at linaro.org>
Date:   Sat Nov 21 23:50:00 2020 +0000

    dma-buf: heaps: Remove heap-helpers code
    
    The heap-helpers code was not as generic as initially hoped
    and it is now not being used, so remove it from the tree.
    
    Cc: Sumit Semwal <sumit.semwal at linaro.org>
    Cc: Liam Mark <lmark at codeaurora.org>
    Cc: Laura Abbott <labbott at kernel.org>
    Cc: Brian Starkey <Brian.Starkey at arm.com>
    Cc: Hridya Valsaraju <hridya at google.com>
    Cc: Suren Baghdasaryan <surenb at google.com>
    Cc: Sandeep Patil <sspatil at google.com>
    Cc: Daniel Mentz <danielmentz at google.com>
    Cc: Chris Goldsworthy <cgoldswo at codeaurora.org>
    Cc: Ørjan Eide <orjan.eide at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: Ezequiel Garcia <ezequiel at collabora.com>
    Cc: Simon Ser <contact at emersion.fr>
    Cc: James Jones <jajones at nvidia.com>
    Cc: linux-media at vger.kernel.org
    Cc: dri-devel at lists.freedesktop.org
    Reviewed-by: Brian Starkey <brian.starkey at arm.com>
    Signed-off-by: John Stultz <john.stultz at linaro.org>
    Signed-off-by: Sumit Semwal <sumit.semwal at linaro.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201121235002.69945-4-john.stultz@linaro.org

diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
index 6e54cdec3da0..974467791032 100644
--- a/drivers/dma-buf/heaps/Makefile
+++ b/drivers/dma-buf/heaps/Makefile
@@ -1,4 +1,3 @@
 # SPDX-License-Identifier: GPL-2.0
-obj-y					+= heap-helpers.o
 obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)	+= system_heap.o
 obj-$(CONFIG_DMABUF_HEAPS_CMA)		+= cma_heap.o
diff --git a/drivers/dma-buf/heaps/heap-helpers.c b/drivers/dma-buf/heaps/heap-helpers.c
deleted file mode 100644
index fcf4ce3e2cbb..000000000000
--- a/drivers/dma-buf/heaps/heap-helpers.c
+++ /dev/null
@@ -1,274 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/device.h>
-#include <linux/dma-buf.h>
-#include <linux/err.h>
-#include <linux/highmem.h>
-#include <linux/idr.h>
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-#include <linux/vmalloc.h>
-#include <uapi/linux/dma-heap.h>
-
-#include "heap-helpers.h"
-
-void init_heap_helper_buffer(struct heap_helper_buffer *buffer,
-			     void (*free)(struct heap_helper_buffer *))
-{
-	buffer->priv_virt = NULL;
-	mutex_init(&buffer->lock);
-	buffer->vmap_cnt = 0;
-	buffer->vaddr = NULL;
-	buffer->pagecount = 0;
-	buffer->pages = NULL;
-	INIT_LIST_HEAD(&buffer->attachments);
-	buffer->free = free;
-}
-
-struct dma_buf *heap_helper_export_dmabuf(struct heap_helper_buffer *buffer,
-					  int fd_flags)
-{
-	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
-
-	exp_info.ops = &heap_helper_ops;
-	exp_info.size = buffer->size;
-	exp_info.flags = fd_flags;
-	exp_info.priv = buffer;
-
-	return dma_buf_export(&exp_info);
-}
-
-static void *dma_heap_map_kernel(struct heap_helper_buffer *buffer)
-{
-	void *vaddr;
-
-	vaddr = vmap(buffer->pages, buffer->pagecount, VM_MAP, PAGE_KERNEL);
-	if (!vaddr)
-		return ERR_PTR(-ENOMEM);
-
-	return vaddr;
-}
-
-static void dma_heap_buffer_destroy(struct heap_helper_buffer *buffer)
-{
-	if (buffer->vmap_cnt > 0) {
-		WARN(1, "%s: buffer still mapped in the kernel\n", __func__);
-		vunmap(buffer->vaddr);
-	}
-
-	buffer->free(buffer);
-}
-
-static void *dma_heap_buffer_vmap_get(struct heap_helper_buffer *buffer)
-{
-	void *vaddr;
-
-	if (buffer->vmap_cnt) {
-		buffer->vmap_cnt++;
-		return buffer->vaddr;
-	}
-	vaddr = dma_heap_map_kernel(buffer);
-	if (IS_ERR(vaddr))
-		return vaddr;
-	buffer->vaddr = vaddr;
-	buffer->vmap_cnt++;
-	return vaddr;
-}
-
-static void dma_heap_buffer_vmap_put(struct heap_helper_buffer *buffer)
-{
-	if (!--buffer->vmap_cnt) {
-		vunmap(buffer->vaddr);
-		buffer->vaddr = NULL;
-	}
-}
-
-struct dma_heaps_attachment {
-	struct device *dev;
-	struct sg_table table;
-	struct list_head list;
-};
-
-static int dma_heap_attach(struct dma_buf *dmabuf,
-			   struct dma_buf_attachment *attachment)
-{
-	struct dma_heaps_attachment *a;
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-	int ret;
-
-	a = kzalloc(sizeof(*a), GFP_KERNEL);
-	if (!a)
-		return -ENOMEM;
-
-	ret = sg_alloc_table_from_pages(&a->table, buffer->pages,
-					buffer->pagecount, 0,
-					buffer->pagecount << PAGE_SHIFT,
-					GFP_KERNEL);
-	if (ret) {
-		kfree(a);
-		return ret;
-	}
-
-	a->dev = attachment->dev;
-	INIT_LIST_HEAD(&a->list);
-
-	attachment->priv = a;
-
-	mutex_lock(&buffer->lock);
-	list_add(&a->list, &buffer->attachments);
-	mutex_unlock(&buffer->lock);
-
-	return 0;
-}
-
-static void dma_heap_detach(struct dma_buf *dmabuf,
-			    struct dma_buf_attachment *attachment)
-{
-	struct dma_heaps_attachment *a = attachment->priv;
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-
-	mutex_lock(&buffer->lock);
-	list_del(&a->list);
-	mutex_unlock(&buffer->lock);
-
-	sg_free_table(&a->table);
-	kfree(a);
-}
-
-static
-struct sg_table *dma_heap_map_dma_buf(struct dma_buf_attachment *attachment,
-				      enum dma_data_direction direction)
-{
-	struct dma_heaps_attachment *a = attachment->priv;
-	struct sg_table *table = &a->table;
-	int ret;
-
-	ret = dma_map_sgtable(attachment->dev, table, direction, 0);
-	if (ret)
-		table = ERR_PTR(ret);
-	return table;
-}
-
-static void dma_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
-				   struct sg_table *table,
-				   enum dma_data_direction direction)
-{
-	dma_unmap_sgtable(attachment->dev, table, direction, 0);
-}
-
-static vm_fault_t dma_heap_vm_fault(struct vm_fault *vmf)
-{
-	struct vm_area_struct *vma = vmf->vma;
-	struct heap_helper_buffer *buffer = vma->vm_private_data;
-
-	if (vmf->pgoff > buffer->pagecount)
-		return VM_FAULT_SIGBUS;
-
-	vmf->page = buffer->pages[vmf->pgoff];
-	get_page(vmf->page);
-
-	return 0;
-}
-
-static const struct vm_operations_struct dma_heap_vm_ops = {
-	.fault = dma_heap_vm_fault,
-};
-
-static int dma_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
-{
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-
-	if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0)
-		return -EINVAL;
-
-	vma->vm_ops = &dma_heap_vm_ops;
-	vma->vm_private_data = buffer;
-
-	return 0;
-}
-
-static void dma_heap_dma_buf_release(struct dma_buf *dmabuf)
-{
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-
-	dma_heap_buffer_destroy(buffer);
-}
-
-static int dma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
-					     enum dma_data_direction direction)
-{
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-	struct dma_heaps_attachment *a;
-	int ret = 0;
-
-	mutex_lock(&buffer->lock);
-
-	if (buffer->vmap_cnt)
-		invalidate_kernel_vmap_range(buffer->vaddr, buffer->size);
-
-	list_for_each_entry(a, &buffer->attachments, list) {
-		dma_sync_sg_for_cpu(a->dev, a->table.sgl, a->table.nents,
-				    direction);
-	}
-	mutex_unlock(&buffer->lock);
-
-	return ret;
-}
-
-static int dma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
-					   enum dma_data_direction direction)
-{
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-	struct dma_heaps_attachment *a;
-
-	mutex_lock(&buffer->lock);
-
-	if (buffer->vmap_cnt)
-		flush_kernel_vmap_range(buffer->vaddr, buffer->size);
-
-	list_for_each_entry(a, &buffer->attachments, list) {
-		dma_sync_sg_for_device(a->dev, a->table.sgl, a->table.nents,
-				       direction);
-	}
-	mutex_unlock(&buffer->lock);
-
-	return 0;
-}
-
-static int dma_heap_dma_buf_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
-{
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-	void *vaddr;
-
-	mutex_lock(&buffer->lock);
-	vaddr = dma_heap_buffer_vmap_get(buffer);
-	mutex_unlock(&buffer->lock);
-
-	if (!vaddr)
-		return -ENOMEM;
-	dma_buf_map_set_vaddr(map, vaddr);
-
-	return 0;
-}
-
-static void dma_heap_dma_buf_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
-{
-	struct heap_helper_buffer *buffer = dmabuf->priv;
-
-	mutex_lock(&buffer->lock);
-	dma_heap_buffer_vmap_put(buffer);
-	mutex_unlock(&buffer->lock);
-}
-
-const struct dma_buf_ops heap_helper_ops = {
-	.map_dma_buf = dma_heap_map_dma_buf,
-	.unmap_dma_buf = dma_heap_unmap_dma_buf,
-	.mmap = dma_heap_mmap,
-	.release = dma_heap_dma_buf_release,
-	.attach = dma_heap_attach,
-	.detach = dma_heap_detach,
-	.begin_cpu_access = dma_heap_dma_buf_begin_cpu_access,
-	.end_cpu_access = dma_heap_dma_buf_end_cpu_access,
-	.vmap = dma_heap_dma_buf_vmap,
-	.vunmap = dma_heap_dma_buf_vunmap,
-};
diff --git a/drivers/dma-buf/heaps/heap-helpers.h b/drivers/dma-buf/heaps/heap-helpers.h
deleted file mode 100644
index 805d2df88024..000000000000
--- a/drivers/dma-buf/heaps/heap-helpers.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * DMABUF Heaps helper code
- *
- * Copyright (C) 2011 Google, Inc.
- * Copyright (C) 2019 Linaro Ltd.
- */
-
-#ifndef _HEAP_HELPERS_H
-#define _HEAP_HELPERS_H
-
-#include <linux/dma-heap.h>
-#include <linux/list.h>
-
-/**
- * struct heap_helper_buffer - helper buffer metadata
- * @heap:		back pointer to the heap the buffer came from
- * @dmabuf:		backing dma-buf for this buffer
- * @size:		size of the buffer
- * @priv_virt		pointer to heap specific private value
- * @lock		mutext to protect the data in this structure
- * @vmap_cnt		count of vmap references on the buffer
- * @vaddr		vmap'ed virtual address
- * @pagecount		number of pages in the buffer
- * @pages		list of page pointers
- * @attachments		list of device attachments
- *
- * @free		heap callback to free the buffer
- */
-struct heap_helper_buffer {
-	struct dma_heap *heap;
-	struct dma_buf *dmabuf;
-	size_t size;
-
-	void *priv_virt;
-	struct mutex lock;
-	int vmap_cnt;
-	void *vaddr;
-	pgoff_t pagecount;
-	struct page **pages;
-	struct list_head attachments;
-
-	void (*free)(struct heap_helper_buffer *buffer);
-};
-
-void init_heap_helper_buffer(struct heap_helper_buffer *buffer,
-			     void (*free)(struct heap_helper_buffer *));
-
-struct dma_buf *heap_helper_export_dmabuf(struct heap_helper_buffer *buffer,
-					  int fd_flags);
-
-extern const struct dma_buf_ops heap_helper_ops;
-#endif /* _HEAP_HELPERS_H */
commit a5d2d29e24be8967ef78a1b1fb2292413e3b3df9
Author: John Stultz <john.stultz at linaro.org>
Date:   Sat Nov 21 23:49:59 2020 +0000

    dma-buf: heaps: Move heap-helper logic into the cma_heap implementation
    
    Since the heap-helpers logic ended up not being as generic as
    hoped, move the heap-helpers dma_buf_ops implementations into
    the cma_heap directly.
    
    This will allow us to remove the heap_helpers code in a following
    patch.
    
    Cc: Sumit Semwal <sumit.semwal at linaro.org>
    Cc: Liam Mark <lmark at codeaurora.org>
    Cc: Laura Abbott <labbott at kernel.org>
    Cc: Brian Starkey <Brian.Starkey at arm.com>
    Cc: Hridya Valsaraju <hridya at google.com>
    Cc: Suren Baghdasaryan <surenb at google.com>
    Cc: Sandeep Patil <sspatil at google.com>
    Cc: Daniel Mentz <danielmentz at google.com>
    Cc: Chris Goldsworthy <cgoldswo at codeaurora.org>
    Cc: Ørjan Eide <orjan.eide at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: Ezequiel Garcia <ezequiel at collabora.com>
    Cc: Simon Ser <contact at emersion.fr>
    Cc: James Jones <jajones at nvidia.com>
    Cc: linux-media at vger.kernel.org
    Cc: dri-devel at lists.freedesktop.org
    Reviewed-by: Brian Starkey <brian.starkey at arm.com>
    Signed-off-by: John Stultz <john.stultz at linaro.org>
    Signed-off-by: Sumit Semwal <sumit.semwal at linaro.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201121235002.69945-3-john.stultz@linaro.org

diff --git a/drivers/dma-buf/heaps/cma_heap.c b/drivers/dma-buf/heaps/cma_heap.c
index e55384dc115b..05aaa4f29397 100644
--- a/drivers/dma-buf/heaps/cma_heap.c
+++ b/drivers/dma-buf/heaps/cma_heap.c
@@ -2,76 +2,295 @@
 /*
  * DMABUF CMA heap exporter
  *
- * Copyright (C) 2012, 2019 Linaro Ltd.
+ * Copyright (C) 2012, 2019, 2020 Linaro Ltd.
  * Author: <benjamin.gaignard at linaro.org> for ST-Ericsson.
+ *
+ * Also utilizing parts of Andrew Davis' SRAM heap:
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ *	Andrew F. Davis <afd at ti.com>
  */
-
 #include <linux/cma.h>
-#include <linux/device.h>
 #include <linux/dma-buf.h>
 #include <linux/dma-heap.h>
 #include <linux/dma-map-ops.h>
 #include <linux/err.h>
-#include <linux/errno.h>
 #include <linux/highmem.h>
+#include <linux/io.h>
+#include <linux/mm.h>
 #include <linux/module.h>
-#include <linux/slab.h>
 #include <linux/scatterlist.h>
-#include <linux/sched/signal.h>
+#include <linux/slab.h>
 
-#include "heap-helpers.h"
 
 struct cma_heap {
 	struct dma_heap *heap;
 	struct cma *cma;
 };
 
-static void cma_heap_free(struct heap_helper_buffer *buffer)
+struct cma_heap_buffer {
+	struct cma_heap *heap;
+	struct list_head attachments;
+	struct mutex lock;
+	unsigned long len;
+	struct page *cma_pages;
+	struct page **pages;
+	pgoff_t pagecount;
+	int vmap_cnt;
+	void *vaddr;
+};
+
+struct dma_heap_attachment {
+	struct device *dev;
+	struct sg_table table;
+	struct list_head list;
+};
+
+static int cma_heap_attach(struct dma_buf *dmabuf,
+			   struct dma_buf_attachment *attachment)
 {
-	struct cma_heap *cma_heap = dma_heap_get_drvdata(buffer->heap);
-	unsigned long nr_pages = buffer->pagecount;
-	struct page *cma_pages = buffer->priv_virt;
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+	int ret;
 
-	/* free page list */
-	kfree(buffer->pages);
-	/* release memory */
-	cma_release(cma_heap->cma, cma_pages, nr_pages);
+	a = kzalloc(sizeof(*a), GFP_KERNEL);
+	if (!a)
+		return -ENOMEM;
+
+	ret = sg_alloc_table_from_pages(&a->table, buffer->pages,
+					buffer->pagecount, 0,
+					buffer->pagecount << PAGE_SHIFT,
+					GFP_KERNEL);
+	if (ret) {
+		kfree(a);
+		return ret;
+	}
+
+	a->dev = attachment->dev;
+	INIT_LIST_HEAD(&a->list);
+
+	attachment->priv = a;
+
+	mutex_lock(&buffer->lock);
+	list_add(&a->list, &buffer->attachments);
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static void cma_heap_detach(struct dma_buf *dmabuf,
+			    struct dma_buf_attachment *attachment)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a = attachment->priv;
+
+	mutex_lock(&buffer->lock);
+	list_del(&a->list);
+	mutex_unlock(&buffer->lock);
+
+	sg_free_table(&a->table);
+	kfree(a);
+}
+
+static struct sg_table *cma_heap_map_dma_buf(struct dma_buf_attachment *attachment,
+					     enum dma_data_direction direction)
+{
+	struct dma_heap_attachment *a = attachment->priv;
+	struct sg_table *table = &a->table;
+	int ret;
+
+	ret = dma_map_sgtable(attachment->dev, table, direction, 0);
+	if (ret)
+		return ERR_PTR(-ENOMEM);
+	return table;
+}
+
+static void cma_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
+				   struct sg_table *table,
+				   enum dma_data_direction direction)
+{
+	dma_unmap_sgtable(attachment->dev, table, direction, 0);
+}
+
+static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
+					     enum dma_data_direction direction)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+
+	if (buffer->vmap_cnt)
+		invalidate_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	mutex_lock(&buffer->lock);
+	list_for_each_entry(a, &buffer->attachments, list) {
+		dma_sync_sgtable_for_cpu(a->dev, &a->table, direction);
+	}
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
+					   enum dma_data_direction direction)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+
+	if (buffer->vmap_cnt)
+		flush_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	mutex_lock(&buffer->lock);
+	list_for_each_entry(a, &buffer->attachments, list) {
+		dma_sync_sgtable_for_device(a->dev, &a->table, direction);
+	}
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf)
+{
+	struct vm_area_struct *vma = vmf->vma;
+	struct cma_heap_buffer *buffer = vma->vm_private_data;
+
+	if (vmf->pgoff > buffer->pagecount)
+		return VM_FAULT_SIGBUS;
+
+	vmf->page = buffer->pages[vmf->pgoff];
+	get_page(vmf->page);
+
+	return 0;
+}
+
+static const struct vm_operations_struct dma_heap_vm_ops = {
+	.fault = cma_heap_vm_fault,
+};
+
+static int cma_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+
+	if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0)
+		return -EINVAL;
+
+	vma->vm_ops = &dma_heap_vm_ops;
+	vma->vm_private_data = buffer;
+
+	return 0;
+}
+
+static void *cma_heap_do_vmap(struct cma_heap_buffer *buffer)
+{
+	void *vaddr;
+
+	vaddr = vmap(buffer->pages, buffer->pagecount, VM_MAP, PAGE_KERNEL);
+	if (!vaddr)
+		return ERR_PTR(-ENOMEM);
+
+	return vaddr;
+}
+
+static int cma_heap_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	void *vaddr;
+	int ret = 0;
+
+	mutex_lock(&buffer->lock);
+	if (buffer->vmap_cnt) {
+		buffer->vmap_cnt++;
+		dma_buf_map_set_vaddr(map, buffer->vaddr);
+		goto out;
+	}
+
+	vaddr = cma_heap_do_vmap(buffer);
+	if (IS_ERR(vaddr)) {
+		ret = PTR_ERR(vaddr);
+		goto out;
+	}
+	buffer->vaddr = vaddr;
+	buffer->vmap_cnt++;
+	dma_buf_map_set_vaddr(map, buffer->vaddr);
+out:
+	mutex_unlock(&buffer->lock);
+
+	return ret;
+}
+
+static void cma_heap_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+
+	mutex_lock(&buffer->lock);
+	if (!--buffer->vmap_cnt) {
+		vunmap(buffer->vaddr);
+		buffer->vaddr = NULL;
+	}
+	mutex_unlock(&buffer->lock);
+	dma_buf_map_clear(map);
+}
+
+static void cma_heap_dma_buf_release(struct dma_buf *dmabuf)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct cma_heap *cma_heap = buffer->heap;
+
+	if (buffer->vmap_cnt > 0) {
+		WARN(1, "%s: buffer still mapped in the kernel\n", __func__);
+		vunmap(buffer->vaddr);
+		buffer->vaddr = NULL;
+	}
+
+	cma_release(cma_heap->cma, buffer->cma_pages, buffer->pagecount);
 	kfree(buffer);
 }
 
-/* dmabuf heap CMA operations functions */
+static const struct dma_buf_ops cma_heap_buf_ops = {
+	.attach = cma_heap_attach,
+	.detach = cma_heap_detach,
+	.map_dma_buf = cma_heap_map_dma_buf,
+	.unmap_dma_buf = cma_heap_unmap_dma_buf,
+	.begin_cpu_access = cma_heap_dma_buf_begin_cpu_access,
+	.end_cpu_access = cma_heap_dma_buf_end_cpu_access,
+	.mmap = cma_heap_mmap,
+	.vmap = cma_heap_vmap,
+	.vunmap = cma_heap_vunmap,
+	.release = cma_heap_dma_buf_release,
+};
+
 static int cma_heap_allocate(struct dma_heap *heap,
-			     unsigned long len,
-			     unsigned long fd_flags,
-			     unsigned long heap_flags)
+				  unsigned long len,
+				  unsigned long fd_flags,
+				  unsigned long heap_flags)
 {
 	struct cma_heap *cma_heap = dma_heap_get_drvdata(heap);
-	struct heap_helper_buffer *helper_buffer;
-	struct page *cma_pages;
+	struct cma_heap_buffer *buffer;
+	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 	size_t size = PAGE_ALIGN(len);
-	unsigned long nr_pages = size >> PAGE_SHIFT;
+	pgoff_t pagecount = size >> PAGE_SHIFT;
 	unsigned long align = get_order(size);
+	struct page *cma_pages;
 	struct dma_buf *dmabuf;
 	int ret = -ENOMEM;
 	pgoff_t pg;
 
-	if (align > CONFIG_CMA_ALIGNMENT)
-		align = CONFIG_CMA_ALIGNMENT;
-
-	helper_buffer = kzalloc(sizeof(*helper_buffer), GFP_KERNEL);
-	if (!helper_buffer)
+	buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
+	if (!buffer)
 		return -ENOMEM;
 
-	init_heap_helper_buffer(helper_buffer, cma_heap_free);
-	helper_buffer->heap = heap;
-	helper_buffer->size = len;
+	INIT_LIST_HEAD(&buffer->attachments);
+	mutex_init(&buffer->lock);
+	buffer->len = size;
+
+	if (align > CONFIG_CMA_ALIGNMENT)
+		align = CONFIG_CMA_ALIGNMENT;
 
-	cma_pages = cma_alloc(cma_heap->cma, nr_pages, align, false);
+	cma_pages = cma_alloc(cma_heap->cma, pagecount, align, false);
 	if (!cma_pages)
-		goto free_buf;
+		goto free_buffer;
 
+	/* Clear the cma pages */
 	if (PageHighMem(cma_pages)) {
-		unsigned long nr_clear_pages = nr_pages;
+		unsigned long nr_clear_pages = pagecount;
 		struct page *page = cma_pages;
 
 		while (nr_clear_pages > 0) {
@@ -85,7 +304,6 @@ static int cma_heap_allocate(struct dma_heap *heap,
 			 */
 			if (fatal_signal_pending(current))
 				goto free_cma;
-
 			page++;
 			nr_clear_pages--;
 		}
@@ -93,28 +311,30 @@ static int cma_heap_allocate(struct dma_heap *heap,
 		memset(page_address(cma_pages), 0, size);
 	}
 
-	helper_buffer->pagecount = nr_pages;
-	helper_buffer->pages = kmalloc_array(helper_buffer->pagecount,
-					     sizeof(*helper_buffer->pages),
-					     GFP_KERNEL);
-	if (!helper_buffer->pages) {
+	buffer->pages = kmalloc_array(pagecount, sizeof(*buffer->pages), GFP_KERNEL);
+	if (!buffer->pages) {
 		ret = -ENOMEM;
 		goto free_cma;
 	}
 
-	for (pg = 0; pg < helper_buffer->pagecount; pg++)
-		helper_buffer->pages[pg] = &cma_pages[pg];
+	for (pg = 0; pg < pagecount; pg++)
+		buffer->pages[pg] = &cma_pages[pg];
+
+	buffer->cma_pages = cma_pages;
+	buffer->heap = cma_heap;
+	buffer->pagecount = pagecount;
 
 	/* create the dmabuf */
-	dmabuf = heap_helper_export_dmabuf(helper_buffer, fd_flags);
+	exp_info.ops = &cma_heap_buf_ops;
+	exp_info.size = buffer->len;
+	exp_info.flags = fd_flags;
+	exp_info.priv = buffer;
+	dmabuf = dma_buf_export(&exp_info);
 	if (IS_ERR(dmabuf)) {
 		ret = PTR_ERR(dmabuf);
 		goto free_pages;
 	}
 
-	helper_buffer->dmabuf = dmabuf;
-	helper_buffer->priv_virt = cma_pages;
-
 	ret = dma_buf_fd(dmabuf, fd_flags);
 	if (ret < 0) {
 		dma_buf_put(dmabuf);
@@ -125,11 +345,12 @@ static int cma_heap_allocate(struct dma_heap *heap,
 	return ret;
 
 free_pages:
-	kfree(helper_buffer->pages);
+	kfree(buffer->pages);
 free_cma:
-	cma_release(cma_heap->cma, cma_pages, nr_pages);
-free_buf:
-	kfree(helper_buffer);
+	cma_release(cma_heap->cma, cma_pages, pagecount);
+free_buffer:
+	kfree(buffer);
+
 	return ret;
 }
 
commit 3812957587923ca325308ed9c4a5be5ca935e903
Author: John Stultz <john.stultz at linaro.org>
Date:   Sat Nov 21 23:49:58 2020 +0000

    dma-buf: system_heap: Rework system heap to use sgtables instead of pagelists
    
    In preparation for some patches to optmize the system
    heap code, rework the dmabuf exporter to utilize sgtables rather
    then pageslists for tracking the associated pages.
    
    This will allow for large order page allocations, as well as
    more efficient page pooling.
    
    In doing so, the system heap stops using the heap-helpers logic
    which sadly is not quite as generic as I was hoping it to be, so
    this patch adds heap specific implementations of the dma_buf_ops
    function handlers.
    
    Cc: Sumit Semwal <sumit.semwal at linaro.org>
    Cc: Liam Mark <lmark at codeaurora.org>
    Cc: Laura Abbott <labbott at kernel.org>
    Cc: Brian Starkey <Brian.Starkey at arm.com>
    Cc: Hridya Valsaraju <hridya at google.com>
    Cc: Suren Baghdasaryan <surenb at google.com>
    Cc: Sandeep Patil <sspatil at google.com>
    Cc: Daniel Mentz <danielmentz at google.com>
    Cc: Chris Goldsworthy <cgoldswo at codeaurora.org>
    Cc: Ørjan Eide <orjan.eide at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: Ezequiel Garcia <ezequiel at collabora.com>
    Cc: Simon Ser <contact at emersion.fr>
    Cc: James Jones <jajones at nvidia.com>
    Cc: linux-media at vger.kernel.org
    Cc: dri-devel at lists.freedesktop.org
    Reviewed-by: Brian Starkey <brian.starkey at arm.com>
    Signed-off-by: John Stultz <john.stultz at linaro.org>
    Signed-off-by: Sumit Semwal <sumit.semwal at linaro.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201121235002.69945-2-john.stultz@linaro.org

diff --git a/drivers/dma-buf/heaps/system_heap.c b/drivers/dma-buf/heaps/system_heap.c
index 0bf688e3c023..b2d02f50f9ed 100644
--- a/drivers/dma-buf/heaps/system_heap.c
+++ b/drivers/dma-buf/heaps/system_heap.c
@@ -3,7 +3,11 @@
  * DMABUF System heap exporter
  *
  * Copyright (C) 2011 Google, Inc.
- * Copyright (C) 2019 Linaro Ltd.
+ * Copyright (C) 2019, 2020 Linaro Ltd.
+ *
+ * Portions based off of Andrew Davis' SRAM heap:
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ *	Andrew F. Davis <afd at ti.com>
  */
 
 #include <linux/dma-buf.h>
@@ -15,72 +19,326 @@
 #include <linux/module.h>
 #include <linux/scatterlist.h>
 #include <linux/slab.h>
-#include <linux/sched/signal.h>
-#include <asm/page.h>
+#include <linux/vmalloc.h>
+
+static struct dma_heap *sys_heap;
 
-#include "heap-helpers.h"
+struct system_heap_buffer {
+	struct dma_heap *heap;
+	struct list_head attachments;
+	struct mutex lock;
+	unsigned long len;
+	struct sg_table sg_table;
+	int vmap_cnt;
+	void *vaddr;
+};
 
-struct dma_heap *sys_heap;
+struct dma_heap_attachment {
+	struct device *dev;
+	struct sg_table *table;
+	struct list_head list;
+};
 
-static void system_heap_free(struct heap_helper_buffer *buffer)
+static struct sg_table *dup_sg_table(struct sg_table *table)
 {
-	pgoff_t pg;
+	struct sg_table *new_table;
+	int ret, i;
+	struct scatterlist *sg, *new_sg;
+
+	new_table = kzalloc(sizeof(*new_table), GFP_KERNEL);
+	if (!new_table)
+		return ERR_PTR(-ENOMEM);
+
+	ret = sg_alloc_table(new_table, table->orig_nents, GFP_KERNEL);
+	if (ret) {
+		kfree(new_table);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	new_sg = new_table->sgl;
+	for_each_sgtable_sg(table, sg, i) {
+		sg_set_page(new_sg, sg_page(sg), sg->length, sg->offset);
+		new_sg = sg_next(new_sg);
+	}
+
+	return new_table;
+}
+
+static int system_heap_attach(struct dma_buf *dmabuf,
+			      struct dma_buf_attachment *attachment)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+	struct sg_table *table;
+
+	a = kzalloc(sizeof(*a), GFP_KERNEL);
+	if (!a)
+		return -ENOMEM;
+
+	table = dup_sg_table(&buffer->sg_table);
+	if (IS_ERR(table)) {
+		kfree(a);
+		return -ENOMEM;
+	}
+
+	a->table = table;
+	a->dev = attachment->dev;
+	INIT_LIST_HEAD(&a->list);
+
+	attachment->priv = a;
+
+	mutex_lock(&buffer->lock);
+	list_add(&a->list, &buffer->attachments);
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static void system_heap_detach(struct dma_buf *dmabuf,
+			       struct dma_buf_attachment *attachment)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a = attachment->priv;
+
+	mutex_lock(&buffer->lock);
+	list_del(&a->list);
+	mutex_unlock(&buffer->lock);
+
+	sg_free_table(a->table);
+	kfree(a->table);
+	kfree(a);
+}
+
+static struct sg_table *system_heap_map_dma_buf(struct dma_buf_attachment *attachment,
+						enum dma_data_direction direction)
+{
+	struct dma_heap_attachment *a = attachment->priv;
+	struct sg_table *table = a->table;
+	int ret;
+
+	ret = dma_map_sgtable(attachment->dev, table, direction, 0);
+	if (ret)
+		return ERR_PTR(ret);
+
+	return table;
+}
+
+static void system_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
+				      struct sg_table *table,
+				      enum dma_data_direction direction)
+{
+	dma_unmap_sgtable(attachment->dev, table, direction, 0);
+}
+
+static int system_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
+						enum dma_data_direction direction)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+
+	mutex_lock(&buffer->lock);
+
+	if (buffer->vmap_cnt)
+		invalidate_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	list_for_each_entry(a, &buffer->attachments, list) {
+		dma_sync_sgtable_for_cpu(a->dev, a->table, direction);
+	}
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static int system_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
+					      enum dma_data_direction direction)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+
+	mutex_lock(&buffer->lock);
 
-	for (pg = 0; pg < buffer->pagecount; pg++)
-		__free_page(buffer->pages[pg]);
-	kfree(buffer->pages);
+	if (buffer->vmap_cnt)
+		flush_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	list_for_each_entry(a, &buffer->attachments, list) {
+		dma_sync_sgtable_for_device(a->dev, a->table, direction);
+	}
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static int system_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	struct sg_table *table = &buffer->sg_table;
+	unsigned long addr = vma->vm_start;
+	struct sg_page_iter piter;
+	int ret;
+
+	for_each_sgtable_page(table, &piter, vma->vm_pgoff) {
+		struct page *page = sg_page_iter_page(&piter);
+
+		ret = remap_pfn_range(vma, addr, page_to_pfn(page), PAGE_SIZE,
+				      vma->vm_page_prot);
+		if (ret)
+			return ret;
+		addr += PAGE_SIZE;
+		if (addr >= vma->vm_end)
+			return 0;
+	}
+	return 0;
+}
+
+static void *system_heap_do_vmap(struct system_heap_buffer *buffer)
+{
+	struct sg_table *table = &buffer->sg_table;
+	int npages = PAGE_ALIGN(buffer->len) / PAGE_SIZE;
+	struct page **pages = vmalloc(sizeof(struct page *) * npages);
+	struct page **tmp = pages;
+	struct sg_page_iter piter;
+	void *vaddr;
+
+	if (!pages)
+		return ERR_PTR(-ENOMEM);
+
+	for_each_sgtable_page(table, &piter, 0) {
+		WARN_ON(tmp - pages >= npages);
+		*tmp++ = sg_page_iter_page(&piter);
+	}
+
+	vaddr = vmap(pages, npages, VM_MAP, PAGE_KERNEL);
+	vfree(pages);
+
+	if (!vaddr)
+		return ERR_PTR(-ENOMEM);
+
+	return vaddr;
+}
+
+static int system_heap_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	void *vaddr;
+	int ret = 0;
+
+	mutex_lock(&buffer->lock);
+	if (buffer->vmap_cnt) {
+		buffer->vmap_cnt++;
+		dma_buf_map_set_vaddr(map, buffer->vaddr);
+		goto out;
+	}
+
+	vaddr = system_heap_do_vmap(buffer);
+	if (IS_ERR(vaddr)) {
+		ret = PTR_ERR(vaddr);
+		goto out;
+	}
+
+	buffer->vaddr = vaddr;
+	buffer->vmap_cnt++;
+	dma_buf_map_set_vaddr(map, buffer->vaddr);
+out:
+	mutex_unlock(&buffer->lock);
+
+	return ret;
+}
+
+static void system_heap_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+
+	mutex_lock(&buffer->lock);
+	if (!--buffer->vmap_cnt) {
+		vunmap(buffer->vaddr);
+		buffer->vaddr = NULL;
+	}
+	mutex_unlock(&buffer->lock);
+	dma_buf_map_clear(map);
+}
+
+static void system_heap_dma_buf_release(struct dma_buf *dmabuf)
+{
+	struct system_heap_buffer *buffer = dmabuf->priv;
+	struct sg_table *table;
+	struct scatterlist *sg;
+	int i;
+
+	table = &buffer->sg_table;
+	for_each_sgtable_sg(table, sg, i)
+		__free_page(sg_page(sg));
+	sg_free_table(table);
 	kfree(buffer);
 }
 
+static const struct dma_buf_ops system_heap_buf_ops = {
+	.attach = system_heap_attach,
+	.detach = system_heap_detach,
+	.map_dma_buf = system_heap_map_dma_buf,
+	.unmap_dma_buf = system_heap_unmap_dma_buf,
+	.begin_cpu_access = system_heap_dma_buf_begin_cpu_access,
+	.end_cpu_access = system_heap_dma_buf_end_cpu_access,
+	.mmap = system_heap_mmap,
+	.vmap = system_heap_vmap,
+	.vunmap = system_heap_vunmap,
+	.release = system_heap_dma_buf_release,
+};
+
 static int system_heap_allocate(struct dma_heap *heap,
 				unsigned long len,
 				unsigned long fd_flags,
 				unsigned long heap_flags)
 {
-	struct heap_helper_buffer *helper_buffer;
+	struct system_heap_buffer *buffer;
+	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
 	struct dma_buf *dmabuf;
-	int ret = -ENOMEM;
+	struct sg_table *table;
+	struct scatterlist *sg;
+	pgoff_t pagecount;
 	pgoff_t pg;
+	int i, ret = -ENOMEM;
 
-	helper_buffer = kzalloc(sizeof(*helper_buffer), GFP_KERNEL);
-	if (!helper_buffer)
+	buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
+	if (!buffer)
 		return -ENOMEM;
 
-	init_heap_helper_buffer(helper_buffer, system_heap_free);
-	helper_buffer->heap = heap;
-	helper_buffer->size = len;
-
-	helper_buffer->pagecount = len / PAGE_SIZE;
-	helper_buffer->pages = kmalloc_array(helper_buffer->pagecount,
-					     sizeof(*helper_buffer->pages),
-					     GFP_KERNEL);
-	if (!helper_buffer->pages) {
-		ret = -ENOMEM;
-		goto err0;
-	}
+	INIT_LIST_HEAD(&buffer->attachments);
+	mutex_init(&buffer->lock);
+	buffer->heap = heap;
+	buffer->len = len;
+
+	table = &buffer->sg_table;
+	pagecount = len / PAGE_SIZE;
+	if (sg_alloc_table(table, pagecount, GFP_KERNEL))
+		goto free_buffer;
 
-	for (pg = 0; pg < helper_buffer->pagecount; pg++) {
+	sg = table->sgl;
+	for (pg = 0; pg < pagecount; pg++) {
+		struct page *page;
 		/*
 		 * Avoid trying to allocate memory if the process
-		 * has been killed by by SIGKILL
+		 * has been killed by SIGKILL
 		 */
 		if (fatal_signal_pending(current))
-			goto err1;
-
-		helper_buffer->pages[pg] = alloc_page(GFP_KERNEL | __GFP_ZERO);
-		if (!helper_buffer->pages[pg])
-			goto err1;
+			goto free_pages;
+		page = alloc_page(GFP_KERNEL | __GFP_ZERO);
+		if (!page)
+			goto free_pages;
+		sg_set_page(sg, page, page_size(page), 0);
+		sg = sg_next(sg);
 	}
 
 	/* create the dmabuf */
-	dmabuf = heap_helper_export_dmabuf(helper_buffer, fd_flags);
+	exp_info.ops = &system_heap_buf_ops;
+	exp_info.size = buffer->len;
+	exp_info.flags = fd_flags;
+	exp_info.priv = buffer;
+	dmabuf = dma_buf_export(&exp_info);
 	if (IS_ERR(dmabuf)) {
 		ret = PTR_ERR(dmabuf);
-		goto err1;
+		goto free_pages;
 	}
 
-	helper_buffer->dmabuf = dmabuf;
-
 	ret = dma_buf_fd(dmabuf, fd_flags);
 	if (ret < 0) {
 		dma_buf_put(dmabuf);
@@ -90,12 +348,12 @@ static int system_heap_allocate(struct dma_heap *heap,
 
 	return ret;
 
-err1:
-	while (pg > 0)
-		__free_page(helper_buffer->pages[--pg]);
-	kfree(helper_buffer->pages);
-err0:
-	kfree(helper_buffer);
+free_pages:
+	for_each_sgtable_sg(table, sg, i)
+		__free_page(sg_page(sg));
+	sg_free_table(table);
+free_buffer:
+	kfree(buffer);
 
 	return ret;
 }
@@ -107,7 +365,6 @@ static const struct dma_heap_ops system_heap_ops = {
 static int system_heap_create(void)
 {
 	struct dma_heap_export_info exp_info;
-	int ret = 0;
 
 	exp_info.name = "system";
 	exp_info.ops = &system_heap_ops;
@@ -115,9 +372,9 @@ static int system_heap_create(void)
 
 	sys_heap = dma_heap_add(&exp_info);
 	if (IS_ERR(sys_heap))
-		ret = PTR_ERR(sys_heap);
+		return PTR_ERR(sys_heap);
 
-	return ret;
+	return 0;
 }
 module_init(system_heap_create);
 MODULE_LICENSE("GPL v2");
commit 74cde1a53368aed4f2b4b54bf7030437f64a534b
Author: Xu Qiang <xuqiang36 at huawei.com>
Date:   Sat Nov 7 10:42:26 2020 +0000

    irqchip/gic-v3-its: Unconditionally save/restore the ITS state on suspend
    
    On systems without HW-based collections (i.e. anything except GIC-500),
    we rely on firmware to perform the ITS save/restore. This doesn't
    really work, as although FW can properly save everything, it cannot
    fully restore the state of the command queue (the read-side is reset
    to the head of the queue). This results in the ITS consuming previously
    processed commands, potentially corrupting the state.
    
    Instead, let's always save the ITS state on suspend, disabling it in the
    process, and restore the full state on resume. This saves us from broken
    FW as long as it doesn't enable the ITS by itself (for which we can't do
    anything).
    
    This amounts to simply dropping the ITS_FLAGS_SAVE_SUSPEND_STATE.
    
    Signed-off-by: Xu Qiang <xuqiang36 at huawei.com>
    [maz: added warning on resume, rewrote commit message]
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201107104226.14282-1-xuqiang36@huawei.com

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 0418071a3724..0598c5caff5c 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -42,7 +42,6 @@
 #define ITS_FLAGS_CMDQ_NEEDS_FLUSHING		(1ULL << 0)
 #define ITS_FLAGS_WORKAROUND_CAVIUM_22375	(1ULL << 1)
 #define ITS_FLAGS_WORKAROUND_CAVIUM_23144	(1ULL << 2)
-#define ITS_FLAGS_SAVE_SUSPEND_STATE		(1ULL << 3)
 
 #define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING	(1 << 0)
 #define RDIST_FLAGS_RD_TABLES_PREALLOCATED	(1 << 1)
@@ -4741,9 +4740,6 @@ static int its_save_disable(void)
 	list_for_each_entry(its, &its_nodes, entry) {
 		void __iomem *base;
 
-		if (!(its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE))
-			continue;
-
 		base = its->base;
 		its->ctlr_save = readl_relaxed(base + GITS_CTLR);
 		err = its_force_quiescent(base);
@@ -4762,9 +4758,6 @@ err:
 		list_for_each_entry_continue_reverse(its, &its_nodes, entry) {
 			void __iomem *base;
 
-			if (!(its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE))
-				continue;
-
 			base = its->base;
 			writel_relaxed(its->ctlr_save, base + GITS_CTLR);
 		}
@@ -4784,9 +4777,6 @@ static void its_restore_enable(void)
 		void __iomem *base;
 		int i;
 
-		if (!(its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE))
-			continue;
-
 		base = its->base;
 
 		/*
@@ -4794,7 +4784,10 @@ static void its_restore_enable(void)
 		 * don't restore it since writing to CBASER or BASER<n>
 		 * registers is undefined according to the GIC v3 ITS
 		 * Specification.
+		 *
+		 * Firmware resuming with the ITS enabled is terminally broken.
 		 */
+		WARN_ON(readl_relaxed(base + GITS_CTLR) & GITS_CTLR_ENABLE);
 		ret = its_force_quiescent(base);
 		if (ret) {
 			pr_err("ITS@%pa: failed to quiesce on resume: %d\n",
@@ -5074,9 +5067,6 @@ static int __init its_probe_one(struct resource *res,
 		ctlr |= GITS_CTLR_ImDe;
 	writel_relaxed(ctlr, its->base + GITS_CTLR);
 
-	if (GITS_TYPER_HCC(typer))
-		its->flags |= ITS_FLAGS_SAVE_SUSPEND_STATE;
-
 	err = its_init_domain(handle, its);
 	if (err)
 		goto out_free_tables;
commit d001e41e1b15716e9b759df5ef00510699f85282
Author: Chen Baozi <chenbaozi at phytium.com.cn>
Date:   Tue Nov 17 11:20:15 2020 +0800

    irqchip/exiu: Fix the index of fwspec for IRQ type
    
    Since fwspec->param_count of ACPI node is two, the index of IRQ type
    in fwspec->param[] should be 1 rather than 2.
    
    Fixes: 3d090a36c8c8 ("irqchip/exiu: Implement ACPI support")
    Signed-off-by: Chen Baozi <chenbaozi at phytium.com.cn>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Ard Biesheuvel <ardb at kernel.org>
    Link: https://lore.kernel.org/r/20201117032015.11805-1-cbz@baozis.org
    Cc: stable at vger.kernel.org

diff --git a/drivers/irqchip/irq-sni-exiu.c b/drivers/irqchip/irq-sni-exiu.c
index 1d027623c776..abd011fcecf4 100644
--- a/drivers/irqchip/irq-sni-exiu.c
+++ b/drivers/irqchip/irq-sni-exiu.c
@@ -136,7 +136,7 @@ static int exiu_domain_translate(struct irq_domain *domain,
 		if (fwspec->param_count != 2)
 			return -EINVAL;
 		*hwirq = fwspec->param[0];
-		*type = fwspec->param[2] & IRQ_TYPE_SENSE_MASK;
+		*type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK;
 	}
 	return 0;
 }
commit f9b036532108d60925ef5d696a8463097abbc59a
Merge: 5aac0390a63b 855a631a4c11
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Sat Nov 21 15:30:49 2020 -0800

    Merge branch 'ibmvnic-fixes-in-reset-path'
    
    Lijun Pan says:
    
    ====================
    ibmvnic: fixes in reset path
    
    Patch 1/3 and 2/3 notify peers in failover and migration reset.
    Patch 3/3 skips timeout reset if it is already resetting.
    ====================
    
    Link: https://lore.kernel.org/r/20201120224013.46891-1-ljp@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 855a631a4c11458a9cef1ab79c1530436aa95fae
Author: Lijun Pan <ljp at linux.ibm.com>
Date:   Fri Nov 20 16:40:13 2020 -0600

    ibmvnic: skip tx timeout reset while in resetting
    
    Sometimes it takes longer than 5 seconds (watchdog timeout) to complete
    failover, migration, and other resets. In stead of scheduling another
    timeout reset, we wait for the current one to complete.
    
    Suggested-by: Brian King <brking at linux.vnet.ibm.com>
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Reviewed-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 9665532a9ed2..2aa40b2f225c 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2356,6 +2356,12 @@ static void ibmvnic_tx_timeout(struct net_device *dev, unsigned int txqueue)
 {
 	struct ibmvnic_adapter *adapter = netdev_priv(dev);
 
+	if (test_bit(0, &adapter->resetting)) {
+		netdev_err(adapter->netdev,
+			   "Adapter is resetting, skip timeout reset\n");
+		return;
+	}
+
 	ibmvnic_reset(adapter, VNIC_RESET_TIMEOUT);
 }
 
commit 98025bce3a6200a0c4637272a33b5913928ba5b8
Author: Lijun Pan <ljp at linux.ibm.com>
Date:   Fri Nov 20 16:40:12 2020 -0600

    ibmvnic: notify peers when failover and migration happen
    
    Commit 61d3e1d9bc2a ("ibmvnic: Remove netdev notify for failover resets")
    excluded the failover case for notify call because it said
    netdev_notify_peers() can cause network traffic to stall or halt.
    Current testing does not show network traffic stall
    or halt because of the notify call for failover event.
    netdev_notify_peers may be used when a device wants to inform the
    rest of the network about some sort of a reconfiguration
    such as failover or migration.
    
    It is unnecessary to call that in other events like
    FATAL, NON_FATAL, CHANGE_PARAM, and TIMEOUT resets
    since in those scenarios the hardware does not change.
    If the driver must do a hard reset, it is necessary to notify peers.
    
    Fixes: 61d3e1d9bc2a ("ibmvnic: Remove netdev notify for failover resets")
    Suggested-by: Brian King <brking at linux.vnet.ibm.com>
    Suggested-by: Pradeep Satyanarayana <pradeeps at linux.vnet.ibm.com>
    Signed-off-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index eface3543b2c..9665532a9ed2 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2074,7 +2074,8 @@ static int do_reset(struct ibmvnic_adapter *adapter,
 	for (i = 0; i < adapter->req_rx_queues; i++)
 		napi_schedule(&adapter->napi[i]);
 
-	if (adapter->reset_reason != VNIC_RESET_FAILOVER) {
+	if (adapter->reset_reason == VNIC_RESET_FAILOVER ||
+	    adapter->reset_reason == VNIC_RESET_MOBILITY) {
 		call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev);
 		call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev);
 	}
@@ -2147,6 +2148,9 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter,
 	if (rc)
 		return IBMVNIC_OPEN_FAILED;
 
+	call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev);
+	call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev);
+
 	return 0;
 }
 
commit 8393597579f5250636f1cff157ea73f402b6501e
Author: Lijun Pan <ljp at linux.ibm.com>
Date:   Fri Nov 20 16:40:11 2020 -0600

    ibmvnic: fix call_netdevice_notifiers in do_reset
    
    When netdev_notify_peers was substituted in
    commit 986103e7920c ("net/ibmvnic: Fix RTNL deadlock during device reset"),
    call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev) was missed.
    Fix it now.
    
    Fixes: 986103e7920c ("net/ibmvnic: Fix RTNL deadlock during device reset")
    Signed-off-by: Lijun Pan <ljp at linux.ibm.com>
    Reviewed-by: Dany Madden <drt at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index da15913879f8..eface3543b2c 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -2074,8 +2074,10 @@ static int do_reset(struct ibmvnic_adapter *adapter,
 	for (i = 0; i < adapter->req_rx_queues; i++)
 		napi_schedule(&adapter->napi[i]);
 
-	if (adapter->reset_reason != VNIC_RESET_FAILOVER)
+	if (adapter->reset_reason != VNIC_RESET_FAILOVER) {
 		call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev);
+		call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev);
+	}
 
 	rc = 0;
 
commit 5aac0390a63b8718237a61dd0d24a29201d1c94a
Author: Jens Axboe <axboe at kernel.dk>
Date:   Fri Nov 20 07:59:54 2020 -0700

    tun: honor IOCB_NOWAIT flag
    
    tun only checks the file O_NONBLOCK flag, but it should also be checking
    the iocb IOCB_NOWAIT flag. Any fops using ->read/write_iter() should check
    both, otherwise it breaks users that correctly expect O_NONBLOCK semantics
    if IOCB_NOWAIT is set.
    
    Signed-off-by: Jens Axboe <axboe at kernel.dk>
    Link: https://lore.kernel.org/r/e9451860-96cc-c7c7-47b8-fe42cadd5f4c@kernel.dk
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index be69d272052f..cd06cae76035 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1961,12 +1961,15 @@ static ssize_t tun_chr_write_iter(struct kiocb *iocb, struct iov_iter *from)
 	struct tun_file *tfile = file->private_data;
 	struct tun_struct *tun = tun_get(tfile);
 	ssize_t result;
+	int noblock = 0;
 
 	if (!tun)
 		return -EBADFD;
 
-	result = tun_get_user(tun, tfile, NULL, from,
-			      file->f_flags & O_NONBLOCK, false);
+	if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
+		noblock = 1;
+
+	result = tun_get_user(tun, tfile, NULL, from, noblock, false);
 
 	tun_put(tun);
 	return result;
@@ -2185,10 +2188,15 @@ static ssize_t tun_chr_read_iter(struct kiocb *iocb, struct iov_iter *to)
 	struct tun_file *tfile = file->private_data;
 	struct tun_struct *tun = tun_get(tfile);
 	ssize_t len = iov_iter_count(to), ret;
+	int noblock = 0;
 
 	if (!tun)
 		return -EBADFD;
-	ret = tun_do_read(tun, tfile, to, file->f_flags & O_NONBLOCK, NULL);
+
+	if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
+		noblock = 1;
+
+	ret = tun_do_read(tun, tfile, to, noblock, NULL);
 	ret = min_t(ssize_t, ret, len);
 	if (ret > 0)
 		iocb->ki_pos = ret;
commit c5dab0941fcdc9664eb0ec0d4d51433216d91336
Author: Julian Wiedmann <jwi at linux.ibm.com>
Date:   Fri Nov 20 11:06:57 2020 +0100

    net/af_iucv: set correct sk_protocol for child sockets
    
    Child sockets erroneously inherit their parent's sk_type (ie. SOCK_*),
    instead of the PF_IUCV protocol that the parent was created with in
    iucv_sock_create().
    
    We're currently not using sk->sk_protocol ourselves, so this shouldn't
    have much impact (except eg. getting the output in skb_dump() right).
    
    Fixes: eac3731bd04c ("[S390]: Add AF_IUCV socket support")
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Link: https://lore.kernel.org/r/20201120100657.34407-1-jwi@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
index 047238f01ba6..db7d888914fa 100644
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -1645,7 +1645,7 @@ static int iucv_callback_connreq(struct iucv_path *path,
 	}
 
 	/* Create the new socket */
-	nsk = iucv_sock_alloc(NULL, sk->sk_type, GFP_ATOMIC, 0);
+	nsk = iucv_sock_alloc(NULL, sk->sk_protocol, GFP_ATOMIC, 0);
 	if (!nsk) {
 		err = pr_iucv->path_sever(path, user_data);
 		iucv_path_free(path);
@@ -1851,7 +1851,7 @@ static int afiucv_hs_callback_syn(struct sock *sk, struct sk_buff *skb)
 		goto out;
 	}
 
-	nsk = iucv_sock_alloc(NULL, sk->sk_type, GFP_ATOMIC, 0);
+	nsk = iucv_sock_alloc(NULL, sk->sk_protocol, GFP_ATOMIC, 0);
 	bh_lock_sock(sk);
 	if ((sk->sk_state != IUCV_LISTEN) ||
 	    sk_acceptq_is_full(sk) ||
commit f33d9e2b48a34e1558b67a473a1fc1d6e793f93c
Author: Yves-Alexis Perez <corsac at corsac.net>
Date:   Thu Nov 19 18:24:39 2020 +0100

    usbnet: ipheth: fix connectivity with iOS 14
    
    Starting with iOS 14 released in September 2020, connectivity using the
    personal hotspot USB tethering function of iOS devices is broken.
    
    Communication between the host and the device (for example ICMP traffic
    or DNS resolution using the DNS service running in the device itself)
    works fine, but communication to endpoints further away doesn't work.
    
    Investigation on the matter shows that no UDP and ICMP traffic from the
    tethered host is reaching the Internet at all. For TCP traffic there are
    exchanges between tethered host and server but packets are modified in
    transit leading to impossible communication.
    
    After some trials Matti Vuorela discovered that reducing the URB buffer
    size by two bytes restored the previous behavior. While a better
    solution might exist to fix the issue, since the protocol is not
    publicly documented and considering the small size of the fix, let's do
    that.
    
    Tested-by: Matti Vuorela <matti.vuorela at bitfactor.fi>
    Signed-off-by: Yves-Alexis Perez <corsac at corsac.net>
    Link: https://lore.kernel.org/linux-usb/CAAn0qaXmysJ9vx3ZEMkViv_B19ju-_ExN8Yn_uSefxpjS6g4Lw@mail.gmail.com/
    Link: https://github.com/libimobiledevice/libimobiledevice/issues/1038
    Link: https://lore.kernel.org/r/20201119172439.94988-1-corsac@corsac.net
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c
index b09b45382faf..207e59e74935 100644
--- a/drivers/net/usb/ipheth.c
+++ b/drivers/net/usb/ipheth.c
@@ -59,7 +59,7 @@
 #define IPHETH_USBINTF_SUBCLASS 253
 #define IPHETH_USBINTF_PROTO    1
 
-#define IPHETH_BUF_SIZE         1516
+#define IPHETH_BUF_SIZE         1514
 #define IPHETH_IP_ALIGN		2	/* padding at front of URB */
 #define IPHETH_TX_TIMEOUT       (5 * HZ)
 
commit 659fbdcf2f147010a7624f7eac04f4282814b013
Author: Tom Seewald <tseewald at gmail.com>
Date:   Fri Nov 20 13:25:28 2020 -0600

    cxgb4: Fix build failure when CONFIG_TLS=m
    
    After commit 9d2e5e9eeb59 ("cxgb4/ch_ktls: decrypted bit is not enough")
    whenever CONFIG_TLS=m and CONFIG_CHELSIO_T4=y, the following build
    failure occurs:
    
    ld: drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.o: in function
    `cxgb_select_queue':
    cxgb4_main.c:(.text+0x2dac): undefined reference to `tls_validate_xmit_skb'
    
    Fix this by ensuring that if TLS is set to be a module, CHELSIO_T4 will
    also be compiled as a module. As otherwise the cxgb4 driver will not be
    able to access TLS' symbols.
    
    Fixes: 9d2e5e9eeb59 ("cxgb4/ch_ktls: decrypted bit is not enough")
    Signed-off-by: Tom Seewald <tseewald at gmail.com>
    Link: https://lore.kernel.org/r/20201120192528.615-1-tseewald@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/Kconfig b/drivers/net/ethernet/chelsio/Kconfig
index 87cc0ef68b31..8ba0e08e5e64 100644
--- a/drivers/net/ethernet/chelsio/Kconfig
+++ b/drivers/net/ethernet/chelsio/Kconfig
@@ -68,7 +68,7 @@ config CHELSIO_T3
 
 config CHELSIO_T4
 	tristate "Chelsio Communications T4/T5/T6 Ethernet support"
-	depends on PCI && (IPV6 || IPV6=n)
+	depends on PCI && (IPV6 || IPV6=n) && (TLS || TLS=n)
 	select FW_LOADER
 	select MDIO
 	select ZLIB_DEFLATE
commit b9ad3e9f5a7a760ab068e33e1f18d240ba32ce92
Author: Jamie Iles <jamie at nuviainc.com>
Date:   Fri Nov 20 14:28:27 2020 +0000

    bonding: wait for sysfs kobject destruction before freeing struct slave
    
    syzkaller found that with CONFIG_DEBUG_KOBJECT_RELEASE=y, releasing a
    struct slave device could result in the following splat:
    
      kobject: 'bonding_slave' (00000000cecdd4fe): kobject_release, parent 0000000074ceb2b2 (delayed 1000)
      bond0 (unregistering): (slave bond_slave_1): Releasing backup interface
      ------------[ cut here ]------------
      ODEBUG: free active (active state 0) object type: timer_list hint: workqueue_select_cpu_near kernel/workqueue.c:1549 [inline]
      ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x98 kernel/workqueue.c:1600
      WARNING: CPU: 1 PID: 842 at lib/debugobjects.c:485 debug_print_object+0x180/0x240 lib/debugobjects.c:485
      Kernel panic - not syncing: panic_on_warn set ...
      CPU: 1 PID: 842 Comm: kworker/u4:4 Tainted: G S                5.9.0-rc8+ #96
      Hardware name: linux,dummy-virt (DT)
      Workqueue: netns cleanup_net
      Call trace:
       dump_backtrace+0x0/0x4d8 include/linux/bitmap.h:239
       show_stack+0x34/0x48 arch/arm64/kernel/traps.c:142
       __dump_stack lib/dump_stack.c:77 [inline]
       dump_stack+0x174/0x1f8 lib/dump_stack.c:118
       panic+0x360/0x7a0 kernel/panic.c:231
       __warn+0x244/0x2ec kernel/panic.c:600
       report_bug+0x240/0x398 lib/bug.c:198
       bug_handler+0x50/0xc0 arch/arm64/kernel/traps.c:974
       call_break_hook+0x160/0x1d8 arch/arm64/kernel/debug-monitors.c:322
       brk_handler+0x30/0xc0 arch/arm64/kernel/debug-monitors.c:329
       do_debug_exception+0x184/0x340 arch/arm64/mm/fault.c:864
       el1_dbg+0x48/0xb0 arch/arm64/kernel/entry-common.c:65
       el1_sync_handler+0x170/0x1c8 arch/arm64/kernel/entry-common.c:93
       el1_sync+0x80/0x100 arch/arm64/kernel/entry.S:594
       debug_print_object+0x180/0x240 lib/debugobjects.c:485
       __debug_check_no_obj_freed lib/debugobjects.c:967 [inline]
       debug_check_no_obj_freed+0x200/0x430 lib/debugobjects.c:998
       slab_free_hook mm/slub.c:1536 [inline]
       slab_free_freelist_hook+0x190/0x210 mm/slub.c:1577
       slab_free mm/slub.c:3138 [inline]
       kfree+0x13c/0x460 mm/slub.c:4119
       bond_free_slave+0x8c/0xf8 drivers/net/bonding/bond_main.c:1492
       __bond_release_one+0xe0c/0xec8 drivers/net/bonding/bond_main.c:2190
       bond_slave_netdev_event drivers/net/bonding/bond_main.c:3309 [inline]
       bond_netdev_event+0x8f0/0xa70 drivers/net/bonding/bond_main.c:3420
       notifier_call_chain+0xf0/0x200 kernel/notifier.c:83
       __raw_notifier_call_chain kernel/notifier.c:361 [inline]
       raw_notifier_call_chain+0x44/0x58 kernel/notifier.c:368
       call_netdevice_notifiers_info+0xbc/0x150 net/core/dev.c:2033
       call_netdevice_notifiers_extack net/core/dev.c:2045 [inline]
       call_netdevice_notifiers net/core/dev.c:2059 [inline]
       rollback_registered_many+0x6a4/0xec0 net/core/dev.c:9347
       unregister_netdevice_many.part.0+0x2c/0x1c0 net/core/dev.c:10509
       unregister_netdevice_many net/core/dev.c:10508 [inline]
       default_device_exit_batch+0x294/0x338 net/core/dev.c:10992
       ops_exit_list.isra.0+0xec/0x150 net/core/net_namespace.c:189
       cleanup_net+0x44c/0x888 net/core/net_namespace.c:603
       process_one_work+0x96c/0x18c0 kernel/workqueue.c:2269
       worker_thread+0x3f0/0xc30 kernel/workqueue.c:2415
       kthread+0x390/0x498 kernel/kthread.c:292
       ret_from_fork+0x10/0x18 arch/arm64/kernel/entry.S:925
    
    This is a potential use-after-free if the sysfs nodes are being accessed
    whilst removing the struct slave, so wait for the object destruction to
    complete before freeing the struct slave itself.
    
    Fixes: 07699f9a7c8d ("bonding: add sysfs /slave dir for bond slave devices.")
    Fixes: a068aab42258 ("bonding: Fix reference count leak in bond_sysfs_slave_add.")
    Cc: Qiushi Wu <wu000273 at umn.edu>
    Cc: Jay Vosburgh <j.vosburgh at gmail.com>
    Cc: Veaceslav Falico <vfalico at gmail.com>
    Cc: Andy Gospodarek <andy at greyhouse.net>
    Signed-off-by: Jamie Iles <jamie at nuviainc.com>
    Reviewed-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
    Link: https://lore.kernel.org/r/20201120142827.879226-1-jamie@nuviainc.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 84ecbc6fa0ff..47afc5938c26 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1460,7 +1460,39 @@ static void bond_upper_dev_unlink(struct bonding *bond, struct slave *slave)
 	slave->dev->flags &= ~IFF_SLAVE;
 }
 
-static struct slave *bond_alloc_slave(struct bonding *bond)
+static void slave_kobj_release(struct kobject *kobj)
+{
+	struct slave *slave = to_slave(kobj);
+	struct bonding *bond = bond_get_bond_by_slave(slave);
+
+	cancel_delayed_work_sync(&slave->notify_work);
+	if (BOND_MODE(bond) == BOND_MODE_8023AD)
+		kfree(SLAVE_AD_INFO(slave));
+
+	kfree(slave);
+}
+
+static struct kobj_type slave_ktype = {
+	.release = slave_kobj_release,
+#ifdef CONFIG_SYSFS
+	.sysfs_ops = &slave_sysfs_ops,
+#endif
+};
+
+static int bond_kobj_init(struct slave *slave)
+{
+	int err;
+
+	err = kobject_init_and_add(&slave->kobj, &slave_ktype,
+				   &(slave->dev->dev.kobj), "bonding_slave");
+	if (err)
+		kobject_put(&slave->kobj);
+
+	return err;
+}
+
+static struct slave *bond_alloc_slave(struct bonding *bond,
+				      struct net_device *slave_dev)
 {
 	struct slave *slave = NULL;
 
@@ -1468,11 +1500,17 @@ static struct slave *bond_alloc_slave(struct bonding *bond)
 	if (!slave)
 		return NULL;
 
+	slave->bond = bond;
+	slave->dev = slave_dev;
+
+	if (bond_kobj_init(slave))
+		return NULL;
+
 	if (BOND_MODE(bond) == BOND_MODE_8023AD) {
 		SLAVE_AD_INFO(slave) = kzalloc(sizeof(struct ad_slave_info),
 					       GFP_KERNEL);
 		if (!SLAVE_AD_INFO(slave)) {
-			kfree(slave);
+			kobject_put(&slave->kobj);
 			return NULL;
 		}
 	}
@@ -1481,17 +1519,6 @@ static struct slave *bond_alloc_slave(struct bonding *bond)
 	return slave;
 }
 
-static void bond_free_slave(struct slave *slave)
-{
-	struct bonding *bond = bond_get_bond_by_slave(slave);
-
-	cancel_delayed_work_sync(&slave->notify_work);
-	if (BOND_MODE(bond) == BOND_MODE_8023AD)
-		kfree(SLAVE_AD_INFO(slave));
-
-	kfree(slave);
-}
-
 static void bond_fill_ifbond(struct bonding *bond, struct ifbond *info)
 {
 	info->bond_mode = BOND_MODE(bond);
@@ -1678,14 +1705,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
 			goto err_undo_flags;
 	}
 
-	new_slave = bond_alloc_slave(bond);
+	new_slave = bond_alloc_slave(bond, slave_dev);
 	if (!new_slave) {
 		res = -ENOMEM;
 		goto err_undo_flags;
 	}
 
-	new_slave->bond = bond;
-	new_slave->dev = slave_dev;
 	/* Set the new_slave's queue_id to be zero.  Queue ID mapping
 	 * is set via sysfs or module option if desired.
 	 */
@@ -2007,7 +2032,7 @@ err_restore_mtu:
 	dev_set_mtu(slave_dev, new_slave->original_mtu);
 
 err_free:
-	bond_free_slave(new_slave);
+	kobject_put(&new_slave->kobj);
 
 err_undo_flags:
 	/* Enslave of first slave has failed and we need to fix master's mac */
@@ -2187,7 +2212,7 @@ static int __bond_release_one(struct net_device *bond_dev,
 	if (!netif_is_bond_master(slave_dev))
 		slave_dev->priv_flags &= ~IFF_BONDING;
 
-	bond_free_slave(slave);
+	kobject_put(&slave->kobj);
 
 	return 0;
 }
diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c
index 9b8346638f69..fd07561da034 100644
--- a/drivers/net/bonding/bond_sysfs_slave.c
+++ b/drivers/net/bonding/bond_sysfs_slave.c
@@ -121,7 +121,6 @@ static const struct slave_attribute *slave_attrs[] = {
 };
 
 #define to_slave_attr(_at) container_of(_at, struct slave_attribute, attr)
-#define to_slave(obj)	container_of(obj, struct slave, kobj)
 
 static ssize_t slave_show(struct kobject *kobj,
 			  struct attribute *attr, char *buf)
@@ -132,28 +131,15 @@ static ssize_t slave_show(struct kobject *kobj,
 	return slave_attr->show(slave, buf);
 }
 
-static const struct sysfs_ops slave_sysfs_ops = {
+const struct sysfs_ops slave_sysfs_ops = {
 	.show = slave_show,
 };
 
-static struct kobj_type slave_ktype = {
-#ifdef CONFIG_SYSFS
-	.sysfs_ops = &slave_sysfs_ops,
-#endif
-};
-
 int bond_sysfs_slave_add(struct slave *slave)
 {
 	const struct slave_attribute **a;
 	int err;
 
-	err = kobject_init_and_add(&slave->kobj, &slave_ktype,
-				   &(slave->dev->dev.kobj), "bonding_slave");
-	if (err) {
-		kobject_put(&slave->kobj);
-		return err;
-	}
-
 	for (a = slave_attrs; *a; ++a) {
 		err = sysfs_create_file(&slave->kobj, &((*a)->attr));
 		if (err) {
@@ -171,6 +157,4 @@ void bond_sysfs_slave_del(struct slave *slave)
 
 	for (a = slave_attrs; *a; ++a)
 		sysfs_remove_file(&slave->kobj, &((*a)->attr));
-
-	kobject_put(&slave->kobj);
 }
diff --git a/include/net/bonding.h b/include/net/bonding.h
index 7d132cc1e584..d9d0ff3b0ad3 100644
--- a/include/net/bonding.h
+++ b/include/net/bonding.h
@@ -185,6 +185,11 @@ struct slave {
 	struct rtnl_link_stats64 slave_stats;
 };
 
+static inline struct slave *to_slave(struct kobject *kobj)
+{
+	return container_of(kobj, struct slave, kobj);
+}
+
 struct bond_up_slave {
 	unsigned int	count;
 	struct rcu_head rcu;
@@ -750,6 +755,9 @@ extern struct bond_parm_tbl ad_select_tbl[];
 /* exported from bond_netlink.c */
 extern struct rtnl_link_ops bond_link_ops;
 
+/* exported from bond_sysfs_slave.c */
+extern const struct sysfs_ops slave_sysfs_ops;
+
 static inline netdev_tx_t bond_tx_drop(struct net_device *dev, struct sk_buff *skb)
 {
 	atomic_long_inc(&dev->tx_dropped);
commit a349e4c659609fd20e4beea89e5c4a4038e33a95
Merge: ba911108f4ec eb8409071a1d
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 21 10:36:25 2020 -0800

    Merge tag 'xfs-5.10-fixes-7' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
    
    Pull xfs fixes from Darrick Wong:
     "The critical fixes are for a crash that someone reported in the xattr
      code on 32-bit arm last week; and a revert of the rmap key comparison
      change from last week as it was totally wrong. I need a vacation. :(
    
      Summary:
    
       - Fix various deficiencies in online fsck's metadata checking code
    
       - Fix an integer casting bug in the xattr code on 32-bit systems
    
       - Fix a hang in an inode walk when the inode index is corrupt
    
       - Fix error codes being dropped when initializing per-AG structures
    
       - Fix nowait directio writes that partially succeed but return EAGAIN
    
       - Revert last week's rmap comparison patch because it was wrong"
    
    * tag 'xfs-5.10-fixes-7' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
      xfs: revert "xfs: fix rmap key and record comparison functions"
      xfs: don't allow NOWAIT DIO across extent boundaries
      xfs: return corresponding errcode if xfs_initialize_perag() fail
      xfs: ensure inobt record walks always make forward progress
      xfs: fix forkoff miscalculation related to XFS_LITINO(mp)
      xfs: directory scrub should check the null bestfree entries too
      xfs: strengthen rmap record flags checking
      xfs: fix the minrecs logic when dealing with inode root child blocks

commit ba911108f4ec1643b7b1d1c1db88e4f8451f201b
Merge: ea0ab6430635 7372e79c9eb9
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 21 10:33:33 2020 -0800

    Merge tag 'fsnotify_for_v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
    
    Pull fanotify fix from Jan Kara:
     "A single fanotify fix from Amir"
    
    * tag 'fsnotify_for_v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
      fanotify: fix logic of reporting name info with watched parent

commit ea0ab64306355432746bafda0364fb2d593bc9e3
Merge: 27bba9c532a8 4c222f31fb1d
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 21 10:24:05 2020 -0800

    Merge tag 'seccomp-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
    
    Pull seccomp fixes from Kees Cook:
     "This gets the seccomp selftests running again on powerpc and sh, and
      fixes an audit reporting oversight noticed in both seccomp and ptrace.
    
       - Fix typos in seccomp selftests on powerpc and sh (Kees Cook)
    
       - Fix PF_SUPERPRIV audit marking in seccomp and ptrace (Mickaël
         Salaün)"
    
    * tag 'seccomp-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
      selftests/seccomp: sh: Fix register names
      selftests/seccomp: powerpc: Fix typo in macro variable name
      seccomp: Set PF_SUPERPRIV when checking capability
      ptrace: Set PF_SUPERPRIV when checking capability

commit 487778f8d22fcdebb6436f0a5f96484ffa237b0b
Author: CK Hu <ck.hu at mediatek.com>
Date:   Fri Nov 13 11:49:07 2020 +0800

    drm/mediatek: dsi: Modify horizontal front/back porch byte formula
    
    In the patch to be fixed, horizontal_backporch_byte become too large
    for some panel, so roll back that patch. For small hfp or hbp panel,
    using vm->hfront_porch + vm->hback_porch to calculate
    horizontal_backporch_byte would make it negtive, so
    use horizontal_backporch_byte itself to make it positive.
    
    Fixes: 35bf948f1edb ("drm/mediatek: dsi: Fix scrolling of panel with small hfp or hbp")
    
    Signed-off-by: CK Hu <ck.hu at mediatek.com>
    Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
    Tested-by: Bilal Wasim <bilal.wasim at imgtec.com>

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index 4a188a942c38..65fd99c528af 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -444,7 +444,10 @@ static void mtk_dsi_config_vdo_timing(struct mtk_dsi *dsi)
 	u32 horizontal_sync_active_byte;
 	u32 horizontal_backporch_byte;
 	u32 horizontal_frontporch_byte;
+	u32 horizontal_front_back_byte;
+	u32 data_phy_cycles_byte;
 	u32 dsi_tmp_buf_bpp, data_phy_cycles;
+	u32 delta;
 	struct mtk_phy_timing *timing = &dsi->phy_timing;
 
 	struct videomode *vm = &dsi->vm;
@@ -466,50 +469,30 @@ static void mtk_dsi_config_vdo_timing(struct mtk_dsi *dsi)
 	horizontal_sync_active_byte = (vm->hsync_len * dsi_tmp_buf_bpp - 10);
 
 	if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
-		horizontal_backporch_byte = vm->hback_porch * dsi_tmp_buf_bpp;
+		horizontal_backporch_byte = vm->hback_porch * dsi_tmp_buf_bpp - 10;
 	else
 		horizontal_backporch_byte = (vm->hback_porch + vm->hsync_len) *
-					    dsi_tmp_buf_bpp;
+					    dsi_tmp_buf_bpp - 10;
 
 	data_phy_cycles = timing->lpx + timing->da_hs_prepare +
-			  timing->da_hs_zero + timing->da_hs_exit;
-
-	if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) {
-		if ((vm->hfront_porch + vm->hback_porch) * dsi_tmp_buf_bpp >
-		    data_phy_cycles * dsi->lanes + 18) {
-			horizontal_frontporch_byte =
-				vm->hfront_porch * dsi_tmp_buf_bpp -
-				(data_phy_cycles * dsi->lanes + 18) *
-				vm->hfront_porch /
-				(vm->hfront_porch + vm->hback_porch);
-
-			horizontal_backporch_byte =
-				horizontal_backporch_byte -
-				(data_phy_cycles * dsi->lanes + 18) *
-				vm->hback_porch /
-				(vm->hfront_porch + vm->hback_porch);
-		} else {
-			DRM_WARN("HFP less than d-phy, FPS will under 60Hz\n");
-			horizontal_frontporch_byte = vm->hfront_porch *
-						     dsi_tmp_buf_bpp;
-		}
+			  timing->da_hs_zero + timing->da_hs_exit + 3;
+
+	delta = dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST ? 18 : 12;
+
+	horizontal_frontporch_byte = vm->hfront_porch * dsi_tmp_buf_bpp;
+	horizontal_front_back_byte = horizontal_frontporch_byte + horizontal_backporch_byte;
+	data_phy_cycles_byte = data_phy_cycles * dsi->lanes + delta;
+
+	if (horizontal_front_back_byte > data_phy_cycles_byte) {
+		horizontal_frontporch_byte -= data_phy_cycles_byte *
+					      horizontal_frontporch_byte /
+					      horizontal_front_back_byte;
+
+		horizontal_backporch_byte -= data_phy_cycles_byte *
+					     horizontal_backporch_byte /
+					     horizontal_front_back_byte;
 	} else {
-		if ((vm->hfront_porch + vm->hback_porch) * dsi_tmp_buf_bpp >
-		    data_phy_cycles * dsi->lanes + 12) {
-			horizontal_frontporch_byte =
-				vm->hfront_porch * dsi_tmp_buf_bpp -
-				(data_phy_cycles * dsi->lanes + 12) *
-				vm->hfront_porch /
-				(vm->hfront_porch + vm->hback_porch);
-			horizontal_backporch_byte = horizontal_backporch_byte -
-				(data_phy_cycles * dsi->lanes + 12) *
-				vm->hback_porch /
-				(vm->hfront_porch + vm->hback_porch);
-		} else {
-			DRM_WARN("HFP less than d-phy, FPS will under 60Hz\n");
-			horizontal_frontporch_byte = vm->hfront_porch *
-						     dsi_tmp_buf_bpp;
-		}
+		DRM_WARN("HFP + HBP less than d-phy, FPS will under 60Hz\n");
 	}
 
 	writel(horizontal_sync_active_byte, dsi->regs + DSI_HSA_WC);
commit 207d0bfc08f1553ac9cec4f3a2c31936319368c5
Merge: e10823c71920 7ed10e16e50d
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Fri Nov 20 18:59:50 2020 -0800

    Merge branch 's390-qeth-fixes-2020-11-20'
    
    Julian Wiedmann says:
    
    ====================
    s390/qeth: fixes 2020-11-20
    
    This brings several fixes for qeth's af_iucv-specific code paths.
    
    Also one fix by Alexandra for the recently added BR_LEARNING_SYNC
    support. We want to trust the feature indication bit, so that HW can
    mask it out if there's any issues on their end.
    ====================
    
    Link: https://lore.kernel.org/r/20201120090939.101406-1-jwi@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 7ed10e16e50daf74460f54bc922e27c6863c8d61
Author: Julian Wiedmann <jwi at linux.ibm.com>
Date:   Fri Nov 20 10:09:39 2020 +0100

    s390/qeth: fix tear down of async TX buffers
    
    When qeth_iqd_tx_complete() detects that a TX buffer requires additional
    async completion via QAOB, it might fail to replace the queue entry's
    metadata (and ends up triggering recovery).
    
    Assume now that the device gets torn down, overruling the recovery.
    If the QAOB notification then arrives before the tear down has
    sufficiently progressed, the buffer state is changed to
    QETH_QDIO_BUF_HANDLED_DELAYED by qeth_qdio_handle_aob().
    
    The tear down code calls qeth_drain_output_queue(), where
    qeth_cleanup_handled_pending() will then attempt to replace such a
    buffer _again_. If it succeeds this time, the buffer ends up dangling in
    its replacement's ->next_pending list ... where it will never be freed,
    since there's no further call to qeth_cleanup_handled_pending().
    
    But the second attempt isn't actually needed, we can simply leave the
    buffer on the queue and re-use it after a potential recovery has
    completed. The qeth_clear_output_buffer() in qeth_drain_output_queue()
    will ensure that it's in a clean state again.
    
    Fixes: 72861ae792c2 ("qeth: recovery through asynchronous delivery")
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 48f9e4a027bf..e27319de7b00 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -500,12 +500,6 @@ static void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, int bidx,
 
 		}
 	}
-	if (forced_cleanup && (atomic_read(&(q->bufs[bidx]->state)) ==
-					QETH_QDIO_BUF_HANDLED_DELAYED)) {
-		/* for recovery situations */
-		qeth_init_qdio_out_buf(q, bidx);
-		QETH_CARD_TEXT(q->card, 2, "clprecov");
-	}
 }
 
 static void qeth_qdio_handle_aob(struct qeth_card *card,
commit 8908f36d20d8ba610d3a7d110b3049b5853b9bb1
Author: Julian Wiedmann <jwi at linux.ibm.com>
Date:   Fri Nov 20 10:09:38 2020 +0100

    s390/qeth: fix af_iucv notification race
    
    The two expected notification sequences are
    1. TX_NOTIFY_PENDING with a subsequent TX_NOTIFY_DELAYED_*, when
       our TX completion code first observed the pending TX and the QAOB
       then completes at a later time; or
    2. TX_NOTIFY_OK, when qeth_qdio_handle_aob() picked up the QAOB
       completion before our TX completion code even noticed that the TX
       was pending.
    
    But as qeth_iqd_tx_complete() and qeth_qdio_handle_aob() can run
    concurrently, we may end up with a race that results in a sequence of
    TX_NOTIFY_DELAYED_* followed by TX_NOTIFY_PENDING. Which would confuse
    the af_iucv code in its tracking of pending transmits.
    
    Rework the notification code, so that qeth_qdio_handle_aob() defers its
    notification if the TX completion code is still active.
    
    Fixes: b333293058aa ("qeth: add support for af_iucv HiperSockets transport")
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index f73b4756ed5e..b235393e091c 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -417,10 +417,13 @@ enum qeth_qdio_out_buffer_state {
 	QETH_QDIO_BUF_EMPTY,
 	/* Filled by driver; owned by hardware in order to be sent. */
 	QETH_QDIO_BUF_PRIMED,
-	/* Identified to be pending in TPQ. */
+	/* Discovered by the TX completion code: */
 	QETH_QDIO_BUF_PENDING,
-	/* Found in completion queue. */
-	QETH_QDIO_BUF_IN_CQ,
+	/* Finished by the TX completion code: */
+	QETH_QDIO_BUF_NEED_QAOB,
+	/* Received QAOB notification on CQ: */
+	QETH_QDIO_BUF_QAOB_OK,
+	QETH_QDIO_BUF_QAOB_ERROR,
 	/* Handled via transfer pending / completion queue. */
 	QETH_QDIO_BUF_HANDLED_DELAYED,
 };
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 715f440bdc7c..48f9e4a027bf 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -511,6 +511,7 @@ static void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, int bidx,
 static void qeth_qdio_handle_aob(struct qeth_card *card,
 				 unsigned long phys_aob_addr)
 {
+	enum qeth_qdio_out_buffer_state new_state = QETH_QDIO_BUF_QAOB_OK;
 	struct qaob *aob;
 	struct qeth_qdio_out_buffer *buffer;
 	enum iucv_tx_notify notification;
@@ -522,22 +523,6 @@ static void qeth_qdio_handle_aob(struct qeth_card *card,
 	buffer = (struct qeth_qdio_out_buffer *) aob->user1;
 	QETH_CARD_TEXT_(card, 5, "%lx", aob->user1);
 
-	if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
-			   QETH_QDIO_BUF_IN_CQ) == QETH_QDIO_BUF_PRIMED) {
-		notification = TX_NOTIFY_OK;
-	} else {
-		WARN_ON_ONCE(atomic_read(&buffer->state) !=
-							QETH_QDIO_BUF_PENDING);
-		atomic_set(&buffer->state, QETH_QDIO_BUF_IN_CQ);
-		notification = TX_NOTIFY_DELAYED_OK;
-	}
-
-	if (aob->aorc != 0)  {
-		QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
-		notification = qeth_compute_cq_notification(aob->aorc, 1);
-	}
-	qeth_notify_skbs(buffer->q, buffer, notification);
-
 	/* Free dangling allocations. The attached skbs are handled by
 	 * qeth_cleanup_handled_pending().
 	 */
@@ -549,7 +534,33 @@ static void qeth_qdio_handle_aob(struct qeth_card *card,
 		if (data && buffer->is_header[i])
 			kmem_cache_free(qeth_core_header_cache, data);
 	}
-	atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
+
+	if (aob->aorc) {
+		QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
+		new_state = QETH_QDIO_BUF_QAOB_ERROR;
+	}
+
+	switch (atomic_xchg(&buffer->state, new_state)) {
+	case QETH_QDIO_BUF_PRIMED:
+		/* Faster than TX completion code. */
+		notification = qeth_compute_cq_notification(aob->aorc, 0);
+		qeth_notify_skbs(buffer->q, buffer, notification);
+		atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
+		break;
+	case QETH_QDIO_BUF_PENDING:
+		/* TX completion code is active and will handle the async
+		 * completion for us.
+		 */
+		break;
+	case QETH_QDIO_BUF_NEED_QAOB:
+		/* TX completion code is already finished. */
+		notification = qeth_compute_cq_notification(aob->aorc, 1);
+		qeth_notify_skbs(buffer->q, buffer, notification);
+		atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
+		break;
+	default:
+		WARN_ON_ONCE(1);
+	}
 
 	qdio_release_aob(aob);
 }
@@ -1417,9 +1428,6 @@ static void qeth_tx_complete_buf(struct qeth_qdio_out_buffer *buf, bool error,
 	struct qeth_qdio_out_q *queue = buf->q;
 	struct sk_buff *skb;
 
-	/* release may never happen from within CQ tasklet scope */
-	WARN_ON_ONCE(atomic_read(&buf->state) == QETH_QDIO_BUF_IN_CQ);
-
 	if (atomic_read(&buf->state) == QETH_QDIO_BUF_PENDING)
 		qeth_notify_skbs(queue, buf, TX_NOTIFY_GENERALERROR);
 
@@ -5870,9 +5878,32 @@ static void qeth_iqd_tx_complete(struct qeth_qdio_out_q *queue,
 
 		if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
 						   QETH_QDIO_BUF_PENDING) ==
-		    QETH_QDIO_BUF_PRIMED)
+		    QETH_QDIO_BUF_PRIMED) {
 			qeth_notify_skbs(queue, buffer, TX_NOTIFY_PENDING);
 
+			/* Handle race with qeth_qdio_handle_aob(): */
+			switch (atomic_xchg(&buffer->state,
+					    QETH_QDIO_BUF_NEED_QAOB)) {
+			case QETH_QDIO_BUF_PENDING:
+				/* No concurrent QAOB notification. */
+				break;
+			case QETH_QDIO_BUF_QAOB_OK:
+				qeth_notify_skbs(queue, buffer,
+						 TX_NOTIFY_DELAYED_OK);
+				atomic_set(&buffer->state,
+					   QETH_QDIO_BUF_HANDLED_DELAYED);
+				break;
+			case QETH_QDIO_BUF_QAOB_ERROR:
+				qeth_notify_skbs(queue, buffer,
+						 TX_NOTIFY_DELAYED_GENERALERROR);
+				atomic_set(&buffer->state,
+					   QETH_QDIO_BUF_HANDLED_DELAYED);
+				break;
+			default:
+				WARN_ON_ONCE(1);
+			}
+		}
+
 		QETH_CARD_TEXT_(card, 5, "pel%u", bidx);
 
 		/* prepare the queue slot for re-use: */
commit 34c7f50f7d0d36fa663c74aee39e25e912505320
Author: Julian Wiedmann <jwi at linux.ibm.com>
Date:   Fri Nov 20 10:09:37 2020 +0100

    s390/qeth: make af_iucv TX notification call more robust
    
    Calling into socket code is ugly already, at least check whether we are
    dealing with the expected sk_family. Only looking at skb->protocol is
    bound to cause troubles (consider eg. af_packet).
    
    Fixes: b333293058aa ("qeth: add support for af_iucv HiperSockets transport")
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 93c9b30ab17a..715f440bdc7c 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -33,6 +33,7 @@
 
 #include <net/iucv/af_iucv.h>
 #include <net/dsfield.h>
+#include <net/sock.h>
 
 #include <asm/ebcdic.h>
 #include <asm/chpid.h>
@@ -1405,7 +1406,7 @@ static void qeth_notify_skbs(struct qeth_qdio_out_q *q,
 	skb_queue_walk(&buf->skb_list, skb) {
 		QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
 		QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
-		if (skb->protocol == htons(ETH_P_AF_IUCV) && skb->sk)
+		if (skb->sk && skb->sk->sk_family == PF_IUCV)
 			iucv_sk(skb->sk)->sk_txnotify(skb, notification);
 	}
 }
commit 0d0e2b538c13f4f698ba58485a573ce824036567
Author: Alexandra Winter <wintera at linux.ibm.com>
Date:   Fri Nov 20 10:09:36 2020 +0100

    s390/qeth: Remove pnso workaround
    
    Remove workaround that supported early hardware implementations
    of PNSO OC3. Rely on the 'enarf' feature bit instead.
    
    Fixes: fa115adff2c1 ("s390/qeth: Detect PNSO OC3 capability")
    Signed-off-by: Alexandra Winter <wintera at linux.ibm.com>
    Reviewed-by: Julian Wiedmann <jwi at linux.ibm.com>
    [jwi: use logical instead of bit-wise AND]
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 28f6dda95736..79939ba5d523 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -985,32 +985,19 @@ static void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card)
  *	change notification' and thus can support the learning_sync bridgeport
  *	attribute
  *	@card: qeth_card structure pointer
- *
- *	This is a destructive test and must be called before dev2br or
- *	bridgeport address notification is enabled!
  */
 static void qeth_l2_detect_dev2br_support(struct qeth_card *card)
 {
 	struct qeth_priv *priv = netdev_priv(card->dev);
 	bool dev2br_supported;
-	int rc;
 
 	QETH_CARD_TEXT(card, 2, "d2brsup");
 	if (!IS_IQD(card))
 		return;
 
 	/* dev2br requires valid cssid,iid,chid */
-	if (!card->info.ids_valid) {
-		dev2br_supported = false;
-	} else if (css_general_characteristics.enarf) {
-		dev2br_supported = true;
-	} else {
-		/* Old machines don't have the feature bit:
-		 * Probe by testing whether a disable succeeds
-		 */
-		rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, NULL, NULL);
-		dev2br_supported = !rc;
-	}
+	dev2br_supported = card->info.ids_valid &&
+			   css_general_characteristics.enarf;
 	QETH_CARD_TEXT_(card, 2, "D2Bsup%02x", dev2br_supported);
 
 	if (dev2br_supported)
@@ -2233,7 +2220,6 @@ static int qeth_l2_set_online(struct qeth_card *card, bool carrier_ok)
 	struct net_device *dev = card->dev;
 	int rc = 0;
 
-	/* query before bridgeport_notification may be enabled */
 	qeth_l2_detect_dev2br_support(card);
 
 	mutex_lock(&card->sbp_lock);
commit e10823c71920c6fd54ab85677f001d7978bcb3ae
Merge: d2624e70a2f5 55472017a421
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Fri Nov 20 18:10:47 2020 -0800

    Merge branch 'tcp-address-issues-with-ect0-not-being-set-in-dctcp-packets'
    
    Alexander Duyck says:
    
    ====================
    tcp: Address issues with ECT0 not being set in DCTCP packets
    
    This patch set is meant to address issues seen with SYN/ACK packets not
    containing the ECT0 bit when DCTCP is configured as the congestion control
    algorithm for a TCP socket.
    
    A simple test using "tcpdump" and "test_progs -t bpf_tcp_ca" makes the
    issue obvious. Looking at the packets will result in the SYN/ACK packet
    with an ECT0 bit that does not match the other packets for the flow when
    the congestion control agorithm is switch from the default. So for example
    going from non-DCTCP to a DCTCP congestion control algorithm we will see
    the SYN/ACK IPV6 header will not have ECT0 set while the other packets in
    the flow will. Likewise if we switch from a default of DCTCP to cubic we
    will see the ECT0 bit set in the SYN/ACK while the other packets in the
    flow will not.
    ====================
    
    Link: https://lore.kernel.org/r/160582070138.66684.11785214534154816097.stgit@localhost.localdomain
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 55472017a4219ca965a957584affdb17549ae4a4
Author: Alexander Duyck <alexanderduyck at fb.com>
Date:   Thu Nov 19 13:23:58 2020 -0800

    tcp: Set INET_ECN_xmit configuration in tcp_reinit_congestion_control
    
    When setting congestion control via a BPF program it is seen that the
    SYN/ACK for packets within a given flow will not include the ECT0 flag. A
    bit of simple printk debugging shows that when this is configured without
    BPF we will see the value INET_ECN_xmit value initialized in
    tcp_assign_congestion_control however when we configure this via BPF the
    socket is in the closed state and as such it isn't configured, and I do not
    see it being initialized when we transition the socket into the listen
    state. The result of this is that the ECT0 bit is configured based on
    whatever the default state is for the socket.
    
    Any easy way to reproduce this is to monitor the following with tcpdump:
    tools/testing/selftests/bpf/test_progs -t bpf_tcp_ca
    
    Without this patch the SYN/ACK will follow whatever the default is. If dctcp
    all SYN/ACK packets will have the ECT0 bit set, and if it is not then ECT0
    will be cleared on all SYN/ACK packets. With this patch applied the SYN/ACK
    bit matches the value seen on the other packets in the given stream.
    
    Fixes: 91b5b21c7c16 ("bpf: Add support for changing congestion control")
    Signed-off-by: Alexander Duyck <alexanderduyck at fb.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c
index db47ac24d057..563d016e7478 100644
--- a/net/ipv4/tcp_cong.c
+++ b/net/ipv4/tcp_cong.c
@@ -198,6 +198,11 @@ static void tcp_reinit_congestion_control(struct sock *sk,
 	icsk->icsk_ca_setsockopt = 1;
 	memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv));
 
+	if (ca->flags & TCP_CONG_NEEDS_ECN)
+		INET_ECN_xmit(sk);
+	else
+		INET_ECN_dontxmit(sk);
+
 	if (!((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)))
 		tcp_init_congestion_control(sk);
 }
commit 861602b57730a5c6d3e0b1e4ca7133ca9a8b8538
Author: Alexander Duyck <alexanderduyck at fb.com>
Date:   Thu Nov 19 13:23:51 2020 -0800

    tcp: Allow full IP tos/IPv6 tclass to be reflected in L3 header
    
    An issue was recently found where DCTCP SYN/ACK packets did not have the
    ECT bit set in the L3 header. A bit of code review found that the recent
    change referenced below had gone though and added a mask that prevented the
    ECN bits from being populated in the L3 header.
    
    This patch addresses that by rolling back the mask so that it is only
    applied to the flags coming from the incoming TCP request instead of
    applying it to the socket tos/tclass field. Doing this the ECT bits were
    restored in the SYN/ACK packets in my testing.
    
    One thing that is not addressed by this patch set is the fact that
    tcp_reflect_tos appears to be incompatible with ECN based congestion
    avoidance algorithms. At a minimum the feature should likely be documented
    which it currently isn't.
    
    Fixes: ac8f1710c12b ("tcp: reflect tos value received in SYN to the socket")
    Signed-off-by: Alexander Duyck <alexanderduyck at fb.com>
    Acked-by: Wei Wang <weiwan at google.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 7352c097ae48..25d35a56ceba 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -981,7 +981,8 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,
 	skb = tcp_make_synack(sk, dst, req, foc, synack_type, syn_skb);
 
 	tos = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
-			tcp_rsk(req)->syn_tos : inet_sk(sk)->tos;
+			tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
+			inet_sk(sk)->tos;
 
 	if (skb) {
 		__tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr);
@@ -990,7 +991,7 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,
 		err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr,
 					    ireq->ir_rmt_addr,
 					    rcu_dereference(ireq->ireq_opt),
-					    tos & ~INET_ECN_MASK);
+					    tos);
 		rcu_read_unlock();
 		err = net_xmit_eval(err);
 	}
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 8db59f4e5f13..3d49e8d0afee 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -530,12 +530,12 @@ static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
 		rcu_read_lock();
 		opt = ireq->ipv6_opt;
 		tclass = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
-				tcp_rsk(req)->syn_tos : np->tclass;
+				tcp_rsk(req)->syn_tos & ~INET_ECN_MASK :
+				np->tclass;
 		if (!opt)
 			opt = rcu_dereference(np->opt);
 		err = ip6_xmit(sk, skb, fl6, sk->sk_mark, opt,
-			       tclass & ~INET_ECN_MASK,
-			       sk->sk_priority);
+			       tclass, sk->sk_priority);
 		rcu_read_unlock();
 		err = net_xmit_eval(err);
 	}
commit 27bba9c532a8d21050b94224ffd310ad0058c353
Merge: 4fd84bc96929 f36199355c64
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 16:24:28 2020 -0800

    Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
    
    Pull SCSI fixes from James Bottomley:
     "Fixes for two fairly obscure but annoying when triggered races in
      iSCSI"
    
    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
      scsi: target: iscsi: Fix cmd abort fabric stop race
      scsi: libiscsi: Fix NOP race condition

commit d2624e70a2f53b6f402fdaeabe7db798148618c5
Author: Ioana Ciornei <ioana.ciornei at nxp.com>
Date:   Thu Nov 19 16:51:06 2020 +0200

    dpaa2-eth: select XGMAC_MDIO for MDIO bus support
    
    Explicitly enable the FSL_XGMAC_MDIO Kconfig option in order to have
    MDIO access to internal and external PHYs.
    
    Fixes: 719479230893 ("dpaa2-eth: add MAC/PHY support through phylink")
    Signed-off-by: Ioana Ciornei <ioana.ciornei at nxp.com>
    Link: https://lore.kernel.org/r/20201119145106.712761-1-ciorneiioana@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/dpaa2/Kconfig b/drivers/net/ethernet/freescale/dpaa2/Kconfig
index cfd369cf4c8c..c0e05f71826d 100644
--- a/drivers/net/ethernet/freescale/dpaa2/Kconfig
+++ b/drivers/net/ethernet/freescale/dpaa2/Kconfig
@@ -4,6 +4,7 @@ config FSL_DPAA2_ETH
 	depends on FSL_MC_BUS && FSL_MC_DPIO
 	select PHYLINK
 	select PCS_LYNX
+	select FSL_XGMAC_MDIO
 	help
 	  This is the DPAA2 Ethernet driver supporting Freescale SoCs
 	  with DPAA2 (DataPath Acceleration Architecture v2).
commit 4fd84bc9692958cd07b3a3320dba26baa04a17d0
Merge: fa5fca78bb2f 45f703a0d4b8
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 12:03:40 2020 -0800

    Merge tag 'block-5.10-2020-11-20' of git://git.kernel.dk/linux-block
    
    Pull block fixes from Jens Axboe:
    
     - NVMe pull request from Christoph:
          - Doorbell Buffer freeing fix (Minwoo Im)
          - CSE log leak fix (Keith Busch)
    
     - blk-cgroup hd_struct leak fix (Christoph)
    
     - Flush request state fix (Ming)
    
     - dasd NULL deref fix (Stefan)
    
    * tag 'block-5.10-2020-11-20' of git://git.kernel.dk/linux-block:
      s390/dasd: fix null pointer dereference for ERP requests
      blk-cgroup: fix a hd_struct leak in blkcg_fill_root_iostats
      nvme: fix memory leak freeing command effects
      nvme: directly cache command effects log
      nvme: free sq/cq dbbuf pointers when dbbuf set fails
      block: mark flush request as IDLE when it is really finished

commit fa5fca78bb2fe7a58ae7297407dcda1914ea8353
Merge: 4ccf7a01e805 e297822b20e7
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 11:47:22 2020 -0800

    Merge tag 'io_uring-5.10-2020-11-20' of git://git.kernel.dk/linux-block
    
    Pull io_uring fixes from Jens Axboe:
     "Mostly regression or stable fodder:
    
       - Disallow async path resolution of /proc/self
    
       - Tighten constraints for segmented async buffered reads
    
       - Fix double completion for a retry error case
    
       - Fix for fixed file life times (Pavel)"
    
    * tag 'io_uring-5.10-2020-11-20' of git://git.kernel.dk/linux-block:
      io_uring: order refnode recycling
      io_uring: get an active ref_node from files_data
      io_uring: don't double complete failed reissue request
      mm: never attempt async page lock if we've transferred data already
      io_uring: handle -EOPNOTSUPP on path resolution
      proc: don't allow async path resolution of /proc/self components

commit bff453921ae105a8dbbad0ed7dd5f5ce424536e7
Author: Raju Rangoju <rajur at chelsio.com>
Date:   Wed Nov 18 20:02:13 2020 +0530

    cxgb4: fix the panic caused by non smac rewrite
    
    SMT entry is allocated only when loopback Source MAC
    rewriting is requested. Accessing SMT entry for non
    smac rewrite cases results in kernel panic.
    
    Fix the panic caused by non smac rewrite
    
    Fixes: 937d84205884 ("cxgb4: set up filter action after rewrites")
    Signed-off-by: Raju Rangoju <rajur at chelsio.com>
    Link: https://lore.kernel.org/r/20201118143213.13319-1-rajur@chelsio.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
index 4e55f7081644..83b46440408b 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
@@ -880,7 +880,8 @@ int set_filter_wr(struct adapter *adapter, int fidx)
 		 FW_FILTER_WR_OVLAN_VLD_V(f->fs.val.ovlan_vld) |
 		 FW_FILTER_WR_IVLAN_VLDM_V(f->fs.mask.ivlan_vld) |
 		 FW_FILTER_WR_OVLAN_VLDM_V(f->fs.mask.ovlan_vld));
-	fwr->smac_sel = f->smt->idx;
+	if (f->fs.newsmac)
+		fwr->smac_sel = f->smt->idx;
 	fwr->rx_chan_rx_rpl_iq =
 		htons(FW_FILTER_WR_RX_CHAN_V(0) |
 		      FW_FILTER_WR_RX_RPL_IQ_V(adapter->sge.fw_evtq.abs_id));
commit 4c222f31fb1db4d590503a181a6268ced9252379
Author: Kees Cook <keescook at chromium.org>
Date:   Tue Nov 17 11:54:43 2020 -0800

    selftests/seccomp: sh: Fix register names
    
    It looks like the seccomp selftests was never actually built for sh.
    This fixes it, though I don't have an environment to do a runtime test
    of it yet.
    
    Fixes: 0bb605c2c7f2b4b3 ("sh: Add SECCOMP_FILTER")
    Tested-by: John Paul Adrian Glaubitz <glaubitz at physik.fu-berlin.de>
    Link: https://lore.kernel.org/lkml/a36d7b48-6598-1642-e403-0c77a86f416d@physik.fu-berlin.de
    Signed-off-by: Kees Cook <keescook at chromium.org>

diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c
index 7f7ecfcd66db..26c72f2b61b1 100644
--- a/tools/testing/selftests/seccomp/seccomp_bpf.c
+++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
@@ -1804,8 +1804,8 @@ TEST_F(TRACE_poke, getpid_runs_normally)
 #define SYSCALL_RET(_regs)	(_regs).a[(_regs).windowbase * 4 + 2]
 #elif defined(__sh__)
 # define ARCH_REGS		struct pt_regs
-# define SYSCALL_NUM(_regs)	(_regs).gpr[3]
-# define SYSCALL_RET(_regs)	(_regs).gpr[0]
+# define SYSCALL_NUM(_regs)	(_regs).regs[3]
+# define SYSCALL_RET(_regs)	(_regs).regs[0]
 #else
 # error "Do not know how to find your architecture's registers and syscalls"
 #endif
commit f5098e34dd4c774c3040e417960f1637e5daade8
Author: Kees Cook <keescook at chromium.org>
Date:   Tue Nov 17 11:33:02 2020 -0800

    selftests/seccomp: powerpc: Fix typo in macro variable name
    
    A typo sneaked into the powerpc selftest. Fix the name so it builds again.
    
    Fixes: 46138329faea ("selftests/seccomp: powerpc: Fix seccomp return value testing")
    Acked-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/lkml/87y2ix2895.fsf@mpe.ellerman.id.au
    Signed-off-by: Kees Cook <keescook at chromium.org>

diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c
index 4a180439ee9e..7f7ecfcd66db 100644
--- a/tools/testing/selftests/seccomp/seccomp_bpf.c
+++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
@@ -1758,10 +1758,10 @@ TEST_F(TRACE_poke, getpid_runs_normally)
 		 * and the code is stored as a positive value.	\
 		 */						\
 		if (_result < 0) {				\
-			SYSCALL_RET(_regs) = -result;		\
+			SYSCALL_RET(_regs) = -_result;		\
 			(_regs).ccr |= 0x10000000;		\
 		} else {					\
-			SYSCALL_RET(_regs) = result;		\
+			SYSCALL_RET(_regs) = _result;		\
 			(_regs).ccr &= ~0x10000000;		\
 		}						\
 	} while (0)
commit 47a846536e1bf62626f1c0d8488f3718ce5f8296
Author: Eric Biggers <ebiggers at google.com>
Date:   Wed Nov 11 13:48:55 2020 -0800

    block/keyslot-manager: prevent crash when num_slots=1
    
    If there is only one keyslot, then blk_ksm_init() computes
    slot_hashtable_size=1 and log_slot_ht_size=0.  This causes
    blk_ksm_find_keyslot() to crash later because it uses
    hash_ptr(key, log_slot_ht_size) to find the hash bucket containing the
    key, and hash_ptr() doesn't support the bits == 0 case.
    
    Fix this by making the hash table always have at least 2 buckets.
    
    Tested by running:
    
        kvm-xfstests -c ext4 -g encrypt -m inlinecrypt \
                     -o blk-crypto-fallback.num_keyslots=1
    
    Fixes: 1b2628397058 ("block: Keyslot Manager for Inline Encryption")
    Signed-off-by: Eric Biggers <ebiggers at google.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/block/keyslot-manager.c b/block/keyslot-manager.c
index 35abcb1ec051..86f8195d8039 100644
--- a/block/keyslot-manager.c
+++ b/block/keyslot-manager.c
@@ -103,6 +103,13 @@ int blk_ksm_init(struct blk_keyslot_manager *ksm, unsigned int num_slots)
 	spin_lock_init(&ksm->idle_slots_lock);
 
 	slot_hashtable_size = roundup_pow_of_two(num_slots);
+	/*
+	 * hash_ptr() assumes bits != 0, so ensure the hash table has at least 2
+	 * buckets.  This only makes a difference when there is only 1 keyslot.
+	 */
+	if (slot_hashtable_size < 2)
+		slot_hashtable_size = 2;
+
 	ksm->log_slot_ht_size = ilog2(slot_hashtable_size);
 	ksm->slot_hashtable = kvmalloc_array(slot_hashtable_size,
 					     sizeof(ksm->slot_hashtable[0]),
commit 4ccf7a01e805f04defd423fb410f47a13af76399
Merge: bd4d74e8f8b2 65cae18882f9
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 10:30:48 2020 -0800

    Merge tag 'for-linus-5.10b-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
    
    Pull xen fix from Juergen Gross:
     "A single fix for avoiding WARN splats when booting a Xen guest with
      nosmt"
    
    * tag 'for-linus-5.10b-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
      x86/xen: don't unbind uninitialized lock_kicker_irq

commit 20ffc7adf53a5fd3d19751fbff7895bcca66686e
Author: Vadim Fedorenko <vfedorenko at novek.ru>
Date:   Thu Nov 19 18:59:48 2020 +0300

    net/tls: missing received data after fast remote close
    
    In case when tcp socket received FIN after some data and the
    parser haven't started before reading data caller will receive
    an empty buffer. This behavior differs from plain TCP socket and
    leads to special treating in user-space.
    The flow that triggers the race is simple. Server sends small
    amount of data right after the connection is configured to use TLS
    and closes the connection. In this case receiver sees TLS Handshake
    data, configures TLS socket right after Change Cipher Spec record.
    While the configuration is in process, TCP socket receives small
    Application Data record, Encrypted Alert record and FIN packet. So
    the TCP socket changes sk_shutdown to RCV_SHUTDOWN and sk_flag with
    SK_DONE bit set. The received data is not parsed upon arrival and is
    never sent to user-space.
    
    Patch unpauses parser directly if we have unparsed data in tcp
    receive queue.
    
    Fixes: fcf4793e278e ("tls: check RCV_SHUTDOWN in tls_wait_data")
    Signed-off-by: Vadim Fedorenko <vfedorenko at novek.ru>
    Link: https://lore.kernel.org/r/1605801588-12236-1-git-send-email-vfedorenko@novek.ru
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index 2fe9e2cf8659..845c628ac1b2 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -1295,6 +1295,12 @@ static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock,
 			return NULL;
 		}
 
+		if (!skb_queue_empty(&sk->sk_receive_queue)) {
+			__strp_unpause(&ctx->strp);
+			if (ctx->recv_pkt)
+				return ctx->recv_pkt;
+		}
+
 		if (sk->sk_shutdown & RCV_SHUTDOWN)
 			return NULL;
 
commit bd4d74e8f8b201caf4dab064b8bc7d01a72747da
Merge: fc8299f9f3b9 7e4be1290a38
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 10:23:49 2020 -0800

    Merge tag 'dmaengine-fix-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine
    
    Pull dmaengine fixes from Vinod Koul:
     "A solitary core fix and a few driver fixes:
    
      Core:
    
       - channel_register error handling
    
      Driver fixes:
    
       - idxd: wq config registers programming and mapping of portal size
    
       - ioatdma: unused fn removal
    
       - pl330: fix burst size
    
       - ti: pm fix on busy and -Wenum-conversion warns
    
       - xilinx: SG capability check, usage of xilinx_aximcdma_tx_segment,
         readl_poll_timeout_atomic variant"
    
    * tag 'dmaengine-fix-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine:
      dmaengine: fix error codes in channel_register()
      dmaengine: pl330: _prep_dma_memcpy: Fix wrong burst size
      dmaengine: ioatdma: remove unused function missed during dma_v2 removal
      dmaengine: idxd: fix mapping of portal size
      dmaengine: ti: omap-dma: Block PM if SDMA is busy to fix audio
      dmaengine: xilinx_dma: Fix SG capability check for MCDMA
      dmaengine: xilinx_dma: Fix usage of xilinx_aximcdma_tx_segment
      dmaengine: xilinx_dma: use readl_poll_timeout_atomic variant
      dmaengine: ti: k3-udma: fix -Wenum-conversion warning
      dmaengine: idxd: fix wq config registers offset programming

commit fc8299f9f3b9f3b0e1c8c9f719b5deb2a74ab314
Merge: 5de18678da02 91c2c28d8de3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 10:20:16 2020 -0800

    Merge tag 'iommu-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
    
    Pull iommu fixes from Will Deacon:
     "Two straightforward vt-d fixes:
    
       - Fix boot when intel iommu initialisation fails under TXT (tboot)
    
       - Fix intel iommu compilation error when DMAR is enabled without ATS
    
      and temporarily update IOMMU MAINTAINERs entry"
    
    * tag 'iommu-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
      MAINTAINERS: Temporarily add myself to the IOMMU entry
      iommu/vt-d: Fix compile error with CONFIG_PCI_ATS not set
      iommu/vt-d: Avoid panic if iommu init fails in tboot system

commit 5de18678da02d893d2c1eb149583fca23c96584a
Merge: e65b30951e50 d06d60d52ec0
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 10:16:26 2020 -0800

    Merge tag 'mmc-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
    
    Pull MMC fixes from Ulf Hansson:
     "A couple of MMC fixes:
    
       - sdhci-of-arasan: Stabilize communication by fixing tap value configs
    
       - sdhci-pci: Use SDR25 timing for HS mode for BYT-based Intel HWs"
    
    * tag 'mmc-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
      mmc: sdhci-of-arasan: Issue DLL reset explicitly
      mmc: sdhci-of-arasan: Use Mask writes for Tap delays
      mmc: sdhci-of-arasan: Allow configuring zero tap values
      mmc: sdhci-pci: Prefer SDR25 timing for High Speed mode for BYT-based Intel controllers

commit c54bc3ced5106663c2f2b44071800621f505b00e
Author: Michael Chan <michael.chan at broadcom.com>
Date:   Fri Nov 20 02:44:31 2020 -0500

    bnxt_en: Release PCI regions when DMA mask setup fails during probe.
    
    Jump to init_err_release to cleanup.  bnxt_unmap_bars() will also be
    called but it will do nothing if the BARs are not mapped yet.
    
    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Reported-by: Jakub Kicinski <kuba at kernel.org>
    Signed-off-by: Michael Chan <michael.chan at broadcom.com>
    Link: https://lore.kernel.org/r/1605858271-8209-1-git-send-email-michael.chan@broadcom.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 6e8329534cde..0af0af2b70fe 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -11591,7 +11591,7 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
 	    dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) != 0) {
 		dev_err(&pdev->dev, "System does not support DMA, aborting\n");
 		rc = -EIO;
-		goto init_err_disable;
+		goto init_err_release;
 	}
 
 	pci_set_master(pdev);
commit 3b3fd068c56e3fbea30090859216a368398e39bf
Author: Anmol Karn <anmol.karan123 at gmail.com>
Date:   Fri Nov 20 00:40:43 2020 +0530

    rose: Fix Null pointer dereference in rose_send_frame()
    
    rose_send_frame() dereferences `neigh->dev` when called from
    rose_transmit_clear_request(), and the first occurrence of the
    `neigh` is in rose_loopback_timer() as `rose_loopback_neigh`,
    and it is initialized in rose_add_loopback_neigh() as NULL.
    i.e when `rose_loopback_neigh` used in rose_loopback_timer()
    its `->dev` was still NULL and rose_loopback_timer() was calling
    rose_rx_call_request() without checking for NULL.
    
    - net/rose/rose_link.c
    This bug seems to get triggered in this line:
    
    rose_call = (ax25_address *)neigh->dev->dev_addr;
    
    Fix it by adding NULL checking for `rose_loopback_neigh->dev`
    in rose_loopback_timer().
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Suggested-by: Jakub Kicinski <kuba at kernel.org>
    Reported-by: syzbot+a1c743815982d9496393 at syzkaller.appspotmail.com
    Tested-by: syzbot+a1c743815982d9496393 at syzkaller.appspotmail.com
    Link: https://syzkaller.appspot.com/bug?id=9d2a7ca8c7f2e4b682c97578dfa3f236258300b3
    Signed-off-by: Anmol Karn <anmol.karan123 at gmail.com>
    Link: https://lore.kernel.org/r/20201119191043.28813-1-anmol.karan123@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/rose/rose_loopback.c b/net/rose/rose_loopback.c
index 7b094275ea8b..11c45c8c6c16 100644
--- a/net/rose/rose_loopback.c
+++ b/net/rose/rose_loopback.c
@@ -96,10 +96,19 @@ static void rose_loopback_timer(struct timer_list *unused)
 		}
 
 		if (frametype == ROSE_CALL_REQUEST) {
-			if ((dev = rose_dev_get(dest)) != NULL) {
-				if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0)
-					kfree_skb(skb);
-			} else {
+			if (!rose_loopback_neigh->dev) {
+				kfree_skb(skb);
+				continue;
+			}
+
+			dev = rose_dev_get(dest);
+			if (!dev) {
+				kfree_skb(skb);
+				continue;
+			}
+
+			if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0) {
+				dev_put(dev);
 				kfree_skb(skb);
 			}
 		} else {
commit e65b30951e50708cb306eb75231329a3a3029a7d
Merge: 46cbc18ed852 aecd1fbe7784
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 09:56:16 2020 -0800

    Merge tag 'sound-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
    
    Pull sound fixes from Takashi Iwai:
     "A collection of small fixes: the only core change is a minor error
      code handling in the control API, and all the rest are device-specific
      fixes, mostly quirks, fixups and ASoC Intel fixes.
    
      It looks boring, and good so"
    
    * tag 'sound-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
      ALSA: mixart: Fix mutex deadlock
      ALSA: hda/ca0132: Fix compile warning without PCI
      ASOC: Intel: kbl_rt5663_rt5514_max98927: Do not try to disable disabled clock
      ALSA: usb-audio: Add delay quirk for all Logitech USB devices
      ASoC: Intel: catpt: Correct clock selection for dai trigger
      ASoC: Intel: catpt: Skip position update for unprepared streams
      ASoC: qcom: lpass-platform: Fix memory leak
      ASoC: Intel: KMB: Fix S24_LE configuration
      ALSA: hda: Add Alderlake-S PCI ID and HDMI codec vid
      ALSA: usb-audio: Use ALC1220-VB-DT mapping for ASUS ROG Strix TRX40 mobo
      ALSA: firewire: Clean up a locking issue in copy_resp_to_buf()
      ASoC: rt1015: increase the time to detect BCLK
      ALSA: ctl: fix error path at adding user-defined element set
      ALSA: hda/realtek - HP Headset Mic can't detect after boot
      ALSA: hda/realtek - Add supported mute Led for HP
      ALSA: hda/realtek: Add some Clove SSID in the ALC293(ALC1220)
      ALSA: hda/realtek - Add supported for Lenovo ThinkPad Headset Button
      ASoC: rt1015: add delay to fix pop noise from speaker

commit 46cbc18ed85219d534b4fbb4a39058fe66766e83
Merge: 4d02da974ea8 6600f9d52213
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 20 09:49:25 2020 -0800

    Merge tag 'drm-fixes-2020-11-20-2' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm fixes from Dave Airlie:
     "Weekly fixes pull.
    
      This contains some fixes for sun4i/dw-hdmi probing, then amdgpu
      enables arcturus hw without experimental flag and two other fixes and
      a group of i915 fixes.
    
      It also has a backported from next fix for the warn on reported in
      ast/drm_gem_vram_helper code in the merge window. There's a separate
      report which initially looked to be the same problem, but I'm going to
      chase that up next week a bit more as I don't think the bisect landed
      anywhere useful.
    
      Summary:
    
      core:
       - vram helper TTM regression fix
    
      amdgpu:
       - Pageflip fix for navi1x with 5 or 6 displays
       - Remove experimental flag for Arcturus
       - Fix regression in atomic commit tail rework
    
      i915:
       - Fix tgl power gating issue
       - Memory leak fixes
       - Selftest fixes
       - Display bpc fix
       - Fix TGL MOCS for PTE tracking
    
      dw-hdmi:
       - probing fix
    
      sun4i:
       - probing fix"
    
    * tag 'drm-fixes-2020-11-20-2' of git://anongit.freedesktop.org/drm/drm:
      drm/i915/gt: Fixup tgl mocs for PTE tracking
      drm/vram-helper: Fix use of top-down placement
      drm/i915/gt: Remember to free the virtual breadcrumbs
      drm/i915: Handle max_bpc==16
      drm/amd/display: Always get CRTC updated constant values inside commit tail
      drm/sun4i: backend: Fix probe failure with multiple backends
      drm/sun4i: dw-hdmi: fix error return code in sun8i_dw_hdmi_bind()
      drm/i915/selftests: Fix wrong return value of perf_request_latency()
      drm/i915/selftests: Fix wrong return value of perf_series_engines()
      drm/i915: Avoid memory leak with more than 16 workarounds on a list
      drm/i915/tgl: Fix Media power gate sequence.
      drm/amdgpu: remove experimental flag from arcturus
      drm/amd/display: Add missing pflip irq for dcn2.0
      drm/i915/gvt: return error when failing to take the module reference
      drm: bridge: dw-hdmi: Avoid resetting force in the detect function
      drm/i915/gvt: Set ENHANCED_FRAME_CAP bit
      drm/i915/gvt: Temporarily disable vfio_edid for BXT/APL

commit f46e79aa1a2bea7de2885fa8d79a68d11545a5fd
Author: Martin Habets <mhabets at solarflare.com>
Date:   Fri Nov 20 11:32:07 2020 +0000

    MAINTAINERS: Change Solarflare maintainers
    
    Email from solarflare.com will stop working. Update the maintainers.
    A replacement for linux-net-drivers at solarflare.com is not working yet,
    for now remove it.
    
    Signed-off-by: Martin Habets <mhabets at solarflare.com>
    Signed-off-by: Edward Cree <ecree at solarflare.com>
    Link: https://lore.kernel.org/r/20201120113207.GA1605547@mh-desktop
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index c7f6924d34c7..aaf3b023e044 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -15775,9 +15775,8 @@ F:	drivers/slimbus/
 F:	include/linux/slimbus.h
 
 SFC NETWORK DRIVER
-M:	Solarflare linux maintainers <linux-net-drivers at solarflare.com>
-M:	Edward Cree <ecree at solarflare.com>
-M:	Martin Habets <mhabets at solarflare.com>
+M:	Edward Cree <ecree.xilinx at gmail.com>
+M:	Martin Habets <habetsm.xilinx at gmail.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 F:	drivers/net/ethernet/sfc/
commit 4fae3a58ab59d8a286864d61fe1846283a0316f2
Author: Serge Semin <Sergey.Semin at baikalelectronics.ru>
Date:   Tue Nov 17 12:45:17 2020 +0300

    spi: Take the SPI IO-mutex in the spi_setup() method
    
    I've discovered that due to the recent commit 49d7d695ca4b ("spi: dw:
    Explicitly de-assert CS on SPI transfer completion") a concurrent usage of
    the spidev devices with different chip-selects causes the "SPI transfer
    timed out" error. The root cause of the problem has turned to be in a race
    condition of the SPI-transfer execution procedure and the spi_setup()
    method being called at the same time. In particular in calling the
    spi_set_cs(false) while there is an SPI-transfer being executed. In my
    case due to the commit cited above all CSs get to be switched off by
    calling the spi_setup() for /dev/spidev0.1 while there is an concurrent
    SPI-transfer execution performed on /dev/spidev0.0. Of course a situation
    of the spi_setup() being called while there is an SPI-transfer being
    executed for two different SPI peripheral devices of the same controller
    may happen not only for the spidev driver, but for instance for MMC SPI +
    some another device, or spi_setup() being called from an SPI-peripheral
    probe method while some other device has already been probed and is being
    used by a corresponding driver...
    
    Of course I could have provided a fix affecting the DW APB SSI driver
    only, for instance, by creating a mutual exclusive access to the set_cs
    callback and setting/clearing only the bit responsible for the
    corresponding chip-select. But after a short research I've discovered that
    the problem most likely affects a lot of the other drivers:
    - drivers/spi/spi-sun4i.c - RMW the chip-select register;
    - drivers/spi/spi-rockchip.c - RMW the chip-select register;
    - drivers/spi/spi-qup.c - RMW a generic force-CS flag in a CSR.
    - drivers/spi/spi-sifive.c - set a generic CS-mode flag in a CSR.
    - drivers/spi/spi-bcm63xx-hsspi.c - uses an internal mutex to serialize
      the bus config changes, but still isn't protected from the race
      condition described above;
    - drivers/spi/spi-geni-qcom.c - RMW a chip-select internal flag and set the
      CS state in HW;
    - drivers/spi/spi-orion.c - RMW a chip-select register;
    - drivers/spi/spi-cadence.c - RMW a chip-select register;
    - drivers/spi/spi-armada-3700.c - RMW a chip-select register;
    - drivers/spi/spi-lantiq-ssc.c - overwrites the chip-select register;
    - drivers/spi/spi-sun6i.c - RMW a chip-select register;
    - drivers/spi/spi-synquacer.c - RMW a chip-select register;
    - drivers/spi/spi-altera.c - directly sets the chip-select state;
    - drivers/spi/spi-omap2-mcspi.c - RMW an internally cached CS state and
      writes it to HW;
    - drivers/spi/spi-mt65xx.c - RMW some CSR;
    - drivers/spi/spi-jcore.c - directly sets the chip-selects state;
    - drivers/spi/spi-mt7621.c - RMW a chip-select register;
    
    I could have missed some drivers, but a scale of the problem is obvious.
    As you can see most of the drivers perform an unprotected
    Read-modify-write chip-select register modification in the set_cs callback.
    Seeing the spi_setup() function is calling the spi_set_cs() and it can be
    executed concurrently with SPI-transfers exec procedure, which also calls
    spi_set_cs() in the SPI core spi_transfer_one_message() method, the race
    condition of the register modification turns to be obvious.
    
    To sum up the problem denoted above affects each driver for a controller
    having more than one chip-select lane and which:
    1) performs the RMW to some CS-related register with no serialization;
    2) directly disables any CS on spi_set_cs(dev, false).
    * the later is the case of the DW APB SSI driver.
    
    The controllers which equipped with a single CS theoretically can also
    experience the problem, but in practice will not since normally the
    spi_setup() isn't called concurrently with the SPI-transfers executed on
    the same SPI peripheral device.
    
    In order to generically fix the denoted bug I'd suggest to serialize an
    access to the controller IO by taking the IO mutex in the spi_setup()
    callback. The mutex is held while there is an SPI communication going on
    on the SPI-bus of the corresponding SPI-controller. So calling the
    spi_setup() method and disabling/updating the CS state within it would be
    safe while there is no any SPI-transfers being executed. Also note I
    suppose it would be safer to protect the spi_controller->setup() callback
    invocation too, seeing some of the SPI-controller drivers update a HW
    state in there.
    
    Fixes: 49d7d695ca4b ("spi: dw: Explicitly de-assert CS on SPI transfer completion")
    Signed-off-by: Serge Semin <Sergey.Semin at baikalelectronics.ru>
    Link: https://lore.kernel.org/r/20201117094517.5654-1-Sergey.Semin@baikalelectronics.ru
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 05c75f890ace..fc9a59788d2e 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -3372,12 +3372,15 @@ int spi_setup(struct spi_device *spi)
 	if (!spi->max_speed_hz)
 		spi->max_speed_hz = spi->controller->max_speed_hz;
 
+	mutex_lock(&spi->controller->io_mutex);
+
 	if (spi->controller->setup)
 		status = spi->controller->setup(spi);
 
 	if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
 		status = pm_runtime_get_sync(spi->controller->dev.parent);
 		if (status < 0) {
+			mutex_unlock(&spi->controller->io_mutex);
 			pm_runtime_put_noidle(spi->controller->dev.parent);
 			dev_err(&spi->controller->dev, "Failed to power device: %d\n",
 				status);
@@ -3399,6 +3402,8 @@ int spi_setup(struct spi_device *spi)
 		spi_set_cs(spi, false);
 	}
 
+	mutex_unlock(&spi->controller->io_mutex);
+
 	if (spi->rt && !spi->controller->rt) {
 		spi->controller->rt = true;
 		spi_set_thread_rt(spi->controller);
commit a98fd117a2553ab1a6d2fe3c7acae88c1eca4372
Author: Icenowy Zheng <icenowy at aosc.io>
Date:   Fri Nov 20 13:08:51 2020 +0800

    ARM: dts: sun8i: v3s: fix GIC node memory range
    
    Currently the GIC node in V3s DTSI follows some old DT examples, and
    being broken. This leads a warning at boot.
    
    Fix this.
    
    Fixes: f989086ccbc6 ("ARM: dts: sunxi: add dtsi file for V3s SoC")
    Signed-off-by: Icenowy Zheng <icenowy at aosc.io>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201120050851.4123759-1-icenowy@aosc.io

diff --git a/arch/arm/boot/dts/sun8i-v3s.dtsi b/arch/arm/boot/dts/sun8i-v3s.dtsi
index 0c7341676921..89abd4cc7e23 100644
--- a/arch/arm/boot/dts/sun8i-v3s.dtsi
+++ b/arch/arm/boot/dts/sun8i-v3s.dtsi
@@ -539,7 +539,7 @@
 		gic: interrupt-controller at 1c81000 {
 			compatible = "arm,gic-400";
 			reg = <0x01c81000 0x1000>,
-			      <0x01c82000 0x1000>,
+			      <0x01c82000 0x2000>,
 			      <0x01c84000 0x2000>,
 			      <0x01c86000 0x2000>;
 			interrupt-controller;
commit 2b6cb81b95d1e8abfb6d32cf194a5bd2992c315c
Author: Marc Zyngier <maz at kernel.org>
Date:   Fri Nov 20 09:42:05 2020 +0000

    drm/meson: dw-hdmi: Enable the iahb clock early enough
    
    Instead of moving meson_dw_hdmi_init() around which breaks existing
    platform, let's enable the clock meson_dw_hdmi_init() depends on.
    This means we don't have to worry about this clock being enabled or
    not, depending on the boot-loader features.
    
    Fixes: b33340e33acd ("drm/meson: dw-hdmi: Ensure that clocks are enabled before touching the TOP registers")
    Reported-by: "kernelci.org bot" <bot at kernelci.org>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Tested-by: Guillaume Tucker <guillaume.tucker at collabora.com>
    Reviewed-by: Neil Armstrong <narmstrong at baylibre.com>
    [narmstrong: changed reported by to kernelci.org bot]
    Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120094205.525228-3-maz@kernel.org

diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 29623b309cb1..aad75a22dc33 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -1051,6 +1051,10 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 	if (ret)
 		return ret;
 
+	ret = meson_enable_clk(dev, "iahb");
+	if (ret)
+		return ret;
+
 	ret = meson_enable_clk(dev, "venci");
 	if (ret)
 		return ret;
@@ -1086,6 +1090,8 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 
 	encoder->possible_crtcs = BIT(0);
 
+	meson_dw_hdmi_init(meson_dw_hdmi);
+
 	DRM_DEBUG_DRIVER("encoder initialized\n");
 
 	/* Bridge / Connector */
@@ -1110,8 +1116,6 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 	if (IS_ERR(meson_dw_hdmi->hdmi))
 		return PTR_ERR(meson_dw_hdmi->hdmi);
 
-	meson_dw_hdmi_init(meson_dw_hdmi);
-
 	next_bridge = of_drm_find_bridge(pdev->dev.of_node);
 	if (next_bridge)
 		drm_bridge_attach(encoder, next_bridge,
commit 1dfeea904550c11eccf3fd5f6256e4b0f0208dfe
Author: Marc Zyngier <maz at kernel.org>
Date:   Fri Nov 20 09:42:04 2020 +0000

    drm/meson: dw-hdmi: Disable clocks on driver teardown
    
    The HDMI driver request clocks early, but never disable them, leaving
    the clocks on even when the driver is removed.
    
    Fix it by slightly refactoring the clock code, and register a devm
    action that will eventually disable/unprepare the enabled clocks.
    
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Reviewed-by: Neil Armstrong <narmstrong at baylibre.com>
    Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201120094205.525228-2-maz@kernel.org

diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 7f8eea494147..29623b309cb1 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -145,8 +145,6 @@ struct meson_dw_hdmi {
 	struct reset_control *hdmitx_apb;
 	struct reset_control *hdmitx_ctrl;
 	struct reset_control *hdmitx_phy;
-	struct clk *hdmi_pclk;
-	struct clk *venci_clk;
 	struct regulator *hdmi_supply;
 	u32 irq_stat;
 	struct dw_hdmi *hdmi;
@@ -946,6 +944,29 @@ static void meson_disable_regulator(void *data)
 	regulator_disable(data);
 }
 
+static void meson_disable_clk(void *data)
+{
+	clk_disable_unprepare(data);
+}
+
+static int meson_enable_clk(struct device *dev, char *name)
+{
+	struct clk *clk;
+	int ret;
+
+	clk = devm_clk_get(dev, name);
+	if (IS_ERR(clk)) {
+		dev_err(dev, "Unable to get %s pclk\n", name);
+		return PTR_ERR(clk);
+	}
+
+	ret = clk_prepare_enable(clk);
+	if (!ret)
+		ret = devm_add_action_or_reset(dev, meson_disable_clk, clk);
+
+	return ret;
+}
+
 static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 				void *data)
 {
@@ -1026,19 +1047,13 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 	if (IS_ERR(meson_dw_hdmi->hdmitx))
 		return PTR_ERR(meson_dw_hdmi->hdmitx);
 
-	meson_dw_hdmi->hdmi_pclk = devm_clk_get(dev, "isfr");
-	if (IS_ERR(meson_dw_hdmi->hdmi_pclk)) {
-		dev_err(dev, "Unable to get HDMI pclk\n");
-		return PTR_ERR(meson_dw_hdmi->hdmi_pclk);
-	}
-	clk_prepare_enable(meson_dw_hdmi->hdmi_pclk);
+	ret = meson_enable_clk(dev, "isfr");
+	if (ret)
+		return ret;
 
-	meson_dw_hdmi->venci_clk = devm_clk_get(dev, "venci");
-	if (IS_ERR(meson_dw_hdmi->venci_clk)) {
-		dev_err(dev, "Unable to get venci clk\n");
-		return PTR_ERR(meson_dw_hdmi->venci_clk);
-	}
-	clk_prepare_enable(meson_dw_hdmi->venci_clk);
+	ret = meson_enable_clk(dev, "venci");
+	if (ret)
+		return ret;
 
 	dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
 					      &meson_dw_hdmi_regmap_config);
commit f3bc432aa8a7a2bfe9ebb432502be5c5d979d7fe
Author: Alan Stern <stern at rowland.harvard.edu>
Date:   Thu Nov 19 12:02:28 2020 -0500

    USB: core: Change %pK for __user pointers to %px
    
    Commit 2f964780c03b ("USB: core: replace %p with %pK") used the %pK
    format specifier for a bunch of __user pointers.  But as the 'K' in
    the specifier indicates, it is meant for kernel pointers.  The reason
    for the %pK specifier is to avoid leaks of kernel addresses, but when
    the pointer is to an address in userspace the security implications
    are minimal.  In particular, no kernel information is leaked.
    
    This patch changes the __user %pK specifiers (used in a bunch of
    debugging output lines) to %px, which will always print the actual
    address with no mangling.  (Notably, there is no printk format
    specifier particularly intended for __user pointers.)
    
    Fixes: 2f964780c03b ("USB: core: replace %p with %pK")
    CC: Vamsi Krishna Samavedam <vskrishn at codeaurora.org>
    CC: <stable at vger.kernel.org>
    Signed-off-by: Alan Stern <stern at rowland.harvard.edu>
    Link: https://lore.kernel.org/r/20201119170228.GB576844@rowland.harvard.edu
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index e96a858a1218..533236366a03 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -482,11 +482,11 @@ static void snoop_urb(struct usb_device *udev,
 
 	if (userurb) {		/* Async */
 		if (when == SUBMIT)
-			dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, "
+			dev_info(&udev->dev, "userurb %px, ep%d %s-%s, "
 					"length %u\n",
 					userurb, ep, t, d, length);
 		else
-			dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, "
+			dev_info(&udev->dev, "userurb %px, ep%d %s-%s, "
 					"actual_length %u status %d\n",
 					userurb, ep, t, d, length,
 					timeout_or_status);
@@ -1997,7 +1997,7 @@ static int proc_reapurb(struct usb_dev_state *ps, void __user *arg)
 	if (as) {
 		int retval;
 
-		snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
+		snoop(&ps->dev->dev, "reap %px\n", as->userurb);
 		retval = processcompl(as, (void __user * __user *)arg);
 		free_async(as);
 		return retval;
@@ -2014,7 +2014,7 @@ static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg)
 
 	as = async_getcompleted(ps);
 	if (as) {
-		snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
+		snoop(&ps->dev->dev, "reap %px\n", as->userurb);
 		retval = processcompl(as, (void __user * __user *)arg);
 		free_async(as);
 	} else {
@@ -2142,7 +2142,7 @@ static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg)
 	if (as) {
 		int retval;
 
-		snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
+		snoop(&ps->dev->dev, "reap %px\n", as->userurb);
 		retval = processcompl_compat(as, (void __user * __user *)arg);
 		free_async(as);
 		return retval;
@@ -2159,7 +2159,7 @@ static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *ar
 
 	as = async_getcompleted(ps);
 	if (as) {
-		snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
+		snoop(&ps->dev->dev, "reap %px\n", as->userurb);
 		retval = processcompl_compat(as, (void __user * __user *)arg);
 		free_async(as);
 	} else {
@@ -2624,7 +2624,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
 #endif
 
 	case USBDEVFS_DISCARDURB:
-		snoop(&dev->dev, "%s: DISCARDURB %pK\n", __func__, p);
+		snoop(&dev->dev, "%s: DISCARDURB %px\n", __func__, p);
 		ret = proc_unlinkurb(ps, p);
 		break;
 
commit c2b1209d852fef65dbe13c1eed2c6d7a8cd0d1f8
Author: Sean Christopherson <seanjc at google.com>
Date:   Thu Nov 19 10:37:07 2020 -0800

    MAINTAINERS: Update email address for Sean Christopherson
    
    Update my email address to one provided by my new benefactor.
    
    Cc: Thomas Gleixner <tglx at linutronix.de>
    Cc: Borislav Petkov <bp at alien8.de>
    Cc: Jarkko Sakkinen <jarkko at kernel.org>
    Cc: Dave Hansen <dave.hansen at linux.intel.com>
    Cc: Andy Lutomirski <luto at kernel.org>
    Cc: Vitaly Kuznetsov <vkuznets at redhat.com>
    Cc: Wanpeng Li <wanpengli at tencent.com>
    Cc: Jim Mattson <jmattson at google.com>
    Cc: Joerg Roedel <joro at 8bytes.org>
    Cc: kvm at vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc at google.com>
    Message-Id: <20201119183707.291864-1-sean.kvm at gmail.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/.mailmap b/.mailmap
index 1e14566a3d56..a0d1685a165a 100644
--- a/.mailmap
+++ b/.mailmap
@@ -287,6 +287,7 @@ Santosh Shilimkar <ssantosh at kernel.org>
 Sarangdhar Joshi <spjoshi at codeaurora.org>
 Sascha Hauer <s.hauer at pengutronix.de>
 S.Çağlar Onur <caglar at pardus.org.tr>
+Sean Christopherson <seanjc at google.com> <sean.j.christopherson at intel.com>
 Sean Nyekjaer <sean at geanix.com> <sean.nyekjaer at prevas.dk>
 Sebastian Reichel <sre at kernel.org> <sebastian.reichel at collabora.co.uk>
 Sebastian Reichel <sre at kernel.org> <sre at debian.org>
commit 184eead057cc7e803558269babc1f2cfb9113ad1
Author: Alan Stern <stern at rowland.harvard.edu>
Date:   Thu Nov 19 12:00:40 2020 -0500

    USB: core: Fix regression in Hercules audio card
    
    Commit 3e4f8e21c4f2 ("USB: core: fix check for duplicate endpoints")
    aimed to make the USB stack more reliable by detecting and skipping
    over endpoints that are duplicated between interfaces.  This caused a
    regression for a Hercules audio card (reported as Bugzilla #208357),
    which contains such non-compliant duplications.  Although the
    duplications are harmless, skipping the valid endpoints prevented the
    device from working.
    
    This patch fixes the regression by adding ENDPOINT_IGNORE quirks for
    the Hercules card, telling the kernel to ignore the invalid duplicate
    endpoints and thereby allowing the valid endpoints to be used as
    intended.
    
    Fixes: 3e4f8e21c4f2 ("USB: core: fix check for duplicate endpoints")
    CC: <stable at vger.kernel.org>
    Reported-by: Alexander Chalikiopoulos <bugzilla.kernel.org at mrtoasted.com>
    Signed-off-by: Alan Stern <stern at rowland.harvard.edu>
    Link: https://lore.kernel.org/r/20201119170040.GA576844@rowland.harvard.edu
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index f536ea9fe945..fad31ccd1fa8 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -348,6 +348,10 @@ static const struct usb_device_id usb_quirk_list[] = {
 	/* Guillemot Webcam Hercules Dualpix Exchange*/
 	{ USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME },
 
+	/* Guillemot Hercules DJ Console audio card (BZ 208357) */
+	{ USB_DEVICE(0x06f8, 0xb000), .driver_info =
+			USB_QUIRK_ENDPOINT_IGNORE },
+
 	/* Midiman M-Audio Keystation 88es */
 	{ USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
 
@@ -525,6 +529,8 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = {
  * Matched for devices with USB_QUIRK_ENDPOINT_IGNORE.
  */
 static const struct usb_device_id usb_endpoint_ignore[] = {
+	{ USB_DEVICE_INTERFACE_NUMBER(0x06f8, 0xb000, 5), .driver_info = 0x01 },
+	{ USB_DEVICE_INTERFACE_NUMBER(0x06f8, 0xb000, 5), .driver_info = 0x81 },
 	{ USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0202, 1), .driver_info = 0x85 },
 	{ USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0208, 1), .driver_info = 0x85 },
 	{ }
commit 87bed3d7d26c974948a3d6e7176f304b2d41272b
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Tue Nov 17 10:16:29 2020 +0800

    usb: gadget: Fix memleak in gadgetfs_fill_super
    
    usb_get_gadget_udc_name will alloc memory for CHIP
    in "Enomem" branch. we should free it before error
    returns to prevent memleak.
    
    Fixes: 175f712119c57 ("usb: gadget: provide interface for legacy gadgets to get UDC name")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Acked-by: Alan Stern <stern at rowland.harvard.edu>
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201117021629.1470544-3-zhangqilong3@huawei.com
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
index 1b430b36d0a6..71e7d10dd76b 100644
--- a/drivers/usb/gadget/legacy/inode.c
+++ b/drivers/usb/gadget/legacy/inode.c
@@ -2039,6 +2039,9 @@ gadgetfs_fill_super (struct super_block *sb, struct fs_context *fc)
 	return 0;
 
 Enomem:
+	kfree(CHIP);
+	CHIP = NULL;
+
 	return -ENOMEM;
 }
 
commit e7694cb6998379341fd9bf3bd62b48c4e6a79385
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Tue Nov 17 10:16:28 2020 +0800

    usb: gadget: f_midi: Fix memleak in f_midi_alloc
    
    In the error path, if midi is not null, we should
    free the midi->id if necessary to prevent memleak.
    
    Fixes: b85e9de9e818d ("usb: gadget: f_midi: convert to new function interface with backward compatibility")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201117021629.1470544-2-zhangqilong3@huawei.com
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c
index 85cb15734aa8..19d97940eeb9 100644
--- a/drivers/usb/gadget/function/f_midi.c
+++ b/drivers/usb/gadget/function/f_midi.c
@@ -1315,7 +1315,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
 	midi->id = kstrdup(opts->id, GFP_KERNEL);
 	if (opts->id && !midi->id) {
 		status = -ENOMEM;
-		goto setup_fail;
+		goto midi_free;
 	}
 	midi->in_ports = opts->in_ports;
 	midi->out_ports = opts->out_ports;
@@ -1327,7 +1327,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
 
 	status = kfifo_alloc(&midi->in_req_fifo, midi->qlen, GFP_KERNEL);
 	if (status)
-		goto setup_fail;
+		goto midi_free;
 
 	spin_lock_init(&midi->transmit_lock);
 
@@ -1343,9 +1343,13 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
 
 	return &midi->func;
 
+midi_free:
+	if (midi)
+		kfree(midi->id);
+	kfree(midi);
 setup_fail:
 	mutex_unlock(&opts->lock);
-	kfree(midi);
+
 	return ERR_PTR(status);
 }
 
commit 9ca57518361418ad5ae7dc38a2128fbf4855e1a2
Author: penghao <penghao at uniontech.com>
Date:   Wed Nov 18 20:30:39 2020 +0800

    USB: quirks: Add USB_QUIRK_DISCONNECT_SUSPEND quirk for Lenovo A630Z TIO built-in usb-audio card
    
    Add a USB_QUIRK_DISCONNECT_SUSPEND quirk for the Lenovo TIO built-in
    usb-audio. when A630Z going into S3,the system immediately wakeup 7-8
    seconds later by usb-audio disconnect interrupt to avoids the issue.
    eg dmesg:
    ....
    [  626.974091 ] usb 7-1.1: USB disconnect, device number 3
    ....
    ....
    [ 1774.486691] usb 7-1.1: new full-speed USB device number 5 using xhci_hcd
    [ 1774.947742] usb 7-1.1: New USB device found, idVendor=17ef, idProduct=a012, bcdDevice= 0.55
    [ 1774.956588] usb 7-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [ 1774.964339] usb 7-1.1: Product: Thinkcentre TIO24Gen3 for USB-audio
    [ 1774.970999] usb 7-1.1: Manufacturer: Lenovo
    [ 1774.975447] usb 7-1.1: SerialNumber: 000000000000
    [ 1775.048590] usb 7-1.1: 2:1: cannot get freq at ep 0x1
    .......
    Seeking a better fix, we've tried a lot of things, including:
     - Check that the device's power/wakeup is disabled
     - Check that remote wakeup is off at the USB level
     - All the quirks in drivers/usb/core/quirks.c
       e.g. USB_QUIRK_RESET_RESUME,
            USB_QUIRK_RESET,
            USB_QUIRK_IGNORE_REMOTE_WAKEUP,
            USB_QUIRK_NO_LPM.
    
    but none of that makes any difference.
    
    There are no errors in the logs showing any suspend/resume-related issues.
    When the system wakes up due to the modem, log-wise it appears to be a
    normal resume.
    
    Introduce a quirk to disable the port during suspend when the modem is
    detected.
    
    Signed-off-by: penghao <penghao at uniontech.com>
    Link: https://lore.kernel.org/r/20201118123039.11696-1-penghao@uniontech.com
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index a1e3a037a289..f536ea9fe945 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -421,6 +421,10 @@ static const struct usb_device_id usb_quirk_list[] = {
 	{ USB_DEVICE(0x1532, 0x0116), .driver_info =
 			USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
 
+	/* Lenovo ThinkCenter A630Z TI024Gen3 usb-audio */
+	{ USB_DEVICE(0x17ef, 0xa012), .driver_info =
+			USB_QUIRK_DISCONNECT_SUSPEND },
+
 	/* BUILDWIN Photo Frame */
 	{ USB_DEVICE(0x1908, 0x1315), .driver_info =
 			USB_QUIRK_HONOR_BNUMINTERFACES },
commit 7c8011dd8c541cd8b3f39eb42d00d01f33f967f2
Merge: 24880a87042b fb89b2544b64
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Fri Nov 20 16:28:48 2020 +0100

    Merge tag 'phy-fixes-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy into usb-linus
    
    Vinod writes:
    
    phy: fixes for 5.10
    
    Bunch of fixes for phy drivers:
    *) USB phy incorrect clearing of bits
    *) Tegra xusb dangling pointer
    *) qcom-qmp null ptr initialization
    *) cpcap-usb irq flags
    *) intel kkembay kconfig depends
    *) qualcomm OF dependency
    *) mediatek typo
    
    * tag 'phy-fixes-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy:
      phy: mediatek: fix spelling mistake in Kconfig "veriosn" -> "version"
      phy: qualcomm: Fix 28 nm Hi-Speed USB PHY OF dependency
      phy: qualcomm: usb: Fix SuperSpeed PHY OF dependency
      phy: intel: PHY_INTEL_KEEMBAY_EMMC should depend on ARCH_KEEMBAY
      phy: cpcap-usb: Use IRQF_ONESHOT
      phy: qcom-qmp: Initialize another pointer to NULL
      phy: tegra: xusb: Fix dangling pointer on probe failure
      phy: usb: Fix incorrect clearing of tca_drv_sel bit in SETUP reg for 7211

commit 537cf4e3cc2f6cc9088dcd6162de573f603adc29
Author: Magnus Karlsson <magnus.karlsson at intel.com>
Date:   Fri Nov 20 12:53:39 2020 +0100

    xsk: Fix umem cleanup bug at socket destruct
    
    Fix a bug that is triggered when a partially setup socket is
    destroyed. For a fully setup socket, a socket that has been bound to a
    device, the cleanup of the umem is performed at the end of the buffer
    pool's cleanup work queue item. This has to be performed in a work
    queue, and not in RCU cleanup, as it is doing a vunmap that cannot
    execute in interrupt context. However, when a socket has only been
    partially set up so that a umem has been created but the buffer pool
    has not, the code erroneously directly calls the umem cleanup function
    instead of using a work queue, and this leads to a BUG_ON() in
    vunmap().
    
    As there in this case is no buffer pool, we cannot use its work queue,
    so we need to introduce a work queue for the umem and schedule this for
    the cleanup. So in the case there is no pool, we are going to use the
    umem's own work queue to schedule the cleanup. But if there is a
    pool, the cleanup of the umem is still being performed by the pool's
    work queue, as it is important that the umem is cleaned up after the
    pool.
    
    Fixes: e5e1a4bc916d ("xsk: Fix possible memory leak at socket close")
    Reported-by: Marek Majtyka <marekx.majtyka at intel.com>
    Signed-off-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Tested-by: Marek Majtyka <marekx.majtyka at intel.com>
    Link: https://lore.kernel.org/bpf/1605873219-21629-1-git-send-email-magnus.karlsson@gmail.com

diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h
index 1a9559c0cbdd..4f4e93bf814c 100644
--- a/include/net/xdp_sock.h
+++ b/include/net/xdp_sock.h
@@ -31,6 +31,7 @@ struct xdp_umem {
 	struct page **pgs;
 	int id;
 	struct list_head xsk_dma_list;
+	struct work_struct work;
 };
 
 struct xsk_map {
diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c
index 56d052bc65cb..56a28a686988 100644
--- a/net/xdp/xdp_umem.c
+++ b/net/xdp/xdp_umem.c
@@ -66,18 +66,31 @@ static void xdp_umem_release(struct xdp_umem *umem)
 	kfree(umem);
 }
 
+static void xdp_umem_release_deferred(struct work_struct *work)
+{
+	struct xdp_umem *umem = container_of(work, struct xdp_umem, work);
+
+	xdp_umem_release(umem);
+}
+
 void xdp_get_umem(struct xdp_umem *umem)
 {
 	refcount_inc(&umem->users);
 }
 
-void xdp_put_umem(struct xdp_umem *umem)
+void xdp_put_umem(struct xdp_umem *umem, bool defer_cleanup)
 {
 	if (!umem)
 		return;
 
-	if (refcount_dec_and_test(&umem->users))
-		xdp_umem_release(umem);
+	if (refcount_dec_and_test(&umem->users)) {
+		if (defer_cleanup) {
+			INIT_WORK(&umem->work, xdp_umem_release_deferred);
+			schedule_work(&umem->work);
+		} else {
+			xdp_umem_release(umem);
+		}
+	}
 }
 
 static int xdp_umem_pin_pages(struct xdp_umem *umem, unsigned long address)
diff --git a/net/xdp/xdp_umem.h b/net/xdp/xdp_umem.h
index 181fdda2f2a8..aa9fe2780410 100644
--- a/net/xdp/xdp_umem.h
+++ b/net/xdp/xdp_umem.h
@@ -9,7 +9,7 @@
 #include <net/xdp_sock_drv.h>
 
 void xdp_get_umem(struct xdp_umem *umem);
-void xdp_put_umem(struct xdp_umem *umem);
+void xdp_put_umem(struct xdp_umem *umem, bool defer_cleanup);
 struct xdp_umem *xdp_umem_create(struct xdp_umem_reg *mr);
 
 #endif /* XDP_UMEM_H_ */
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index cfbec3989a76..5a6cdf7b320d 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -1147,7 +1147,7 @@ static void xsk_destruct(struct sock *sk)
 		return;
 
 	if (!xp_put_pool(xs->pool))
-		xdp_put_umem(xs->umem);
+		xdp_put_umem(xs->umem, !xs->pool);
 
 	sk_refcnt_debug_dec(sk);
 }
diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c
index 8a3bf4e1318e..3c5a1423d922 100644
--- a/net/xdp/xsk_buff_pool.c
+++ b/net/xdp/xsk_buff_pool.c
@@ -242,7 +242,7 @@ static void xp_release_deferred(struct work_struct *work)
 		pool->cq = NULL;
 	}
 
-	xdp_put_umem(pool->umem);
+	xdp_put_umem(pool->umem, false);
 	xp_destroy(pool);
 }
 
commit 6200d5c3831370cd0ab4b6455933d12e82ea9956
Author: Jesper Dangaard Brouer <brouer at redhat.com>
Date:   Fri Nov 20 09:53:09 2020 +0100

    MAINTAINERS: Update XDP and AF_XDP entries
    
    Getting too many false positive matches with current use
    of the content regex K: and file regex N: patterns.
    
    This patch drops file match N: and makes K: more restricted.
    Some more normal F: file wildcards are added.
    
    Notice that AF_XDP forgot to some F: files that is also
    updated in this patch.
    
    Suggested-by: Jakub Kicinski <kuba at kernel.org>
    Signed-off-by: Jesper Dangaard Brouer <brouer at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Björn Töpel <bjorn.topel at intel.com>
    Link: https://lore.kernel.org/bpf/160586238944.2808432.4401269290440394008.stgit@firesoul

diff --git a/MAINTAINERS b/MAINTAINERS
index c7f6924d34c7..15355c055a1a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -19109,12 +19109,17 @@ L:	netdev at vger.kernel.org
 L:	bpf at vger.kernel.org
 S:	Supported
 F:	include/net/xdp.h
+F:	include/net/xdp_priv.h
 F:	include/trace/events/xdp.h
 F:	kernel/bpf/cpumap.c
 F:	kernel/bpf/devmap.c
 F:	net/core/xdp.c
-N:	xdp
-K:	xdp
+F:	samples/bpf/xdp*
+F:	tools/testing/selftests/bpf/*xdp*
+F:	tools/testing/selftests/bpf/*/*xdp*
+F:	drivers/net/ethernet/*/*/*/*/*xdp*
+F:	drivers/net/ethernet/*/*/*xdp*
+K:	(?:\b|_)xdp(?:\b|_)
 
 XDP SOCKETS (AF_XDP)
 M:	Björn Töpel <bjorn.topel at intel.com>
@@ -19123,9 +19128,12 @@ R:	Jonathan Lemon <jonathan.lemon at gmail.com>
 L:	netdev at vger.kernel.org
 L:	bpf at vger.kernel.org
 S:	Maintained
+F:	Documentation/networking/af_xdp.rst
 F:	include/net/xdp_sock*
 F:	include/net/xsk_buff_pool.h
 F:	include/uapi/linux/if_xdp.h
+F:	include/uapi/linux/xdp_diag.h
+F:	include/net/netns/xdp.h
 F:	net/xdp/
 F:	samples/bpf/xdpsock*
 F:	tools/lib/bpf/xsk*
commit 017496af28e2589c2c2cb396baba0507179d2748
Author: Marek Szyprowski <m.szyprowski at samsung.com>
Date:   Thu Nov 19 11:37:46 2020 +0100

    interconnect: fix memory trashing in of_count_icc_providers()
    
    of_count_icc_providers() function uses for_each_available_child_of_node()
    helper to recursively check all the available nodes. This helper already
    properly handles child nodes' reference count, so there is no need to do
    it explicitly. Remove the excessive call to of_node_put(). This fixes
    memory trashing when CONFIG_OF_DYNAMIC is enabled (for example
    arm/multi_v7_defconfig).
    
    Fixes: b1d681d8d324 ("interconnect: Add sync state support")
    Signed-off-by: Marek Szyprowski <m.szyprowski at samsung.com>
    Link: https://lore.kernel.org/r/20201119103746.32564-1-m.szyprowski@samsung.com
    Signed-off-by: Georgi Djakov <georgi.djakov at linaro.org>

diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
index 974a66725d09..5ad519c9f239 100644
--- a/drivers/interconnect/core.c
+++ b/drivers/interconnect/core.c
@@ -1083,7 +1083,6 @@ static int of_count_icc_providers(struct device_node *np)
 			count++;
 		count += of_count_icc_providers(child);
 	}
-	of_node_put(np);
 
 	return count;
 }
commit 92666d45adcfd4a4a70580ff9f732309e16131f9
Author: Kailang Yang <kailang at realtek.com>
Date:   Thu Nov 19 17:04:21 2020 +0800

    ALSA: hda/realtek - Fixed Dell AIO wrong sound tone
    
    This platform only had one audio jack.
    If it plugged speaker then replug with speaker or headset, the sound
    tone will change to abnormal.
    Headset Mic also can't record when this issue was happen.
    
    [ Added a short comment about the COEF by tiwai ]
    
    Signed-off-by: Kailang Yang <kailang at realtek.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/593c777dcfef4546aa050e105b8e53b5@realtek.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 739dbaf54517..b90cd4c65b58 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -119,6 +119,7 @@ struct alc_spec {
 	unsigned int no_shutup_pins:1;
 	unsigned int ultra_low_power:1;
 	unsigned int has_hs_key:1;
+	unsigned int no_internal_mic_pin:1;
 
 	/* for PLL fix */
 	hda_nid_t pll_nid;
@@ -4523,6 +4524,7 @@ static const struct coef_fw alc225_pre_hsmode[] = {
 
 static void alc_headset_mode_unplugged(struct hda_codec *codec)
 {
+	struct alc_spec *spec = codec->spec;
 	static const struct coef_fw coef0255[] = {
 		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
@@ -4597,6 +4599,11 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
 		{}
 	};
 
+	if (spec->no_internal_mic_pin) {
+		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
+		return;
+	}
+
 	switch (codec->core.vendor_id) {
 	case 0x10ec0255:
 		alc_process_coef_fw(codec, coef0255);
@@ -5163,6 +5170,11 @@ static void alc_determine_headset_type(struct hda_codec *codec)
 		{}
 	};
 
+	if (spec->no_internal_mic_pin) {
+		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
+		return;
+	}
+
 	switch (codec->core.vendor_id) {
 	case 0x10ec0255:
 		alc_process_coef_fw(codec, coef0255);
@@ -6121,6 +6133,23 @@ static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
 	}
 }
 
+static void alc_fixup_no_int_mic(struct hda_codec *codec,
+				    const struct hda_fixup *fix, int action)
+{
+	struct alc_spec *spec = codec->spec;
+
+	switch (action) {
+	case HDA_FIXUP_ACT_PRE_PROBE:
+		/* Mic RING SLEEVE swap for combo jack */
+		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
+		spec->no_internal_mic_pin = true;
+		break;
+	case HDA_FIXUP_ACT_INIT:
+		alc_combo_jack_hp_jd_restart(codec);
+		break;
+	}
+}
+
 /* for hda_fixup_thinkpad_acpi() */
 #include "thinkpad_helper.c"
 
@@ -6320,6 +6349,7 @@ enum {
 	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
 	ALC287_FIXUP_HP_GPIO_LED,
 	ALC256_FIXUP_HP_HEADSET_MIC,
+	ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -7738,6 +7768,12 @@ static const struct hda_fixup alc269_fixups[] = {
 		.type = HDA_FIXUP_FUNC,
 		.v.func = alc274_fixup_hp_headset_mic,
 	},
+	[ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc_fixup_no_int_mic,
+		.chained = true,
+		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7815,6 +7851,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	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, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
+	SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
 	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),
@@ -8353,6 +8391,8 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
 		{0x19, 0x02a11020},
 		{0x1a, 0x02a11030},
 		{0x21, 0x0221101f}),
+	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
+		{0x21, 0x02211010}),
 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
 		{0x14, 0x90170110},
 		{0x19, 0x02a11020},
commit f0aee45ffc8b97e38274808de2480ddf4807b27c
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 17 18:56:21 2020 +0100

    drm/panel: s6e63m0: Fix init sequence
    
    The init sequence consist of a number of unknown settings
    for the display controller. This patch achieves two things:
    
    - Fix an error that must have happened when the driver was
      converted from the backlight subsystem: the 0xb8
      configuration command was lost and added as a tail to
      the previous command.
    
    - Update some minor settings in some bytes here and there
      according to changes in the Samsung GT-I9070 and
      Samsung GT-S7710 code dumps. Since two other devices use
      these settings they probably reflect trimmings later
      found to be better for the display rather than
      customizations for these devices.
    
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Reviewed-by: Guido Günther <agx at sigxcpu.org>
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Cc: Paweł Chmiel <pawel.mikolaj.chmiel at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117175621.870085-3-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
index 0418d6f1530b..6b4e97bfd46e 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
@@ -397,7 +397,7 @@ static void s6e63m0_init(struct s6e63m0 *ctx)
 {
 	s6e63m0_dcs_write_seq_static(ctx, MCS_PANELCTL,
 				     0x01, 0x27, 0x27, 0x07, 0x07, 0x54, 0x9f,
-				     0x63, 0x86, 0x1a, 0x33, 0x0d, 0x00, 0x00);
+				     0x63, 0x8f, 0x1a, 0x33, 0x0d, 0x00, 0x00);
 
 	s6e63m0_dcs_write_seq_static(ctx, MCS_DISCTL,
 				     0x02, 0x03, 0x1c, 0x10, 0x10);
@@ -413,9 +413,8 @@ static void s6e63m0_init(struct s6e63m0 *ctx)
 				     0x01);
 
 	s6e63m0_dcs_write_seq_static(ctx, MCS_SRCCTL,
-				     0x00, 0x8c, 0x07);
-	s6e63m0_dcs_write_seq_static(ctx, 0xb3,
-				     0xc);
+				     0x00, 0x8e, 0x07);
+	s6e63m0_dcs_write_seq_static(ctx, 0xb3, 0x6c);
 
 	s6e63m0_dcs_write_seq_static(ctx, 0xb5,
 				     0x2c, 0x12, 0x0c, 0x0a, 0x10, 0x0e, 0x17,
@@ -434,9 +433,12 @@ static void s6e63m0_init(struct s6e63m0 *ctx)
 				     0x13, 0x1f, 0x1a, 0x2a, 0x24, 0x1f, 0x1b,
 				     0x1a, 0x17, 0x2b, 0x26, 0x22, 0x20, 0x3a,
 				     0x34, 0x30, 0x2c, 0x29, 0x26, 0x25, 0x23,
-				     0x21, 0x20, 0x1e, 0x1e, 0x00, 0x00, 0x11,
-				     0x22, 0x33, 0x44, 0x44, 0x44, 0x55, 0x55,
-				     0x66, 0x66, 0x66, 0x66, 0x66, 0x66);
+				     0x21, 0x20, 0x1e, 0x1e);
+
+	s6e63m0_dcs_write_seq_static(ctx, 0xb8,
+				     0x00, 0x00, 0x11, 0x22, 0x33, 0x44, 0x44,
+				     0x44, 0x55, 0x55, 0x66, 0x66, 0x66, 0x66,
+				     0x66, 0x66);
 
 	s6e63m0_dcs_write_seq_static(ctx, 0xb9,
 				     0x2c, 0x12, 0x0c, 0x0a, 0x10, 0x0e, 0x17,
@@ -456,7 +458,7 @@ static void s6e63m0_init(struct s6e63m0 *ctx)
 				     0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06,
 				     0x09, 0x0d, 0x0f, 0x12, 0x15, 0x18);
 
-	s6e63m0_dcs_write_seq_static(ctx, 0xb2,
+	s6e63m0_dcs_write_seq_static(ctx, MCS_TEMP_SWIRE,
 				     0x10, 0x10, 0x0b, 0x05);
 
 	s6e63m0_dcs_write_seq_static(ctx, MCS_MIECTL1,
commit 9c3f0a0dd6a1da86b3476b3ef57d4a17ea5130cf
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 17 18:56:20 2020 +0100

    drm/panel: s6e63m0: Implement 28 backlight levels
    
    A later version of the s6e63m0 driver in the Samsung
    GT-I9070 vendor tree provides 28 different backlight
    levels making use of elaborate control of the ACL
    and ELVSS regulator. Implement this more fine-grained
    backlight control.
    
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Reviewed-by: Guido Günther <agx at sigxcpu.org>
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Cc: Paweł Chmiel <pawel.mikolaj.chmiel at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117175621.870085-2-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
index 8fce399fb97d..0418d6f1530b 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
@@ -43,57 +43,234 @@
 #define S6E63M0_LCD_ID_VALUE_SM2	0xB4
 #define S6E63M0_LCD_ID_VALUE_SM2_1	0xB6
 
-#define NUM_GAMMA_LEVELS             11
-#define GAMMA_TABLE_COUNT           23
+#define NUM_GAMMA_LEVELS	28
+#define GAMMA_TABLE_COUNT	23
 
-#define MAX_BRIGHTNESS              (NUM_GAMMA_LEVELS - 1)
+#define MAX_BRIGHTNESS		(NUM_GAMMA_LEVELS - 1)
 
 /* array of gamma tables for gamma value 2.2 */
 static u8 const s6e63m0_gamma_22[NUM_GAMMA_LEVELS][GAMMA_TABLE_COUNT] = {
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x78, 0xEC, 0x3D, 0xC8,
-	  0xC2, 0xB6, 0xC4, 0xC7, 0xB6, 0xD5, 0xD7,
-	  0xCC, 0x00, 0x39, 0x00, 0x36, 0x00, 0x51 },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x73, 0x4A, 0x3D, 0xC0,
-	  0xC2, 0xB1, 0xBB, 0xBE, 0xAC, 0xCE, 0xCF,
-	  0xC5, 0x00, 0x5D, 0x00, 0x5E, 0x00, 0x82 },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x70, 0x51, 0x3E, 0xBF,
-	  0xC1, 0xAF, 0xB9, 0xBC, 0xAB, 0xCC, 0xCC,
-	  0xC2, 0x00, 0x65, 0x00, 0x67, 0x00, 0x8D },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x6C, 0x54, 0x3A, 0xBC,
-	  0xBF, 0xAC, 0xB7, 0xBB, 0xA9, 0xC9, 0xC9,
-	  0xBE, 0x00, 0x71, 0x00, 0x73, 0x00, 0x9E },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x69, 0x54, 0x37, 0xBB,
-	  0xBE, 0xAC, 0xB4, 0xB7, 0xA6, 0xC7, 0xC8,
-	  0xBC, 0x00, 0x7B, 0x00, 0x7E, 0x00, 0xAB },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x66, 0x55, 0x34, 0xBA,
-	  0xBD, 0xAB, 0xB1, 0xB5, 0xA3, 0xC5, 0xC6,
-	  0xB9, 0x00, 0x85, 0x00, 0x88, 0x00, 0xBA },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x63, 0x53, 0x31, 0xB8,
-	  0xBC, 0xA9, 0xB0, 0xB5, 0xA2, 0xC4, 0xC4,
-	  0xB8, 0x00, 0x8B, 0x00, 0x8E, 0x00, 0xC2 },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x62, 0x54, 0x30, 0xB9,
-	  0xBB, 0xA9, 0xB0, 0xB3, 0xA1, 0xC1, 0xC3,
-	  0xB7, 0x00, 0x91, 0x00, 0x95, 0x00, 0xDA },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x66, 0x58, 0x34, 0xB6,
-	  0xBA, 0xA7, 0xAF, 0xB3, 0xA0, 0xC1, 0xC2,
-	  0xB7, 0x00, 0x97, 0x00, 0x9A, 0x00, 0xD1 },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x64, 0x56, 0x33, 0xB6,
-	  0xBA, 0xA8, 0xAC, 0xB1, 0x9D, 0xC1, 0xC1,
-	  0xB7, 0x00, 0x9C, 0x00, 0x9F, 0x00, 0xD6 },
-	{ MCS_PGAMMACTL, 0x00,
-	  0x18, 0x08, 0x24, 0x5f, 0x50, 0x2d, 0xB6,
-	  0xB9, 0xA7, 0xAd, 0xB1, 0x9f, 0xbe, 0xC0,
-	  0xB5, 0x00, 0xa0, 0x00, 0xa4, 0x00, 0xdb },
+	/* 30 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0xA1, 0x51, 0x7B, 0xCE,
+	  0xCB, 0xC2, 0xC7, 0xCB, 0xBC, 0xDA, 0xDD,
+	  0xD3, 0x00, 0x53, 0x00, 0x52, 0x00, 0x6F, },
+	/* 40 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x97, 0x58, 0x71, 0xCC,
+	  0xCB, 0xC0, 0xC5, 0xC9, 0xBA, 0xD9, 0xDC,
+	  0xD1, 0x00, 0x5B, 0x00, 0x5A, 0x00, 0x7A, },
+	/* 50 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x96, 0x58, 0x72, 0xCB,
+	  0xCA, 0xBF, 0xC6, 0xC9, 0xBA, 0xD6, 0xD9,
+	  0xCD, 0x00, 0x61, 0x00, 0x61, 0x00, 0x83, },
+	/* 60 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x91, 0x5E, 0x6E, 0xC9,
+	  0xC9, 0xBD, 0xC4, 0xC9, 0xB8, 0xD3, 0xD7,
+	  0xCA, 0x00, 0x69, 0x00, 0x67, 0x00, 0x8D, },
+	/* 70 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x8E, 0x62, 0x6B, 0xC7,
+	  0xC9, 0xBB, 0xC3, 0xC7, 0xB7, 0xD3, 0xD7,
+	  0xCA, 0x00, 0x6E, 0x00, 0x6C, 0x00, 0x94, },
+	/* 80 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x89, 0x68, 0x65, 0xC9,
+	  0xC9, 0xBC, 0xC1, 0xC5, 0xB6, 0xD2, 0xD5,
+	  0xC9, 0x00, 0x73, 0x00, 0x72, 0x00, 0x9A, },
+	/* 90 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x89, 0x69, 0x64, 0xC7,
+	  0xC8, 0xBB, 0xC0, 0xC5, 0xB4, 0xD2, 0xD5,
+	  0xC9, 0x00, 0x77, 0x00, 0x76, 0x00, 0xA0, },
+	/* 100 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x86, 0x69, 0x60, 0xC6,
+	  0xC8, 0xBA, 0xBF, 0xC4, 0xB4, 0xD0, 0xD4,
+	  0xC6, 0x00, 0x7C, 0x00, 0x7A, 0x00, 0xA7, },
+	/* 110 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x86, 0x6A, 0x60, 0xC5,
+	  0xC7, 0xBA, 0xBD, 0xC3, 0xB2, 0xD0, 0xD4,
+	  0xC5, 0x00, 0x80, 0x00, 0x7E, 0x00, 0xAD, },
+	/* 120 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x82, 0x6B, 0x5E, 0xC4,
+	  0xC8, 0xB9, 0xBD, 0xC2, 0xB1, 0xCE, 0xD2,
+	  0xC4, 0x00, 0x85, 0x00, 0x82, 0x00, 0xB3, },
+	/* 130 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x8C, 0x6C, 0x60, 0xC3,
+	  0xC7, 0xB9, 0xBC, 0xC1, 0xAF, 0xCE, 0xD2,
+	  0xC3, 0x00, 0x88, 0x00, 0x86, 0x00, 0xB8, },
+	/* 140 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x80, 0x6C, 0x5F, 0xC1,
+	  0xC6, 0xB7, 0xBC, 0xC1, 0xAE, 0xCD, 0xD0,
+	  0xC2, 0x00, 0x8C, 0x00, 0x8A, 0x00, 0xBE, },
+	/* 150 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x80, 0x6E, 0x5F, 0xC1,
+	  0xC6, 0xB6, 0xBC, 0xC0, 0xAE, 0xCC, 0xD0,
+	  0xC2, 0x00, 0x8F, 0x00, 0x8D, 0x00, 0xC2, },
+	/* 160 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x7F, 0x6E, 0x5F, 0xC0,
+	  0xC6, 0xB5, 0xBA, 0xBF, 0xAD, 0xCB, 0xCF,
+	  0xC0, 0x00, 0x94, 0x00, 0x91, 0x00, 0xC8, },
+	/* 170 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x7C, 0x6D, 0x5C, 0xC0,
+	  0xC6, 0xB4, 0xBB, 0xBE, 0xAD, 0xCA, 0xCF,
+	  0xC0, 0x00, 0x96, 0x00, 0x94, 0x00, 0xCC, },
+	/* 180 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x7B, 0x6D, 0x5B, 0xC0,
+	  0xC5, 0xB3, 0xBA, 0xBE, 0xAD, 0xCA, 0xCE,
+	  0xBF,	0x00, 0x99, 0x00, 0x97, 0x00, 0xD0, },
+	/* 190 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x7A, 0x6D, 0x59, 0xC1,
+	  0xC5, 0xB4, 0xB8, 0xBD, 0xAC, 0xC9, 0xCE,
+	  0xBE, 0x00, 0x9D, 0x00, 0x9A, 0x00, 0xD5, },
+	/* 200 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x79, 0x6D, 0x58, 0xC1,
+	  0xC4, 0xB4, 0xB6, 0xBD, 0xAA, 0xCA, 0xCD,
+	  0xBE, 0x00, 0x9F, 0x00, 0x9D, 0x00, 0xD9, },
+	/* 210 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x79, 0x6D, 0x57, 0xC0,
+	  0xC4, 0xB4, 0xB7, 0xBD, 0xAA, 0xC8, 0xCC,
+	  0xBD, 0x00, 0xA2, 0x00, 0xA0, 0x00, 0xDD, },
+	/* 220 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x78, 0x6F, 0x58, 0xBF,
+	  0xC4, 0xB3, 0xB5, 0xBB, 0xA9, 0xC8, 0xCC,
+	  0xBC, 0x00, 0xA6, 0x00, 0xA3, 0x00, 0xE2, },
+	/* 230 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x75, 0x6F, 0x56, 0xBF,
+	  0xC3, 0xB2, 0xB6, 0xBB, 0xA8, 0xC7, 0xCB,
+	  0xBC, 0x00, 0xA8, 0x00, 0xA6, 0x00, 0xE6, },
+	/* 240 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x76, 0x6F, 0x56, 0xC0,
+	  0xC3, 0xB2, 0xB5, 0xBA, 0xA8, 0xC6, 0xCB,
+	  0xBB, 0x00, 0xAA, 0x00, 0xA8, 0x00, 0xE9, },
+	/* 250 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x74, 0x6D, 0x54, 0xBF,
+	  0xC3, 0xB2, 0xB4, 0xBA, 0xA7, 0xC6, 0xCA,
+	  0xBA, 0x00, 0xAD, 0x00, 0xAB, 0x00, 0xED, },
+	/* 260 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x74, 0x6E, 0x54, 0xBD,
+	  0xC2, 0xB0, 0xB5, 0xBA, 0xA7, 0xC5, 0xC9,
+	  0xBA, 0x00, 0xB0, 0x00, 0xAE, 0x00, 0xF1, },
+	/* 270 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x71, 0x6C, 0x50, 0xBD,
+	  0xC3, 0xB0, 0xB4, 0xB8, 0xA6, 0xC6, 0xC9,
+	  0xBB, 0x00, 0xB2, 0x00, 0xB1, 0x00, 0xF4, },
+	/* 280 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x6E, 0x6C, 0x4D, 0xBE,
+	  0xC3, 0xB1, 0xB3, 0xB8, 0xA5, 0xC6, 0xC8,
+	  0xBB, 0x00, 0xB4, 0x00, 0xB3, 0x00, 0xF7, },
+	/* 290 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x71, 0x70, 0x50, 0xBD,
+	  0xC1, 0xB0, 0xB2, 0xB8, 0xA4, 0xC6, 0xC7,
+	  0xBB, 0x00, 0xB6, 0x00, 0xB6, 0x00, 0xFA, },
+	/* 300 cd */
+	{ MCS_PGAMMACTL, 0x02,
+	  0x18, 0x08, 0x24, 0x70, 0x6E, 0x4E, 0xBC,
+	  0xC0, 0xAF, 0xB3, 0xB8, 0xA5, 0xC5, 0xC7,
+	  0xBB, 0x00, 0xB9, 0x00, 0xB8, 0x00, 0xFC, },
+};
+
+#define NUM_ACL_LEVELS 7
+#define ACL_TABLE_COUNT 28
+
+static u8 const s6e63m0_acl[NUM_ACL_LEVELS][ACL_TABLE_COUNT] = {
+	/* NULL ACL */
+	{ MCS_BCMODE,
+	  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x00, 0x00, 0x00 },
+	/* 40P ACL */
+	{ MCS_BCMODE,
+	  0x4D, 0x96, 0x1D, 0x00, 0x00, 0x01, 0xDF, 0x00,
+	  0x00, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x01, 0x06, 0x0C, 0x11, 0x16, 0x1C, 0x21, 0x26,
+	  0x2B, 0x31, 0x36 },
+	/* 43P ACL */
+	{ MCS_BCMODE,
+	  0x4D, 0x96, 0x1D, 0x00, 0x00, 0x01, 0xDF, 0x00,
+	  0x00, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x01, 0x07, 0x0C, 0x12, 0x18, 0x1E, 0x23, 0x29,
+	  0x2F, 0x34, 0x3A },
+	/* 45P ACL */
+	{ MCS_BCMODE,
+	  0x4D, 0x96, 0x1D, 0x00, 0x00, 0x01, 0xDF, 0x00,
+	  0x00, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x01, 0x07, 0x0D, 0x13, 0x19, 0x1F, 0x25, 0x2B,
+	  0x31, 0x37, 0x3D },
+	/* 47P ACL */
+	{ MCS_BCMODE,
+	  0x4D, 0x96, 0x1D, 0x00, 0x00, 0x01, 0xDF, 0x00,
+	  0x00, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x01, 0x07, 0x0E, 0x14, 0x1B, 0x21, 0x27, 0x2E,
+	  0x34, 0x3B, 0x41 },
+	/* 48P ACL */
+	{ MCS_BCMODE,
+	  0x4D, 0x96, 0x1D, 0x00, 0x00, 0x01, 0xDF, 0x00,
+	  0x00, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x01, 0x08, 0x0E, 0x15, 0x1B, 0x22, 0x29, 0x2F,
+	  0x36, 0x3C, 0x43 },
+	/* 50P ACL */
+	{ MCS_BCMODE,
+	  0x4D, 0x96, 0x1D, 0x00, 0x00, 0x01, 0xDF, 0x00,
+	  0x00, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+	  0x01, 0x08, 0x0F, 0x16, 0x1D, 0x24, 0x2A, 0x31,
+	  0x38, 0x3F, 0x46 },
+};
+
+/* This tells us which ACL level goes with which gamma */
+static u8 const s6e63m0_acl_per_gamma[NUM_GAMMA_LEVELS] = {
+	/* 30 - 60 cd: ACL off/NULL */
+	0, 0, 0, 0,
+	/* 70 - 250 cd: 40P ACL */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	/* 260 - 300 cd: 50P ACL */
+	6, 6, 6, 6, 6,
+};
+
+/* The ELVSS backlight regulator has 5 levels */
+#define S6E63M0_ELVSS_LEVELS 5
+
+static u8 const s6e63m0_elvss_offsets[S6E63M0_ELVSS_LEVELS] = {
+	0x00,   /* not set */
+	0x0D,   /* 30 cd - 100 cd */
+	0x09,   /* 110 cd - 160 cd */
+	0x07,   /* 170 cd - 200 cd */
+	0x00,   /* 210 cd - 300 cd */
+};
+
+/* This tells us which ELVSS level goes with which gamma */
+static u8 const s6e63m0_elvss_per_gamma[NUM_GAMMA_LEVELS] = {
+	/* 30 - 100 cd */
+	1, 1, 1, 1, 1, 1, 1, 1,
+	/* 110 - 160 cd */
+	2, 2, 2, 2, 2, 2,
+	/* 170 - 200 cd */
+	3, 3, 3, 3,
+	/* 210 - 300 cd */
+	4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
 };
 
 struct s6e63m0 {
@@ -103,6 +280,7 @@ struct s6e63m0 {
 	struct drm_panel panel;
 	struct backlight_device *bl_dev;
 	u8 lcd_type;
+	u8 elvss_pulse;
 
 	struct regulator_bulk_data supplies[2];
 	struct gpio_desc *reset_gpio;
@@ -188,17 +366,25 @@ static int s6e63m0_check_lcd_type(struct s6e63m0 *ctx)
 
 	dev_info(ctx->dev, "MTP ID: %02x %02x %02x\n", id1, id2, id3);
 
-	/* We attempt to detect what panel is mounted on the controller */
+	/*
+	 * We attempt to detect what panel is mounted on the controller.
+	 * The third ID byte represents the desired ELVSS pulse for
+	 * some displays.
+	 */
 	switch (id2) {
 	case S6E63M0_LCD_ID_VALUE_M2:
 		dev_info(ctx->dev, "detected LCD panel AMS397GE MIPI M2\n");
+		ctx->elvss_pulse = id3;
 		break;
 	case S6E63M0_LCD_ID_VALUE_SM2:
 	case S6E63M0_LCD_ID_VALUE_SM2_1:
 		dev_info(ctx->dev, "detected LCD panel AMS397GE MIPI SM2\n");
+		ctx->elvss_pulse = id3;
 		break;
 	default:
 		dev_info(ctx->dev, "unknown LCD panel type %02x\n", id2);
+		/* Default ELVSS pulse level */
+		ctx->elvss_pulse = 0x16;
 		break;
 	}
 
@@ -448,15 +634,33 @@ static const struct drm_panel_funcs s6e63m0_drm_funcs = {
 static int s6e63m0_set_brightness(struct backlight_device *bd)
 {
 	struct s6e63m0 *ctx = bl_get_data(bd);
-
 	int brightness = bd->props.brightness;
-
-	/* disable and set new gamma */
+	u8 elvss_val;
+	u8 elvss_cmd_set[5];
+	int i;
+
+	/* Adjust ELVSS to candela level */
+	i = s6e63m0_elvss_per_gamma[brightness];
+	elvss_val = ctx->elvss_pulse + s6e63m0_elvss_offsets[i];
+	if (elvss_val > 0x1f)
+		elvss_val = 0x1f;
+	elvss_cmd_set[0] = MCS_TEMP_SWIRE;
+	elvss_cmd_set[1] = elvss_val;
+	elvss_cmd_set[2] = elvss_val;
+	elvss_cmd_set[3] = elvss_val;
+	elvss_cmd_set[4] = elvss_val;
+	s6e63m0_dcs_write(ctx, elvss_cmd_set, 5);
+
+	/* Update the ACL per gamma value */
+	i = s6e63m0_acl_per_gamma[brightness];
+	s6e63m0_dcs_write(ctx, s6e63m0_acl[i],
+			  ARRAY_SIZE(s6e63m0_acl[i]));
+
+	/* Update gamma table */
 	s6e63m0_dcs_write(ctx, s6e63m0_gamma_22[brightness],
 			  ARRAY_SIZE(s6e63m0_gamma_22[brightness]));
+	s6e63m0_dcs_write_seq_static(ctx, MCS_PGAMMACTL, 0x03);
 
-	/* update gamma table. */
-	s6e63m0_dcs_write_seq_static(ctx, MCS_PGAMMACTL, 0x01);
 
 	return s6e63m0_clear_error(ctx);
 }
commit c8917fd74f93f63bfb2e0a4ae11a215fecc0c791
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 17 18:56:19 2020 +0100

    drm/panel: s6e63m0: Fix and extend MCS table
    
    Fix up the format of the manufacturer command set table
    to be TAB-indented and lowercase. Add the MCS_TEMP_SWIRE
    command that we will make use of.
    
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Reviewed-by: Guido Günther <agx at sigxcpu.org>
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Cc: Paweł Chmiel <pawel.mikolaj.chmiel at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117175621.870085-1-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
index 210e70da3a15..8fce399fb97d 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
@@ -23,20 +23,21 @@
 #include "panel-samsung-s6e63m0.h"
 
 /* Manufacturer Command Set */
-#define MCS_ELVSS_ON                0xb1
-#define MCS_MIECTL1                0xc0
-#define MCS_BCMODE                              0xc1
+#define MCS_ELVSS_ON		0xb1
+#define MCS_TEMP_SWIRE		0xb2
+#define MCS_MIECTL1		0xc0
+#define MCS_BCMODE		0xc1
 #define MCS_ERROR_CHECK		0xd5
 #define MCS_READ_ID1		0xda
 #define MCS_READ_ID2		0xdb
 #define MCS_READ_ID3		0xdc
 #define MCS_LEVEL_2_KEY		0xf0
 #define MCS_MTP_KEY		0xf1
-#define MCS_DISCTL   0xf2
-#define MCS_SRCCTL           0xf6
-#define MCS_IFCTL                       0xf7
-#define MCS_PANELCTL         0xF8
-#define MCS_PGAMMACTL                   0xfa
+#define MCS_DISCTL		0xf2
+#define MCS_SRCCTL		0xf6
+#define MCS_IFCTL		0xf7
+#define MCS_PANELCTL		0xf8
+#define MCS_PGAMMACTL		0xfa
 
 #define S6E63M0_LCD_ID_VALUE_M2		0xA4
 #define S6E63M0_LCD_ID_VALUE_SM2	0xB4
commit 7ab1e9117607485df977bb6e271be5c5ad649a4c
Author: Georgi Djakov <georgi.djakov at linaro.org>
Date:   Wed Nov 18 13:10:44 2020 +0200

    interconnect: qcom: qcs404: Remove GPU and display RPM IDs
    
    The following errors are noticed during boot on a QCS404 board:
    [    2.926647] qcom_icc_rpm_smd_send mas 6 error -6
    [    2.934573] qcom_icc_rpm_smd_send mas 8 error -6
    
    These errors show when we try to configure the GPU and display nodes.
    Since these particular nodes aren't supported on RPM and are purely
    local, we should just change their mas_rpm_id to -1 to avoid any
    requests being sent for these master IDs.
    
    Reviewed-by: Mike Tipton <mdtipton at codeaurora.org>
    Reviewed-by: Bjorn Andersson <bjorn.andersson at linaro.org>
    Link: https://lore.kernel.org/r/20201118111044.26056-1-georgi.djakov@linaro.org
    Signed-off-by: Georgi Djakov <georgi.djakov at linaro.org>

diff --git a/drivers/interconnect/qcom/qcs404.c b/drivers/interconnect/qcom/qcs404.c
index d4769a5ea182..9820709b43db 100644
--- a/drivers/interconnect/qcom/qcs404.c
+++ b/drivers/interconnect/qcom/qcs404.c
@@ -157,8 +157,8 @@ struct qcom_icc_desc {
 	}
 
 DEFINE_QNODE(mas_apps_proc, QCS404_MASTER_AMPSS_M0, 8, 0, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV);
-DEFINE_QNODE(mas_oxili, QCS404_MASTER_GRAPHICS_3D, 8, 6, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV);
-DEFINE_QNODE(mas_mdp, QCS404_MASTER_MDP_PORT0, 8, 8, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV);
+DEFINE_QNODE(mas_oxili, QCS404_MASTER_GRAPHICS_3D, 8, -1, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV);
+DEFINE_QNODE(mas_mdp, QCS404_MASTER_MDP_PORT0, 8, -1, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV);
 DEFINE_QNODE(mas_snoc_bimc_1, QCS404_SNOC_BIMC_1_MAS, 8, 76, -1, QCS404_SLAVE_EBI_CH0);
 DEFINE_QNODE(mas_tcu_0, QCS404_MASTER_TCU_0, 8, -1, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV);
 DEFINE_QNODE(mas_spdm, QCS404_MASTER_SPDM, 4, -1, -1, QCS404_PNOC_INT_3);
commit c497f9322af947204c28292be6f20dd2d97483dd
Author: Georgi Djakov <georgi.djakov at linaro.org>
Date:   Thu Nov 12 12:51:40 2020 +0200

    interconnect: qcom: msm8916: Remove rpm-ids from non-RPM nodes
    
    Some nodes are incorrectly marked as RPM-controlled (they have RPM
    master and slave ids assigned), but are actually controlled by the
    application CPU instead. The RPM complains when we send requests for
    resources that it can't control. Let's fix this by replacing the IDs,
    with the default "-1" in which case no requests are sent.
    
    Reviewed-by: Mike Tipton <mdtipton at codeaurora.org>
    Link: https://lore.kernel.org/r/20201112105140.10092-1-georgi.djakov@linaro.org
    Signed-off-by: Georgi Djakov <georgi.djakov at linaro.org>

diff --git a/drivers/interconnect/qcom/msm8916.c b/drivers/interconnect/qcom/msm8916.c
index 42c6c5581662..e8371d40ab8d 100644
--- a/drivers/interconnect/qcom/msm8916.c
+++ b/drivers/interconnect/qcom/msm8916.c
@@ -182,7 +182,7 @@ DEFINE_QNODE(mas_pcnoc_sdcc_1, MSM8916_MASTER_SDCC_1, 8, -1, -1, MSM8916_PNOC_IN
 DEFINE_QNODE(mas_pcnoc_sdcc_2, MSM8916_MASTER_SDCC_2, 8, -1, -1, MSM8916_PNOC_INT_1);
 DEFINE_QNODE(mas_qdss_bam, MSM8916_MASTER_QDSS_BAM, 8, -1, -1, MSM8916_SNOC_QDSS_INT);
 DEFINE_QNODE(mas_qdss_etr, MSM8916_MASTER_QDSS_ETR, 8, -1, -1, MSM8916_SNOC_QDSS_INT);
-DEFINE_QNODE(mas_snoc_cfg, MSM8916_MASTER_SNOC_CFG, 4, 20, -1, MSM8916_SNOC_QDSS_INT);
+DEFINE_QNODE(mas_snoc_cfg, MSM8916_MASTER_SNOC_CFG, 4, -1, -1, MSM8916_SNOC_QDSS_INT);
 DEFINE_QNODE(mas_spdm, MSM8916_MASTER_SPDM, 4, -1, -1, MSM8916_PNOC_MAS_0);
 DEFINE_QNODE(mas_tcu0, MSM8916_MASTER_TCU0, 8, -1, -1, MSM8916_SLAVE_EBI_CH0, MSM8916_BIMC_SNOC_MAS, MSM8916_SLAVE_AMPSS_L2);
 DEFINE_QNODE(mas_tcu1, MSM8916_MASTER_TCU1, 8, -1, -1, MSM8916_SLAVE_EBI_CH0, MSM8916_BIMC_SNOC_MAS, MSM8916_SLAVE_AMPSS_L2);
@@ -208,14 +208,14 @@ DEFINE_QNODE(pcnoc_snoc_mas, MSM8916_PNOC_SNOC_MAS, 8, 29, -1, MSM8916_PNOC_SNOC
 DEFINE_QNODE(pcnoc_snoc_slv, MSM8916_PNOC_SNOC_SLV, 8, -1, 45, MSM8916_SNOC_INT_0, MSM8916_SNOC_INT_BIMC, MSM8916_SNOC_INT_1);
 DEFINE_QNODE(qdss_int, MSM8916_SNOC_QDSS_INT, 8, -1, -1, MSM8916_SNOC_INT_0, MSM8916_SNOC_INT_BIMC);
 DEFINE_QNODE(slv_apps_l2, MSM8916_SLAVE_AMPSS_L2, 8, -1, -1, 0);
-DEFINE_QNODE(slv_apss, MSM8916_SLAVE_APSS, 4, -1, 20, 0);
+DEFINE_QNODE(slv_apss, MSM8916_SLAVE_APSS, 4, -1, -1, 0);
 DEFINE_QNODE(slv_audio, MSM8916_SLAVE_LPASS, 4, -1, -1, 0);
 DEFINE_QNODE(slv_bimc_cfg, MSM8916_SLAVE_BIMC_CFG, 4, -1, -1, 0);
 DEFINE_QNODE(slv_blsp_1, MSM8916_SLAVE_BLSP_1, 4, -1, -1, 0);
 DEFINE_QNODE(slv_boot_rom, MSM8916_SLAVE_BOOT_ROM, 4, -1, -1, 0);
 DEFINE_QNODE(slv_camera_cfg, MSM8916_SLAVE_CAMERA_CFG, 4, -1, -1, 0);
-DEFINE_QNODE(slv_cats_0, MSM8916_SLAVE_CATS_128, 16, -1, 106, 0);
-DEFINE_QNODE(slv_cats_1, MSM8916_SLAVE_OCMEM_64, 8, -1, 107, 0);
+DEFINE_QNODE(slv_cats_0, MSM8916_SLAVE_CATS_128, 16, -1, -1, 0);
+DEFINE_QNODE(slv_cats_1, MSM8916_SLAVE_OCMEM_64, 8, -1, -1, 0);
 DEFINE_QNODE(slv_clk_ctl, MSM8916_SLAVE_CLK_CTL, 4, -1, -1, 0);
 DEFINE_QNODE(slv_crypto_0_cfg, MSM8916_SLAVE_CRYPTO_0_CFG, 4, -1, -1, 0);
 DEFINE_QNODE(slv_dehr_cfg, MSM8916_SLAVE_DEHR_CFG, 4, -1, -1, 0);
@@ -239,7 +239,7 @@ DEFINE_QNODE(slv_sdcc_2, MSM8916_SLAVE_SDCC_2, 4, -1, -1, 0);
 DEFINE_QNODE(slv_security, MSM8916_SLAVE_SECURITY, 4, -1, -1, 0);
 DEFINE_QNODE(slv_snoc_cfg, MSM8916_SLAVE_SNOC_CFG, 4, -1, -1, 0);
 DEFINE_QNODE(slv_spdm, MSM8916_SLAVE_SPDM, 4, -1, -1, 0);
-DEFINE_QNODE(slv_srvc_snoc, MSM8916_SLAVE_SRVC_SNOC, 8, -1, 29, 0);
+DEFINE_QNODE(slv_srvc_snoc, MSM8916_SLAVE_SRVC_SNOC, 8, -1, -1, 0);
 DEFINE_QNODE(slv_tcsr, MSM8916_SLAVE_TCSR, 4, -1, -1, 0);
 DEFINE_QNODE(slv_tlmm, MSM8916_SLAVE_TLMM, 4, -1, -1, 0);
 DEFINE_QNODE(slv_usb_hs, MSM8916_SLAVE_USB_HS, 4, -1, -1, 0);
@@ -249,7 +249,7 @@ DEFINE_QNODE(snoc_bimc_0_slv, MSM8916_SNOC_BIMC_0_SLV, 8, -1, 24, MSM8916_SLAVE_
 DEFINE_QNODE(snoc_bimc_1_mas, MSM8916_SNOC_BIMC_1_MAS, 16, -1, -1, MSM8916_SNOC_BIMC_1_SLV);
 DEFINE_QNODE(snoc_bimc_1_slv, MSM8916_SNOC_BIMC_1_SLV, 8, -1, -1, MSM8916_SLAVE_EBI_CH0);
 DEFINE_QNODE(snoc_int_0, MSM8916_SNOC_INT_0, 8, 99, 130, MSM8916_SLAVE_QDSS_STM, MSM8916_SLAVE_IMEM, MSM8916_SNOC_PNOC_MAS);
-DEFINE_QNODE(snoc_int_1, MSM8916_SNOC_INT_1, 8, 100, 131, MSM8916_SLAVE_APSS, MSM8916_SLAVE_CATS_128, MSM8916_SLAVE_OCMEM_64);
+DEFINE_QNODE(snoc_int_1, MSM8916_SNOC_INT_1, 8, -1, -1, MSM8916_SLAVE_APSS, MSM8916_SLAVE_CATS_128, MSM8916_SLAVE_OCMEM_64);
 DEFINE_QNODE(snoc_int_bimc, MSM8916_SNOC_INT_BIMC, 8, 101, 132, MSM8916_SNOC_BIMC_0_MAS);
 DEFINE_QNODE(snoc_pcnoc_mas, MSM8916_SNOC_PNOC_MAS, 8, -1, -1, MSM8916_SNOC_PNOC_SLV);
 DEFINE_QNODE(snoc_pcnoc_slv, MSM8916_SNOC_PNOC_SLV, 8, -1, -1, MSM8916_PNOC_INT_0);
commit 5f1251a48c17b54939d7477305e39679a565382c
Author: Dexuan Cui <decui at microsoft.com>
Date:   Tue Nov 17 16:03:05 2020 -0800

    video: hyperv_fb: Fix the cache type when mapping the VRAM
    
    x86 Hyper-V used to essentially always overwrite the effective cache type
    of guest memory accesses to WB. This was problematic in cases where there
    is a physical device assigned to the VM, since that often requires that
    the VM should have control over cache types. Thus, on newer Hyper-V since
    2018, Hyper-V always honors the VM's cache type, but unexpectedly Linux VM
    users start to complain that Linux VM's VRAM becomes very slow, and it
    turns out that Linux VM should not map the VRAM uncacheable by ioremap().
    Fix this slowness issue by using ioremap_cache().
    
    On ARM64, ioremap_cache() is also required as the host also maps the VRAM
    cacheable, otherwise VM Connect can't display properly with ioremap() or
    ioremap_wc().
    
    With this change, the VRAM on new Hyper-V is as fast as regular RAM, so
    it's no longer necessary to use the hacks we added to mitigate the
    slowness, i.e. we no longer need to allocate physical memory and use
    it to back up the VRAM in Generation-1 VM, and we also no longer need to
    allocate physical memory to back up the framebuffer in a Generation-2 VM
    and copy the framebuffer to the real VRAM. A further big change will
    address these for v5.11.
    
    Fixes: 68a2d20b79b1 ("drivers/video: add Hyper-V Synthetic Video Frame Buffer Driver")
    Tested-by: Boqun Feng <boqun.feng at gmail.com>
    Signed-off-by: Dexuan Cui <decui at microsoft.com>
    Reviewed-by: Michael Kelley <mikelley at microsoft.com>
    Reviewed-by: Haiyang Zhang <haiyangz at microsoft.com>
    Link: https://lore.kernel.org/r/20201118000305.24797-1-decui@microsoft.com
    Signed-off-by: Wei Liu <wei.liu at kernel.org>

diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
index 02411d89cb46..58c74d2356ba 100644
--- a/drivers/video/fbdev/hyperv_fb.c
+++ b/drivers/video/fbdev/hyperv_fb.c
@@ -1092,7 +1092,12 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
 		goto err1;
 	}
 
-	fb_virt = ioremap(par->mem->start, screen_fb_size);
+	/*
+	 * Map the VRAM cacheable for performance. This is also required for
+	 * VM Connect to display properly for ARM64 Linux VM, as the host also
+	 * maps the VRAM cacheable.
+	 */
+	fb_virt = ioremap_cache(par->mem->start, screen_fb_size);
 	if (!fb_virt)
 		goto err2;
 
commit b36bf0a0fe5d18561dd98eb774ef61dd396edc42
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:24 2020 +0100

    mtd: rawnand: socrates: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-20-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/socrates_nand.c b/drivers/mtd/nand/raw/socrates_nand.c
index 0f63ff6f7fe7..107208311987 100644
--- a/drivers/mtd/nand/raw/socrates_nand.c
+++ b/drivers/mtd/nand/raw/socrates_nand.c
@@ -22,6 +22,7 @@
 #define FPGA_NAND_DATA_SHIFT		16
 
 struct socrates_nand_host {
+	struct nand_controller	controller;
 	struct nand_chip	nand_chip;
 	void __iomem		*io_base;
 	struct device		*dev;
@@ -116,6 +117,18 @@ static int socrates_nand_device_ready(struct nand_chip *nand_chip)
 	return 1;
 }
 
+static int socrates_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
+static const struct nand_controller_ops socrates_ops = {
+	.attach_chip = socrates_attach_chip,
+};
+
 /*
  * Probe for the NAND device.
  */
@@ -141,6 +154,10 @@ static int socrates_nand_probe(struct platform_device *ofdev)
 	mtd = nand_to_mtd(nand_chip);
 	host->dev = &ofdev->dev;
 
+	nand_controller_init(&host->controller);
+	host->controller.ops = &socrates_ops;
+	nand_chip->controller = &host->controller;
+
 	/* link the private data structures */
 	nand_set_controller_data(nand_chip, host);
 	nand_set_flash_node(nand_chip, ofdev->dev.of_node);
@@ -153,10 +170,6 @@ static int socrates_nand_probe(struct platform_device *ofdev)
 	nand_chip->legacy.read_buf = socrates_nand_read_buf;
 	nand_chip->legacy.dev_ready = socrates_nand_device_ready;
 
-	/* enable ECC */
-	nand_chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	nand_chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
-
 	/* TODO: I have no idea what real delay is. */
 	nand_chip->legacy.chip_delay = 20;	/* 20us command delay time */
 
commit 1ac6870991939c9351d4c5c49c38b52c97ee7e19
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:23 2020 +0100

    mtd: rawnand: sharpsl: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>

diff --git a/drivers/mtd/nand/raw/sharpsl.c b/drivers/mtd/nand/raw/sharpsl.c
index 1327bfb3d5d3..af98bcc9d689 100644
--- a/drivers/mtd/nand/raw/sharpsl.c
+++ b/drivers/mtd/nand/raw/sharpsl.c
@@ -20,6 +20,7 @@
 #include <linux/io.h>
 
 struct sharpsl_nand {
+	struct nand_controller	controller;
 	struct nand_chip	chip;
 
 	void __iomem		*io;
@@ -96,6 +97,25 @@ static int sharpsl_nand_calculate_ecc(struct nand_chip *chip,
 	return readb(sharpsl->io + ECCCNTR) != 0;
 }
 
+static int sharpsl_attach_chip(struct nand_chip *chip)
+{
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
+	chip->ecc.size = 256;
+	chip->ecc.bytes = 3;
+	chip->ecc.strength = 1;
+	chip->ecc.hwctl = sharpsl_nand_enable_hwecc;
+	chip->ecc.calculate = sharpsl_nand_calculate_ecc;
+	chip->ecc.correct = nand_correct_data;
+
+	return 0;
+}
+
+static const struct nand_controller_ops sharpsl_ops = {
+	.attach_chip = sharpsl_attach_chip,
+};
+
 /*
  * Main initialization routine
  */
@@ -136,6 +156,10 @@ static int sharpsl_nand_probe(struct platform_device *pdev)
 	/* Get pointer to private data */
 	this = (struct nand_chip *)(&sharpsl->chip);
 
+	nand_controller_init(&sharpsl->controller);
+	sharpsl->controller.ops = &sharpsl_ops;
+	this->controller = &sharpsl->controller;
+
 	/* Link the private data with the MTD structure */
 	mtd = nand_to_mtd(this);
 	mtd->dev.parent = &pdev->dev;
@@ -156,15 +180,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev)
 	this->legacy.dev_ready = sharpsl_nand_dev_ready;
 	/* 15 us command delay time */
 	this->legacy.chip_delay = 15;
-	/* set eccmode using hardware ECC */
-	this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	this->ecc.size = 256;
-	this->ecc.bytes = 3;
-	this->ecc.strength = 1;
 	this->badblock_pattern = data->badblock_pattern;
-	this->ecc.hwctl = sharpsl_nand_enable_hwecc;
-	this->ecc.calculate = sharpsl_nand_calculate_ecc;
-	this->ecc.correct = nand_correct_data;
 
 	/* Scan to find existence of the device */
 	err = nand_scan(this, 1);
commit 7ef969a042281bdcdba31f1b69daeea4f0789ed1
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:22 2020 +0100

    mtd: rawnand: r852: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Cc: Maxim Levitsky <maximlevitsky at gmail.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-18-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/r852.c b/drivers/mtd/nand/raw/r852.c
index 6b7addd2c420..c742354c1b0b 100644
--- a/drivers/mtd/nand/raw/r852.c
+++ b/drivers/mtd/nand/raw/r852.c
@@ -817,6 +817,29 @@ out:
 	return ret;
 }
 
+static int r852_attach_chip(struct nand_chip *chip)
+{
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
+	chip->ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
+	chip->ecc.size = R852_DMA_LEN;
+	chip->ecc.bytes = SM_OOB_SIZE;
+	chip->ecc.strength = 2;
+	chip->ecc.hwctl = r852_ecc_hwctl;
+	chip->ecc.calculate = r852_ecc_calculate;
+	chip->ecc.correct = r852_ecc_correct;
+
+	/* TODO: hack */
+	chip->ecc.read_oob = r852_read_oob;
+
+	return 0;
+}
+
+static const struct nand_controller_ops r852_ops = {
+	.attach_chip = r852_attach_chip,
+};
+
 static int  r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
 {
 	int error;
@@ -858,19 +881,6 @@ static int  r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
 	chip->legacy.read_buf = r852_read_buf;
 	chip->legacy.write_buf = r852_write_buf;
 
-	/* ecc */
-	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	chip->ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
-	chip->ecc.size = R852_DMA_LEN;
-	chip->ecc.bytes = SM_OOB_SIZE;
-	chip->ecc.strength = 2;
-	chip->ecc.hwctl = r852_ecc_hwctl;
-	chip->ecc.calculate = r852_ecc_calculate;
-	chip->ecc.correct = r852_ecc_correct;
-
-	/* TODO: hack */
-	chip->ecc.read_oob = r852_read_oob;
-
 	/* init our device structure */
 	dev = kzalloc(sizeof(struct r852_device), GFP_KERNEL);
 
@@ -882,6 +892,10 @@ static int  r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
 	dev->pci_dev = pci_dev;
 	pci_set_drvdata(pci_dev, dev);
 
+	nand_controller_init(&dev->controller);
+	dev->controller.ops = &r852_ops;
+	chip->controller = &dev->controller;
+
 	dev->bounce_buffer = dma_alloc_coherent(&pci_dev->dev, R852_DMA_LEN,
 		&dev->phys_bounce_buffer, GFP_KERNEL);
 
diff --git a/drivers/mtd/nand/raw/r852.h b/drivers/mtd/nand/raw/r852.h
index e9ce299c499d..96fe301d15da 100644
--- a/drivers/mtd/nand/raw/r852.h
+++ b/drivers/mtd/nand/raw/r852.h
@@ -104,6 +104,7 @@
 #define DMA_MEMORY	1
 
 struct r852_device {
+	struct nand_controller		controller;
 	void __iomem *mmio;		/* mmio */
 	struct nand_chip *chip;		/* nand chip backpointer */
 	struct pci_dev *pci_dev;	/* pci backpointer */
commit eca22edb37d29f29306fab6e6b59fe92c633960b
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Wed Nov 18 10:47:58 2020 +0100

    drm: Pass the full state to connectors atomic functions
    
    The current atomic helpers have either their object state being passed as
    an argument or the full atomic state.
    
    The former is the pattern that was done at first, before switching to the
    latter for new hooks or when it was needed.
    
    Now that the CRTCs have been converted, let's move forward with the
    connectors to provide a consistent interface.
    
    The conversion was done using the coccinelle script below, and built tested
    on all the drivers.
    
    @@
    identifier connector, connector_state;
    @@
    
     struct drm_connector_helper_funcs {
            ...
            struct drm_encoder* (*atomic_best_encoder)(struct drm_connector *connector,
    -                                                  struct drm_connector_state *connector_state);
    +                                                  struct drm_atomic_state *state);
            ...
    }
    
    @@
    identifier connector, connector_state;
    @@
    
     struct drm_connector_helper_funcs {
            ...
            void (*atomic_commit)(struct drm_connector *connector,
    -                             struct drm_connector_state *connector_state);
    +                             struct drm_atomic_state *state);
            ...
    }
    
    @@
    struct drm_connector_helper_funcs *FUNCS;
    identifier state;
    identifier connector, connector_state;
    identifier f;
    @@
    
     f(..., struct drm_atomic_state *state, ...)
     {
            <+...
    -       FUNCS->atomic_commit(connector, connector_state);
    +       FUNCS->atomic_commit(connector, state);
            ...+>
     }
    
    @@
    struct drm_connector_helper_funcs *FUNCS;
    identifier state;
    identifier connector, connector_state;
    identifier var, f;
    @@
    
     f(struct drm_atomic_state *state, ...)
     {
            <+...
    -       var = FUNCS->atomic_best_encoder(connector, connector_state);
    +       var = FUNCS->atomic_best_encoder(connector, state);
            ...+>
     }
    
    @ connector_atomic_func @
    identifier helpers;
    identifier func;
    @@
    
    (
    static struct drm_connector_helper_funcs helpers = {
            ...,
            .atomic_best_encoder = func,
            ...,
    };
    |
    static struct drm_connector_helper_funcs helpers = {
            ...,
            .atomic_commit = func,
            ...,
    };
    )
    
    @@
    identifier connector_atomic_func.func;
    identifier connector;
    symbol state;
    @@
    
     func(struct drm_connector *connector,
    -      struct drm_connector_state *state
    +      struct drm_connector_state *connector_state
          )
     {
            ...
    -       state
    +       connector_state
            ...
     }
    
    @ ignores_state @
    identifier connector_atomic_func.func;
    identifier connector, connector_state;
    @@
    
     func(struct drm_connector *connector,
          struct drm_connector_state *connector_state)
    {
            ... when != connector_state
    }
    
    @ adds_state depends on connector_atomic_func && !ignores_state @
    identifier connector_atomic_func.func;
    identifier connector, connector_state;
    @@
    
     func(struct drm_connector *connector, struct drm_connector_state *connector_state)
     {
    +       struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state, connector);
            ...
     }
    
    @ depends on connector_atomic_func @
    identifier connector_atomic_func.func;
    identifier connector_state;
    identifier connector;
    @@
    
     func(struct drm_connector *connector,
    -     struct drm_connector_state *connector_state
    +     struct drm_atomic_state *state
               )
     { ... }
    
    @ include depends on adds_state @
    @@
    
     #include <drm/drm_atomic.h>
    
    @ no_include depends on !include && adds_state @
    @@
    
    + #include <drm/drm_atomic.h>
      #include <drm/...>
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Rodrigo Siqueira <rodrigosiqueiramelo at gmail.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Acked-by: Thomas Zimmermann <tzimmermann at suse.de>
    Acked-by: Harry Wentland <harry.wentland at amd.com>
    Cc: Leo Li <sunpeng.li at amd.com>
    Cc: Alex Deucher <alexander.deucher at amd.com>
    Cc: "Christian König" <christian.koenig at amd.com>
    Cc: Jani Nikula <jani.nikula at linux.intel.com>
    Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
    Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Cc: Ben Skeggs <bskeggs at redhat.com>
    Cc: Rodrigo Siqueira <rodrigosiqueiramelo at gmail.com>
    Cc: Melissa Wen <melissa.srw at gmail.com>
    Cc: Haneen Mohammed <hamohammed.sa at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201118094758.506730-1-maxime@cerno.tech

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 6f975c16779d..8ab0b9060d2b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -24,6 +24,7 @@
  */
 
 #include <linux/version.h>
+#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_mst_helper.h>
 #include <drm/drm_dp_helper.h>
@@ -252,8 +253,10 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
 
 static struct drm_encoder *
 dm_mst_atomic_best_encoder(struct drm_connector *connector,
-			   struct drm_connector_state *connector_state)
+			   struct drm_atomic_state *state)
 {
+	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
+											 connector);
 	struct drm_device *dev = connector->dev;
 	struct amdgpu_device *adev = drm_to_adev(dev);
 	struct amdgpu_crtc *acrtc = to_amdgpu_crtc(connector_state->crtc);
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index ddd0e3239150..ba1507036f26 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -122,7 +122,8 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state,
 			continue;
 
 		if (funcs->atomic_best_encoder)
-			new_encoder = funcs->atomic_best_encoder(connector, new_conn_state);
+			new_encoder = funcs->atomic_best_encoder(connector,
+								 state);
 		else if (funcs->best_encoder)
 			new_encoder = funcs->best_encoder(connector);
 		else
@@ -345,8 +346,7 @@ update_connector_routing(struct drm_atomic_state *state,
 	funcs = connector->helper_private;
 
 	if (funcs->atomic_best_encoder)
-		new_encoder = funcs->atomic_best_encoder(connector,
-							 new_connector_state);
+		new_encoder = funcs->atomic_best_encoder(connector, state);
 	else if (funcs->best_encoder)
 		new_encoder = funcs->best_encoder(connector);
 	else
@@ -1313,7 +1313,7 @@ static void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
 
 		if (new_conn_state->writeback_job && new_conn_state->writeback_job->fb) {
 			WARN_ON(connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK);
-			funcs->atomic_commit(connector, new_conn_state);
+			funcs->atomic_commit(connector, old_state);
 		}
 	}
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index c8fcec4d0788..4f05ffa3e761 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -23,6 +23,7 @@
  *
  */
 
+#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_probe_helper.h>
@@ -719,11 +720,13 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
 }
 
 static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *connector,
-							 struct drm_connector_state *state)
+							 struct drm_atomic_state *state)
 {
+	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
+											 connector);
 	struct intel_connector *intel_connector = to_intel_connector(connector);
 	struct intel_dp *intel_dp = intel_connector->mst_port;
-	struct intel_crtc *crtc = to_intel_crtc(state->crtc);
+	struct intel_crtc *crtc = to_intel_crtc(connector_state->crtc);
 
 	return &intel_dp->mst_encoders[crtc->pipe]->base.base;
 }
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index b111fe24a06b..911c2cbe6aa3 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -32,6 +32,7 @@
 #include <linux/hdmi.h>
 #include <linux/component.h>
 
+#include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_helper.h>
 #include <drm/drm_edid.h>
@@ -1161,8 +1162,10 @@ nv50_msto_new(struct drm_device *dev, struct nv50_head *head, int id)
 
 static struct drm_encoder *
 nv50_mstc_atomic_best_encoder(struct drm_connector *connector,
-			      struct drm_connector_state *connector_state)
+			      struct drm_atomic_state *state)
 {
+	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
+											 connector);
 	struct nv50_mstc *mstc = nv50_mstc(connector);
 	struct drm_crtc *crtc = connector_state->crtc;
 
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index 34612edcabbd..8aa5220885f4 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -273,8 +273,10 @@ static int vc4_txp_connector_atomic_check(struct drm_connector *conn,
 }
 
 static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
-					struct drm_connector_state *conn_state)
+					struct drm_atomic_state *state)
 {
+	struct drm_connector_state *conn_state = drm_atomic_get_new_connector_state(state,
+										    conn);
 	struct vc4_txp *txp = connector_to_vc4_txp(conn);
 	struct drm_gem_cma_object *gem;
 	struct drm_display_mode *mode;
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index 67f80ab1e85f..78fdc1d59186 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -2,6 +2,7 @@
 
 #include <linux/dma-buf-map.h>
 
+#include <drm/drm_atomic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_writeback.h>
 #include <drm/drm_probe_helper.h>
@@ -105,8 +106,10 @@ static void vkms_wb_cleanup_job(struct drm_writeback_connector *connector,
 }
 
 static void vkms_wb_atomic_commit(struct drm_connector *conn,
-				  struct drm_connector_state *state)
+				  struct drm_atomic_state *state)
 {
+	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
+											 conn);
 	struct vkms_device *vkmsdev = drm_device_to_vkms_device(conn->dev);
 	struct vkms_output *output = &vkmsdev->output;
 	struct drm_writeback_connector *wb_conn = &output->wb_connector;
@@ -122,7 +125,7 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
 	crtc_state->active_writeback = conn_state->writeback_job->priv;
 	crtc_state->wb_pending = true;
 	spin_unlock_irq(&output->composer_lock);
-	drm_writeback_queue_job(wb_conn, state);
+	drm_writeback_queue_job(wb_conn, connector_state);
 }
 
 static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {
diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
index f2de050085be..16ff3fa148f5 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -1044,9 +1044,8 @@ struct drm_connector_helper_funcs {
 	 * NOTE:
 	 *
 	 * This function is called in the check phase of an atomic update. The
-	 * driver is not allowed to change anything outside of the free-standing
-	 * state objects passed-in or assembled in the overall &drm_atomic_state
-	 * update tracking structure.
+	 * driver is not allowed to change anything outside of the
+	 * &drm_atomic_state update tracking structure passed in.
 	 *
 	 * RETURNS:
 	 *
@@ -1056,7 +1055,7 @@ struct drm_connector_helper_funcs {
 	 * for this.
 	 */
 	struct drm_encoder *(*atomic_best_encoder)(struct drm_connector *connector,
-						   struct drm_connector_state *connector_state);
+						   struct drm_atomic_state *state);
 
 	/**
 	 * @atomic_check:
@@ -1097,15 +1096,15 @@ struct drm_connector_helper_funcs {
 	 *
 	 * This hook is to be used by drivers implementing writeback connectors
 	 * that need a point when to commit the writeback job to the hardware.
-	 * The writeback_job to commit is available in
-	 * &drm_connector_state.writeback_job.
+	 * The writeback_job to commit is available in the new connector state,
+	 * in &drm_connector_state.writeback_job.
 	 *
 	 * This hook is optional.
 	 *
 	 * This callback is used by the atomic modeset helpers.
 	 */
 	void (*atomic_commit)(struct drm_connector *connector,
-			      struct drm_connector_state *state);
+			      struct drm_atomic_state *state);
 
 	/**
 	 * @prepare_writeback_job:
commit 22f0d89805a44c06a263f36a0d0f192f333df16e
Author: Simon Ser <contact at emersion.fr>
Date:   Fri Nov 20 09:46:28 2020 +0000

    drm: document drm_mode_modeinfo
    
    This allows `struct drm_mode_modeinfo` references to be linkified.
    
    Some descriptions are borrowed from struct drm_display_mode.
    
    Signed-off-by: Simon Ser <contact at emersion.fr>
    Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/BBtyuxgs3DvcrMtbRyb7KBEWUviGy1dtWO61eB4@cp3-web-016.plabs.ch

diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
index cdf2a299ccd4..a0d79d1c51e2 100644
--- a/include/drm/drm_modes.h
+++ b/include/drm/drm_modes.h
@@ -195,6 +195,9 @@ enum drm_mode_status {
  * @crtc_vsync_end: hardware mode vertical sync end
  * @crtc_vtotal: hardware mode vertical total size
  *
+ * This is the kernel API display mode information structure. For the
+ * user-space version see struct drm_mode_modeinfo.
+ *
  * The horizontal and vertical timings are defined per the following diagram.
  *
  * ::
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 3979389fcc4f..b49fbf2bdc40 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -218,6 +218,27 @@ extern "C" {
 #define DRM_MODE_CONTENT_PROTECTION_DESIRED     1
 #define DRM_MODE_CONTENT_PROTECTION_ENABLED     2
 
+/**
+ * struct drm_mode_modeinfo - Display mode information.
+ * @clock: pixel clock in kHz
+ * @hdisplay: horizontal display size
+ * @hsync_start: horizontal sync start
+ * @hsync_end: horizontal sync end
+ * @htotal: horizontal total size
+ * @hskew: horizontal skew
+ * @vdisplay: vertical display size
+ * @vsync_start: vertical sync start
+ * @vsync_end: vertical sync end
+ * @vtotal: vertical total size
+ * @vscan: vertical scan
+ * @vrefresh: approximate vertical refresh rate in Hz
+ * @flags: bitmask of misc. flags, see DRM_MODE_FLAG_* defines
+ * @type: bitmask of type flags, see DRM_MODE_TYPE_* defines
+ * @name: string describing the mode resolution
+ *
+ * This is the user-space API display mode information structure. For the
+ * kernel version see struct drm_display_mode.
+ */
 struct drm_mode_modeinfo {
 	__u32 clock;
 	__u16 hdisplay;
commit 2ac5ef3b23629e9740000948c48f4141bacb5abb
Author: Simon Ser <contact at emersion.fr>
Date:   Fri Nov 20 08:57:33 2020 +0000

    drm: document drm_mode_get_connector
    
    Document how to perform a GETCONNECTOR ioctl. Document the various
    struct fields. Also document how to perform a forced probe, and when
    should user-space do it.
    
    Signed-off-by: Simon Ser <contact at emersion.fr>
    Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Cc: Pekka Paalanen <ppaalanen at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/4NxrTtynzPiPX4SOCzxmA1sRB8fVLfeiabVpi5j3Y@cp7-web-041.plabs.ch

diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index f29c1d37be67..3979389fcc4f 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -368,27 +368,95 @@ enum drm_mode_subconnector {
 #define DRM_MODE_CONNECTOR_WRITEBACK	18
 #define DRM_MODE_CONNECTOR_SPI		19
 
+/**
+ * struct drm_mode_get_connector - Get connector metadata.
+ *
+ * User-space can perform a GETCONNECTOR ioctl to retrieve information about a
+ * connector. User-space is expected to retrieve encoders, modes and properties
+ * by performing this ioctl at least twice: the first time to retrieve the
+ * number of elements, the second time to retrieve the elements themselves.
+ *
+ * To retrieve the number of elements, set @count_props and @count_encoders to
+ * zero, set @count_modes to 1, and set @modes_ptr to a temporary struct
+ * drm_mode_modeinfo element.
+ *
+ * To retrieve the elements, allocate arrays for @encoders_ptr, @modes_ptr,
+ * @props_ptr and @prop_values_ptr, then set @count_modes, @count_props and
+ * @count_encoders to their capacity.
+ *
+ * Performing the ioctl only twice may be racy: the number of elements may have
+ * changed with a hotplug event in-between the two ioctls. User-space is
+ * expected to retry the last ioctl until the number of elements stabilizes.
+ * The kernel won't fill any array which doesn't have the expected length.
+ *
+ * **Force-probing a connector**
+ *
+ * If the @count_modes field is set to zero, the kernel will perform a forced
+ * probe on the connector to refresh the connector status, modes and EDID.
+ * A forced-probe can be slow and the ioctl will block. A force-probe can cause
+ * flickering and temporary freezes, so it should not be performed
+ * automatically.
+ *
+ * User-space shouldn't need to force-probe connectors in general: the kernel
+ * will automatically take care of probing connectors that don't support
+ * hot-plug detection when appropriate. However, user-space may force-probe
+ * connectors on user request (e.g. clicking a "Scan connectors" button, or
+ * opening a UI to manage screens).
+ */
 struct drm_mode_get_connector {
-
+	/** @encoders_ptr: Pointer to ``__u32`` array of object IDs. */
 	__u64 encoders_ptr;
+	/** @modes_ptr: Pointer to struct drm_mode_modeinfo array. */
 	__u64 modes_ptr;
+	/** @props_ptr: Pointer to ``__u32`` array of property IDs. */
 	__u64 props_ptr;
+	/** @prop_values_ptr: Pointer to ``__u64`` array of property values. */
 	__u64 prop_values_ptr;
 
+	/** @count_modes: Number of modes. */
 	__u32 count_modes;
+	/** @count_props: Number of properties. */
 	__u32 count_props;
+	/** @count_encoders: Number of encoders. */
 	__u32 count_encoders;
 
-	__u32 encoder_id; /**< Current Encoder */
-	__u32 connector_id; /**< Id */
+	/** @encoder_id: Object ID of the current encoder. */
+	__u32 encoder_id;
+	/** @connector_id: Object ID of the connector. */
+	__u32 connector_id;
+	/**
+	 * @connector_type: Type of the connector.
+	 *
+	 * See DRM_MODE_CONNECTOR_* defines.
+	 */
 	__u32 connector_type;
+	/**
+	 * @connector_type_id: Type-specific connector number.
+	 *
+	 * This is not an object ID. This is a per-type connector number. Each
+	 * (type, type_id) combination is unique across all connectors of a DRM
+	 * device.
+	 */
 	__u32 connector_type_id;
 
+	/**
+	 * @connection: Status of the connector.
+	 *
+	 * See enum drm_connector_status.
+	 */
 	__u32 connection;
-	__u32 mm_width;  /**< width in millimeters */
-	__u32 mm_height; /**< height in millimeters */
+	/** @mm_width: Width of the connected sink in millimeters. */
+	__u32 mm_width;
+	/** @mm_height: Height of the connected sink in millimeters. */
+	__u32 mm_height;
+	/**
+	 * @subpixel: Subpixel order of the connected sink.
+	 *
+	 * See enum subpixel_order.
+	 */
 	__u32 subpixel;
 
+	/** @pad: Padding, must be zero. */
 	__u32 pad;
 };
 
commit 5e4d659b10fde14403adb2e215df4a3168fe8465
Author: Vincent Palatin <vpalatin at chromium.org>
Date:   Fri Nov 20 10:28:28 2020 +0100

    USB: serial: option: add Fibocom NL668 variants
    
    Update the USB serial option driver support for the Fibocom NL668 Cat.4
    LTE modules as there are actually several different variants.
    Got clarifications from Fibocom, there are distinct products:
    - VID:PID 1508:1001, NL668 for IOT (no MBIM interface)
    - VID:PID 2cb7:01a0, NL668-AM and NL652-EU are laptop M.2 cards (with
      MBIM interfaces for Windows/Linux/Chrome OS), respectively for Americas
      and Europe.
    
    usb-devices output for the laptop M.2 cards:
    T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  4 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=ef(misc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=2cb7 ProdID=01a0 Rev=03.18
    S:  Manufacturer=Fibocom Wireless Inc.
    S:  Product=Fibocom NL652-EU Modem
    S:  SerialNumber=0123456789ABCDEF
    C:  #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=500mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim
    I:  If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    
    Signed-off-by: Vincent Palatin <vpalatin at chromium.org>
    Cc: stable at vger.kernel.org
    Signed-off-by: Johan Hovold <johan at kernel.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 54ca85cc920d..2aa31173997f 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -2046,12 +2046,13 @@ static const struct usb_device_id option_ids[] = {
 	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
 	{ USB_DEVICE(0x0489, 0xe0b5),						/* Foxconn T77W968 ESIM */
 	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
-	{ USB_DEVICE(0x1508, 0x1001),						/* Fibocom NL668 */
+	{ USB_DEVICE(0x1508, 0x1001),						/* Fibocom NL668 (IOT version) */
 	  .driver_info = RSVD(4) | RSVD(5) | RSVD(6) },
 	{ USB_DEVICE(0x2cb7, 0x0104),						/* Fibocom NL678 series */
 	  .driver_info = RSVD(4) | RSVD(5) },
 	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff),			/* Fibocom NL678 series */
 	  .driver_info = RSVD(6) },
+	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) },			/* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) },			/* GosunCn GM500 RNDIS */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) },			/* GosunCn GM500 MBIM */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) },			/* GosunCn GM500 ECM/NCM */
commit 65f8453dc69159fd499e0c5b7fafbba771a1dfe2
Author: Gurchetan Singh <gurchetansingh at chromium.org>
Date:   Wed Nov 18 17:08:09 2020 -0800

    drm/virtio: rename sync_seq and last_seq
    
    To be clearer about our intentions to associate sequence numbers
    and fence IDs, let's rename these variables.
    
    Signed-off-by: Gurchetan Singh <gurchetansingh at chromium.org>
    Reviewed-by: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20201119010809.528-5-gurchetansingh@chromium.org
    Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>

diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
index f336a8fa6666..5fefc88d47e4 100644
--- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c
+++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
@@ -67,8 +67,8 @@ virtio_gpu_debugfs_irq_info(struct seq_file *m, void *data)
 	struct virtio_gpu_device *vgdev = node->minor->dev->dev_private;
 
 	seq_printf(m, "fence %llu %lld\n",
-		   (u64)atomic64_read(&vgdev->fence_drv.last_seq),
-		   vgdev->fence_drv.sync_seq);
+		   (u64)atomic64_read(&vgdev->fence_drv.last_fence_id),
+		   vgdev->fence_drv.current_fence_id);
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 7c7967a2eb84..6a232553c99b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -127,8 +127,8 @@ typedef void (*virtio_gpu_resp_cb)(struct virtio_gpu_device *vgdev,
 				   struct virtio_gpu_vbuffer *vbuf);
 
 struct virtio_gpu_fence_driver {
-	atomic64_t       last_seq;
-	uint64_t         sync_seq;
+	atomic64_t       last_fence_id;
+	uint64_t         current_fence_id;
 	uint64_t         context;
 	struct list_head fences;
 	spinlock_t       lock;
diff --git a/drivers/gpu/drm/virtio/virtgpu_fence.c b/drivers/gpu/drm/virtio/virtgpu_fence.c
index 2fe9c7ebcbd4..728ca36f6327 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fence.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fence.c
@@ -48,7 +48,7 @@ static bool virtio_fence_signaled(struct dma_fence *f)
 		/* leaked fence outside driver before completing
 		 * initialization with virtio_gpu_fence_emit */
 		return false;
-	if (atomic64_read(&fence->drv->last_seq) >= fence->f.seqno)
+	if (atomic64_read(&fence->drv->last_fence_id) >= fence->f.seqno)
 		return true;
 	return false;
 }
@@ -62,7 +62,8 @@ static void virtio_timeline_value_str(struct dma_fence *f, char *str, int size)
 {
 	struct virtio_gpu_fence *fence = to_virtio_fence(f);
 
-	snprintf(str, size, "%llu", (u64)atomic64_read(&fence->drv->last_seq));
+	snprintf(str, size, "%llu",
+		 (u64)atomic64_read(&fence->drv->last_fence_id));
 }
 
 static const struct dma_fence_ops virtio_fence_ops = {
@@ -100,7 +101,7 @@ void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
 	unsigned long irq_flags;
 
 	spin_lock_irqsave(&drv->lock, irq_flags);
-	fence->f.seqno = ++drv->sync_seq;
+	fence->f.seqno = ++drv->current_fence_id;
 	dma_fence_get(&fence->f);
 	list_add_tail(&fence->node, &drv->fences);
 	spin_unlock_irqrestore(&drv->lock, irq_flags);
@@ -119,7 +120,7 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev,
 	unsigned long irq_flags;
 
 	spin_lock_irqsave(&drv->lock, irq_flags);
-	atomic64_set(&vgdev->fence_drv.last_seq, fence_id);
+	atomic64_set(&vgdev->fence_drv.last_fence_id, fence_id);
 	list_for_each_entry_safe(fence, tmp, &drv->fences, node) {
 		if (fence_id < fence->f.seqno)
 			continue;
commit bb53a604a74b38e6d71ae12174c8c1d229c2e2b1
Author: Gurchetan Singh <gurchetansingh at chromium.org>
Date:   Wed Nov 18 17:08:08 2020 -0800

    drm/virtio: use fence_id when processing fences
    
    Currently, the fence ID, which can be used to identify a
    virtgpu fence, is the same as the fence sequence number.
    
    Let's use the fence_id name to clearly signal this.
    
    Signed-off-by: Gurchetan Singh <gurchetansingh at chromium.org>
    Reviewed-by: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20201119010809.528-4-gurchetansingh@chromium.org
    Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index c94052376d18..7c7967a2eb84 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -420,7 +420,7 @@ void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
 			  struct virtio_gpu_ctrl_hdr *cmd_hdr,
 			  struct virtio_gpu_fence *fence);
 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev,
-				    u64 last_seq);
+				    u64 fence_id);
 
 /* virtgpu_object.c */
 void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo);
diff --git a/drivers/gpu/drm/virtio/virtgpu_fence.c b/drivers/gpu/drm/virtio/virtgpu_fence.c
index 5b2a4146c5bd..2fe9c7ebcbd4 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fence.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fence.c
@@ -112,16 +112,16 @@ void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
 }
 
 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev,
-				    u64 last_seq)
+				    u64 fence_id)
 {
 	struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv;
 	struct virtio_gpu_fence *fence, *tmp;
 	unsigned long irq_flags;
 
 	spin_lock_irqsave(&drv->lock, irq_flags);
-	atomic64_set(&vgdev->fence_drv.last_seq, last_seq);
+	atomic64_set(&vgdev->fence_drv.last_seq, fence_id);
 	list_for_each_entry_safe(fence, tmp, &drv->fences, node) {
-		if (last_seq < fence->f.seqno)
+		if (fence_id < fence->f.seqno)
 			continue;
 		dma_fence_signal_locked(&fence->f);
 		list_del(&fence->node);
commit c12096085b623024416d02db435005cdf79a71bb
Author: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
Date:   Wed Nov 18 17:08:07 2020 -0800

    virtio-gpu api: Add a comment on VIRTIO_GPU_SHM_ID_HOST_VISIBLE
    
    This provides a description of how the kernel driver uses the
    shmid to determine capabilities.
    
    Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20201119010809.528-3-gurchetansingh@chromium.org
    Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>

diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h
index 0ec6b610402c..97523a95781d 100644
--- a/include/uapi/linux/virtio_gpu.h
+++ b/include/uapi/linux/virtio_gpu.h
@@ -115,6 +115,10 @@ enum virtio_gpu_ctrl_type {
 
 enum virtio_gpu_shm_id {
 	VIRTIO_GPU_SHM_ID_UNDEFINED = 0,
+	/*
+	 * VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB
+	 * VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB
+	 */
 	VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
 };
 
commit 7efb5f38ac9e9694128e03e949139c78b7829e01
Author: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
Date:   Wed Nov 18 17:08:06 2020 -0800

    drm/virtio: fix a file name comment reference
    
    Easier to find where declarations are implemented.
    
    Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20201119010809.528-2-gurchetansingh@chromium.org
    Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 3c0e17212c33..c94052376d18 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -257,7 +257,7 @@ struct virtio_gpu_fpriv {
 	struct mutex context_lock;
 };
 
-/* virtio_ioctl.c */
+/* virtgpu_ioctl.c */
 #define DRM_VIRTIO_NUM_IOCTLS 11
 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file);
commit a651341b269c3d6ea0551db815bbe21a0dae127f
Author: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
Date:   Wed Nov 18 17:08:05 2020 -0800

    drm/virtio: suffix create blob call with _ioctl like any ioctl
    
    For coherency, all ioctls are suffixed
    
    Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20201119010809.528-1-gurchetansingh@chromium.org
    Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>

diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 5417f365d1a3..23eb6d772e40 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -591,8 +591,9 @@ static int verify_blob(struct virtio_gpu_device *vgdev,
 	return 0;
 }
 
-static int virtio_gpu_resource_create_blob(struct drm_device *dev,
-					   void *data, struct drm_file *file)
+static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev,
+						 void *data,
+						 struct drm_file *file)
 {
 	int ret = 0;
 	uint32_t handle = 0;
@@ -696,6 +697,6 @@ struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
 			  DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE_BLOB,
-			  virtio_gpu_resource_create_blob,
+			  virtio_gpu_resource_create_blob_ioctl,
 			  DRM_RENDER_ALLOW),
 };
commit 52aa300fabe5ee17fd1dc85cef4723816b62f4b6
Author: Simon Ser <contact at emersion.fr>
Date:   Thu Nov 19 10:03:20 2020 +0000

    drm: improve kernel-docs in drm_mode.h
    
    - Remove duplicate doc-comments for struct members
    - Add missing @member markers for in-line member comments
    
    Signed-off-by: Simon Ser <contact at emersion.fr>
    Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/grZIqIAOSUM7eNL0PurBsaWoILFwN2hEKd40Ylgzg@cp7-web-041.plabs.ch

diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 5ad10ab2a577..f29c1d37be67 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -905,24 +905,23 @@ struct drm_format_modifier {
 
 /**
  * struct drm_mode_create_blob - Create New block property
- * @data: Pointer to data to copy.
- * @length: Length of data to copy.
- * @blob_id: new property ID.
+ *
  * Create a new 'blob' data property, copying length bytes from data pointer,
  * and returning new blob ID.
  */
 struct drm_mode_create_blob {
-	/** Pointer to data to copy. */
+	/** @data: Pointer to data to copy. */
 	__u64 data;
-	/** Length of data to copy. */
+	/** @length: Length of data to copy. */
 	__u32 length;
-	/** Return: new property ID. */
+	/** @blob_id: Return: new property ID. */
 	__u32 blob_id;
 };
 
 /**
  * struct drm_mode_destroy_blob - Destroy user blob
  * @blob_id: blob_id to destroy
+ *
  * Destroy a user-created blob property.
  *
  * User-space can release blobs as soon as they do not need to refer to them by
@@ -937,36 +936,32 @@ struct drm_mode_destroy_blob {
 
 /**
  * struct drm_mode_create_lease - Create lease
- * @object_ids: Pointer to array of object ids.
- * @object_count: Number of object ids.
- * @flags: flags for new FD.
- * @lessee_id: unique identifier for lessee.
- * @fd: file descriptor to new drm_master file.
+ *
  * Lease mode resources, creating another drm_master.
  */
 struct drm_mode_create_lease {
-	/** Pointer to array of object ids (__u32) */
+	/** @object_ids: Pointer to array of object ids (__u32) */
 	__u64 object_ids;
-	/** Number of object ids */
+	/** @object_count: Number of object ids */
 	__u32 object_count;
-	/** flags for new FD (O_CLOEXEC, etc) */
+	/** @flags: flags for new FD (O_CLOEXEC, etc) */
 	__u32 flags;
 
-	/** Return: unique identifier for lessee. */
+	/** @lessee_id: Return: unique identifier for lessee. */
 	__u32 lessee_id;
-	/** Return: file descriptor to new drm_master file */
+	/** @fd: Return: file descriptor to new drm_master file */
 	__u32 fd;
 };
 
 /**
  * struct drm_mode_list_lessees - List lessees
- * @count_lessees: Number of lessees.
- * @pad: pad.
- * @lessees_ptr: Pointer to lessess.
- * List lesses from a drm_master
+ *
+ * List lesses from a drm_master.
  */
 struct drm_mode_list_lessees {
-	/** Number of lessees.
+	/**
+	 * @count_lessees: Number of lessees.
+	 *
 	 * On input, provides length of the array.
 	 * On output, provides total number. No
 	 * more than the input number will be written
@@ -974,23 +969,26 @@ struct drm_mode_list_lessees {
 	 * the size and then the data.
 	 */
 	__u32 count_lessees;
+	/** @pad: Padding. */
 	__u32 pad;
 
-	/** Pointer to lessees.
-	 * pointer to __u64 array of lessee ids
+	/**
+	 * @lessees_ptr: Pointer to lessees.
+	 *
+	 * Pointer to __u64 array of lessee ids
 	 */
 	__u64 lessees_ptr;
 };
 
 /**
  * struct drm_mode_get_lease - Get Lease
- * @count_objects: Number of leased objects.
- * @pad: pad.
- * @objects_ptr: Pointer to objects.
- * Get leased objects
+ *
+ * Get leased objects.
  */
 struct drm_mode_get_lease {
-	/** Number of leased objects.
+	/**
+	 * @count_objects: Number of leased objects.
+	 *
 	 * On input, provides length of the array.
 	 * On output, provides total number. No
 	 * more than the input number will be written
@@ -998,22 +996,22 @@ struct drm_mode_get_lease {
 	 * the size and then the data.
 	 */
 	__u32 count_objects;
+	/** @pad: Padding. */
 	__u32 pad;
 
-	/** Pointer to objects.
-	 * pointer to __u32 array of object ids
+	/**
+	 * @objects_ptr: Pointer to objects.
+	 *
+	 * Pointer to __u32 array of object ids.
 	 */
 	__u64 objects_ptr;
 };
 
 /**
  * struct drm_mode_revoke_lease - Revoke lease
- * @lessee_id: Unique ID of lessee.
- * Revoke lease
  */
 struct drm_mode_revoke_lease {
-	/** Unique ID of lessee
-	 */
+	/** @lessee_id: Unique ID of lessee */
 	__u32 lessee_id;
 };
 
commit 3383176efc0fb0c0900a191026468a58668b4214
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Thu Nov 19 21:30:21 2020 +0800

    bnxt_en: fix error return code in bnxt_init_board()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Reviewed-by: Edwin Peer <edwin.peer at broadcom.com>
    Link: https://lore.kernel.org/r/1605792621-6268-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 092775e396c7..6e8329534cde 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -11590,6 +11590,7 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
 	if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) != 0 &&
 	    dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) != 0) {
 		dev_err(&pdev->dev, "System does not support DMA, aborting\n");
+		rc = -EIO;
 		goto init_err_disable;
 	}
 
commit b5f796b62c98cd8c219c4b788ecb6e1218e648cb
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Wed Nov 18 20:17:31 2020 +0800

    bnxt_en: fix error return code in bnxt_init_one()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: c213eae8d3cd ("bnxt_en: Improve VF/PF link change logic.")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Reviewed-by: Edwin Peer <edwin.peer at broadcom.com>
    Link: https://lore.kernel.org/r/1605701851-20270-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 7c21aaa8b9af..092775e396c7 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -12674,6 +12674,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 				create_singlethread_workqueue("bnxt_pf_wq");
 			if (!bnxt_pf_wq) {
 				dev_err(&pdev->dev, "Unable to create workqueue.\n");
+				rc = -ENOMEM;
 				goto init_err_pci_clean;
 			}
 		}
commit f902b216501094495ff75834035656e8119c537f
Author: Jan Kara <jack at suse.cz>
Date:   Wed Nov 18 16:30:32 2020 +0100

    ext4: fix bogus warning in ext4_update_dx_flag()
    
    The idea of the warning in ext4_update_dx_flag() is that we should warn
    when we are clearing EXT4_INODE_INDEX on a filesystem with metadata
    checksums enabled since after clearing the flag, checksums for internal
    htree nodes will become invalid. So there's no need to warn (or actually
    do anything) when EXT4_INODE_INDEX is not set.
    
    Link: https://lore.kernel.org/r/20201118153032.17281-1-jack@suse.cz
    Fixes: 48a34311953d ("ext4: fix checksum errors with indexed dirs")
    Reported-by: Eric Biggers <ebiggers at kernel.org>
    Reviewed-by: Eric Biggers <ebiggers at google.com>
    Signed-off-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>
    Cc: stable at kernel.org

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index bf9429484462..65ecaf96d0a4 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2695,7 +2695,8 @@ void ext4_insert_dentry(struct inode *inode,
 			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_test_inode_flag(inode, EXT4_INODE_INDEX)) {
 		/* 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);
commit 2bf31d94423c8ae3ff58e38a115b177df6940399
Author: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
Date:   Mon Nov 16 11:18:08 2020 +0100

    jbd2: fix kernel-doc markups
    
    Kernel-doc markup should use this format:
            identifier - description
    
    They should not have any type before that, as otherwise
    the parser won't do the right thing.
    
    Also, some identifiers have different names between their
    prototypes and the kernel-doc markup.
    
    Reviewed-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
    Link: https://lore.kernel.org/r/72f5c6628f5f278d67625f60893ffbc2ca28d46e.1605521731.git.mchehab+huawei@kernel.org
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 0c3d5e3b24b2..188f79d76988 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -566,12 +566,14 @@ static int __jbd2_journal_force_commit(journal_t *journal)
 }
 
 /**
- * Force and wait upon a commit if the calling process is not within
- * transaction.  This is used for forcing out undo-protected data which contains
- * bitmaps, when the fs is running out of space.
+ * jbd2_journal_force_commit_nested - Force and wait upon a commit if the
+ * calling process is not within transaction.
  *
  * @journal: journal to force
  * Returns true if progress was made.
+ *
+ * This is used for forcing out undo-protected data which contains
+ * bitmaps, when the fs is running out of space.
  */
 int jbd2_journal_force_commit_nested(journal_t *journal)
 {
@@ -582,7 +584,7 @@ int jbd2_journal_force_commit_nested(journal_t *journal)
 }
 
 /**
- * int journal_force_commit() - force any uncommitted transactions
+ * jbd2_journal_force_commit() - force any uncommitted transactions
  * @journal: journal to force
  *
  * Caller want unconditional commit. We can only force the running transaction
@@ -1881,7 +1883,7 @@ static int load_superblock(journal_t *journal)
 
 
 /**
- * int jbd2_journal_load() - Read journal from disk.
+ * jbd2_journal_load() - Read journal from disk.
  * @journal: Journal to act on.
  *
  * Given a journal_t structure which tells us which disk blocks contain
@@ -1951,7 +1953,7 @@ recovery_error:
 }
 
 /**
- * void jbd2_journal_destroy() - Release a journal_t structure.
+ * jbd2_journal_destroy() - Release a journal_t structure.
  * @journal: Journal to act on.
  *
  * Release a journal_t structure once it is no longer in use by the
@@ -2028,7 +2030,7 @@ int jbd2_journal_destroy(journal_t *journal)
 
 
 /**
- *int jbd2_journal_check_used_features() - Check if features specified are used.
+ * jbd2_journal_check_used_features() - Check if features specified are used.
  * @journal: Journal to check.
  * @compat: bitmask of compatible features
  * @ro: bitmask of features that force read-only mount
@@ -2063,7 +2065,7 @@ int jbd2_journal_check_used_features(journal_t *journal, unsigned long compat,
 }
 
 /**
- * int jbd2_journal_check_available_features() - Check feature set in journalling layer
+ * jbd2_journal_check_available_features() - Check feature set in journalling layer
  * @journal: Journal to check.
  * @compat: bitmask of compatible features
  * @ro: bitmask of features that force read-only mount
@@ -2126,7 +2128,7 @@ jbd2_journal_initialize_fast_commit(journal_t *journal)
 }
 
 /**
- * int jbd2_journal_set_features() - Mark a given journal feature in the superblock
+ * jbd2_journal_set_features() - Mark a given journal feature in the superblock
  * @journal: Journal to act on.
  * @compat: bitmask of compatible features
  * @ro: bitmask of features that force read-only mount
@@ -2217,7 +2219,7 @@ int jbd2_journal_set_features(journal_t *journal, unsigned long compat,
 }
 
 /*
- * jbd2_journal_clear_features () - Clear a given journal feature in the
+ * jbd2_journal_clear_features() - Clear a given journal feature in the
  * 				    superblock
  * @journal: Journal to act on.
  * @compat: bitmask of compatible features
@@ -2246,7 +2248,7 @@ void jbd2_journal_clear_features(journal_t *journal, unsigned long compat,
 EXPORT_SYMBOL(jbd2_journal_clear_features);
 
 /**
- * int jbd2_journal_flush () - Flush journal
+ * jbd2_journal_flush() - Flush journal
  * @journal: Journal to act on.
  *
  * Flush all data for a given journal to disk and empty the journal.
@@ -2321,7 +2323,7 @@ out:
 }
 
 /**
- * int jbd2_journal_wipe() - Wipe journal contents
+ * jbd2_journal_wipe() - Wipe journal contents
  * @journal: Journal to act on.
  * @write: flag (see below)
  *
@@ -2362,7 +2364,7 @@ int jbd2_journal_wipe(journal_t *journal, int write)
 }
 
 /**
- * void jbd2_journal_abort () - Shutdown the journal immediately.
+ * jbd2_journal_abort () - Shutdown the journal immediately.
  * @journal: the journal to shutdown.
  * @errno:   an error number to record in the journal indicating
  *           the reason for the shutdown.
@@ -2453,7 +2455,7 @@ void jbd2_journal_abort(journal_t *journal, int errno)
 }
 
 /**
- * int jbd2_journal_errno () - returns the journal's error state.
+ * jbd2_journal_errno() - returns the journal's error state.
  * @journal: journal to examine.
  *
  * This is the errno number set with jbd2_journal_abort(), the last
@@ -2477,7 +2479,7 @@ int jbd2_journal_errno(journal_t *journal)
 }
 
 /**
- * int jbd2_journal_clear_err () - clears the journal's error state
+ * jbd2_journal_clear_err() - clears the journal's error state
  * @journal: journal to act on.
  *
  * An error must be cleared or acked to take a FS out of readonly
@@ -2497,7 +2499,7 @@ int jbd2_journal_clear_err(journal_t *journal)
 }
 
 /**
- * void jbd2_journal_ack_err() - Ack journal err.
+ * jbd2_journal_ack_err() - Ack journal err.
  * @journal: journal to act on.
  *
  * An error must be cleared or acked to take a FS out of readonly
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index d54f04674e8e..9396666b7314 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -519,7 +519,7 @@ EXPORT_SYMBOL(jbd2__journal_start);
 
 
 /**
- * handle_t *jbd2_journal_start() - Obtain a new handle.
+ * jbd2_journal_start() - Obtain a new handle.
  * @journal: Journal to start transaction on.
  * @nblocks: number of block buffer we might modify
  *
@@ -566,7 +566,7 @@ void jbd2_journal_free_reserved(handle_t *handle)
 EXPORT_SYMBOL(jbd2_journal_free_reserved);
 
 /**
- * int jbd2_journal_start_reserved() - start reserved handle
+ * jbd2_journal_start_reserved() - start reserved handle
  * @handle: handle to start
  * @type: for handle statistics
  * @line_no: for handle statistics
@@ -620,7 +620,7 @@ int jbd2_journal_start_reserved(handle_t *handle, unsigned int type,
 EXPORT_SYMBOL(jbd2_journal_start_reserved);
 
 /**
- * int jbd2_journal_extend() - extend buffer credits.
+ * jbd2_journal_extend() - extend buffer credits.
  * @handle:  handle to 'extend'
  * @nblocks: nr blocks to try to extend by.
  * @revoke_records: number of revoke records to try to extend by.
@@ -745,7 +745,7 @@ static void stop_this_handle(handle_t *handle)
 }
 
 /**
- * int jbd2_journal_restart() - restart a handle .
+ * jbd2__journal_restart() - restart a handle .
  * @handle:  handle to restart
  * @nblocks: nr credits requested
  * @revoke_records: number of revoke record credits requested
@@ -815,7 +815,7 @@ int jbd2_journal_restart(handle_t *handle, int nblocks)
 EXPORT_SYMBOL(jbd2_journal_restart);
 
 /**
- * void jbd2_journal_lock_updates () - establish a transaction barrier.
+ * jbd2_journal_lock_updates () - establish a transaction barrier.
  * @journal:  Journal to establish a barrier on.
  *
  * This locks out any further updates from being started, and blocks
@@ -874,7 +874,7 @@ void jbd2_journal_lock_updates(journal_t *journal)
 }
 
 /**
- * void jbd2_journal_unlock_updates (journal_t* journal) - release barrier
+ * jbd2_journal_unlock_updates () - release barrier
  * @journal:  Journal to release the barrier on.
  *
  * Release a transaction barrier obtained with jbd2_journal_lock_updates().
@@ -1182,7 +1182,8 @@ out:
 }
 
 /**
- * int jbd2_journal_get_write_access() - notify intent to modify a buffer for metadata (not data) update.
+ * jbd2_journal_get_write_access() - notify intent to modify a buffer
+ *				     for metadata (not data) update.
  * @handle: transaction to add buffer modifications to
  * @bh:     bh to be used for metadata writes
  *
@@ -1226,7 +1227,7 @@ int jbd2_journal_get_write_access(handle_t *handle, struct buffer_head *bh)
  * unlocked buffer beforehand. */
 
 /**
- * int jbd2_journal_get_create_access () - notify intent to use newly created bh
+ * jbd2_journal_get_create_access () - notify intent to use newly created bh
  * @handle: transaction to new buffer to
  * @bh: new buffer.
  *
@@ -1306,7 +1307,7 @@ out:
 }
 
 /**
- * int jbd2_journal_get_undo_access() -  Notify intent to modify metadata with
+ * jbd2_journal_get_undo_access() -  Notify intent to modify metadata with
  *     non-rewindable consequences
  * @handle: transaction
  * @bh: buffer to undo
@@ -1383,7 +1384,7 @@ out:
 }
 
 /**
- * void jbd2_journal_set_triggers() - Add triggers for commit writeout
+ * jbd2_journal_set_triggers() - Add triggers for commit writeout
  * @bh: buffer to trigger on
  * @type: struct jbd2_buffer_trigger_type containing the trigger(s).
  *
@@ -1425,7 +1426,7 @@ void jbd2_buffer_abort_trigger(struct journal_head *jh,
 }
 
 /**
- * int jbd2_journal_dirty_metadata() -  mark a buffer as containing dirty metadata
+ * jbd2_journal_dirty_metadata() -  mark a buffer as containing dirty metadata
  * @handle: transaction to add buffer to.
  * @bh: buffer to mark
  *
@@ -1593,7 +1594,7 @@ out:
 }
 
 /**
- * void jbd2_journal_forget() - bforget() for potentially-journaled buffers.
+ * jbd2_journal_forget() - bforget() for potentially-journaled buffers.
  * @handle: transaction handle
  * @bh:     bh to 'forget'
  *
@@ -1762,7 +1763,7 @@ drop:
 }
 
 /**
- * int jbd2_journal_stop() - complete a transaction
+ * jbd2_journal_stop() - complete a transaction
  * @handle: transaction to complete.
  *
  * All done for a particular handle.
@@ -2080,7 +2081,7 @@ out:
 }
 
 /**
- * int jbd2_journal_try_to_free_buffers() - try to free page buffers.
+ * jbd2_journal_try_to_free_buffers() - try to free page buffers.
  * @journal: journal for operation
  * @page: to try and free
  *
@@ -2411,7 +2412,7 @@ zap_buffer_unlocked:
 }
 
 /**
- * void jbd2_journal_invalidatepage()
+ * jbd2_journal_invalidatepage()
  * @journal: journal to use for flush...
  * @page:    page to flush
  * @offset:  start of the range to invalidate
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index 1c49fd62ff2e..578ff196b3ce 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -401,7 +401,7 @@ static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
 #define JI_WAIT_DATA (1 << __JI_WAIT_DATA)
 
 /**
- * struct jbd_inode - The jbd_inode type is the structure linking inodes in
+ * struct jbd2_inode - The jbd_inode type is the structure linking inodes in
  * ordered mode present in a transaction so that we can sync them during commit.
  */
 struct jbd2_inode {
commit e92643db514803c2c87d72caf5950b4c0a8faf4a
Author: Stanley Chu <stanley.chu at mediatek.com>
Date:   Thu Nov 19 14:29:16 2020 +0800

    scsi: ufs: Fix race between shutdown and runtime resume flow
    
    If UFS host device is in runtime-suspended state while UFS shutdown
    callback is invoked, UFS device shall be resumed for register
    accesses. Currently only UFS local runtime resume function will be invoked
    to wake up the host.  This is not enough because if someone triggers
    runtime resume from block layer, then race may happen between shutdown and
    runtime resume flow, and finally lead to unlocked register access.
    
    To fix this, in ufshcd_shutdown(), use pm_runtime_get_sync() instead of
    resuming UFS device by ufshcd_runtime_resume() "internally" to let runtime
    PM framework manage the whole resume flow.
    
    Link: https://lore.kernel.org/r/20201119062916.12931-1-stanley.chu@mediatek.com
    Fixes: 57d104c153d3 ("ufs: add UFS power management support")
    Reviewed-by: Can Guo <cang at codeaurora.org>
    Signed-off-by: Stanley Chu <stanley.chu at mediatek.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 20b16de4c5e2..0c148fcd24de 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -8913,11 +8913,7 @@ int ufshcd_shutdown(struct ufs_hba *hba)
 	if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba))
 		goto out;
 
-	if (pm_runtime_suspended(hba->dev)) {
-		ret = ufshcd_runtime_resume(hba);
-		if (ret)
-			goto out;
-	}
+	pm_runtime_get_sync(hba->dev);
 
 	ret = ufshcd_suspend(hba, UFS_SHUTDOWN_PM);
 out:
commit 6600f9d52213b5c3455481b5c9e61cf5e305c0e6
Merge: 9336127d8cbc be33805c6529
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 20 11:21:32 2020 +1000

    Merge tag 'drm-intel-fixes-2020-11-19' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
    
    - Fix tgl power gating issue (Rodrigo)
    - Memory leak fixes (Tvrtko, Chris)
    - Selftest fixes (Zhang)
    - Display bpc fix (Ville)
    - Fix TGL MOCS for PTE tracking (Chris)
    
    GVT Fixes: It temporarily disables VFIO edid
    feature on BXT/APL until its virtual display is really fixed to make
    it work properly. And fixes for DPCD 1.2 and error return in taking
    module reference.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201119203417.GA1795798@intel.com

commit 9336127d8cbcd65a719d19cad13059ee7c7f900d
Merge: f95dddc9f405 cdf117d6d38a
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 20 06:18:01 2020 +1000

    Merge tag 'drm-misc-fixes-2020-11-19' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
    
    two patches to fix dw-hdmi bind and detection code, and one fix for
    sun4i shared with arm-soc
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Maxime Ripard <maxime at cerno.tech>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201119083939.ddj3saipyg5iwvb4@gilmour

commit eb8409071a1d47e3593cfe077107ac46853182ab
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Thu Nov 19 15:17:50 2020 -0800

    xfs: revert "xfs: fix rmap key and record comparison functions"
    
    This reverts commit 6ff646b2ceb0eec916101877f38da0b73e3a5b7f.
    
    Your maintainer committed a major braino in the rmap code by adding the
    attr fork, bmbt, and unwritten extent usage bits into rmap record key
    comparisons.  While XFS uses the usage bits *in the rmap records* for
    cross-referencing metadata in xfs_scrub and xfs_repair, it only needs
    the owner and offset information to distinguish between reverse mappings
    of the same physical extent into the data fork of a file at multiple
    offsets.  The other bits are not important for key comparisons for index
    lookups, and never have been.
    
    Eric Sandeen reports that this causes regressions in generic/299, so
    undo this patch before it does more damage.
    
    Reported-by: Eric Sandeen <sandeen at sandeen.net>
    Fixes: 6ff646b2ceb0 ("xfs: fix rmap key and record comparison functions")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Eric Sandeen <sandeen at redhat.com>

diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
index 577a66381327..beb81c84a937 100644
--- a/fs/xfs/libxfs/xfs_rmap_btree.c
+++ b/fs/xfs/libxfs/xfs_rmap_btree.c
@@ -243,8 +243,8 @@ xfs_rmapbt_key_diff(
 	else if (y > x)
 		return -1;
 
-	x = be64_to_cpu(kp->rm_offset);
-	y = xfs_rmap_irec_offset_pack(rec);
+	x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset));
+	y = rec->rm_offset;
 	if (x > y)
 		return 1;
 	else if (y > x)
@@ -275,8 +275,8 @@ xfs_rmapbt_diff_two_keys(
 	else if (y > x)
 		return -1;
 
-	x = be64_to_cpu(kp1->rm_offset);
-	y = be64_to_cpu(kp2->rm_offset);
+	x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset));
+	y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset));
 	if (x > y)
 		return 1;
 	else if (y > x)
@@ -390,8 +390,8 @@ xfs_rmapbt_keys_inorder(
 		return 1;
 	else if (a > b)
 		return 0;
-	a = be64_to_cpu(k1->rmap.rm_offset);
-	b = be64_to_cpu(k2->rmap.rm_offset);
+	a = XFS_RMAP_OFF(be64_to_cpu(k1->rmap.rm_offset));
+	b = XFS_RMAP_OFF(be64_to_cpu(k2->rmap.rm_offset));
 	if (a <= b)
 		return 1;
 	return 0;
@@ -420,8 +420,8 @@ xfs_rmapbt_recs_inorder(
 		return 1;
 	else if (a > b)
 		return 0;
-	a = be64_to_cpu(r1->rmap.rm_offset);
-	b = be64_to_cpu(r2->rmap.rm_offset);
+	a = XFS_RMAP_OFF(be64_to_cpu(r1->rmap.rm_offset));
+	b = XFS_RMAP_OFF(be64_to_cpu(r2->rmap.rm_offset));
 	if (a <= b)
 		return 1;
 	return 0;
commit 4d02da974ea85a62074efedf354e82778f910d82
Merge: 3be28e93cd88 e6ea60bac1ee
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 13:33:16 2020 -0800

    Merge tag 'net-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
    
    Pull networking fixes from Jakub Kicinski:
     "Networking fixes for 5.10-rc5, including fixes from the WiFi
      (mac80211), can and bpf (including the strncpy_from_user fix).
    
      Current release - regressions:
    
       - mac80211: fix memory leak of filtered powersave frames
    
       - mac80211: free sta in sta_info_insert_finish() on errors to avoid
         sleeping in atomic context
    
       - netlabel: fix an uninitialized variable warning added in -rc4
    
      Previous release - regressions:
    
       - vsock: forward all packets to the host when no H2G is registered,
         un-breaking AWS Nitro Enclaves
    
       - net: Exempt multicast addresses from five-second neighbor lifetime
         requirement, decreasing the chances neighbor tables fill up
    
       - net/tls: fix corrupted data in recvmsg
    
       - qed: fix ILT configuration of SRC block
    
       - can: m_can: process interrupt only when not runtime suspended
    
      Previous release - always broken:
    
       - page_frag: Recover from memory pressure by not recycling pages
         allocating from the reserves
    
       - strncpy_from_user: Mask out bytes after NUL terminator
    
       - ip_tunnels: Set tunnel option flag only when tunnel metadata is
         present, always setting it confuses Open vSwitch
    
       - bpf, sockmap:
          - Fix partial copy_page_to_iter so progress can still be made
          - Fix socket memory accounting and obeying SO_RCVBUF
    
       - net: Have netpoll bring-up DSA management interface
    
       - net: bridge: add missing counters to ndo_get_stats64 callback
    
       - tcp: brr: only postpone PROBE_RTT if RTT is < current min_rtt
    
       - enetc: Workaround MDIO register access HW bug
    
       - net/ncsi: move netlink family registration to a subsystem init,
         instead of tying it to driver probe
    
       - net: ftgmac100: unregister NC-SI when removing driver to avoid
         crash
    
       - lan743x:
          - prevent interrupt storm on open
          - fix freeing skbs in the wrong context
    
       - net/mlx5e: Fix socket refcount leak on kTLS RX resync
    
       - net: dsa: mv88e6xxx: Avoid VLAN database corruption on 6097
    
       - fix 21 unset return codes and other mistakes on error paths, mostly
         detected by the Hulk Robot"
    
    * tag 'net-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (115 commits)
      fail_function: Remove a redundant mutex unlock
      selftest/bpf: Test bpf_probe_read_user_str() strips trailing bytes after NUL
      lib/strncpy_from_user.c: Mask out bytes after NUL terminator.
      net/smc: fix direct access to ib_gid_addr->ndev in smc_ib_determine_gid()
      net/smc: fix matching of existing link groups
      ipv6: Remove dependency of ipv6_frag_thdr_truncated on ipv6 module
      libbpf: Fix VERSIONED_SYM_COUNT number parsing
      net/mlx4_core: Fix init_hca fields offset
      atm: nicstar: Unmap DMA on send error
      page_frag: Recover from memory pressure
      net: dsa: mv88e6xxx: Wait for EEPROM done after HW reset
      mlxsw: core: Use variable timeout for EMAD retries
      mlxsw: Fix firmware flashing
      net: Have netpoll bring-up DSA management interface
      atl1e: fix error return code in atl1e_probe()
      atl1c: fix error return code in atl1c_probe()
      ah6: fix error return code in ah6_input()
      net: usb: qmi_wwan: Set DTR quirk for MR400
      can: m_can: process interrupt only when not runtime suspended
      can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable() during bus-off recovery
      ...

commit 3be28e93cd88fbcbe97cabcbe92b1ccc9f830450
Merge: dda3f4252e6c ee415d73dcc2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 13:01:53 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
    
    Pull rdma fixes from Jason Gunthorpe:
     "The last two weeks have been quiet here, just the usual smattering of
      long standing bug fixes.
    
      A collection of error case bug fixes:
    
       - Improper nesting of spinlock types in cm
    
       - Missing error codes and kfree()
    
       - Ensure dma_virt_ops users have the right kconfig symbols to work
         properly
    
       - Compilation failure of tools/testing"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
      tools/testing/scatterlist: Fix test to compile and run
      IB/hfi1: Fix error return code in hfi1_init_dd()
      RMDA/sw: Don't allow drivers using dma_virt_ops on highmem configs
      RDMA/pvrdma: Fix missing kfree() in pvrdma_register_device()
      RDMA/cm: Make the local_id_table xarray non-irq

commit 612e048e6aabbc5d042140c0ec494753f36bdfe6
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:21 2020 +0100

    mtd: rawnand: plat_nand: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-17-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/plat_nand.c b/drivers/mtd/nand/raw/plat_nand.c
index b98c0d5c413f..93d9f1694dc1 100644
--- a/drivers/mtd/nand/raw/plat_nand.c
+++ b/drivers/mtd/nand/raw/plat_nand.c
@@ -14,10 +14,23 @@
 #include <linux/mtd/platnand.h>
 
 struct plat_nand_data {
+	struct nand_controller	controller;
 	struct nand_chip	chip;
 	void __iomem		*io_base;
 };
 
+static int plat_nand_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
+static const struct nand_controller_ops plat_nand_ops = {
+	.attach_chip = plat_nand_attach_chip,
+};
+
 /*
  * Probe for the NAND device.
  */
@@ -46,6 +59,10 @@ static int plat_nand_probe(struct platform_device *pdev)
 	if (!data)
 		return -ENOMEM;
 
+	data->controller.ops = &plat_nand_ops;
+	nand_controller_init(&data->controller);
+	data->chip.controller = &data->controller;
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	data->io_base = devm_ioremap_resource(&pdev->dev, res);
 	if (IS_ERR(data->io_base))
@@ -66,9 +83,6 @@ static int plat_nand_probe(struct platform_device *pdev)
 	data->chip.options |= pdata->chip.options;
 	data->chip.bbt_options |= pdata->chip.bbt_options;
 
-	data->chip.ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	data->chip.ecc.algo = NAND_ECC_ALGO_HAMMING;
-
 	platform_set_drvdata(pdev, data);
 
 	/* Handle any platform specific setup */
commit 8fc6f1f042b2d383f57110ab808b788592550b25
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:20 2020 +0100

    mtd: rawnand: pasemi: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-16-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/pasemi_nand.c b/drivers/mtd/nand/raw/pasemi_nand.c
index 2b8f155cc0c5..4dfff34800f4 100644
--- a/drivers/mtd/nand/raw/pasemi_nand.c
+++ b/drivers/mtd/nand/raw/pasemi_nand.c
@@ -29,6 +29,7 @@
 
 static unsigned int lpcctl;
 static struct mtd_info *pasemi_nand_mtd;
+static struct nand_controller controller;
 static const char driver_name[] = "pasemi-nand";
 
 static void pasemi_read_buf(struct nand_chip *chip, u_char *buf, int len)
@@ -73,6 +74,18 @@ static int pasemi_device_ready(struct nand_chip *chip)
 	return !!(inl(lpcctl) & LBICTRL_LPCCTL_NR);
 }
 
+static int pasemi_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
+static const struct nand_controller_ops pasemi_ops = {
+	.attach_chip = pasemi_attach_chip,
+};
+
 static int pasemi_nand_probe(struct platform_device *ofdev)
 {
 	struct device *dev = &ofdev->dev;
@@ -100,6 +113,10 @@ static int pasemi_nand_probe(struct platform_device *ofdev)
 		goto out;
 	}
 
+	controller.ops = &pasemi_ops;
+	nand_controller_init(&controller);
+	chip->controller = &controller;
+
 	pasemi_nand_mtd = nand_to_mtd(chip);
 
 	/* Link the private data with the MTD structure */
@@ -132,8 +149,6 @@ static int pasemi_nand_probe(struct platform_device *ofdev)
 	chip->legacy.read_buf = pasemi_read_buf;
 	chip->legacy.write_buf = pasemi_write_buf;
 	chip->legacy.chip_delay = 0;
-	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	/* Enable the following for a flash based bad block table */
 	chip->bbt_options = NAND_BBT_USE_FLASH;
commit 1f65976b55865adf84340d6e07c4c773cb8a728b
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:19 2020 +0100

    mtd: rawnand: tmio: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-15-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/tmio_nand.c b/drivers/mtd/nand/raw/tmio_nand.c
index 235a2f7b1bad..aa6c7e7bbf1b 100644
--- a/drivers/mtd/nand/raw/tmio_nand.c
+++ b/drivers/mtd/nand/raw/tmio_nand.c
@@ -103,6 +103,7 @@
 /*--------------------------------------------------------------------------*/
 
 struct tmio_nand {
+	struct nand_controller controller;
 	struct nand_chip chip;
 	struct completion comp;
 
@@ -355,6 +356,25 @@ static void tmio_hw_stop(struct platform_device *dev, struct tmio_nand *tmio)
 		cell->disable(dev);
 }
 
+static int tmio_attach_chip(struct nand_chip *chip)
+{
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
+	chip->ecc.size = 512;
+	chip->ecc.bytes = 6;
+	chip->ecc.strength = 2;
+	chip->ecc.hwctl = tmio_nand_enable_hwecc;
+	chip->ecc.calculate = tmio_nand_calculate_ecc;
+	chip->ecc.correct = tmio_nand_correct_data;
+
+	return 0;
+}
+
+static const struct nand_controller_ops tmio_ops = {
+	.attach_chip = tmio_attach_chip,
+};
+
 static int tmio_probe(struct platform_device *dev)
 {
 	struct tmio_nand_data *data = dev_get_platdata(&dev->dev);
@@ -385,6 +405,10 @@ static int tmio_probe(struct platform_device *dev)
 	mtd->name = "tmio-nand";
 	mtd->dev.parent = &dev->dev;
 
+	nand_controller_init(&tmio->controller);
+	tmio->controller.ops = &tmio_ops;
+	nand_chip->controller = &tmio->controller;
+
 	tmio->ccr = devm_ioremap(&dev->dev, ccr->start, resource_size(ccr));
 	if (!tmio->ccr)
 		return -EIO;
@@ -409,15 +433,6 @@ static int tmio_probe(struct platform_device *dev)
 	nand_chip->legacy.write_buf = tmio_nand_write_buf;
 	nand_chip->legacy.read_buf = tmio_nand_read_buf;
 
-	/* set eccmode using hardware ECC */
-	nand_chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	nand_chip->ecc.size = 512;
-	nand_chip->ecc.bytes = 6;
-	nand_chip->ecc.strength = 2;
-	nand_chip->ecc.hwctl = tmio_nand_enable_hwecc;
-	nand_chip->ecc.calculate = tmio_nand_calculate_ecc;
-	nand_chip->ecc.correct = tmio_nand_correct_data;
-
 	if (data)
 		nand_chip->badblock_pattern = data->badblock_pattern;
 
commit 3c3bbf014ab3bc9793a51d550a048873e832f2fa
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:18 2020 +0100

    mtd: rawnand: txx9ndfmc: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-14-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/txx9ndfmc.c b/drivers/mtd/nand/raw/txx9ndfmc.c
index ef81dce6b5c4..fe8ed2441588 100644
--- a/drivers/mtd/nand/raw/txx9ndfmc.c
+++ b/drivers/mtd/nand/raw/txx9ndfmc.c
@@ -253,6 +253,11 @@ static int txx9ndfmc_attach_chip(struct nand_chip *chip)
 {
 	struct mtd_info *mtd = nand_to_mtd(chip);
 
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
+	chip->ecc.strength = 1;
+
 	if (mtd->writesize >= 512) {
 		chip->ecc.size = 512;
 		chip->ecc.bytes = 6;
@@ -261,6 +266,10 @@ static int txx9ndfmc_attach_chip(struct nand_chip *chip)
 		chip->ecc.bytes = 3;
 	}
 
+	chip->ecc.calculate = txx9ndfmc_calculate_ecc;
+	chip->ecc.correct = txx9ndfmc_correct_data;
+	chip->ecc.hwctl = txx9ndfmc_enable_hwecc;
+
 	return 0;
 }
 
@@ -326,11 +335,6 @@ static int __init txx9ndfmc_probe(struct platform_device *dev)
 		chip->legacy.write_buf = txx9ndfmc_write_buf;
 		chip->legacy.cmd_ctrl = txx9ndfmc_cmd_ctrl;
 		chip->legacy.dev_ready = txx9ndfmc_dev_ready;
-		chip->ecc.calculate = txx9ndfmc_calculate_ecc;
-		chip->ecc.correct = txx9ndfmc_correct_data;
-		chip->ecc.hwctl = txx9ndfmc_enable_hwecc;
-		chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-		chip->ecc.strength = 1;
 		chip->legacy.chip_delay = 100;
 		chip->controller = &drvdata->controller;
 
commit 553508cec2e8138ec50f284bc8ec10e7ef0d44b1
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:17 2020 +0100

    mtd: rawnand: orion: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-13-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/orion_nand.c b/drivers/mtd/nand/raw/orion_nand.c
index df9c0f8e4b4e..e3bb65fd3ab2 100644
--- a/drivers/mtd/nand/raw/orion_nand.c
+++ b/drivers/mtd/nand/raw/orion_nand.c
@@ -22,6 +22,7 @@
 #include <linux/platform_data/mtd-orion_nand.h>
 
 struct orion_nand_info {
+	struct nand_controller controller;
 	struct nand_chip chip;
 	struct clk *clk;
 };
@@ -82,6 +83,18 @@ static void orion_nand_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
 		buf[i++] = readb(io_base);
 }
 
+static int orion_nand_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
+static const struct nand_controller_ops orion_nand_ops = {
+	.attach_chip = orion_nand_attach_chip,
+};
+
 static int __init orion_nand_probe(struct platform_device *pdev)
 {
 	struct orion_nand_info *info;
@@ -101,6 +114,10 @@ static int __init orion_nand_probe(struct platform_device *pdev)
 	nc = &info->chip;
 	mtd = nand_to_mtd(nc);
 
+	nand_controller_init(&info->controller);
+	info->controller.ops = &orion_nand_ops;
+	nc->controller = &info->controller;
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	io_base = devm_ioremap_resource(&pdev->dev, res);
 
@@ -139,8 +156,6 @@ static int __init orion_nand_probe(struct platform_device *pdev)
 	nc->legacy.IO_ADDR_R = nc->legacy.IO_ADDR_W = io_base;
 	nc->legacy.cmd_ctrl = orion_nand_cmd_ctrl;
 	nc->legacy.read_buf = orion_nand_read_buf;
-	nc->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	nc->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	if (board->chip_delay)
 		nc->legacy.chip_delay = board->chip_delay;
commit 6dd09f775b729478e180eed295ddfa50569e61be
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:16 2020 +0100

    mtd: rawnand: mpc5121: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-12-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/mpc5121_nfc.c b/drivers/mtd/nand/raw/mpc5121_nfc.c
index dfd0d3ed5ed0..fb4c0b11689f 100644
--- a/drivers/mtd/nand/raw/mpc5121_nfc.c
+++ b/drivers/mtd/nand/raw/mpc5121_nfc.c
@@ -104,6 +104,7 @@
 #define NFC_TIMEOUT		(HZ / 10)	/* 1/10 s */
 
 struct mpc5121_nfc_prv {
+	struct nand_controller	controller;
 	struct nand_chip	chip;
 	int			irq;
 	void __iomem		*regs;
@@ -602,6 +603,18 @@ static void mpc5121_nfc_free(struct device *dev, struct mtd_info *mtd)
 		iounmap(prv->csreg);
 }
 
+static int mpc5121_nfc_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
+static const struct nand_controller_ops mpc5121_nfc_ops = {
+	.attach_chip = mpc5121_nfc_attach_chip,
+};
+
 static int mpc5121_nfc_probe(struct platform_device *op)
 {
 	struct device_node *dn = op->dev.of_node;
@@ -634,6 +647,10 @@ static int mpc5121_nfc_probe(struct platform_device *op)
 	chip = &prv->chip;
 	mtd = nand_to_mtd(chip);
 
+	nand_controller_init(&prv->controller);
+	prv->controller.ops = &mpc5121_nfc_ops;
+	chip->controller = &prv->controller;
+
 	mtd->dev.parent = dev;
 	nand_set_controller_data(chip, prv);
 	nand_set_flash_node(chip, dn);
@@ -688,8 +705,6 @@ static int mpc5121_nfc_probe(struct platform_device *op)
 	chip->legacy.set_features = nand_get_set_features_notsupp;
 	chip->legacy.get_features = nand_get_set_features_notsupp;
 	chip->bbt_options = NAND_BBT_USE_FLASH;
-	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	/* Support external chip-select logic on ADS5121 board */
 	if (of_machine_is_compatible("fsl,mpc5121ads")) {
commit e044b8b72151637738b0d2880d62ee5e21f6be5d
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:15 2020 +0100

    mtd: rawnand: lpc32xx_slc: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Cc: Vladimir Zapolskiy <vz at mleia.com>
    Cc: Sylvain Lemieux <slemieux.tyco at gmail.com>

diff --git a/drivers/mtd/nand/raw/lpc32xx_slc.c b/drivers/mtd/nand/raw/lpc32xx_slc.c
index 6db9d2ed6881..dc7785e30d2f 100644
--- a/drivers/mtd/nand/raw/lpc32xx_slc.c
+++ b/drivers/mtd/nand/raw/lpc32xx_slc.c
@@ -775,6 +775,9 @@ static int lpc32xx_nand_attach_chip(struct nand_chip *chip)
 	struct mtd_info *mtd = nand_to_mtd(chip);
 	struct lpc32xx_nand_host *host = nand_get_controller_data(chip);
 
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
 	/* OOB and ECC CPU and DMA work areas */
 	host->ecc_buf = (uint32_t *)(host->data_buf + LPC32XX_DMA_DATA_SIZE);
 
@@ -786,11 +789,22 @@ static int lpc32xx_nand_attach_chip(struct nand_chip *chip)
 	if (mtd->writesize <= 512)
 		mtd_set_ooblayout(mtd, &lpc32xx_ooblayout_ops);
 
+	chip->ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
 	/* These sizes remain the same regardless of page size */
 	chip->ecc.size = 256;
+	chip->ecc.strength = 1;
 	chip->ecc.bytes = LPC32XX_SLC_DEV_ECC_BYTES;
 	chip->ecc.prepad = 0;
 	chip->ecc.postpad = 0;
+	chip->ecc.read_page_raw = lpc32xx_nand_read_page_raw_syndrome;
+	chip->ecc.read_page = lpc32xx_nand_read_page_syndrome;
+	chip->ecc.write_page_raw = lpc32xx_nand_write_page_raw_syndrome;
+	chip->ecc.write_page = lpc32xx_nand_write_page_syndrome;
+	chip->ecc.write_oob = lpc32xx_nand_write_oob_syndrome;
+	chip->ecc.read_oob = lpc32xx_nand_read_oob_syndrome;
+	chip->ecc.calculate = lpc32xx_nand_ecc_calculate;
+	chip->ecc.correct = nand_correct_data;
+	chip->ecc.hwctl = lpc32xx_nand_ecc_enable;
 
 	/*
 	 * Use a custom BBT marker setup for small page FLASH that
@@ -881,21 +895,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, host);
 
 	/* NAND callbacks for LPC32xx SLC hardware */
-	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	chip->ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
 	chip->legacy.read_byte = lpc32xx_nand_read_byte;
 	chip->legacy.read_buf = lpc32xx_nand_read_buf;
 	chip->legacy.write_buf = lpc32xx_nand_write_buf;
-	chip->ecc.read_page_raw = lpc32xx_nand_read_page_raw_syndrome;
-	chip->ecc.read_page = lpc32xx_nand_read_page_syndrome;
-	chip->ecc.write_page_raw = lpc32xx_nand_write_page_raw_syndrome;
-	chip->ecc.write_page = lpc32xx_nand_write_page_syndrome;
-	chip->ecc.write_oob = lpc32xx_nand_write_oob_syndrome;
-	chip->ecc.read_oob = lpc32xx_nand_read_oob_syndrome;
-	chip->ecc.calculate = lpc32xx_nand_ecc_calculate;
-	chip->ecc.correct = nand_correct_data;
-	chip->ecc.strength = 1;
-	chip->ecc.hwctl = lpc32xx_nand_ecc_enable;
 
 	/*
 	 * Allocate a large enough buffer for a single huge page plus
commit 2dbd8382a2e1a9b167712dc3764616bfdb189818
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:14 2020 +0100

    mtd: rawnand: lpc32xx_mlc: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Cc: Vladimir Zapolskiy <vz at mleia.com>
    Cc: Sylvain Lemieux <slemieux.tyco at gmail.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-10-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/lpc32xx_mlc.c b/drivers/mtd/nand/raw/lpc32xx_mlc.c
index 4940bb2e3c07..9e728c731795 100644
--- a/drivers/mtd/nand/raw/lpc32xx_mlc.c
+++ b/drivers/mtd/nand/raw/lpc32xx_mlc.c
@@ -648,6 +648,9 @@ static int lpc32xx_nand_attach_chip(struct nand_chip *chip)
 	struct lpc32xx_nand_host *host = nand_get_controller_data(chip);
 	struct device *dev = &host->pdev->dev;
 
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
 	host->dma_buf = devm_kzalloc(dev, mtd->writesize, GFP_KERNEL);
 	if (!host->dma_buf)
 		return -ENOMEM;
@@ -656,8 +659,17 @@ static int lpc32xx_nand_attach_chip(struct nand_chip *chip)
 	if (!host->dummy_buf)
 		return -ENOMEM;
 
-	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
 	chip->ecc.size = 512;
+	chip->ecc.hwctl = lpc32xx_ecc_enable;
+	chip->ecc.read_page_raw = lpc32xx_read_page;
+	chip->ecc.read_page = lpc32xx_read_page;
+	chip->ecc.write_page_raw = lpc32xx_write_page_lowlevel;
+	chip->ecc.write_page = lpc32xx_write_page_lowlevel;
+	chip->ecc.write_oob = lpc32xx_write_oob;
+	chip->ecc.read_oob = lpc32xx_read_oob;
+	chip->ecc.strength = 4;
+	chip->ecc.bytes = 10;
+
 	mtd_set_ooblayout(mtd, &lpc32xx_ooblayout_ops);
 	host->mlcsubpages = mtd->writesize / 512;
 
@@ -741,15 +753,6 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, host);
 
 	/* Initialize function pointers */
-	nand_chip->ecc.hwctl = lpc32xx_ecc_enable;
-	nand_chip->ecc.read_page_raw = lpc32xx_read_page;
-	nand_chip->ecc.read_page = lpc32xx_read_page;
-	nand_chip->ecc.write_page_raw = lpc32xx_write_page_lowlevel;
-	nand_chip->ecc.write_page = lpc32xx_write_page_lowlevel;
-	nand_chip->ecc.write_oob = lpc32xx_write_oob;
-	nand_chip->ecc.read_oob = lpc32xx_read_oob;
-	nand_chip->ecc.strength = 4;
-	nand_chip->ecc.bytes = 10;
 	nand_chip->legacy.waitfunc = lpc32xx_waitfunc;
 
 	nand_chip->options = NAND_NO_SUBPAGE_WRITE;
commit 98591a68736f3d2431384b5284713fb98da488a6
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:13 2020 +0100

    mtd: rawnand: fsmc: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>

diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
index 4191831df182..c88421a1c078 100644
--- a/drivers/mtd/nand/raw/fsmc_nand.c
+++ b/drivers/mtd/nand/raw/fsmc_nand.c
@@ -880,6 +880,20 @@ static int fsmc_nand_attach_chip(struct nand_chip *nand)
 	struct mtd_info *mtd = nand_to_mtd(nand);
 	struct fsmc_nand_data *host = nand_to_fsmc(nand);
 
+	if (nand->ecc.engine_type == NAND_ECC_ENGINE_TYPE_INVALID)
+		nand->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
+
+	if (!nand->ecc.size)
+		nand->ecc.size = 512;
+
+	if (AMBA_REV_BITS(host->pid) >= 8) {
+		nand->ecc.read_page = fsmc_read_page_hwecc;
+		nand->ecc.calculate = fsmc_read_hwecc_ecc4;
+		nand->ecc.correct = fsmc_bch8_correct_data;
+		nand->ecc.bytes = 13;
+		nand->ecc.strength = 8;
+	}
+
 	if (AMBA_REV_BITS(host->pid) >= 8) {
 		switch (mtd->oobsize) {
 		case 16:
@@ -905,6 +919,7 @@ static int fsmc_nand_attach_chip(struct nand_chip *nand)
 		dev_info(host->dev, "Using 1-bit HW ECC scheme\n");
 		nand->ecc.calculate = fsmc_read_hwecc_ecc1;
 		nand->ecc.correct = nand_correct_data;
+		nand->ecc.hwctl = fsmc_enable_hwecc;
 		nand->ecc.bytes = 3;
 		nand->ecc.strength = 1;
 		nand->ecc.options |= NAND_ECC_SOFT_HAMMING_SM_ORDER;
@@ -1055,13 +1070,6 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
 
 	mtd->dev.parent = &pdev->dev;
 
-	/*
-	 * Setup default ECC mode. nand_dt_init() called from nand_scan_ident()
-	 * can overwrite this value if the DT provides a different value.
-	 */
-	nand->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	nand->ecc.hwctl = fsmc_enable_hwecc;
-	nand->ecc.size = 512;
 	nand->badblockbits = 7;
 
 	if (host->mode == USE_DMA_ACCESS) {
@@ -1084,14 +1092,6 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
 		nand->options |= NAND_KEEP_TIMINGS;
 	}
 
-	if (AMBA_REV_BITS(host->pid) >= 8) {
-		nand->ecc.read_page = fsmc_read_page_hwecc;
-		nand->ecc.calculate = fsmc_read_hwecc_ecc4;
-		nand->ecc.correct = fsmc_bch8_correct_data;
-		nand->ecc.bytes = 13;
-		nand->ecc.strength = 8;
-	}
-
 	nand_controller_init(&host->base);
 	host->base.ops = &fsmc_nand_controller_ops;
 	nand->controller = &host->base;
commit 7f4ea0340ed4fa5cdfff6b1dd9f51f293d3f5ee7
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:12 2020 +0100

    mtd: rawnand: diskonchip: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-8-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/diskonchip.c b/drivers/mtd/nand/raw/diskonchip.c
index 94432a453e5e..26b265e4384a 100644
--- a/drivers/mtd/nand/raw/diskonchip.c
+++ b/drivers/mtd/nand/raw/diskonchip.c
@@ -1269,12 +1269,31 @@ static inline int __init doc2001plus_init(struct mtd_info *mtd)
 	return 1;
 }
 
+static int doc200x_attach_chip(struct nand_chip *chip)
+{
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
+	chip->ecc.placement = NAND_ECC_PLACEMENT_INTERLEAVED;
+	chip->ecc.size = 512;
+	chip->ecc.bytes = 6;
+	chip->ecc.strength = 2;
+	chip->ecc.options = NAND_ECC_GENERIC_ERASED_CHECK;
+	chip->ecc.hwctl = doc200x_enable_hwecc;
+	chip->ecc.calculate = doc200x_calculate_ecc;
+	chip->ecc.correct = doc200x_correct_data;
+
+	return 0;
+}
+
 static const struct nand_controller_ops doc200x_ops = {
 	.exec_op = doc200x_exec_op,
+	.attach_chip = doc200x_attach_chip,
 };
 
 static const struct nand_controller_ops doc2001plus_ops = {
 	.exec_op = doc2001plus_exec_op,
+	.attach_chip = doc200x_attach_chip,
 };
 
 static int __init doc_probe(unsigned long physadr)
@@ -1452,16 +1471,6 @@ static int __init doc_probe(unsigned long physadr)
 
 	nand->controller	= &doc->base;
 	nand_set_controller_data(nand, doc);
-	nand->ecc.hwctl		= doc200x_enable_hwecc;
-	nand->ecc.calculate	= doc200x_calculate_ecc;
-	nand->ecc.correct	= doc200x_correct_data;
-
-	nand->ecc.engine_type	= NAND_ECC_ENGINE_TYPE_ON_HOST;
-	nand->ecc.placement	= NAND_ECC_PLACEMENT_INTERLEAVED;
-	nand->ecc.size		= 512;
-	nand->ecc.bytes		= 6;
-	nand->ecc.strength	= 2;
-	nand->ecc.options	= NAND_ECC_GENERIC_ERASED_CHECK;
 	nand->bbt_options	= NAND_BBT_USE_FLASH;
 	/* Skip the automatic BBT scan so we can run it manually */
 	nand->options		|= NAND_SKIP_BBTSCAN | NAND_NO_BBM_QUIRK;
commit 3500bd7035ee6df2a465f37439d3cb9e00d2f66a
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:11 2020 +0100

    mtd: rawnand: davinci: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Cc: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-7-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/davinci_nand.c b/drivers/mtd/nand/raw/davinci_nand.c
index 427f320fb79b..f8c36d19ab47 100644
--- a/drivers/mtd/nand/raw/davinci_nand.c
+++ b/drivers/mtd/nand/raw/davinci_nand.c
@@ -585,6 +585,10 @@ static int davinci_nand_attach_chip(struct nand_chip *chip)
 	if (IS_ERR(pdata))
 		return PTR_ERR(pdata);
 
+	/* Use board-specific ECC config */
+	info->chip.ecc.engine_type = pdata->engine_type;
+	info->chip.ecc.placement = pdata->ecc_placement;
+
 	switch (info->chip.ecc.engine_type) {
 	case NAND_ECC_ENGINE_TYPE_NONE:
 		pdata->ecc_bits = 0;
@@ -850,10 +854,6 @@ static int nand_davinci_probe(struct platform_device *pdev)
 	info->mask_ale		= pdata->mask_ale ? : MASK_ALE;
 	info->mask_cle		= pdata->mask_cle ? : MASK_CLE;
 
-	/* Use board-specific ECC config */
-	info->chip.ecc.engine_type = pdata->engine_type;
-	info->chip.ecc.placement = pdata->ecc_placement;
-
 	spin_lock_irq(&davinci_nand_lock);
 
 	/* put CSxNAND into NAND mode */
commit 58e111002887ad5f0b665685aac3d4c3bc3768db
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:10 2020 +0100

    mtd: rawnand: cs553x: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>

diff --git a/drivers/mtd/nand/raw/cs553x_nand.c b/drivers/mtd/nand/raw/cs553x_nand.c
index b7f3f6347761..282203debd0c 100644
--- a/drivers/mtd/nand/raw/cs553x_nand.c
+++ b/drivers/mtd/nand/raw/cs553x_nand.c
@@ -243,8 +243,24 @@ static int cs_calculate_ecc(struct nand_chip *this, const u_char *dat,
 
 static struct cs553x_nand_controller *controllers[4];
 
+static int cs553x_attach_chip(struct nand_chip *chip)
+{
+	if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST)
+		return 0;
+
+	chip->ecc.size = 256;
+	chip->ecc.bytes = 3;
+	chip->ecc.hwctl  = cs_enable_hwecc;
+	chip->ecc.calculate = cs_calculate_ecc;
+	chip->ecc.correct  = nand_correct_data;
+	chip->ecc.strength = 1;
+
+	return 0;
+}
+
 static const struct nand_controller_ops cs553x_nand_controller_ops = {
 	.exec_op = cs553x_exec_op,
+	.attach_chip = cs553x_attach_chip,
 };
 
 static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
@@ -286,14 +302,6 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
 		goto out_mtd;
 	}
 
-	this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	this->ecc.size = 256;
-	this->ecc.bytes = 3;
-	this->ecc.hwctl  = cs_enable_hwecc;
-	this->ecc.calculate = cs_calculate_ecc;
-	this->ecc.correct  = nand_correct_data;
-	this->ecc.strength = 1;
-
 	/* Enable the following for a flash based bad block table */
 	this->bbt_options = NAND_BBT_USE_FLASH;
 
commit 704c2317cab5571da0e5763cd47ad07f8900aa76
Author: Theodore Ts'o <tytso at mit.edu>
Date:   Thu Nov 19 15:36:25 2020 -0500

    ext4: drop fast_commit from /proc/mounts
    
    The options in /proc/mounts must be valid mount options --- and
    fast_commit is not a mount option.  Otherwise, command sequences like
    this will fail:
    
        # mount /dev/vdc /vdc
        # mkdir -p /vdc/phoronix_test_suite /pts
        # mount --bind /vdc/phoronix_test_suite /pts
        # mount -o remount,nodioread_nolock /pts
        mount: /pts: mount point not mounted or bad option.
    
    And in the system logs, you'll find:
    
        EXT4-fs (vdc): Unrecognized mount option "fast_commit" or missing value
    
    Fixes: 995a3ed67fc8 ("ext4: add fast_commit feature and handling for extended mount options")
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 6633b20224d5..94472044f4c1 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2638,10 +2638,6 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
 	} else if (test_opt2(sb, DAX_INODE)) {
 		SEQ_OPTS_PUTS("dax=inode");
 	}
-
-	if (test_opt2(sb, JOURNAL_FAST_COMMIT))
-		SEQ_OPTS_PUTS("fast_commit");
-
 	ext4_show_quota_options(seq, sb);
 	return 0;
 }
commit dbffc8ccdf3a1d0c93bc923cb2dce3272d5fd4e8
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:09 2020 +0100

    mtd: rawnand: au1550: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-5-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 79b057400fe9..7892022bd6dd 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -236,8 +236,17 @@ static int au1550nd_exec_op(struct nand_chip *this,
 	return ret;
 }
 
+static int au1550nd_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
 static const struct nand_controller_ops au1550nd_ops = {
 	.exec_op = au1550nd_exec_op,
+	.attach_chip = au1550nd_attach_chip,
 };
 
 static int au1550nd_probe(struct platform_device *pdev)
@@ -294,8 +303,6 @@ static int au1550nd_probe(struct platform_device *pdev)
 	nand_controller_init(&ctx->controller);
 	ctx->controller.ops = &au1550nd_ops;
 	this->controller = &ctx->controller;
-	this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	this->ecc.algo = NAND_ECC_ALGO_HAMMING;
 
 	if (pd->devwidth)
 		this->options |= NAND_BUSWIDTH_16;
commit 59d93473323ab104c733778831c459f4cdbe95b2
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:08 2020 +0100

    mtd: rawnand: ams-delta: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip().
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-4-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index d3c5cc513c8f..0c352b39ad4b 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -215,8 +215,17 @@ static int gpio_nand_setup_interface(struct nand_chip *this, int csline,
 	return 0;
 }
 
+static int gpio_nand_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
 static const struct nand_controller_ops gpio_nand_ops = {
 	.exec_op = gpio_nand_exec_op,
+	.attach_chip = gpio_nand_attach_chip,
 	.setup_interface = gpio_nand_setup_interface,
 };
 
@@ -260,9 +269,6 @@ static int gpio_nand_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	this->ecc.algo = NAND_ECC_ALGO_HAMMING;
-
 	platform_set_drvdata(pdev, priv);
 
 	/* Set chip enabled but write protected */
commit d525914b5bd8d71f7e92a30a170c108c485814ad
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:07 2020 +0100

    mtd: rawnand: xway: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip(), a NAND controller
    hook.
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-3-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/xway_nand.c b/drivers/mtd/nand/raw/xway_nand.c
index f2dbd63a5c1f..efc5bf5434e0 100644
--- a/drivers/mtd/nand/raw/xway_nand.c
+++ b/drivers/mtd/nand/raw/xway_nand.c
@@ -62,6 +62,7 @@
 #define NAND_CON_NANDM		1
 
 struct xway_nand_data {
+	struct nand_controller	controller;
 	struct nand_chip	chip;
 	unsigned long		csflags;
 	void __iomem		*nandaddr;
@@ -145,6 +146,18 @@ static void xway_write_buf(struct nand_chip *chip, const u_char *buf, int len)
 		xway_writeb(nand_to_mtd(chip), NAND_WRITE_DATA, buf[i]);
 }
 
+static int xway_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
+static const struct nand_controller_ops xway_nand_ops = {
+	.attach_chip = xway_attach_chip,
+};
+
 /*
  * Probe for the NAND device.
  */
@@ -180,8 +193,9 @@ static int xway_nand_probe(struct platform_device *pdev)
 	data->chip.legacy.read_byte = xway_read_byte;
 	data->chip.legacy.chip_delay = 30;
 
-	data->chip.ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-	data->chip.ecc.algo = NAND_ECC_ALGO_HAMMING;
+	nand_controller_init(&data->controller);
+	data->controller.ops = &xway_nand_ops;
+	data->chip.controller = &data->controller;
 
 	platform_set_drvdata(pdev, data);
 	nand_set_controller_data(&data->chip, data);
commit f6341f6448e04c9a0ab22fabe38d0c6b43aab848
Author: Miquel Raynal <miquel.raynal at bootlin.com>
Date:   Fri Nov 13 13:34:06 2020 +0100

    mtd: rawnand: gpio: Move the ECC initialization to ->attach_chip()
    
    The probe function is only supposed to initialize the controller
    hardware but not the ECC engine. Indeed, we don't know anything about
    the NAND chip(s) at this stage. Let's move the logic initializing the
    ECC engine, even pretty simple, to the ->attach_chip() hook which gets
    called during nand_scan() routine, after the NAND chip discovery. As
    the previously mentioned logic is supposed to parse the DT for us, it
    is likely that the chip->ecc.* entries be overwritten. So let's avoid
    this by moving these lines to ->attach_chip(), a NAND controller
    hook.
    
    Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input parsing bits")
    Reported-by: Christophe Leroy <christophe.leroy at csgroup.eu>
    Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
    Tested-by: Christophe Leroy <christophe.leroy at csgroup.eu>
    Link: https://lore.kernel.org/linux-mtd/20201113123424.32233-2-miquel.raynal@bootlin.com

diff --git a/drivers/mtd/nand/raw/gpio.c b/drivers/mtd/nand/raw/gpio.c
index 4ec0a1e10867..eb03b8cea1cb 100644
--- a/drivers/mtd/nand/raw/gpio.c
+++ b/drivers/mtd/nand/raw/gpio.c
@@ -161,8 +161,17 @@ static int gpio_nand_exec_op(struct nand_chip *chip,
 	return ret;
 }
 
+static int gpio_nand_attach_chip(struct nand_chip *chip)
+{
+	chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
+	chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
+
+	return 0;
+}
+
 static const struct nand_controller_ops gpio_nand_ops = {
 	.exec_op = gpio_nand_exec_op,
+	.attach_chip = gpio_nand_attach_chip,
 };
 
 #ifdef CONFIG_OF
@@ -342,8 +351,6 @@ static int gpio_nand_probe(struct platform_device *pdev)
 	gpiomtd->base.ops = &gpio_nand_ops;
 
 	nand_set_flash_node(chip, pdev->dev.of_node);
-	chip->ecc.engine_type	= NAND_ECC_ENGINE_TYPE_SOFT;
-	chip->ecc.algo		= NAND_ECC_ALGO_HAMMING;
 	chip->options		= gpiomtd->plat.options;
 	chip->controller	= &gpiomtd->base;
 
commit e6ea60bac1ee28bb46232f8c2ecd3a3fbb9011e0
Merge: 90b49784814c 2801a5da5b25
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Thu Nov 19 12:26:09 2020 -0800

    Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
    
    Alexei Starovoitov says:
    
    ====================
    1) libbpf should not attempt to load unused subprogs, from Andrii.
    
    2) Make strncpy_from_user() mask out bytes after NUL terminator, from Daniel.
    
    3) Relax return code check for subprograms in the BPF verifier, from Dmitrii.
    
    4) Fix several sockmap issues, from John.
    
    * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
      fail_function: Remove a redundant mutex unlock
      selftest/bpf: Test bpf_probe_read_user_str() strips trailing bytes after NUL
      lib/strncpy_from_user.c: Mask out bytes after NUL terminator.
      libbpf: Fix VERSIONED_SYM_COUNT number parsing
      bpf, sockmap: Avoid failures from skb_to_sgvec when skb has frag_list
      bpf, sockmap: Handle memory acct if skb_verdict prog redirects to self
      bpf, sockmap: Avoid returning unneeded EAGAIN when redirecting to self
      bpf, sockmap: Use truesize with sk_rmem_schedule()
      bpf, sockmap: Ensure SO_RCVBUF memory is observed on ingress redirect
      bpf, sockmap: Fix partial copy_page_to_iter so progress can still be made
      selftests/bpf: Fix error return code in run_getsockopt_test()
      bpf: Relax return code check for subprograms
      tools, bpftool: Add missing close before bpftool net attach exit
      MAINTAINERS/bpf: Update Andrii's entry.
      selftests/bpf: Fix unused attribute usage in subprogs_unused test
      bpf: Fix unsigned 'datasec_id' compared with zero in check_pseudo_btf_id
      bpf: Fix passing zero to PTR_ERR() in bpf_btf_printf_prepare
      libbpf: Don't attempt to load unused subprog as an entry-point BPF program
    ====================
    
    Link: https://lore.kernel.org/r/20201119200721.288-1-alexei.starovoitov@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit be33805c65297611971003d72e7f9235e23ec84d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Oct 15 13:21:38 2020 +0100

    drm/i915/gt: Fixup tgl mocs for PTE tracking
    
    Forcing mocs:1 [used for our winsys follows-pte mode] to be cached
    caused display glitches. Though it is documented as deprecated (and so
    likely behaves as uncached) use the follow-pte bit and force it out of
    L3 cache.
    
    Testcase: igt/kms_frontbuffer_tracking
    Testcase: igt/kms_big_fb
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Ayaz A Siddiqui <ayaz.siddiqui at intel.com>
    Cc: Lucas De Marchi <lucas.demarchi at intel.com>
    Cc: Matt Roper <matthew.d.roper at intel.com>
    Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
    Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201015122138.30161-4-chris@chris-wilson.co.uk
    (cherry picked from commit a04ac827366594c7244f60e9be79fcb404af69f0)
    Fixes: 849c0fe9e831 ("drm/i915/gt: Initialize reserved and unspecified MOCS indices")
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
    [Rodrigo: Updated Fixes tag]

diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.c b/drivers/gpu/drm/i915/gt/intel_mocs.c
index b8f56e62158e..313e51e7d4f7 100644
--- a/drivers/gpu/drm/i915/gt/intel_mocs.c
+++ b/drivers/gpu/drm/i915/gt/intel_mocs.c
@@ -243,8 +243,9 @@ static const struct drm_i915_mocs_entry tgl_mocs_table[] = {
 	 * only, __init_mocs_table() take care to program unused index with
 	 * this entry.
 	 */
-	MOCS_ENTRY(1, LE_3_WB | LE_TC_1_LLC | LE_LRUM(3),
-		   L3_3_WB),
+	MOCS_ENTRY(I915_MOCS_PTE,
+		   LE_0_PAGETABLE | LE_TC_0_PAGETABLE,
+		   L3_1_UC),
 	GEN11_MOCS_ENTRIES,
 
 	/* Implicitly enable L1 - HDC:L1 + L3 + LLC */
commit f95dddc9f4051b04a02677eb3df0b25962f12dfc
Merge: 01822dd1bacf 2b3af2705645
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 20 06:08:35 2020 +1000

    Merge tag 'amd-drm-fixes-5.10-2020-11-18' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
    
    amd-drm-fixes-5.10-2020-11-18:
    
    amdgpu:
    - Pageflip fix for navi1x with 5 or 6 displays
    - Remove experimental flag for Arcturus
    - Fix regression in atomic commit tail rework
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    From: Alex Deucher <alexdeucher at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201118213646.4015-1-alexander.deucher@amd.com

commit 2801a5da5b25b7af9dd2addd19b2315c02d17b64
Author: Luo Meng <luomeng12 at huawei.com>
Date:   Wed Nov 18 22:49:31 2020 +0900

    fail_function: Remove a redundant mutex unlock
    
    Fix a mutex_unlock() issue where before copy_from_user() is
    not called mutex_locked.
    
    Fixes: 4b1a29a7f542 ("error-injection: Support fault injection framework")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Luo Meng <luomeng12 at huawei.com>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Acked-by: Masami Hiramatsu <mhiramat at kernel.org>
    Link: https://lore.kernel.org/bpf/160570737118.263807.8358435412898356284.stgit@devnote2

diff --git a/kernel/fail_function.c b/kernel/fail_function.c
index 63b349168da7..b0b1ad93fa95 100644
--- a/kernel/fail_function.c
+++ b/kernel/fail_function.c
@@ -253,7 +253,7 @@ static ssize_t fei_write(struct file *file, const char __user *buffer,
 
 	if (copy_from_user(buf, buffer, count)) {
 		ret = -EFAULT;
-		goto out;
+		goto out_free;
 	}
 	buf[count] = '\0';
 	sym = strstrip(buf);
@@ -307,8 +307,9 @@ static ssize_t fei_write(struct file *file, const char __user *buffer,
 		ret = count;
 	}
 out:
-	kfree(buf);
 	mutex_unlock(&fei_lock);
+out_free:
+	kfree(buf);
 	return ret;
 }
 
commit 14d6d86c210aea1a83c19a8f6391ecabcbefed94
Merge: 1fd6cee127e2 c8a36aedf3e2
Author: Alexei Starovoitov <ast at kernel.org>
Date:   Thu Nov 19 10:45:55 2020 -0800

    Merge branch 'Fix bpf_probe_read_user_str() overcopying'
    
    Daniel Xu says:
    
    ====================
    
    6ae08ae3dea2 ("bpf: Add probe_read_{user, kernel} and probe_read_{user,
    kernel}_str helpers") introduced a subtle bug where
    bpf_probe_read_user_str() would potentially copy a few extra bytes after
    the NUL terminator.
    
    This issue is particularly nefarious when strings are used as map keys,
    as seemingly identical strings can occupy multiple entries in a map.
    
    This patchset fixes the issue and introduces a selftest to prevent
    future regressions.
    
    v6 -> v7:
    * Add comments
    
    v5 -> v6:
    * zero-pad up to sizeof(unsigned long) after NUL
    
    v4 -> v5:
    * don't read potentially uninitialized memory
    
    v3 -> v4:
    * directly pass userspace pointer to prog
    * test more strings of different length
    
    v2 -> v3:
    * set pid filter before attaching prog in selftest
    * use long instead of int as bpf_probe_read_user_str() retval
    * style changes
    
    v1 -> v2:
    * add Fixes: tag
    * add selftest
    ====================
    
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>

commit c8a36aedf3e24768e94d87fdcdd37684bd241c44
Author: Daniel Xu <dxu at dxuuu.xyz>
Date:   Tue Nov 17 12:05:46 2020 -0800

    selftest/bpf: Test bpf_probe_read_user_str() strips trailing bytes after NUL
    
    Previously, bpf_probe_read_user_str() could potentially overcopy the
    trailing bytes after the NUL due to how do_strncpy_from_user() does the
    copy in long-sized strides. The issue has been fixed in the previous
    commit.
    
    This commit adds a selftest that ensures we don't regress
    bpf_probe_read_user_str() again.
    
    Signed-off-by: Daniel Xu <dxu at dxuuu.xyz>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Acked-by: Song Liu <songliubraving at fb.com>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/4d977508fab4ec5b7b574b85bdf8b398868b6ee9.1605642949.git.dxu@dxuuu.xyz

diff --git a/tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c b/tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c
new file mode 100644
index 000000000000..e419298132b5
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <test_progs.h>
+#include "test_probe_read_user_str.skel.h"
+
+static const char str1[] = "mestring";
+static const char str2[] = "mestringalittlebigger";
+static const char str3[] = "mestringblubblubblubblubblub";
+
+static int test_one_str(struct test_probe_read_user_str *skel, const char *str,
+			size_t len)
+{
+	int err, duration = 0;
+	char buf[256];
+
+	/* Ensure bytes after string are ones */
+	memset(buf, 1, sizeof(buf));
+	memcpy(buf, str, len);
+
+	/* Give prog our userspace pointer */
+	skel->bss->user_ptr = buf;
+
+	/* Trigger tracepoint */
+	usleep(1);
+
+	/* Did helper fail? */
+	if (CHECK(skel->bss->ret < 0, "prog_ret", "prog returned: %ld\n",
+		  skel->bss->ret))
+		return 1;
+
+	/* Check that string was copied correctly */
+	err = memcmp(skel->bss->buf, str, len);
+	if (CHECK(err, "memcmp", "prog copied wrong string"))
+		return 1;
+
+	/* Now check that no extra trailing bytes were copied */
+	memset(buf, 0, sizeof(buf));
+	err = memcmp(skel->bss->buf + len, buf, sizeof(buf) - len);
+	if (CHECK(err, "memcmp", "trailing bytes were not stripped"))
+		return 1;
+
+	return 0;
+}
+
+void test_probe_read_user_str(void)
+{
+	struct test_probe_read_user_str *skel;
+	int err, duration = 0;
+
+	skel = test_probe_read_user_str__open_and_load();
+	if (CHECK(!skel, "test_probe_read_user_str__open_and_load",
+		  "skeleton open and load failed\n"))
+		return;
+
+	/* Give pid to bpf prog so it doesn't read from anyone else */
+	skel->bss->pid = getpid();
+
+	err = test_probe_read_user_str__attach(skel);
+	if (CHECK(err, "test_probe_read_user_str__attach",
+		  "skeleton attach failed: %d\n", err))
+		goto out;
+
+	if (test_one_str(skel, str1, sizeof(str1)))
+		goto out;
+	if (test_one_str(skel, str2, sizeof(str2)))
+		goto out;
+	if (test_one_str(skel, str3, sizeof(str3)))
+		goto out;
+
+out:
+	test_probe_read_user_str__destroy(skel);
+}
diff --git a/tools/testing/selftests/bpf/progs/test_probe_read_user_str.c b/tools/testing/selftests/bpf/progs/test_probe_read_user_str.c
new file mode 100644
index 000000000000..3ae398b75dcd
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_probe_read_user_str.c
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+#include <sys/types.h>
+
+pid_t pid = 0;
+long ret = 0;
+void *user_ptr = 0;
+char buf[256] = {};
+
+SEC("tracepoint/syscalls/sys_enter_nanosleep")
+int on_write(void *ctx)
+{
+	if (pid != (bpf_get_current_pid_tgid() >> 32))
+		return 0;
+
+	ret = bpf_probe_read_user_str(buf, sizeof(buf), user_ptr);
+
+	return 0;
+}
+
+char _license[] SEC("license") = "GPL";
commit 6fa6d28051e9fcaa1570e69648ea13a353a5d218
Author: Daniel Xu <dxu at dxuuu.xyz>
Date:   Tue Nov 17 12:05:45 2020 -0800

    lib/strncpy_from_user.c: Mask out bytes after NUL terminator.
    
    do_strncpy_from_user() may copy some extra bytes after the NUL
    terminator into the destination buffer. This usually does not matter for
    normal string operations. However, when BPF programs key BPF maps with
    strings, this matters a lot.
    
    A BPF program may read strings from user memory by calling the
    bpf_probe_read_user_str() helper which eventually calls
    do_strncpy_from_user(). The program can then key a map with the
    destination buffer. BPF map keys are fixed-width and string-agnostic,
    meaning that map keys are treated as a set of bytes.
    
    The issue is when do_strncpy_from_user() overcopies bytes after the NUL
    terminator, it can result in seemingly identical strings occupying
    multiple slots in a BPF map. This behavior is subtle and totally
    unexpected by the user.
    
    This commit masks out the bytes following the NUL while preserving
    long-sized stride in the fast path.
    
    Fixes: 6ae08ae3dea2 ("bpf: Add probe_read_{user, kernel} and probe_read_{user, kernel}_str helpers")
    Signed-off-by: Daniel Xu <dxu at dxuuu.xyz>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/21efc982b3e9f2f7b0379eed642294caaa0c27a7.1605642949.git.dxu@dxuuu.xyz

diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 5113fd423cdf..048c655315f1 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -181,6 +181,16 @@ bpf_probe_read_user_str_common(void *dst, u32 size,
 {
 	int ret;
 
+	/*
+	 * NB: We rely on strncpy_from_user() not copying junk past the NUL
+	 * terminator into `dst`.
+	 *
+	 * strncpy_from_user() does long-sized strides in the fast path. If the
+	 * strncpy does not mask out the bytes after the NUL in `unsafe_ptr`,
+	 * then there could be junk after the NUL in `dst`. If user takes `dst`
+	 * and keys a hash map with it, then semantically identical strings can
+	 * occupy multiple entries in the map.
+	 */
 	ret = strncpy_from_user_nofault(dst, unsafe_ptr, size);
 	if (unlikely(ret < 0))
 		memset(dst, 0, size);
diff --git a/lib/strncpy_from_user.c b/lib/strncpy_from_user.c
index e6d5fcc2cdf3..122d8d0e253c 100644
--- a/lib/strncpy_from_user.c
+++ b/lib/strncpy_from_user.c
@@ -35,17 +35,32 @@ static inline long do_strncpy_from_user(char *dst, const char __user *src,
 		goto byte_at_a_time;
 
 	while (max >= sizeof(unsigned long)) {
-		unsigned long c, data;
+		unsigned long c, data, mask;
 
 		/* Fall back to byte-at-a-time if we get a page fault */
 		unsafe_get_user(c, (unsigned long __user *)(src+res), byte_at_a_time);
 
-		*(unsigned long *)(dst+res) = c;
+		/*
+		 * Note that we mask out the bytes following the NUL. This is
+		 * important to do because string oblivious code may read past
+		 * the NUL. For those routines, we don't want to give them
+		 * potentially random bytes after the NUL in `src`.
+		 *
+		 * One example of such code is BPF map keys. BPF treats map keys
+		 * as an opaque set of bytes. Without the post-NUL mask, any BPF
+		 * maps keyed by strings returned from strncpy_from_user() may
+		 * have multiple entries for semantically identical strings.
+		 */
 		if (has_zero(c, &data, &constants)) {
 			data = prep_zero_mask(c, data, &constants);
 			data = create_zero_mask(data);
+			mask = zero_bytemask(data);
+			*(unsigned long *)(dst+res) = c & mask;
 			return res + find_zero(data);
 		}
+
+		*(unsigned long *)(dst+res) = c;
+
 		res += sizeof(unsigned long);
 		max -= sizeof(unsigned long);
 	}
commit dda3f4252e6c8b833a2ef164afd3da9808d0f07c
Merge: 3494d58865ad da631f7fd623
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 11:32:31 2020 -0800

    Merge tag 'powerpc-cve-2020-4788' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
    
    Pull powerpc fixes from Michael Ellerman:
     "Fixes for CVE-2020-4788.
    
      From Daniel's cover letter:
    
      IBM Power9 processors can speculatively operate on data in the L1
      cache before it has been completely validated, via a way-prediction
      mechanism. It is not possible for an attacker to determine the
      contents of impermissible memory using this method, since these
      systems implement a combination of hardware and software security
      measures to prevent scenarios where protected data could be leaked.
    
      However these measures don't address the scenario where an attacker
      induces the operating system to speculatively execute instructions
      using data that the attacker controls. This can be used for example to
      speculatively bypass "kernel user access prevention" techniques, as
      discovered by Anthony Steinhauser of Google's Safeside Project. This
      is not an attack by itself, but there is a possibility it could be
      used in conjunction with side-channels or other weaknesses in the
      privileged code to construct an attack.
    
      This issue can be mitigated by flushing the L1 cache between privilege
      boundaries of concern.
    
      This patch series flushes the L1 cache on kernel entry (patch 2) and
      after the kernel performs any user accesses (patch 3). It also adds a
      self-test and performs some related cleanups"
    
    * tag 'powerpc-cve-2020-4788' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
      powerpc/64s: rename pnv|pseries_setup_rfi_flush to _setup_security_mitigations
      selftests/powerpc: refactor entry and rfi_flush tests
      selftests/powerpc: entry flush test
      powerpc: Only include kup-radix.h for 64-bit Book3S
      powerpc/64s: flush L1D after user accesses
      powerpc/64s: flush L1D on kernel entry
      selftests/powerpc: rfi_flush: disable entry flush if present

commit 3494d58865ad4a47611dbb427b214cc5227fa5eb
Merge: 131ad0b6f529 dc293f210690
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 11:22:33 2020 -0800

    Merge tag 'xtensa-20201119' of git://github.com/jcmvbkbc/linux-xtensa
    
    Pull xtensa fixes from Max Filippov:
    
     - fix placement of cache alias remapping area
    
     - disable preemption around cache alias management calls
    
     - add missing __user annotation to strncpy_from_user argument
    
    * tag 'xtensa-20201119' of git://github.com/jcmvbkbc/linux-xtensa:
      xtensa: uaccess: Add missing __user to strncpy_from_user() prototype
      xtensa: disable preemption around cache alias management calls
      xtensa: fix TLBTEMP area placement

commit 01822dd1bacfce25418cd4662c14240e6eb17ad6
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Mon Sep 21 16:25:36 2020 +0200

    drm/vram-helper: Fix use of top-down placement
    
    Commit 7053e0eab473 ("drm/vram-helper: stop using TTM placement flags")
    cleared the BO placement flags if top-down placement had been selected.
    Hence, BOs that were supposed to go into VRAM are now placed in a default
    location in system memory.
    
    Trying to scanout the incorrectly pinned BO results in displayed garbage
    and an error message.
    
    [  146.108127] ------------[ cut here ]------------
    [  146.1V08180] WARNING: CPU: 0 PID: 152 at drivers/gpu/drm/drm_gem_vram_helper.c:284 drm_gem_vram_offset+0x59/0x60 [drm_vram_helper]
    ...
    [  146.108591]  ast_cursor_page_flip+0x3e/0x150 [ast]
    [  146.108622]  ast_cursor_plane_helper_atomic_update+0x8a/0xc0 [ast]
    [  146.108654]  drm_atomic_helper_commit_planes+0x197/0x4c0
    [  146.108699]  drm_atomic_helper_commit_tail_rpm+0x59/0xa0
    [  146.108718]  commit_tail+0x103/0x1c0
    ...
    [  146.109302] ---[ end trace d901a1ba1d949036 ]---
    
    Fix the bug by keeping the placement flags. The top-down placement flag
    is stored in a separate variable.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Christian König <christian.koenig at amd.com>
    Fixes: 7053e0eab473 ("drm/vram-helper: stop using TTM placement flags")
    Reported-by: Pu Wen <puwen at hygon.cn> [for 5.10-rc1]
    Tested-by: Pu Wen <puwen at hygon.cn>
    Cc: Christian König <christian.koenig at amd.com>
    Cc: Dave Airlie <airlied at redhat.com>
    Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
    Cc: Maxime Ripard <mripard at kernel.org>
    Cc: Thomas Zimmermann <tzimmermann at suse.de>
    Cc: David Airlie <airlied at linux.ie>
    Cc: Daniel Vetter <daniel at ffwll.ch>
    Cc: dri-devel at lists.freedesktop.org
    Link: https://patchwork.freedesktop.org/patch/msgid/20200921142536.4392-1-tzimmermann@suse.de
    (cherry picked from commit b8f8dbf6495850b0babc551377bde754b7bc0eea)
    [pulled into fixes from drm-next]
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
index 50cad0e4a92e..375c79e23ca5 100644
--- a/drivers/gpu/drm/drm_gem_vram_helper.c
+++ b/drivers/gpu/drm/drm_gem_vram_helper.c
@@ -140,7 +140,7 @@ static void drm_gem_vram_placement(struct drm_gem_vram_object *gbo,
 	unsigned int c = 0;
 
 	if (pl_flag & DRM_GEM_VRAM_PL_FLAG_TOPDOWN)
-		pl_flag = TTM_PL_FLAG_TOPDOWN;
+		invariant_flags = TTM_PL_FLAG_TOPDOWN;
 
 	gbo->placement.placement = gbo->placements;
 	gbo->placement.busy_placement = gbo->placements;
commit 131ad0b6f5294dd4eb1c8e5e5c611a85cbae0c4e
Merge: 4ca35b4f4509 de15e20f50b1
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 11:15:15 2020 -0800

    Merge tag 'acpi-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
    
    Pull ACPI fixes from Rafael Wysocki:
     "These fix recent regression in the APEI code and initialization issue
      in the ACPI fan driver.
    
      Specifics:
    
       - Make the APEI code avoid attempts to obtain logical addresses for
         registers located in the I/O address space to fix initialization
         issues (Aili Yao)
    
       - Fix sysfs attribute initialization in the ACPI fan driver (Guenter
         Roeck)"
    
    * tag 'acpi-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
      ACPI, APEI, Fix error return value in apei_map_generic_address()
      ACPI: fan: Initialize performance state sysfs attribute

commit 4ca35b4f45092634df21dada47746571a34cc09c
Merge: fee3c824edf2 3a8ac4d39651
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 11:11:50 2020 -0800

    Merge tag 'pm-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
    
    Pull power management fixes from Rafael Wysocki:
     "These fix two issues in ARM cpufreq drivers and one cpuidle driver
      issue.
    
      Specifics:
    
       - Add missing RCU_NONIDLE() annotations to the Tegra cpuidle driver
         (Dmitry Osipenko)
    
       - Fix boot frequency computation in the tegra186 cpufreq driver (Jon
         Hunter)
    
       - Make the SCMI cpufreq driver register a dummy clock provider to
         avoid OPP addition failures (Sudeep Holla)"
    
    * tag 'pm-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
      cpufreq: scmi: Fix OPP addition failure with a dummy clock provider
      cpufreq: tegra186: Fix get frequency callback
      cpuidle: tegra: Annotate tegra_pm_set_cpu_in_lp2() with RCU_NONIDLE

commit fee3c824edf24fd4c497bb3b887d1447150ec4ec
Merge: d748287a28de 04a9cd51d3f3
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 11:05:28 2020 -0800

    Merge tag 'spi-fix-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
    
    Pull spi fixes from Mark Brown:
     "This is a relatively large set of fixes, the bulk of it being a series
      from Lukas Wunner which fixes confusion with the lifetime of driver
      data allocated along with the SPI controller structure that's been
      created as part of the conversion to devm APIs.
    
      The simplest fix, explained in detail in Lukas' commit message, is to
      move to a devm_ function for allocation of the controller and hence
      driver data in order to push the free of that after anything tries to
      reference the driver data in the remove path. This results in a
      relatively large diff due to the addition of a new function but isn't
      particularly complex.
    
      There's also a fix from Sven van Asbroeck which fixes yet more fallout
      from the conflicts between the various different places one can
      configure the polarity of GPIOs in modern systems.
    
      Otherwise everything is fairly small and driver specific"
    
    * tag 'spi-fix-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
      spi: npcm-fiu: Don't leak SPI master in probe error path
      spi: dw: Set transfer handler before unmasking the IRQs
      spi: cadence-quadspi: Fix error return code in cqspi_probe
      spi: bcm2835aux: Restore err assignment in bcm2835aux_spi_probe
      spi: lpspi: Fix use-after-free on unbind
      spi: bcm-qspi: Fix use-after-free on unbind
      spi: bcm2835aux: Fix use-after-free on unbind
      spi: bcm2835: Fix use-after-free on unbind
      spi: Introduce device-managed SPI controller allocation
      spi: fsi: Fix transfer returning without finalizing message
      spi: fix client driver breakages when using GPIO descriptors

commit 90b49784814c10c0f028646f95cc2c2848696712
Merge: 2d8f6481c17d 41a0be3f8f6b
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Thu Nov 19 10:59:22 2020 -0800

    Merge branch 'net-smc-fixes-2020-11-18'
    
    Karsten Graul says:
    
    ====================
    net/smc: fixes 2020-11-18
    
    Patch 1 fixes the matching of link groups because with SMC-Dv2 the vlanid
    should no longer be part of this matching. Patch 2 removes a sparse message.
    ====================
    
    Link: https://lore.kernel.org/r/20201118214038.24039-1-kgraul@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 41a0be3f8f6be893860b991eb10c47fc3ee09d7f
Author: Karsten Graul <kgraul at linux.ibm.com>
Date:   Wed Nov 18 22:40:38 2020 +0100

    net/smc: fix direct access to ib_gid_addr->ndev in smc_ib_determine_gid()
    
    Sparse complaints 3 times about:
    net/smc/smc_ib.c:203:52: warning: incorrect type in argument 1 (different address spaces)
    net/smc/smc_ib.c:203:52:    expected struct net_device const *dev
    net/smc/smc_ib.c:203:52:    got struct net_device [noderef] __rcu *const ndev
    
    Fix that by using the existing and validated ndev variable instead of
    accessing attr->ndev directly.
    
    Fixes: 5102eca9039b ("net/smc: Use rdma_read_gid_l2_fields to L2 fields")
    Signed-off-by: Karsten Graul <kgraul at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/smc/smc_ib.c b/net/smc/smc_ib.c
index 1c314dbdc7fa..fc766b537ac7 100644
--- a/net/smc/smc_ib.c
+++ b/net/smc/smc_ib.c
@@ -198,9 +198,9 @@ int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport,
 		rcu_read_lock();
 		ndev = rdma_read_gid_attr_ndev_rcu(attr);
 		if (!IS_ERR(ndev) &&
-		    ((!vlan_id && !is_vlan_dev(attr->ndev)) ||
-		     (vlan_id && is_vlan_dev(attr->ndev) &&
-		      vlan_dev_vlan_id(attr->ndev) == vlan_id)) &&
+		    ((!vlan_id && !is_vlan_dev(ndev)) ||
+		     (vlan_id && is_vlan_dev(ndev) &&
+		      vlan_dev_vlan_id(ndev) == vlan_id)) &&
 		    attr->gid_type == IB_GID_TYPE_ROCE) {
 			rcu_read_unlock();
 			if (gid)
commit 0530bd6e6a3d5a0292a1a5f33ea980ae7e8b56ca
Author: Karsten Graul <kgraul at linux.ibm.com>
Date:   Wed Nov 18 22:40:37 2020 +0100

    net/smc: fix matching of existing link groups
    
    With the multi-subnet support of SMC-Dv2 the match for existing link
    groups should not include the vlanid of the network device.
    Set ini->smcd_version accordingly before the call to smc_conn_create()
    and use this value in smc_conn_create() to skip the vlanid check.
    
    Fixes: 5c21c4ccafe8 ("net/smc: determine accepted ISM devices")
    Signed-off-by: Karsten Graul <kgraul at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index e9f487c8c6d5..5dd4faaf7d6e 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -979,7 +979,8 @@ static int __smc_connect(struct smc_sock *smc)
 
 	/* check if smc modes and versions of CLC proposal and accept match */
 	rc = smc_connect_check_aclc(ini, aclc);
-	version = aclc->hdr.version == SMC_V1 ? SMC_V1 : version;
+	version = aclc->hdr.version == SMC_V1 ? SMC_V1 : SMC_V2;
+	ini->smcd_version = version;
 	if (rc)
 		goto vlan_cleanup;
 
diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
index 2b19863f7171..af96f813c075 100644
--- a/net/smc/smc_core.c
+++ b/net/smc/smc_core.c
@@ -1309,7 +1309,8 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini)
 				    ini->ism_peer_gid[ini->ism_selected]) :
 		     smcr_lgr_match(lgr, ini->ib_lcl, role, ini->ib_clcqpn)) &&
 		    !lgr->sync_err &&
-		    lgr->vlan_id == ini->vlan_id &&
+		    (ini->smcd_version == SMC_V2 ||
+		     lgr->vlan_id == ini->vlan_id) &&
 		    (role == SMC_CLNT || ini->is_smcd ||
 		     lgr->conns_num < SMC_RMBS_PER_LGR_MAX)) {
 			/* link group found */
commit aecd1fbe7784e75226682afe7a9c3a34af35aa3e
Merge: d21b96c8ed2a 879ee8b6f2ba
Author: Takashi Iwai <tiwai at suse.de>
Date:   Thu Nov 19 19:56:29 2020 +0100

    Merge tag 'asoc-fix-v5.10-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
    
    ASoC: Fixes for v5.11
    
    A collection of driver specific fixes, mostly for x86 systems (or CODECs
    used mostly on x86) and all for relatively minor issues, the biggest one
    being fixing S24_LE format on Keem Bay systems.

commit d748287a28de8955e1756a454e81ab1a73d45ecf
Merge: 841d6e9ec9e3 2ba546ebe0ce
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 10:55:54 2020 -0800

    Merge tag 'regulator-fix-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator
    
    Pull regulator fixes from Mark Brown:
     "Mostly core fixes here, one set from Michał Mirosław which cleans up
      some issues introduced as part of the coupled regulators work, one
      memory leak during probe and two due to regulators which have an input
      supply name and regulator name which are identical, which is very
      unusual.
    
      There's also a fix for our handling of the similarly unusual case
      where we can't determine if a regulator is enabled during boot"
    
    * tag 'regulator-fix-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator:
      regulator: ti-abb: Fix array out of bound read access on the first transition
      regulator: workaround self-referent regulators
      regulator: avoid resolve_supply() infinite recursion
      regulator: fix memory leak with repeated set_machine_constraints()
      regulator: pfuze100: limit pfuze-support-disable-sw to pfuze{100,200}
      regulator: core: don't disable regulator if is_enabled return error.

commit 2d8f6481c17db9fa5238b277cdbc392084060b09
Author: Georg Kohmann <geokohma at cisco.com>
Date:   Thu Nov 19 10:58:33 2020 +0100

    ipv6: Remove dependency of ipv6_frag_thdr_truncated on ipv6 module
    
    IPV6=m
    NF_DEFRAG_IPV6=y
    
    ld: net/ipv6/netfilter/nf_conntrack_reasm.o: in function
    `nf_ct_frag6_gather':
    net/ipv6/netfilter/nf_conntrack_reasm.c:462: undefined reference to
    `ipv6_frag_thdr_truncated'
    
    Netfilter is depending on ipv6 symbol ipv6_frag_thdr_truncated. This
    dependency is forcing IPV6=y.
    
    Remove this dependency by moving ipv6_frag_thdr_truncated out of ipv6. This
    is the same solution as used with a similar issues: Referring to
    commit 70b095c843266 ("ipv6: remove dependency of nf_defrag_ipv6 on ipv6
    module")
    
    Fixes: 9d9e937b1c8b ("ipv6/netfilter: Discard first fragment not including all headers")
    Reported-by: Randy Dunlap <rdunlap at infradead.org>
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Georg Kohmann <geokohma at cisco.com>
    Acked-by: Pablo Neira Ayuso <pablo at netfilter.org>
    Acked-by: Randy Dunlap <rdunlap at infradead.org> # build-tested
    Link: https://lore.kernel.org/r/20201119095833.8409-1-geokohma@cisco.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 637cc6dd12b7..bd1f396cc9c7 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -1064,8 +1064,6 @@ int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
 
 bool ipv6_ext_hdr(u8 nexthdr);
 
-bool ipv6_frag_thdr_truncated(struct sk_buff *skb, int start, u8 *nexthdrp);
-
 enum {
 	IP6_FH_F_FRAG		= (1 << 0),
 	IP6_FH_F_AUTH		= (1 << 1),
diff --git a/include/net/ipv6_frag.h b/include/net/ipv6_frag.h
index a21e8b1381a1..851029ecff13 100644
--- a/include/net/ipv6_frag.h
+++ b/include/net/ipv6_frag.h
@@ -108,5 +108,35 @@ out_rcu_unlock:
 	rcu_read_unlock();
 	inet_frag_put(&fq->q);
 }
+
+/* Check if the upper layer header is truncated in the first fragment. */
+static inline bool
+ipv6frag_thdr_truncated(struct sk_buff *skb, int start, u8 *nexthdrp)
+{
+	u8 nexthdr = *nexthdrp;
+	__be16 frag_off;
+	int offset;
+
+	offset = ipv6_skip_exthdr(skb, start, &nexthdr, &frag_off);
+	if (offset < 0 || (frag_off & htons(IP6_OFFSET)))
+		return false;
+	switch (nexthdr) {
+	case NEXTHDR_TCP:
+		offset += sizeof(struct tcphdr);
+		break;
+	case NEXTHDR_UDP:
+		offset += sizeof(struct udphdr);
+		break;
+	case NEXTHDR_ICMP:
+		offset += sizeof(struct icmp6hdr);
+		break;
+	default:
+		offset += 1;
+	}
+	if (offset > skb->len)
+		return true;
+	return false;
+}
+
 #endif
 #endif
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
index b9cc0b330dbe..c129ad334eb3 100644
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
@@ -459,7 +459,7 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
 	/* Discard the first fragment if it does not include all headers
 	 * RFC 8200, Section 4.5
 	 */
-	if (ipv6_frag_thdr_truncated(skb, fhoff, &nexthdr)) {
+	if (ipv6frag_thdr_truncated(skb, fhoff, &nexthdr)) {
 		pr_debug("Drop incomplete fragment\n");
 		return 0;
 	}
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index e3869bac9c88..47a0dc46cbdb 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -318,35 +318,6 @@ out_fail:
 	return -1;
 }
 
-/* Check if the upper layer header is truncated in the first fragment. */
-bool ipv6_frag_thdr_truncated(struct sk_buff *skb, int start, u8 *nexthdrp)
-{
-	u8 nexthdr = *nexthdrp;
-	__be16 frag_off;
-	int offset;
-
-	offset = ipv6_skip_exthdr(skb, start, &nexthdr, &frag_off);
-	if (offset < 0 || (frag_off & htons(IP6_OFFSET)))
-		return false;
-	switch (nexthdr) {
-	case NEXTHDR_TCP:
-		offset += sizeof(struct tcphdr);
-		break;
-	case NEXTHDR_UDP:
-		offset += sizeof(struct udphdr);
-		break;
-	case NEXTHDR_ICMP:
-		offset += sizeof(struct icmp6hdr);
-		break;
-	default:
-		offset += 1;
-	}
-	if (offset > skb->len)
-		return true;
-	return false;
-}
-EXPORT_SYMBOL(ipv6_frag_thdr_truncated);
-
 static int ipv6_frag_rcv(struct sk_buff *skb)
 {
 	struct frag_hdr *fhdr;
@@ -390,7 +361,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
 	 * the source of the fragment, with the Pointer field set to zero.
 	 */
 	nexthdr = hdr->nexthdr;
-	if (ipv6_frag_thdr_truncated(skb, skb_transport_offset(skb), &nexthdr)) {
+	if (ipv6frag_thdr_truncated(skb, skb_transport_offset(skb), &nexthdr)) {
 		__IP6_INC_STATS(net, __in6_dev_get_safely(skb->dev),
 				IPSTATS_MIB_INHDRERRORS);
 		icmpv6_param_prob(skb, ICMPV6_HDR_INCOMP, 0);
commit 841d6e9ec9e345054dd4a28ef5feceb73e9702be
Merge: c2e7554e1b85 b98467fe96d2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 19 10:49:35 2020 -0800

    Merge tag 'thermal-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux
    
    Pull thermal fix from Daniel Lezcano:
     "Disable the CPU PM notifier for OMAP4430 for suspend in order to
      prevent wrong temperature leading to a critical shutdown (Peter
      Ujfalusi)"
    
    * tag 'thermal-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux:
      thermal: ti-soc-thermal: Disable the CPU PM notifier for OMAP4430

commit d21b96c8ed2aea7e6b7bf4735e1d2503cfbf4072
Author: Takashi Iwai <tiwai at suse.de>
Date:   Thu Nov 19 13:14:40 2020 +0100

    ALSA: mixart: Fix mutex deadlock
    
    The code change for switching to non-atomic mode brought the
    unexpected mutex deadlock in get_msg().  It converted the spinlock
    with the existing mutex, but there were calls with the already holding
    the mutex.  Since the only place that needs the extra lock is the code
    path from snd_mixart_send_msg(), remove the mutex lock in get_msg()
    and apply in the caller side for fixing the mutex deadlock.
    
    Fixes: 8d3a8b5cb57d ("ALSA: mixart: Use nonatomic PCM ops")
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201119121440.18945-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/mixart/mixart_core.c b/sound/pci/mixart/mixart_core.c
index 0bdd33b0af65..fb8895af0363 100644
--- a/sound/pci/mixart/mixart_core.c
+++ b/sound/pci/mixart/mixart_core.c
@@ -70,7 +70,6 @@ static int get_msg(struct mixart_mgr *mgr, struct mixart_msg *resp,
 	unsigned int i;
 #endif
 
-	mutex_lock(&mgr->msg_lock);
 	err = 0;
 
 	/* copy message descriptor from miXart to driver */
@@ -119,8 +118,6 @@ static int get_msg(struct mixart_mgr *mgr, struct mixart_msg *resp,
 	writel_be(headptr, MIXART_MEM(mgr, MSG_OUTBOUND_FREE_HEAD));
 
  _clean_exit:
-	mutex_unlock(&mgr->msg_lock);
-
 	return err;
 }
 
@@ -258,7 +255,9 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int
 	resp.data = resp_data;
 	resp.size = max_resp_size;
 
+	mutex_lock(&mgr->msg_lock);
 	err = get_msg(mgr, &resp, msg_frame);
+	mutex_unlock(&mgr->msg_lock);
 
 	if( request->message_id != resp.message_id )
 		dev_err(&mgr->pci->dev, "RESPONSE ERROR!\n");
commit 883a790a84401f6f55992887fd7263d808d4d05d
Author: Dave Chinner <dchinner at redhat.com>
Date:   Thu Nov 19 08:59:11 2020 -0800

    xfs: don't allow NOWAIT DIO across extent boundaries
    
    Jens has reported a situation where partial direct IOs can be issued
    and completed yet still return -EAGAIN. We don't want this to report
    a short IO as we want XFS to complete user DIO entirely or not at
    all.
    
    This partial IO situation can occur on a write IO that is split
    across an allocated extent and a hole, and the second mapping is
    returning EAGAIN because allocation would be required.
    
    The trivial reproducer:
    
    $ sudo xfs_io -fdt -c "pwrite 0 4k" -c "pwrite -V 1 -b 8k -N 0 8k" /mnt/scr/foo
    wrote 4096/4096 bytes at offset 0
    4 KiB, 1 ops; 0.0001 sec (27.509 MiB/sec and 7042.2535 ops/sec)
    pwrite: Resource temporarily unavailable
    $
    
    The pwritev2(0, 8kB, RWF_NOWAIT) call returns EAGAIN having done
    the first 4kB write:
    
     xfs_file_direct_write: dev 259:1 ino 0x83 size 0x1000 offset 0x0 count 0x2000
     iomap_apply:          dev 259:1 ino 0x83 pos 0 length 8192 flags WRITE|DIRECT|NOWAIT (0x31) ops xfs_direct_write_iomap_ops caller iomap_dio_rw actor iomap_dio_actor
     xfs_ilock_nowait:     dev 259:1 ino 0x83 flags ILOCK_SHARED caller xfs_ilock_for_iomap
     xfs_iunlock:          dev 259:1 ino 0x83 flags ILOCK_SHARED caller xfs_direct_write_iomap_begin
     xfs_iomap_found:      dev 259:1 ino 0x83 size 0x1000 offset 0x0 count 8192 fork data startoff 0x0 startblock 24 blockcount 0x1
     iomap_apply_dstmap:   dev 259:1 ino 0x83 bdev 259:1 addr 102400 offset 0 length 4096 type MAPPED flags DIRTY
    
    Here the first iomap loop has mapped the first 4kB of the file and
    issued the IO, and we enter the second iomap_apply loop:
    
     iomap_apply: dev 259:1 ino 0x83 pos 4096 length 4096 flags WRITE|DIRECT|NOWAIT (0x31) ops xfs_direct_write_iomap_ops caller iomap_dio_rw actor iomap_dio_actor
     xfs_ilock_nowait:     dev 259:1 ino 0x83 flags ILOCK_SHARED caller xfs_ilock_for_iomap
     xfs_iunlock:          dev 259:1 ino 0x83 flags ILOCK_SHARED caller xfs_direct_write_iomap_begin
    
    And we exit with -EAGAIN out because we hit the allocate case trying
    to make the second 4kB block.
    
    Then IO completes on the first 4kB and the original IO context
    completes and unlocks the inode, returning -EAGAIN to userspace:
    
     xfs_end_io_direct_write: dev 259:1 ino 0x83 isize 0x1000 disize 0x1000 offset 0x0 count 4096
     xfs_iunlock:          dev 259:1 ino 0x83 flags IOLOCK_SHARED caller xfs_file_dio_aio_write
    
    There are other vectors to the same problem when we re-enter the
    mapping code if we have to make multiple mappinfs under NOWAIT
    conditions. e.g. failing trylocks, COW extents being found,
    allocation being required, and so on.
    
    Avoid all these potential problems by only allowing IOMAP_NOWAIT IO
    to go ahead if the mapping we retrieve for the IO spans an entire
    allocated extent. This avoids the possibility of subsequent mappings
    to complete the IO from triggering NOWAIT semantics by any means as
    NOWAIT IO will now only enter the mapping code once per NOWAIT IO.
    
    Reported-and-tested-by: Jens Axboe <axboe at kernel.dk>
    Signed-off-by: Dave Chinner <dchinner at redhat.com>
    Reviewed-by: Darrick J. Wong <darrick.wong at oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>

diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 3abb8b9d6f4c..7b9ff824e82d 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -706,6 +706,23 @@ relock:
 	return 0;
 }
 
+/*
+ * Check that the imap we are going to return to the caller spans the entire
+ * range that the caller requested for the IO.
+ */
+static bool
+imap_spans_range(
+	struct xfs_bmbt_irec	*imap,
+	xfs_fileoff_t		offset_fsb,
+	xfs_fileoff_t		end_fsb)
+{
+	if (imap->br_startoff > offset_fsb)
+		return false;
+	if (imap->br_startoff + imap->br_blockcount < end_fsb)
+		return false;
+	return true;
+}
+
 static int
 xfs_direct_write_iomap_begin(
 	struct inode		*inode,
@@ -766,6 +783,18 @@ xfs_direct_write_iomap_begin(
 	if (imap_needs_alloc(inode, flags, &imap, nimaps))
 		goto allocate_blocks;
 
+	/*
+	 * NOWAIT IO needs to span the entire requested IO with a single map so
+	 * that we avoid partial IO failures due to the rest of the IO range not
+	 * covered by this map triggering an EAGAIN condition when it is
+	 * subsequently mapped and aborting the IO.
+	 */
+	if ((flags & IOMAP_NOWAIT) &&
+	    !imap_spans_range(&imap, offset_fsb, end_fsb)) {
+		error = -EAGAIN;
+		goto out_unlock;
+	}
+
 	xfs_iunlock(ip, lockmode);
 	trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap);
 	return xfs_bmbt_to_iomap(ip, iomap, &imap, iomap_flags);
commit 1fd6cee127e2ddff36d648573d7566aafb0d0b77
Author: Jiri Olsa <jolsa at kernel.org>
Date:   Wed Nov 18 22:13:50 2020 +0100

    libbpf: Fix VERSIONED_SYM_COUNT number parsing
    
    We remove "other info" from "readelf -s --wide" output when
    parsing GLOBAL_SYM_COUNT variable, which was added in [1].
    But we don't do that for VERSIONED_SYM_COUNT and it's failing
    the check_abi target on powerpc Fedora 33.
    
    The extra "other info" wasn't problem for VERSIONED_SYM_COUNT
    parsing until commit [2] added awk in the pipe, which assumes
    that the last column is symbol, but it can be "other info".
    
    Adding "other info" removal for VERSIONED_SYM_COUNT the same
    way as we did for GLOBAL_SYM_COUNT parsing.
    
    [1] aa915931ac3e ("libbpf: Fix readelf output parsing for Fedora")
    [2] 746f534a4809 ("tools/libbpf: Avoid counting local symbols in ABI check")
    
    Fixes: 746f534a4809 ("tools/libbpf: Avoid counting local symbols in ABI check")
    Signed-off-by: Jiri Olsa <jolsa at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201118211350.1493421-1-jolsa@kernel.org

diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile
index 5f9abed3e226..55bd78b3496f 100644
--- a/tools/lib/bpf/Makefile
+++ b/tools/lib/bpf/Makefile
@@ -146,6 +146,7 @@ GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN_SHARED) | \
 			   awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
 			   sort -u | wc -l)
 VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
+			      sed 's/\[.*\]//' | \
 			      awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
 			      grep -Eo '[^ ]+ at LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
 
@@ -214,6 +215,7 @@ check_abi: $(OUTPUT)libbpf.so
 		    awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'|  \
 		    sort -u > $(OUTPUT)libbpf_global_syms.tmp;		 \
 		readelf --dyn-syms --wide $(OUTPUT)libbpf.so |		 \
+		    sed 's/\[.*\]//' |					 \
 		    awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'|  \
 		    grep -Eo '[^ ]+ at LIBBPF_' | cut -d@ -f1 |		 \
 		    sort -u > $(OUTPUT)libbpf_versioned_syms.tmp; 	 \
commit 45f703a0d4b87f940ea150367dc4f4a9c06fa868
Merge: 6f117cb854a4 8168d23fbcee
Author: Jens Axboe <axboe at kernel.dk>
Date:   Thu Nov 19 09:23:27 2020 -0700

    Merge tag 'nvme-5.10-2020-11-19' of git://git.infradead.org/nvme into block-5.10
    
    Pull NVMe fixes from Christoph:
    
    "nvme fixes for 5.10
    
     - Doorbell Buffer freeing fix (Minwoo Im)
     - CSE log leak fix (Keith Busch)"
    
    * tag 'nvme-5.10-2020-11-19' of git://git.infradead.org/nvme:
      nvme: fix memory leak freeing command effects
      nvme: directly cache command effects log
      nvme: free sq/cq dbbuf pointers when dbbuf set fails

commit b4c00e7976636f33a4f67eab436a11666c8afd60
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Sat Nov 14 22:20:56 2020 +0100

    HID: logitech-dj: Fix Dinovo Mini when paired with a MX5x00 receiver
    
    Some users are pairing the Dinovo keyboards with the MX5000 or MX5500
    receivers, instead of with the Dinovo receivers. The receivers are
    mostly the same (and the air protocol obviously is compatible) but
    currently the Dinovo receivers are handled by hid-lg.c while the
    MX5x00 receivers are handled by logitech-dj.c.
    
    When using a Dinovo keyboard, with its builtin touchpad, through
    logitech-dj.c then the touchpad stops working because when asking the
    receiver for paired devices, we get only 1 paired device with
    a device_type of REPORT_TYPE_KEYBOARD. And since we don't see a paired
    mouse, we have nowhere to send mouse-events to, so we drop them.
    
    Extend the existing fix for the Dinovo Edge for this to also cover the
    Dinovo Mini keyboard and also add a mapping to logitech-hidpp for the
    Media key on the Dinovo Mini, so that that keeps working too.
    
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1811424
    Fixes: f2113c3020ef ("HID: logitech-dj: add support for Logitech Bluetooth Mini-Receiver")
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>

diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index 19b9bca0f40a..1cbbcf607ee9 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -875,6 +875,7 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
  */
 static const u16 kbd_builtin_touchpad_ids[] = {
 	0xb309, /* Dinovo Edge */
+	0xb30c, /* Dinovo Mini */
 };
 
 static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 40b7c75b3384..0ca723119547 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -93,6 +93,8 @@ MODULE_PARM_DESC(disable_tap_to_click,
 #define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS	BIT(3)
 #define HIDPP_CAPABILITY_BATTERY_VOLTAGE	BIT(4)
 
+#define lg_map_key_clear(c)  hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
+
 /*
  * There are two hidpp protocols in use, the first version hidpp10 is known
  * as register access protocol or RAP, the second version hidpp20 is known as
@@ -2950,6 +2952,26 @@ static int g920_get_config(struct hidpp_device *hidpp,
 	return g920_ff_set_autocenter(hidpp, data);
 }
 
+/* -------------------------------------------------------------------------- */
+/* Logitech Dinovo Mini keyboard with builtin touchpad                        */
+/* -------------------------------------------------------------------------- */
+#define DINOVO_MINI_PRODUCT_ID		0xb30c
+
+static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+		struct hid_field *field, struct hid_usage *usage,
+		unsigned long **bit, int *max)
+{
+	if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
+		return 0;
+
+	switch (usage->hid & HID_USAGE) {
+	case 0x00d: lg_map_key_clear(KEY_MEDIA);	break;
+	default:
+		return 0;
+	}
+	return 1;
+}
+
 /* -------------------------------------------------------------------------- */
 /* HID++1.0 devices which use HID++ reports for their wheels                  */
 /* -------------------------------------------------------------------------- */
@@ -3185,6 +3207,9 @@ static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
 			field->application != HID_GD_MOUSE)
 		return m560_input_mapping(hdev, hi, field, usage, bit, max);
 
+	if (hdev->product == DINOVO_MINI_PRODUCT_ID)
+		return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
+
 	return 0;
 }
 
commit eec231e060fb79923c349f6e89f022b286f32c1e
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Sat Nov 14 10:45:31 2020 +0100

    HID: logitech-dj: Fix an error in mse_bluetooth_descriptor
    
    Fix an error in the mouse / INPUT(2) descriptor used for quad/bt2.0 combo
    receivers. Replace INPUT with INPUT (Data,Var,Abs) for the field for the
    4 extra buttons which share their report-byte with the low-res hwheel.
    
    This is likely a copy and paste error. I've verified that the new
    0x81, 0x02 value matches both the mouse descriptor for the currently
    supported MX5000 / MX5500 receivers, as well as the INPUT(2) mouse
    descriptors for the Dinovo receivers for which support is being
    worked on.
    
    Cc: stable at vger.kernel.org
    Fixes: f2113c3020ef ("HID: logitech-dj: add support for Logitech Bluetooth Mini-Receiver")
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>

diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index 1cafb65428b0..19b9bca0f40a 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -328,7 +328,7 @@ static const char mse_bluetooth_descriptor[] = {
 	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
 	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
 	0x95, 0x04,		/*      REPORT_COUNT (4)                */
-	0x81, 0x06,		/*      INPUT                           */
+	0x81, 0x02,		/*      INPUT (Data,Var,Abs)            */
 	0xC0,			/*    END_COLLECTION                    */
 	0xC0,			/*  END_COLLECTION                      */
 };
commit 9fa1d7e60ad5ad2f7859ea8912d7b0b57821a5b7
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Oct 29 14:40:17 2020 +0100

    drm/vc4: hdmi: Disable Wifi Frequencies
    
    There's cross-talk on the RPi4 between the 2.4GHz channels used by the WiFi
    chip and some resolutions, most notably 1440p at 60Hz.
    
    In such a case, we can either reject entirely the mode, or lower slightly
    the pixel frequency to remove the overlap. Let's go for the latter.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201029134018.1948636-2-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 4689a7338ac5..afc178b0d89f 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -760,6 +760,9 @@ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
 {
 }
 
+#define WIFI_2_4GHz_CH1_MIN_FREQ	2400000000ULL
+#define WIFI_2_4GHz_CH1_MAX_FREQ	2422000000ULL
+
 static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
 					 struct drm_crtc_state *crtc_state,
 					 struct drm_connector_state *conn_state)
@@ -767,12 +770,27 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
 	struct drm_display_mode *mode = &crtc_state->adjusted_mode;
 	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
 	unsigned long long pixel_rate = mode->clock * 1000;
+	unsigned long long tmds_rate;
 
 	if (vc4_hdmi->variant->unsupported_odd_h_timings &&
 	    ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
 	     (mode->hsync_end % 2) || (mode->htotal % 2)))
 		return -EINVAL;
 
+	/*
+	 * The 1440p at 60 pixel rate is in the same range than the first
+	 * WiFi channel (between 2.4GHz and 2.422GHz with 22MHz
+	 * bandwidth). Slightly lower the frequency to bring it out of
+	 * the WiFi range.
+	 */
+	tmds_rate = pixel_rate * 10;
+	if (vc4_hdmi->disable_wifi_frequencies &&
+	    (tmds_rate >= WIFI_2_4GHz_CH1_MIN_FREQ &&
+	     tmds_rate <= WIFI_2_4GHz_CH1_MAX_FREQ)) {
+		mode->clock = 238560;
+		pixel_rate = mode->clock * 1000;
+	}
+
 	if (pixel_rate > vc4_hdmi->variant->max_pixel_clock)
 		return -EINVAL;
 
@@ -1719,6 +1737,9 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
 		vc4_hdmi->hpd_active_low = hpd_gpio_flags & OF_GPIO_ACTIVE_LOW;
 	}
 
+	vc4_hdmi->disable_wifi_frequencies =
+		of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence");
+
 	pm_runtime_enable(dev);
 
 	drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h
index 6815e93b1a48..0526a9cf608a 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
@@ -142,6 +142,14 @@ struct vc4_hdmi {
 	int hpd_gpio;
 	bool hpd_active_low;
 
+	/*
+	 * On some systems (like the RPi4), some modes are in the same
+	 * frequency range than the WiFi channels (1440p at 60Hz for
+	 * example). Should we take evasive actions because that system
+	 * has a wifi adapter?
+	 */
+	bool disable_wifi_frequencies;
+
 	struct cec_adapter *cec_adap;
 	struct cec_msg cec_rx_msg;
 	bool cec_tx_ok;
commit 8d15aa4ed02bed2f5b0720480ab8eb032dc0887e
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Oct 29 14:40:16 2020 +0100

    dt-bindings: display: Add a property to deal with WiFi coexistence
    
    The RaspberryPi4 has both a WiFi chip and HDMI outputs capable of doing
    4k. Unfortunately, the 1440p resolution at 60Hz has a TMDS rate on the
    HDMI cable right in the middle of the first Wifi channel.
    
    Add a property to our HDMI controller, that could be reused by other
    similar HDMI controllers, to allow the OS to take whatever measure is
    necessary to avoid that crosstalk.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Nicolas Saenz Julienne <nsaenzjulienne at suse.de>
    Reviewed-by: Rob Herring <robh at kernel.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201029134018.1948636-1-maxime@cerno.tech

diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
index 03a76729d26c..7ce06f9f9f8e 100644
--- a/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
+++ b/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
@@ -76,6 +76,12 @@ properties:
   resets:
     maxItems: 1
 
+  wifi-2.4ghz-coexistence:
+    type: boolean
+    description: >
+      Should the pixel frequencies in the WiFi frequencies range be
+      avoided?
+
 required:
   - compatible
   - reg
commit 600c0849cf86b75d86352f59745226273290986a
Author: Mika Westerberg <mika.westerberg at linux.intel.com>
Date:   Wed Nov 18 13:08:21 2020 +0200

    thunderbolt: Fix use-after-free in remove_unplugged_switch()
    
    Paulian reported a crash that happens when a dock is unplugged during
    hibernation:
    
    [78436.228217] thunderbolt 0-1: device disconnected
    [78436.228365] BUG: kernel NULL pointer dereference, address: 00000000000001e0
    ...
    [78436.228397] RIP: 0010:icm_free_unplugged_children+0x109/0x1a0
    ...
    [78436.228432] Call Trace:
    [78436.228439]  icm_rescan_work+0x24/0x30
    [78436.228444]  process_one_work+0x1a3/0x3a0
    [78436.228449]  worker_thread+0x30/0x370
    [78436.228454]  ? process_one_work+0x3a0/0x3a0
    [78436.228457]  kthread+0x13d/0x160
    [78436.228461]  ? kthread_park+0x90/0x90
    [78436.228465]  ret_from_fork+0x1f/0x30
    
    This happens because remove_unplugged_switch() calls tb_switch_remove()
    that releases the memory pointed by sw so the following lines reference
    to a memory that might be released already.
    
    Fix this by saving pointer to the parent device before calling
    tb_switch_remove().
    
    Reported-by: Paulian Bogdan Marinca <paulian at marinca.net>
    Fixes: 4f7c2e0d8765 ("thunderbolt: Make sure device runtime resume completes before taking domain lock")
    Cc: stable at vger.kernel.org
    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
    Reviewed-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
index 977ba91f4d0e..82c46b200c34 100644
--- a/drivers/thunderbolt/icm.c
+++ b/drivers/thunderbolt/icm.c
@@ -1976,7 +1976,9 @@ static int complete_rpm(struct device *dev, void *data)
 
 static void remove_unplugged_switch(struct tb_switch *sw)
 {
-	pm_runtime_get_sync(sw->dev.parent);
+	struct device *parent = get_device(sw->dev.parent);
+
+	pm_runtime_get_sync(parent);
 
 	/*
 	 * Signal this and switches below for rpm_complete because
@@ -1987,8 +1989,10 @@ static void remove_unplugged_switch(struct tb_switch *sw)
 	bus_for_each_dev(&tb_bus_type, &sw->dev, NULL, complete_rpm);
 	tb_switch_remove(sw);
 
-	pm_runtime_mark_last_busy(sw->dev.parent);
-	pm_runtime_put_autosuspend(sw->dev.parent);
+	pm_runtime_mark_last_busy(parent);
+	pm_runtime_put_autosuspend(parent);
+
+	put_device(parent);
 }
 
 static void icm_free_unplugged_children(struct tb_switch *sw)
commit 01cf158e48d2b5ce947430de5896c10f4f7c1822
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Thu Nov 19 15:07:19 2020 +0100

    Revert "iommu/vt-d: Take CONFIG_PCI_ATS into account"
    
    This reverts commit 8986f223bd777a73119f5d593c15b4d630ff49bb.
    
    The proper fix is queued in Will's tree now
    
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index bc9f4cf72240..b2e804473209 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -335,9 +335,7 @@ static void  dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
 
 static inline void vf_inherit_msi_domain(struct pci_dev *pdev)
 {
-#ifdef CONFIG_PCI_ATS
 	dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&pdev->physfn->dev));
-#endif
 }
 
 static int dmar_pci_bus_notifier(struct notifier_block *nb,
commit fbc6e1c6e0a4b5ef402f9eb8d00880a5e1d98df3
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Nov 19 14:53:49 2020 +0900

    docs: bootconfig: Update file format on initrd image
    
    To align the total file size, add padding null character when appending
    the bootconfig to initrd image.
    
    Link: https://lkml.kernel.org/r/160576522916.320071.4145530996151028855.stgit@devnote2
    
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin-guide/bootconfig.rst
index a22024f9175e..363599683784 100644
--- a/Documentation/admin-guide/bootconfig.rst
+++ b/Documentation/admin-guide/bootconfig.rst
@@ -137,15 +137,22 @@ Boot Kernel With a Boot Config
 ==============================
 
 Since the boot configuration file is loaded with initrd, it will be added
-to the end of the initrd (initramfs) image file with size, checksum and
-12-byte magic word as below.
+to the end of the initrd (initramfs) image file with padding, size,
+checksum and 12-byte magic word as below.
 
-[initrd][bootconfig][size(u32)][checksum(u32)][#BOOTCONFIG\n]
+[initrd][bootconfig][padding][size(u32)][checksum(u32)][#BOOTCONFIG\n]
+
+When the boot configuration is added to the initrd image, the total
+file size is aligned to 4 bytes. To fill the gap, null characters
+(``\0``) will be added. Thus the ``size`` is the length of the bootconfig
+file + padding bytes.
 
 The Linux kernel decodes the last part of the initrd image in memory to
 get the boot configuration data.
 Because of this "piggyback" method, there is no need to change or
-update the boot loader and the kernel image itself.
+update the boot loader and the kernel image itself as long as the boot
+loader passes the correct initrd file size. If by any chance, the boot
+loader passes a longer size, the kernel feils to find the bootconfig data.
 
 To do this operation, Linux kernel provides "bootconfig" command under
 tools/bootconfig, which allows admin to apply or delete the config file
@@ -176,7 +183,8 @@ up to 512 key-value pairs. If keys contains 3 words in average, it can
 contain 256 key-value pairs. In most cases, the number of config items
 will be under 100 entries and smaller than 8KB, so it would be enough.
 If the node number exceeds 1024, parser returns an error even if the file
-size is smaller than 32KB.
+size is smaller than 32KB. (Note that this maximum size is not including
+the padding null characters.)
 Anyway, since bootconfig command verifies it when appending a boot config
 to initrd image, user can notice it before boot.
 
commit e1cef2d4c379b2aab43a7dc9601f645048209090
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Nov 19 14:53:40 2020 +0900

    tools/bootconfig: Align the bootconfig applied initrd image size to 4
    
    Align the bootconfig applied initrd image size to 4. To fill the gap,
    the bootconfig command uses null characters in between the bootconfig
    data and the footer. This will expands the footer size but don't change
    the checksum.
    Thus the block image of the initrd file with bootconfig is as follows.
    
    [initrd][bootconfig][(pad)][size][csum]["#BOOTCONFIG\n"]
    
    Link: https://lkml.kernel.org/r/160576522046.320071.8550680670010950634.stgit@devnote2
    
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h
index 9903088891fa..2696eb0fc149 100644
--- a/include/linux/bootconfig.h
+++ b/include/linux/bootconfig.h
@@ -12,6 +12,9 @@
 
 #define BOOTCONFIG_MAGIC	"#BOOTCONFIG\n"
 #define BOOTCONFIG_MAGIC_LEN	12
+#define BOOTCONFIG_ALIGN_SHIFT	2
+#define BOOTCONFIG_ALIGN	(1 << BOOTCONFIG_ALIGN_SHIFT)
+#define BOOTCONFIG_ALIGN_MASK	(BOOTCONFIG_ALIGN - 1)
 
 /* XBC tree node */
 struct xbc_node {
diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index a0733cbb3c49..4a445b6304bb 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -337,12 +337,13 @@ static int delete_xbc(const char *path)
 
 static int apply_xbc(const char *path, const char *xbc_path)
 {
+	char *buf, *data, *p;
+	size_t total_size;
 	struct stat stat;
+	const char *msg;
 	u32 size, csum;
-	char *buf, *data;
+	int pos, pad;
 	int ret, fd;
-	const char *msg;
-	int pos;
 
 	ret = load_xbc_file(xbc_path, &buf);
 	if (ret < 0) {
@@ -352,13 +353,12 @@ static int apply_xbc(const char *path, const char *xbc_path)
 	size = strlen(buf) + 1;
 	csum = checksum((unsigned char *)buf, size);
 
-	/* Prepare xbc_path data */
-	data = malloc(size + 8);
+	/* Backup the bootconfig data */
+	data = calloc(size + BOOTCONFIG_ALIGN +
+		      sizeof(u32) + sizeof(u32) + BOOTCONFIG_MAGIC_LEN, 1);
 	if (!data)
 		return -ENOMEM;
-	strcpy(data, buf);
-	*(u32 *)(data + size) = size;
-	*(u32 *)(data + size + 4) = csum;
+	memcpy(data, buf, size);
 
 	/* Check the data format */
 	ret = xbc_init(buf, &msg, &pos);
@@ -399,24 +399,35 @@ static int apply_xbc(const char *path, const char *xbc_path)
 		pr_err("Failed to get the size of %s\n", path);
 		goto out;
 	}
-	ret = write(fd, data, size + 8);
-	if (ret < size + 8) {
+
+	/* To align up the total size to BOOTCONFIG_ALIGN, get padding size */
+	total_size = stat.st_size + size + sizeof(u32) * 2 + BOOTCONFIG_MAGIC_LEN;
+	pad = ((total_size + BOOTCONFIG_ALIGN - 1) & (~BOOTCONFIG_ALIGN_MASK)) - total_size;
+	size += pad;
+
+	/* Add a footer */
+	p = data + size;
+	*(u32 *)p = size;
+	p += sizeof(u32);
+
+	*(u32 *)p = csum;
+	p += sizeof(u32);
+
+	memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
+	p += BOOTCONFIG_MAGIC_LEN;
+
+	total_size = p - data;
+
+	ret = write(fd, data, total_size);
+	if (ret < total_size) {
 		if (ret < 0)
 			ret = -errno;
 		pr_err("Failed to apply a boot config: %d\n", ret);
-		if (ret < 0)
-			goto out;
-		goto out_rollback;
-	}
-	/* Write a magic word of the bootconfig */
-	ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
-	if (ret < BOOTCONFIG_MAGIC_LEN) {
-		if (ret < 0)
-			ret = -errno;
-		pr_err("Failed to apply a boot config magic: %d\n", ret);
-		goto out_rollback;
-	}
-	ret = 0;
+		if (ret >= 0)
+			goto out_rollback;
+	} else
+		ret = 0;
+
 out:
 	close(fd);
 	free(data);
diff --git a/tools/bootconfig/test-bootconfig.sh b/tools/bootconfig/test-bootconfig.sh
index d295e406a756..baed891d0ba4 100755
--- a/tools/bootconfig/test-bootconfig.sh
+++ b/tools/bootconfig/test-bootconfig.sh
@@ -9,6 +9,7 @@ else
   TESTDIR=.
 fi
 BOOTCONF=${TESTDIR}/bootconfig
+ALIGN=4
 
 INITRD=`mktemp ${TESTDIR}/initrd-XXXX`
 TEMPCONF=`mktemp ${TESTDIR}/temp-XXXX.bconf`
@@ -59,7 +60,10 @@ echo "Show command test"
 xpass $BOOTCONF $INITRD
 
 echo "File size check"
-xpass test $new_size -eq $(expr $bconf_size + $initrd_size + 9 + 12)
+total_size=$(expr $bconf_size + $initrd_size + 9 + 12 + $ALIGN - 1 )
+total_size=$(expr $total_size / $ALIGN)
+total_size=$(expr $total_size \* $ALIGN)
+xpass test $new_size -eq $total_size
 
 echo "Apply command repeat test"
 xpass $BOOTCONF -a $TEMPCONF $INITRD
commit a995e6bc0524450adfd6181dfdcd9d0520cfaba5
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Nov 19 14:53:31 2020 +0900

    tools/bootconfig: Fix to check the write failure correctly
    
    Fix to check the write(2) failure including partial write
    correctly and try to rollback the partial write, because
    if there is no BOOTCONFIG_MAGIC string, we can not remove it.
    
    Link: https://lkml.kernel.org/r/160576521135.320071.3883101436675969998.stgit@devnote2
    
    Fixes: 85c46b78da58 ("bootconfig: Add bootconfig magic word for indicating bootconfig explicitly")
    Suggested-by: Linus Torvalds <torvalds at linux-foundation.org>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index 52eb2bbe8966..a0733cbb3c49 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -337,6 +337,7 @@ static int delete_xbc(const char *path)
 
 static int apply_xbc(const char *path, const char *xbc_path)
 {
+	struct stat stat;
 	u32 size, csum;
 	char *buf, *data;
 	int ret, fd;
@@ -394,16 +395,26 @@ static int apply_xbc(const char *path, const char *xbc_path)
 		return ret;
 	}
 	/* TODO: Ensure the @path is initramfs/initrd image */
+	if (fstat(fd, &stat) < 0) {
+		pr_err("Failed to get the size of %s\n", path);
+		goto out;
+	}
 	ret = write(fd, data, size + 8);
-	if (ret < 0) {
+	if (ret < size + 8) {
+		if (ret < 0)
+			ret = -errno;
 		pr_err("Failed to apply a boot config: %d\n", ret);
-		goto out;
+		if (ret < 0)
+			goto out;
+		goto out_rollback;
 	}
 	/* Write a magic word of the bootconfig */
 	ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
-	if (ret < 0) {
+	if (ret < BOOTCONFIG_MAGIC_LEN) {
+		if (ret < 0)
+			ret = -errno;
 		pr_err("Failed to apply a boot config magic: %d\n", ret);
-		goto out;
+		goto out_rollback;
 	}
 	ret = 0;
 out:
@@ -411,6 +422,17 @@ out:
 	free(data);
 
 	return ret;
+
+out_rollback:
+	/* Map the partial write to -ENOSPC */
+	if (ret >= 0)
+		ret = -ENOSPC;
+	if (ftruncate(fd, stat.st_size) < 0) {
+		ret = -errno;
+		pr_err("Failed to rollback the write error: %d\n", ret);
+		pr_err("The initrd %s may be corrupted. Recommend to rebuild.\n", path);
+	}
+	goto out;
 }
 
 static int usage(void)
commit a61ea6379ae9dbb63fbf022d1456733520db6be7
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Thu Nov 19 14:53:22 2020 +0900

    tools/bootconfig: Fix errno reference after printf()
    
    Fix not to refer the errno variable as the result of previous libc
    functions after printf() because printf() can change the errno.
    
    Link: https://lkml.kernel.org/r/160576520243.320071.51093664672431249.stgit@devnote2
    
    Fixes: 85c46b78da58 ("bootconfig: Add bootconfig magic word for indicating bootconfig explicitly")
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index eb92027817a7..52eb2bbe8966 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -147,6 +147,12 @@ static int load_xbc_file(const char *path, char **buf)
 	return ret;
 }
 
+static int pr_errno(const char *msg, int err)
+{
+	pr_err("%s: %d\n", msg, err);
+	return err;
+}
+
 static int load_xbc_from_initrd(int fd, char **buf)
 {
 	struct stat stat;
@@ -162,26 +168,24 @@ static int load_xbc_from_initrd(int fd, char **buf)
 	if (stat.st_size < 8 + BOOTCONFIG_MAGIC_LEN)
 		return 0;
 
-	if (lseek(fd, -BOOTCONFIG_MAGIC_LEN, SEEK_END) < 0) {
-		pr_err("Failed to lseek: %d\n", -errno);
-		return -errno;
-	}
+	if (lseek(fd, -BOOTCONFIG_MAGIC_LEN, SEEK_END) < 0)
+		return pr_errno("Failed to lseek for magic", -errno);
+
 	if (read(fd, magic, BOOTCONFIG_MAGIC_LEN) < 0)
-		return -errno;
+		return pr_errno("Failed to read", -errno);
+
 	/* Check the bootconfig magic bytes */
 	if (memcmp(magic, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN) != 0)
 		return 0;
 
-	if (lseek(fd, -(8 + BOOTCONFIG_MAGIC_LEN), SEEK_END) < 0) {
-		pr_err("Failed to lseek: %d\n", -errno);
-		return -errno;
-	}
+	if (lseek(fd, -(8 + BOOTCONFIG_MAGIC_LEN), SEEK_END) < 0)
+		return pr_errno("Failed to lseek for size", -errno);
 
 	if (read(fd, &size, sizeof(u32)) < 0)
-		return -errno;
+		return pr_errno("Failed to read size", -errno);
 
 	if (read(fd, &csum, sizeof(u32)) < 0)
-		return -errno;
+		return pr_errno("Failed to read checksum", -errno);
 
 	/* Wrong size error  */
 	if (stat.st_size < size + 8 + BOOTCONFIG_MAGIC_LEN) {
@@ -190,10 +194,8 @@ static int load_xbc_from_initrd(int fd, char **buf)
 	}
 
 	if (lseek(fd, stat.st_size - (size + 8 + BOOTCONFIG_MAGIC_LEN),
-		  SEEK_SET) < 0) {
-		pr_err("Failed to lseek: %d\n", -errno);
-		return -errno;
-	}
+		  SEEK_SET) < 0)
+		return pr_errno("Failed to lseek", -errno);
 
 	ret = load_xbc_fd(fd, buf, size);
 	if (ret < 0)
@@ -262,14 +264,16 @@ static int show_xbc(const char *path, bool list)
 
 	ret = stat(path, &st);
 	if (ret < 0) {
-		pr_err("Failed to stat %s: %d\n", path, -errno);
-		return -errno;
+		ret = -errno;
+		pr_err("Failed to stat %s: %d\n", path, ret);
+		return ret;
 	}
 
 	fd = open(path, O_RDONLY);
 	if (fd < 0) {
-		pr_err("Failed to open initrd %s: %d\n", path, fd);
-		return -errno;
+		ret = -errno;
+		pr_err("Failed to open initrd %s: %d\n", path, ret);
+		return ret;
 	}
 
 	ret = load_xbc_from_initrd(fd, &buf);
@@ -307,8 +311,9 @@ static int delete_xbc(const char *path)
 
 	fd = open(path, O_RDWR);
 	if (fd < 0) {
-		pr_err("Failed to open initrd %s: %d\n", path, fd);
-		return -errno;
+		ret = -errno;
+		pr_err("Failed to open initrd %s: %d\n", path, ret);
+		return ret;
 	}
 
 	size = load_xbc_from_initrd(fd, &buf);
@@ -383,9 +388,10 @@ static int apply_xbc(const char *path, const char *xbc_path)
 	/* Apply new one */
 	fd = open(path, O_RDWR | O_APPEND);
 	if (fd < 0) {
-		pr_err("Failed to open %s: %d\n", path, fd);
+		ret = -errno;
+		pr_err("Failed to open %s: %d\n", path, ret);
 		free(data);
-		return fd;
+		return ret;
 	}
 	/* TODO: Ensure the @path is initramfs/initrd image */
 	ret = write(fd, data, size + 8);
commit b5dbc4d36885bef6257054a737a76101d293b185
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Nov 5 14:56:54 2020 +0100

    drm/vc4: kms: Document the muxing corner cases
    
    We've had a number of muxing corner-cases with specific ways to reproduce
    them, so let's document them to make sure they aren't lost and introduce
    regressions later on.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Acked-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105135656.383350-6-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index bb2efc5d2d01..0f44fc526fd2 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -662,6 +662,28 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
 }
 
+/*
+ * The BCM2711 HVS has up to 7 outputs connected to the pixelvalves and
+ * the TXP (and therefore all the CRTCs found on that platform).
+ *
+ * The naive (and our initial) implementation would just iterate over
+ * all the active CRTCs, try to find a suitable FIFO, and then remove it
+ * from the pool of available FIFOs. However, there are a few corner
+ * cases that need to be considered:
+ *
+ * - When running in a dual-display setup (so with two CRTCs involved),
+ *   we can update the state of a single CRTC (for example by changing
+ *   its mode using xrandr under X11) without affecting the other. In
+ *   this case, the other CRTC wouldn't be in the state at all, so we
+ *   need to consider all the running CRTCs in the DRM device to assign
+ *   a FIFO, not just the one in the state.
+ *
+ * - Since we need the pixelvalve to be disabled and enabled back when
+ *   the FIFO is changed, we should keep the FIFO assigned for as long
+ *   as the CRTC is enabled, only considering it free again once that
+ *   CRTC has been disabled. This can be tested by booting X11 on a
+ *   single display, and changing the resolution down and then back up.
+ */
 static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
 				      struct drm_atomic_state *state)
 {
commit a72b0458cd5123b40dd5084f6e536af63aeacda1
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Nov 5 14:56:53 2020 +0100

    drm/vc4: kms: Split the HVS muxing check in a separate function
    
    The code that assigns HVS channels during atomic_check is starting to grow
    a bit big, let's move it into a separate function.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105135656.383350-5-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index ad69c70f66a2..bb2efc5d2d01 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -662,13 +662,13 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
 }
 
-static int
-vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
+static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
+				      struct drm_atomic_state *state)
 {
 	unsigned long unassigned_channels = GENMASK(HVS_NUM_CHANNELS - 1, 0);
 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 	struct drm_crtc *crtc;
-	int i, ret;
+	unsigned int i;
 
 	/*
 	 * Since the HVS FIFOs are shared across all the pixelvalves and
@@ -741,6 +741,18 @@ vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
 		}
 	}
 
+	return 0;
+}
+
+static int
+vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
+{
+	int ret;
+
+	ret = vc4_pv_muxing_atomic_check(dev, state);
+	if (ret)
+		return ret;
+
 	ret = vc4_ctm_atomic_check(dev, state);
 	if (ret < 0)
 		return ret;
commit a9661f27dc6bfbb6869b07cf68f9c2fd05167746
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Nov 5 14:56:52 2020 +0100

    drm/vc4: kms: Rename NUM_CHANNELS
    
    The NUM_CHANNELS define has a pretty generic name and was right before the
    function using it. Let's move to something that makes the hardware-specific
    nature more obvious, and to a more appropriate place.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105135656.383350-4-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 4b558ccb18fe..ad69c70f66a2 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -24,6 +24,8 @@
 #include "vc4_drv.h"
 #include "vc4_regs.h"
 
+#define HVS_NUM_CHANNELS 3
+
 struct vc4_ctm_state {
 	struct drm_private_state base;
 	struct drm_color_ctm *ctm;
@@ -660,12 +662,10 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
 }
 
-#define NUM_CHANNELS 3
-
 static int
 vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
 {
-	unsigned long unassigned_channels = GENMASK(NUM_CHANNELS - 1, 0);
+	unsigned long unassigned_channels = GENMASK(HVS_NUM_CHANNELS - 1, 0);
 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 	struct drm_crtc *crtc;
 	int i, ret;
commit 213189dbe7a1d7b1032aca4eacb0348a3ed67823
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Nov 5 14:56:51 2020 +0100

    drm/vc4: kms: Remove useless define
    
    NUM_OUTPUTS isn't used anymore, let's remove it.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Hoegeun Kwon <hoegeun.kwon at samsung.com>
    Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105135656.383350-3-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 44db31e16e91..4b558ccb18fe 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -660,7 +660,6 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
 }
 
-#define NUM_OUTPUTS  6
 #define NUM_CHANNELS 3
 
 static int
commit 3c354ed1c43dabbdaae8569f982cdcccfdecd6a8
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Nov 5 14:56:50 2020 +0100

    drm/vc4: kms: Switch to drmm_add_action_or_reset
    
    Even though it was pointed in the review by Daniel, and I thought to have
    fixed it while applying the patches, but it turns out I forgot to commit
    the fixes in the process. Properly fix it this time.
    
    Fixes: dcda7c28bff2 ("drm/vc4: kms: Add functions to create the state objects")
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105135656.383350-2-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 2b951cae04ad..44db31e16e91 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -113,7 +113,7 @@ static int vc4_ctm_obj_init(struct vc4_dev *vc4)
 	drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager, &ctm_state->base,
 				    &vc4_ctm_state_funcs);
 
-	return drmm_add_action(&vc4->base, vc4_ctm_obj_fini, NULL);
+	return drmm_add_action_or_reset(&vc4->base, vc4_ctm_obj_fini, NULL);
 }
 
 /* Converts a DRM S31.32 value to the HW S0.9 format. */
@@ -657,7 +657,7 @@ static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
 				    &load_state->base,
 				    &vc4_load_tracker_state_funcs);
 
-	return drmm_add_action(&vc4->base, vc4_load_tracker_obj_fini, NULL);
+	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
 }
 
 #define NUM_OUTPUTS  6
commit 57fb32e632be4d406b4594829e3befdae1100c12
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Oct 29 13:25:22 2020 +0100

    drm/vc4: hdmi: Block odd horizontal timings
    
    The FIFO between the pixelvalve and the HDMI controller runs at 2 pixels
    per clock cycle, and cannot deal with odd timings.
    
    Let's reject any mode with such timings.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201029122522.1917579-2-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 600dd6d40309..4689a7338ac5 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -768,6 +768,11 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
 	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
 	unsigned long long pixel_rate = mode->clock * 1000;
 
+	if (vc4_hdmi->variant->unsupported_odd_h_timings &&
+	    ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
+	     (mode->hsync_end % 2) || (mode->htotal % 2)))
+		return -EINVAL;
+
 	if (pixel_rate > vc4_hdmi->variant->max_pixel_clock)
 		return -EINVAL;
 
@@ -780,6 +785,11 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
 {
 	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
 
+	if (vc4_hdmi->variant->unsupported_odd_h_timings &&
+	    ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
+	     (mode->hsync_end % 2) || (mode->htotal % 2)))
+		return MODE_H_ILLEGAL;
+
 	if ((mode->clock * 1000) > vc4_hdmi->variant->max_pixel_clock)
 		return MODE_CLOCK_HIGH;
 
@@ -1832,6 +1842,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = {
 		PHY_LANE_2,
 		PHY_LANE_CK,
 	},
+	.unsupported_odd_h_timings	= true,
 
 	.init_resources		= vc5_hdmi_init_resources,
 	.csc_setup		= vc5_hdmi_csc_setup,
@@ -1857,6 +1868,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
 		PHY_LANE_CK,
 		PHY_LANE_2,
 	},
+	.unsupported_odd_h_timings	= true,
 
 	.init_resources		= vc5_hdmi_init_resources,
 	.csc_setup		= vc5_hdmi_csc_setup,
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h
index 63c6f8bddf1d..6815e93b1a48 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
@@ -62,6 +62,9 @@ struct vc4_hdmi_variant {
 	 */
 	enum vc4_hdmi_phy_channel phy_lane_mapping[4];
 
+	/* The BCM2711 cannot deal with odd horizontal pixel timings */
+	bool unsupported_odd_h_timings;
+
 	/* Callback to get the resources (memory region, interrupts,
 	 * clocks, etc) for that variant.
 	 */
commit 63495f6b4aede26e6f8fe3da69e5cfdd8a4ccc3b
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Oct 29 13:25:21 2020 +0100

    drm/vc4: hdmi: Make sure our clock rate is within limits
    
    The HDMI controller cannot go above a certain pixel rate limit depending on
    the generations, but that limit is only enforced in mode_valid at the
    moment, which means that we won't advertise modes that exceed that limit,
    but the userspace is still free to try to setup a mode that would.
    
    Implement atomic_check to make sure we check it in that scenario too.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201029122522.1917579-1-maxime@cerno.tech

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 95779d50cca0..600dd6d40309 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -760,6 +760,20 @@ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
 {
 }
 
+static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
+					 struct drm_crtc_state *crtc_state,
+					 struct drm_connector_state *conn_state)
+{
+	struct drm_display_mode *mode = &crtc_state->adjusted_mode;
+	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
+	unsigned long long pixel_rate = mode->clock * 1000;
+
+	if (pixel_rate > vc4_hdmi->variant->max_pixel_clock)
+		return -EINVAL;
+
+	return 0;
+}
+
 static enum drm_mode_status
 vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
 			    const struct drm_display_mode *mode)
@@ -773,6 +787,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
 }
 
 static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = {
+	.atomic_check = vc4_hdmi_encoder_atomic_check,
 	.mode_valid = vc4_hdmi_encoder_mode_valid,
 	.disable = vc4_hdmi_encoder_disable,
 	.enable = vc4_hdmi_encoder_enable,
commit de15e20f50b126b3a5a753dd259df775e6a0ea5c
Merge: 4fba15fbb810 7dc7a8b04f3d
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Thu Nov 19 14:03:52 2020 +0100

    Merge branch 'acpi-fan'
    
    * acpi-fan:
      ACPI: fan: Initialize performance state sysfs attribute

commit 3a8ac4d39651c71d6d2f3376b13d0bad1484249a
Merge: 14c620cf2ee8 c39de538a06e
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Thu Nov 19 14:02:18 2020 +0100

    Merge branch 'pm-cpuidle'
    
    * pm-cpuidle:
      cpuidle: tegra: Annotate tegra_pm_set_cpu_in_lp2() with RCU_NONIDLE

commit fbdae7d6d04d2db36c687723920f612e93b2cbda
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Wed Nov 18 13:15:15 2020 +0100

    ASoC: Intel: bytcr_rt5640: Fix HP Pavilion x2 Detachable quirks
    
    The HP Pavilion x2 Detachable line comes in many variants:
    
    1. Bay Trail SoC + AXP288 PMIC, Micro-USB charging (10-k010nz, ...)
       DMI_SYS_VENDOR: "Hewlett-Packard"
       DMI_PRODUCT_NAME: "HP Pavilion x2 Detachable PC 10"
       DMI_BOARD_NAME: "8021"
    
    2. Bay Trail SoC + AXP288 PMIC, Type-C charging (10-n000nd, 10-n010nl, ...)
       DMI_SYS_VENDOR: "Hewlett-Packard"
       DMI_PRODUCT_NAME: "HP Pavilion x2 Detachable"
       DMI_BOARD_NAME: "815D"
    
    3. Cherry Trail SoC + AXP288 PMIC, Type-C charging (10-n101ng, ...)
       DMI_SYS_VENDOR: "HP"
       DMI_PRODUCT_NAME: "HP Pavilion x2 Detachable"
       DMI_BOARD_NAME: "813E"
    
    4. Cherry Trail SoC + TI PMIC, Type-C charging (10-p002nd, 10-p018wm, ...)
       DMI_SYS_VENDOR: "HP"
       DMI_PRODUCT_NAME: "HP x2 Detachable 10-p0XX"
       DMI_BOARD_NAME: "827C"
    
    5. Cherry Trail SoC + TI PMIC, Type-C charging (x2-210-g2, ...)
       DMI_SYS_VENDOR: "HP"
       DMI_PRODUCT_NAME: "HP x2 210 G2"
       DMI_BOARD_NAME: "82F4"
    
    Variant 1 needs the exact same quirk as variant 2, so relax the DMI check
    for the existing quirk a bit so that it matches both variant 1 and 2
    (note the other variants will still not match).
    
    Variant 2 already has an existing quirk (which now also matches variant 1)
    
    Variant 3 uses a cx2072x codec, so is not applicable here.
    
    Variant 4 almost works with the defaults, but it also needs a quirk to
    fix jack-detection, add a new quirk for this.
    
    Variant 5 does use a RT5640 codec (based on old dmesg output), but was
    otherwise not tested, keep using the defaults for this variant.
    
    Fixes: ec8e8418ff7d ("ASoC: Intel: bytcr_rt5640: Add quirks for various devices")
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Acked-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
    Link: https://lore.kernel.org/r/20201118121515.11441-1-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 9dadf6561444..f790514a147d 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -520,10 +520,10 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
 		.driver_data = (void *)(BYT_RT5640_IN1_MAP |
 					BYT_RT5640_MCLK_EN),
 	},
-	{	/* HP Pavilion x2 10-n000nd */
+	{	/* HP Pavilion x2 10-k0XX, 10-n0XX */
 		.matches = {
-			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"),
+			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"),
 		},
 		.driver_data = (void *)(BYT_RT5640_DMIC1_MAP |
 					BYT_RT5640_JD_SRC_JD2_IN4N |
@@ -532,6 +532,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
 					BYT_RT5640_SSP0_AIF1 |
 					BYT_RT5640_MCLK_EN),
 	},
+	{	/* HP Pavilion x2 10-p0XX */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"),
+		},
+		.driver_data = (void *)(BYT_RT5640_DMIC1_MAP |
+					BYT_RT5640_JD_SRC_JD1_IN4P |
+					BYT_RT5640_OVCD_TH_1500UA |
+					BYT_RT5640_OVCD_SF_0P75 |
+					BYT_RT5640_MCLK_EN),
+	},
 	{	/* HP Stream 7 */
 		.matches = {
 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
commit da631f7fd623b6c180c8d93a93040d1e0d61291f
Author: Daniel Axtens <dja at axtens.net>
Date:   Tue Nov 17 16:59:16 2020 +1100

    powerpc/64s: rename pnv|pseries_setup_rfi_flush to _setup_security_mitigations
    
    pseries|pnv_setup_rfi_flush already does the count cache flush setup, and
    we just added entry and uaccess flushes. So the name is not very accurate
    any more. In both platforms we then also immediately setup the STF flush.
    
    Rename them to _setup_security_mitigations and fold the STF flush in.
    
    Signed-off-by: Daniel Axtens <dja at axtens.net>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
index 087ec92acfc4..46115231a3b2 100644
--- a/arch/powerpc/platforms/powernv/setup.c
+++ b/arch/powerpc/platforms/powernv/setup.c
@@ -98,7 +98,7 @@ static void init_fw_feat_flags(struct device_node *np)
 		security_ftr_clear(SEC_FTR_BNDS_CHK_SPEC_BAR);
 }
 
-static void pnv_setup_rfi_flush(void)
+static void pnv_setup_security_mitigations(void)
 {
 	struct device_node *np, *fw_features;
 	enum l1d_flush_type type;
@@ -145,6 +145,8 @@ static void pnv_setup_rfi_flush(void)
 	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
 		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_UACCESS);
 	setup_uaccess_flush(enable);
+
+	setup_stf_barrier();
 }
 
 static void __init pnv_check_guarded_cores(void)
@@ -173,8 +175,7 @@ static void __init pnv_setup_arch(void)
 {
 	set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT);
 
-	pnv_setup_rfi_flush();
-	setup_stf_barrier();
+	pnv_setup_security_mitigations();
 
 	/* Initialize SMP */
 	pnv_smp_init();
diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
index d6f4162478a5..2f73cb5bf12d 100644
--- a/arch/powerpc/platforms/pseries/mobility.c
+++ b/arch/powerpc/platforms/pseries/mobility.c
@@ -349,8 +349,8 @@ void post_mobility_fixup(void)
 
 	cpus_read_unlock();
 
-	/* Possibly switch to a new RFI flush type */
-	pseries_setup_rfi_flush();
+	/* Possibly switch to a new L1 flush type */
+	pseries_setup_security_mitigations();
 
 	/* Reinitialise system information for hv-24x7 */
 	read_24x7_sys_info();
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index 13fa370a87e4..593840847cd3 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -111,7 +111,7 @@ static inline unsigned long cmo_get_page_size(void)
 
 int dlpar_workqueue_init(void);
 
-void pseries_setup_rfi_flush(void);
+void pseries_setup_security_mitigations(void);
 void pseries_lpar_read_hblkrm_characteristics(void);
 
 #endif /* _PSERIES_PSERIES_H */
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 3617cdb079f6..090c13f6c881 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -542,7 +542,7 @@ static void init_cpu_char_feature_flags(struct h_cpu_char_result *result)
 		security_ftr_clear(SEC_FTR_BNDS_CHK_SPEC_BAR);
 }
 
-void pseries_setup_rfi_flush(void)
+void pseries_setup_security_mitigations(void)
 {
 	struct h_cpu_char_result result;
 	enum l1d_flush_type types;
@@ -587,6 +587,8 @@ void pseries_setup_rfi_flush(void)
 	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
 		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_UACCESS);
 	setup_uaccess_flush(enable);
+
+	setup_stf_barrier();
 }
 
 #ifdef CONFIG_PCI_IOV
@@ -776,8 +778,7 @@ static void __init pSeries_setup_arch(void)
 
 	fwnmi_init();
 
-	pseries_setup_rfi_flush();
-	setup_stf_barrier();
+	pseries_setup_security_mitigations();
 	pseries_lpar_read_hblkrm_characteristics();
 
 	/* By default, only probe PCI (can be overridden by rtas_pci) */
commit 0d239f3b03efc78fb5b290aff6c747fecd3b98cb
Author: Daniel Axtens <dja at axtens.net>
Date:   Tue Nov 17 16:59:15 2020 +1100

    selftests/powerpc: refactor entry and rfi_flush tests
    
    For simplicity in backporting, the original entry_flush test contained
    a lot of duplicated code from the rfi_flush test. De-duplicate that code.
    
    Signed-off-by: Daniel Axtens <dja at axtens.net>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/tools/testing/selftests/powerpc/include/utils.h b/tools/testing/selftests/powerpc/include/utils.h
index 052b5a775dc2..b7d188fc87c7 100644
--- a/tools/testing/selftests/powerpc/include/utils.h
+++ b/tools/testing/selftests/powerpc/include/utils.h
@@ -42,6 +42,11 @@ int perf_event_enable(int fd);
 int perf_event_disable(int fd);
 int perf_event_reset(int fd);
 
+struct perf_event_read {
+	__u64 nr;
+	__u64 l1d_misses;
+};
+
 #if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 30)
 #include <unistd.h>
 #include <sys/syscall.h>
diff --git a/tools/testing/selftests/powerpc/security/Makefile b/tools/testing/selftests/powerpc/security/Makefile
index 921152caf1dc..f25e854fe370 100644
--- a/tools/testing/selftests/powerpc/security/Makefile
+++ b/tools/testing/selftests/powerpc/security/Makefile
@@ -11,3 +11,5 @@ $(TEST_GEN_PROGS): ../harness.c ../utils.c
 
 $(OUTPUT)/spectre_v2: CFLAGS += -m64
 $(OUTPUT)/spectre_v2: ../pmu/event.c branch_loops.S
+$(OUTPUT)/rfi_flush: flush_utils.c
+$(OUTPUT)/entry_flush: flush_utils.c
diff --git a/tools/testing/selftests/powerpc/security/entry_flush.c b/tools/testing/selftests/powerpc/security/entry_flush.c
index 7ae7e37204c5..78cf914fa321 100644
--- a/tools/testing/selftests/powerpc/security/entry_flush.c
+++ b/tools/testing/selftests/powerpc/security/entry_flush.c
@@ -15,66 +15,7 @@
 #include <string.h>
 #include <stdio.h>
 #include "utils.h"
-
-#define CACHELINE_SIZE 128
-
-struct perf_event_read {
-	__u64 nr;
-	__u64 l1d_misses;
-};
-
-static inline __u64 load(void *addr)
-{
-	__u64 tmp;
-
-	asm volatile("ld %0,0(%1)" : "=r"(tmp) : "b"(addr));
-
-	return tmp;
-}
-
-static void syscall_loop(char *p, unsigned long iterations,
-			 unsigned long zero_size)
-{
-	for (unsigned long i = 0; i < iterations; i++) {
-		for (unsigned long j = 0; j < zero_size; j += CACHELINE_SIZE)
-			load(p + j);
-		getppid();
-	}
-}
-
-static void sigill_handler(int signr, siginfo_t *info, void *unused)
-{
-	static int warned;
-	ucontext_t *ctx = (ucontext_t *)unused;
-	unsigned long *pc = &UCONTEXT_NIA(ctx);
-
-	/* mtspr 3,RS to check for move to DSCR below */
-	if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) {
-		if (!warned++)
-			printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n");
-		*pc += 4;
-	} else {
-		printf("SIGILL at %p\n", pc);
-		abort();
-	}
-}
-
-static void set_dscr(unsigned long val)
-{
-	static int init;
-	struct sigaction sa;
-
-	if (!init) {
-		memset(&sa, 0, sizeof(sa));
-		sa.sa_sigaction = sigill_handler;
-		sa.sa_flags = SA_SIGINFO;
-		if (sigaction(SIGILL, &sa, NULL))
-			perror("sigill_handler");
-		init = 1;
-	}
-
-	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
-}
+#include "flush_utils.h"
 
 int entry_flush_test(void)
 {
diff --git a/tools/testing/selftests/powerpc/security/flush_utils.c b/tools/testing/selftests/powerpc/security/flush_utils.c
new file mode 100644
index 000000000000..0c3c4c40c7fb
--- /dev/null
+++ b/tools/testing/selftests/powerpc/security/flush_utils.c
@@ -0,0 +1,70 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Copyright 2018 IBM Corporation.
+ */
+
+#define __SANE_USERSPACE_TYPES__
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "utils.h"
+#include "flush_utils.h"
+
+static inline __u64 load(void *addr)
+{
+	__u64 tmp;
+
+	asm volatile("ld %0,0(%1)" : "=r"(tmp) : "b"(addr));
+
+	return tmp;
+}
+
+void syscall_loop(char *p, unsigned long iterations,
+		  unsigned long zero_size)
+{
+	for (unsigned long i = 0; i < iterations; i++) {
+		for (unsigned long j = 0; j < zero_size; j += CACHELINE_SIZE)
+			load(p + j);
+		getppid();
+	}
+}
+
+static void sigill_handler(int signr, siginfo_t *info, void *unused)
+{
+	static int warned;
+	ucontext_t *ctx = (ucontext_t *)unused;
+	unsigned long *pc = &UCONTEXT_NIA(ctx);
+
+	/* mtspr 3,RS to check for move to DSCR below */
+	if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) {
+		if (!warned++)
+			printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n");
+		*pc += 4;
+	} else {
+		printf("SIGILL at %p\n", pc);
+		abort();
+	}
+}
+
+void set_dscr(unsigned long val)
+{
+	static int init;
+	struct sigaction sa;
+
+	if (!init) {
+		memset(&sa, 0, sizeof(sa));
+		sa.sa_sigaction = sigill_handler;
+		sa.sa_flags = SA_SIGINFO;
+		if (sigaction(SIGILL, &sa, NULL))
+			perror("sigill_handler");
+		init = 1;
+	}
+
+	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
+}
diff --git a/tools/testing/selftests/powerpc/security/flush_utils.h b/tools/testing/selftests/powerpc/security/flush_utils.h
new file mode 100644
index 000000000000..07a5eb301466
--- /dev/null
+++ b/tools/testing/selftests/powerpc/security/flush_utils.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+/*
+ * Copyright 2018 IBM Corporation.
+ */
+
+#ifndef _SELFTESTS_POWERPC_SECURITY_FLUSH_UTILS_H
+#define _SELFTESTS_POWERPC_SECURITY_FLUSH_UTILS_H
+
+#define CACHELINE_SIZE 128
+
+void syscall_loop(char *p, unsigned long iterations,
+		  unsigned long zero_size);
+
+void set_dscr(unsigned long val);
+
+#endif /* _SELFTESTS_POWERPC_SECURITY_FLUSH_UTILS_H */
diff --git a/tools/testing/selftests/powerpc/security/rfi_flush.c b/tools/testing/selftests/powerpc/security/rfi_flush.c
index 4e7b2776c367..7565fd786640 100644
--- a/tools/testing/selftests/powerpc/security/rfi_flush.c
+++ b/tools/testing/selftests/powerpc/security/rfi_flush.c
@@ -10,71 +10,12 @@
 #include <stdint.h>
 #include <malloc.h>
 #include <unistd.h>
-#include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include "utils.h"
+#include "flush_utils.h"
 
-#define CACHELINE_SIZE 128
-
-struct perf_event_read {
-	__u64 nr;
-	__u64 l1d_misses;
-};
-
-static inline __u64 load(void *addr)
-{
-	__u64 tmp;
-
-	asm volatile("ld %0,0(%1)" : "=r"(tmp) : "b"(addr));
-
-	return tmp;
-}
-
-static void syscall_loop(char *p, unsigned long iterations,
-			 unsigned long zero_size)
-{
-	for (unsigned long i = 0; i < iterations; i++) {
-		for (unsigned long j = 0; j < zero_size; j += CACHELINE_SIZE)
-			load(p + j);
-		getppid();
-	}
-}
-
-static void sigill_handler(int signr, siginfo_t *info, void *unused)
-{
-	static int warned = 0;
-	ucontext_t *ctx = (ucontext_t *)unused;
-	unsigned long *pc = &UCONTEXT_NIA(ctx);
-
-	/* mtspr 3,RS to check for move to DSCR below */
-	if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) {
-		if (!warned++)
-			printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n");
-		*pc += 4;
-	} else {
-		printf("SIGILL at %p\n", pc);
-		abort();
-	}
-}
-
-static void set_dscr(unsigned long val)
-{
-	static int init = 0;
-	struct sigaction sa;
-
-	if (!init) {
-		memset(&sa, 0, sizeof(sa));
-		sa.sa_sigaction = sigill_handler;
-		sa.sa_flags = SA_SIGINFO;
-		if (sigaction(SIGILL, &sa, NULL))
-			perror("sigill_handler");
-		init = 1;
-	}
-
-	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
-}
 
 int rfi_flush_test(void)
 {
commit 89a83a0c69c81a25ce91002b90ca27ed86132a0a
Author: Daniel Axtens <dja at axtens.net>
Date:   Tue Nov 17 16:59:14 2020 +1100

    selftests/powerpc: entry flush test
    
    Add a test modelled on the RFI flush test which counts the number
    of L1D misses doing a simple syscall with the entry flush on and off.
    
    For simplicity of backporting, this test duplicates a lot of code from
    rfi_flush. We clean that up in the next patch.
    
    Signed-off-by: Daniel Axtens <dja at axtens.net>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/tools/testing/selftests/powerpc/security/.gitignore b/tools/testing/selftests/powerpc/security/.gitignore
index f795e06f5ae3..4257a1f156bb 100644
--- a/tools/testing/selftests/powerpc/security/.gitignore
+++ b/tools/testing/selftests/powerpc/security/.gitignore
@@ -1,2 +1,3 @@
 # SPDX-License-Identifier: GPL-2.0-only
 rfi_flush
+entry_flush
diff --git a/tools/testing/selftests/powerpc/security/Makefile b/tools/testing/selftests/powerpc/security/Makefile
index eadbbff50be6..921152caf1dc 100644
--- a/tools/testing/selftests/powerpc/security/Makefile
+++ b/tools/testing/selftests/powerpc/security/Makefile
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0+
 
-TEST_GEN_PROGS := rfi_flush spectre_v2
+TEST_GEN_PROGS := rfi_flush entry_flush spectre_v2
 top_srcdir = ../../../../..
 
 CFLAGS += -I../../../../../usr/include
diff --git a/tools/testing/selftests/powerpc/security/entry_flush.c b/tools/testing/selftests/powerpc/security/entry_flush.c
new file mode 100644
index 000000000000..7ae7e37204c5
--- /dev/null
+++ b/tools/testing/selftests/powerpc/security/entry_flush.c
@@ -0,0 +1,198 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Copyright 2018 IBM Corporation.
+ */
+
+#define __SANE_USERSPACE_TYPES__
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <malloc.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "utils.h"
+
+#define CACHELINE_SIZE 128
+
+struct perf_event_read {
+	__u64 nr;
+	__u64 l1d_misses;
+};
+
+static inline __u64 load(void *addr)
+{
+	__u64 tmp;
+
+	asm volatile("ld %0,0(%1)" : "=r"(tmp) : "b"(addr));
+
+	return tmp;
+}
+
+static void syscall_loop(char *p, unsigned long iterations,
+			 unsigned long zero_size)
+{
+	for (unsigned long i = 0; i < iterations; i++) {
+		for (unsigned long j = 0; j < zero_size; j += CACHELINE_SIZE)
+			load(p + j);
+		getppid();
+	}
+}
+
+static void sigill_handler(int signr, siginfo_t *info, void *unused)
+{
+	static int warned;
+	ucontext_t *ctx = (ucontext_t *)unused;
+	unsigned long *pc = &UCONTEXT_NIA(ctx);
+
+	/* mtspr 3,RS to check for move to DSCR below */
+	if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) {
+		if (!warned++)
+			printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n");
+		*pc += 4;
+	} else {
+		printf("SIGILL at %p\n", pc);
+		abort();
+	}
+}
+
+static void set_dscr(unsigned long val)
+{
+	static int init;
+	struct sigaction sa;
+
+	if (!init) {
+		memset(&sa, 0, sizeof(sa));
+		sa.sa_sigaction = sigill_handler;
+		sa.sa_flags = SA_SIGINFO;
+		if (sigaction(SIGILL, &sa, NULL))
+			perror("sigill_handler");
+		init = 1;
+	}
+
+	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
+}
+
+int entry_flush_test(void)
+{
+	char *p;
+	int repetitions = 10;
+	int fd, passes = 0, iter, rc = 0;
+	struct perf_event_read v;
+	__u64 l1d_misses_total = 0;
+	unsigned long iterations = 100000, zero_size = 24 * 1024;
+	unsigned long l1d_misses_expected;
+	int rfi_flush_orig;
+	int entry_flush, entry_flush_orig;
+
+	SKIP_IF(geteuid() != 0);
+
+	// The PMU event we use only works on Power7 or later
+	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
+
+	if (read_debugfs_file("powerpc/rfi_flush", &rfi_flush_orig) < 0) {
+		perror("Unable to read powerpc/rfi_flush debugfs file");
+		SKIP_IF(1);
+	}
+
+	if (read_debugfs_file("powerpc/entry_flush", &entry_flush_orig) < 0) {
+		perror("Unable to read powerpc/entry_flush debugfs file");
+		SKIP_IF(1);
+	}
+
+	if (rfi_flush_orig != 0) {
+		if (write_debugfs_file("powerpc/rfi_flush", 0) < 0) {
+			perror("error writing to powerpc/rfi_flush debugfs file");
+			FAIL_IF(1);
+		}
+	}
+
+	entry_flush = entry_flush_orig;
+
+	fd = perf_event_open_counter(PERF_TYPE_RAW, /* L1d miss */ 0x400f0, -1);
+	FAIL_IF(fd < 0);
+
+	p = (char *)memalign(zero_size, CACHELINE_SIZE);
+
+	FAIL_IF(perf_event_enable(fd));
+
+	// disable L1 prefetching
+	set_dscr(1);
+
+	iter = repetitions;
+
+	/*
+	 * We expect to see l1d miss for each cacheline access when entry_flush
+	 * is set. Allow a small variation on this.
+	 */
+	l1d_misses_expected = iterations * (zero_size / CACHELINE_SIZE - 2);
+
+again:
+	FAIL_IF(perf_event_reset(fd));
+
+	syscall_loop(p, iterations, zero_size);
+
+	FAIL_IF(read(fd, &v, sizeof(v)) != sizeof(v));
+
+	if (entry_flush && v.l1d_misses >= l1d_misses_expected)
+		passes++;
+	else if (!entry_flush && v.l1d_misses < (l1d_misses_expected / 2))
+		passes++;
+
+	l1d_misses_total += v.l1d_misses;
+
+	while (--iter)
+		goto again;
+
+	if (passes < repetitions) {
+		printf("FAIL (L1D misses with entry_flush=%d: %llu %c %lu) [%d/%d failures]\n",
+		       entry_flush, l1d_misses_total, entry_flush ? '<' : '>',
+		       entry_flush ? repetitions * l1d_misses_expected :
+		       repetitions * l1d_misses_expected / 2,
+		       repetitions - passes, repetitions);
+		rc = 1;
+	} else {
+		printf("PASS (L1D misses with entry_flush=%d: %llu %c %lu) [%d/%d pass]\n",
+		       entry_flush, l1d_misses_total, entry_flush ? '>' : '<',
+		       entry_flush ? repetitions * l1d_misses_expected :
+		       repetitions * l1d_misses_expected / 2,
+		       passes, repetitions);
+	}
+
+	if (entry_flush == entry_flush_orig) {
+		entry_flush = !entry_flush_orig;
+		if (write_debugfs_file("powerpc/entry_flush", entry_flush) < 0) {
+			perror("error writing to powerpc/entry_flush debugfs file");
+			return 1;
+		}
+		iter = repetitions;
+		l1d_misses_total = 0;
+		passes = 0;
+		goto again;
+	}
+
+	perf_event_disable(fd);
+	close(fd);
+
+	set_dscr(0);
+
+	if (write_debugfs_file("powerpc/rfi_flush", rfi_flush_orig) < 0) {
+		perror("unable to restore original value of powerpc/rfi_flush debugfs file");
+		return 1;
+	}
+
+	if (write_debugfs_file("powerpc/entry_flush", entry_flush_orig) < 0) {
+		perror("unable to restore original value of powerpc/entry_flush debugfs file");
+		return 1;
+	}
+
+	return rc;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(entry_flush_test, "entry_flush_test");
+}
commit 178d52c6e89c38d0553b0ac8b99927b11eb995b0
Author: Michael Ellerman <mpe at ellerman.id.au>
Date:   Thu Nov 19 23:43:53 2020 +1100

    powerpc: Only include kup-radix.h for 64-bit Book3S
    
    In kup.h we currently include kup-radix.h for all 64-bit builds, which
    includes Book3S and Book3E. The latter doesn't make sense, Book3E
    never uses the Radix MMU.
    
    This has worked up until now, but almost by accident, and the recent
    uaccess flush changes introduced a build breakage on Book3E because of
    the bad structure of the code.
    
    So disentangle things so that we only use kup-radix.h for Book3S. This
    requires some more stubs in kup.h and fixing an include in
    syscall_64.c.
    
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h
index 97c2394e7dea..28716e2f13e3 100644
--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h
+++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h
@@ -27,6 +27,7 @@
 #endif
 .endm
 
+#ifdef CONFIG_PPC_KUAP
 .macro kuap_check_amr gpr1, gpr2
 #ifdef CONFIG_PPC_KUAP_DEBUG
 	BEGIN_MMU_FTR_SECTION_NESTED(67)
@@ -38,6 +39,7 @@
 	END_MMU_FTR_SECTION_NESTED_IFSET(MMU_FTR_RADIX_KUAP, 67)
 #endif
 .endm
+#endif
 
 .macro kuap_save_amr_and_lock gpr1, gpr2, use_cr, msr_pr_cr
 #ifdef CONFIG_PPC_KUAP
@@ -148,8 +150,6 @@ static inline unsigned long kuap_get_and_check_amr(void)
 	return 0UL;
 }
 
-static inline void kuap_check_amr(void) { }
-
 static inline unsigned long get_kuap(void)
 {
 	return AMR_KUAP_BLOCKED;
diff --git a/arch/powerpc/include/asm/kup.h b/arch/powerpc/include/asm/kup.h
index 0f5c606ae057..0d93331d0fab 100644
--- a/arch/powerpc/include/asm/kup.h
+++ b/arch/powerpc/include/asm/kup.h
@@ -14,7 +14,7 @@
 #define KUAP_CURRENT_WRITE	8
 #define KUAP_CURRENT		(KUAP_CURRENT_READ | KUAP_CURRENT_WRITE)
 
-#ifdef CONFIG_PPC64
+#ifdef CONFIG_PPC_BOOK3S_64
 #include <asm/book3s/64/kup-radix.h>
 #endif
 #ifdef CONFIG_PPC_8xx
@@ -35,6 +35,9 @@
 .macro kuap_check	current, gpr
 .endm
 
+.macro kuap_check_amr	gpr1, gpr2
+.endm
+
 #endif
 
 #else /* !__ASSEMBLY__ */
@@ -60,19 +63,21 @@ bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
 	return false;
 }
 
+static inline void kuap_check_amr(void) { }
+
 /*
  * book3s/64/kup-radix.h defines these functions for the !KUAP case to flush
  * the L1D cache after user accesses. Only include the empty stubs for other
  * platforms.
  */
-#ifndef CONFIG_PPC64
+#ifndef CONFIG_PPC_BOOK3S_64
 static inline void allow_user_access(void __user *to, const void __user *from,
 				     unsigned long size, unsigned long dir) { }
 static inline void prevent_user_access(void __user *to, const void __user *from,
 				       unsigned long size, unsigned long dir) { }
 static inline unsigned long prevent_user_access_return(void) { return 0UL; }
 static inline void restore_user_access(unsigned long flags) { }
-#endif /* CONFIG_PPC64 */
+#endif /* CONFIG_PPC_BOOK3S_64 */
 #endif /* CONFIG_PPC_KUAP */
 
 static inline void allow_read_from_user(const void __user *from, unsigned long size)
diff --git a/arch/powerpc/kernel/syscall_64.c b/arch/powerpc/kernel/syscall_64.c
index 8e50818aa50b..310bcd768cd5 100644
--- a/arch/powerpc/kernel/syscall_64.c
+++ b/arch/powerpc/kernel/syscall_64.c
@@ -2,7 +2,7 @@
 
 #include <linux/err.h>
 #include <asm/asm-prototypes.h>
-#include <asm/book3s/64/kup-radix.h>
+#include <asm/kup.h>
 #include <asm/cputime.h>
 #include <asm/hw_irq.h>
 #include <asm/kprobes.h>
commit 9a32a7e78bd0cd9a9b6332cbdc345ee5ffd0c5de
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Tue Nov 17 16:59:13 2020 +1100

    powerpc/64s: flush L1D after user accesses
    
    IBM Power9 processors can speculatively operate on data in the L1 cache
    before it has been completely validated, via a way-prediction mechanism. It
    is not possible for an attacker to determine the contents of impermissible
    memory using this method, since these systems implement a combination of
    hardware and software security measures to prevent scenarios where
    protected data could be leaked.
    
    However these measures don't address the scenario where an attacker induces
    the operating system to speculatively execute instructions using data that
    the attacker controls. This can be used for example to speculatively bypass
    "kernel user access prevention" techniques, as discovered by Anthony
    Steinhauser of Google's Safeside Project. This is not an attack by itself,
    but there is a possibility it could be used in conjunction with
    side-channels or other weaknesses in the privileged code to construct an
    attack.
    
    This issue can be mitigated by flushing the L1 cache between privilege
    boundaries of concern. This patch flushes the L1 cache after user accesses.
    
    This is part of the fix for CVE-2020-4788.
    
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Signed-off-by: Daniel Axtens <dja at axtens.net>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 383889fe771f..44fde25bb221 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2859,6 +2859,7 @@
 					       tsx_async_abort=off [X86]
 					       kvm.nx_huge_pages=off [X86]
 					       no_entry_flush [PPC]
+					       no_uaccess_flush [PPC]
 
 				Exceptions:
 					       This does not have any effect on
@@ -3238,6 +3239,9 @@
 	nospec_store_bypass_disable
 			[HW] Disable all mitigations for the Speculative Store Bypass vulnerability
 
+	no_uaccess_flush
+	                [PPC] Don't flush the L1-D cache after accessing user data.
+
 	noxsave		[BUGS=X86] Disables x86 extended register state save
 			and restore using xsave. The kernel will fallback to
 			enabling legacy floating-point and sse state.
diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h
index 3ee1ec60be84..97c2394e7dea 100644
--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h
+++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h
@@ -61,6 +61,8 @@
 
 #else /* !__ASSEMBLY__ */
 
+DECLARE_STATIC_KEY_FALSE(uaccess_flush_key);
+
 #ifdef CONFIG_PPC_KUAP
 
 #include <asm/mmu.h>
@@ -103,8 +105,16 @@ static inline void kuap_check_amr(void)
 
 static inline unsigned long get_kuap(void)
 {
+	/*
+	 * We return AMR_KUAP_BLOCKED when we don't support KUAP because
+	 * prevent_user_access_return needs to return AMR_KUAP_BLOCKED to
+	 * cause restore_user_access to do a flush.
+	 *
+	 * This has no effect in terms of actually blocking things on hash,
+	 * so it doesn't break anything.
+	 */
 	if (!early_mmu_has_feature(MMU_FTR_RADIX_KUAP))
-		return 0;
+		return AMR_KUAP_BLOCKED;
 
 	return mfspr(SPRN_AMR);
 }
@@ -123,6 +133,31 @@ static inline void set_kuap(unsigned long value)
 	isync();
 }
 
+static inline bool
+bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
+{
+	return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) &&
+		    (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)),
+		    "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read");
+}
+#else /* CONFIG_PPC_KUAP */
+static inline void kuap_restore_amr(struct pt_regs *regs, unsigned long amr) { }
+
+static inline unsigned long kuap_get_and_check_amr(void)
+{
+	return 0UL;
+}
+
+static inline void kuap_check_amr(void) { }
+
+static inline unsigned long get_kuap(void)
+{
+	return AMR_KUAP_BLOCKED;
+}
+
+static inline void set_kuap(unsigned long value) { }
+#endif /* !CONFIG_PPC_KUAP */
+
 static __always_inline void allow_user_access(void __user *to, const void __user *from,
 					      unsigned long size, unsigned long dir)
 {
@@ -142,6 +177,8 @@ static inline void prevent_user_access(void __user *to, const void __user *from,
 				       unsigned long size, unsigned long dir)
 {
 	set_kuap(AMR_KUAP_BLOCKED);
+	if (static_branch_unlikely(&uaccess_flush_key))
+		do_uaccess_flush();
 }
 
 static inline unsigned long prevent_user_access_return(void)
@@ -149,6 +186,8 @@ static inline unsigned long prevent_user_access_return(void)
 	unsigned long flags = get_kuap();
 
 	set_kuap(AMR_KUAP_BLOCKED);
+	if (static_branch_unlikely(&uaccess_flush_key))
+		do_uaccess_flush();
 
 	return flags;
 }
@@ -156,30 +195,9 @@ static inline unsigned long prevent_user_access_return(void)
 static inline void restore_user_access(unsigned long flags)
 {
 	set_kuap(flags);
+	if (static_branch_unlikely(&uaccess_flush_key) && flags == AMR_KUAP_BLOCKED)
+		do_uaccess_flush();
 }
-
-static inline bool
-bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
-{
-	return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) &&
-		    (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)),
-		    "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read");
-}
-#else /* CONFIG_PPC_KUAP */
-static inline void kuap_restore_amr(struct pt_regs *regs, unsigned long amr)
-{
-}
-
-static inline void kuap_check_amr(void)
-{
-}
-
-static inline unsigned long kuap_get_and_check_amr(void)
-{
-	return 0;
-}
-#endif /* CONFIG_PPC_KUAP */
-
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_POWERPC_BOOK3S_64_KUP_RADIX_H */
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 83fa88bc9935..1d32b174ab6a 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -144,6 +144,9 @@
 	RFSCV;								\
 	b	rfscv_flush_fallback
 
+#else /* __ASSEMBLY__ */
+/* Prototype for function defined in exceptions-64s.S */
+void do_uaccess_flush(void);
 #endif /* __ASSEMBLY__ */
 
 #endif	/* _ASM_POWERPC_EXCEPTION_H */
diff --git a/arch/powerpc/include/asm/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h
index 06a48219bbf2..fbd406cd6916 100644
--- a/arch/powerpc/include/asm/feature-fixups.h
+++ b/arch/powerpc/include/asm/feature-fixups.h
@@ -205,6 +205,14 @@ label##3:					       	\
 	FTR_ENTRY_OFFSET 955b-956b;			\
 	.popsection;
 
+#define UACCESS_FLUSH_FIXUP_SECTION			\
+959:							\
+	.pushsection __uaccess_flush_fixup,"a";		\
+	.align 2;					\
+960:							\
+	FTR_ENTRY_OFFSET 959b-960b;			\
+	.popsection;
+
 #define ENTRY_FLUSH_FIXUP_SECTION			\
 957:							\
 	.pushsection __entry_flush_fixup,"a";		\
@@ -248,6 +256,7 @@ extern long stf_barrier_fallback;
 extern long entry_flush_fallback;
 extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
 extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
+extern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup;
 extern long __start___entry_flush_fixup, __stop___entry_flush_fixup;
 extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
 extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
diff --git a/arch/powerpc/include/asm/kup.h b/arch/powerpc/include/asm/kup.h
index 1d0f7d838b2e..0f5c606ae057 100644
--- a/arch/powerpc/include/asm/kup.h
+++ b/arch/powerpc/include/asm/kup.h
@@ -53,17 +53,26 @@ static inline void setup_kuep(bool disabled) { }
 void setup_kuap(bool disabled);
 #else
 static inline void setup_kuap(bool disabled) { }
+
+static inline bool
+bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
+{
+	return false;
+}
+
+/*
+ * book3s/64/kup-radix.h defines these functions for the !KUAP case to flush
+ * the L1D cache after user accesses. Only include the empty stubs for other
+ * platforms.
+ */
+#ifndef CONFIG_PPC64
 static inline void allow_user_access(void __user *to, const void __user *from,
 				     unsigned long size, unsigned long dir) { }
 static inline void prevent_user_access(void __user *to, const void __user *from,
 				       unsigned long size, unsigned long dir) { }
 static inline unsigned long prevent_user_access_return(void) { return 0UL; }
 static inline void restore_user_access(unsigned long flags) { }
-static inline bool
-bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
-{
-	return false;
-}
+#endif /* CONFIG_PPC64 */
 #endif /* CONFIG_PPC_KUAP */
 
 static inline void allow_read_from_user(const void __user *from, unsigned long size)
diff --git a/arch/powerpc/include/asm/security_features.h b/arch/powerpc/include/asm/security_features.h
index 9e7459d2edca..b774a4477d5f 100644
--- a/arch/powerpc/include/asm/security_features.h
+++ b/arch/powerpc/include/asm/security_features.h
@@ -89,6 +89,8 @@ static inline bool security_ftr_enabled(u64 feature)
 // The L1-D cache should be flushed when entering the kernel
 #define SEC_FTR_L1D_FLUSH_ENTRY		0x0000000000004000ull
 
+// The L1-D cache should be flushed after user accesses from the kernel
+#define SEC_FTR_L1D_FLUSH_UACCESS	0x0000000000008000ull
 
 // Features enabled by default
 #define SEC_FTR_DEFAULT \
@@ -96,6 +98,7 @@ static inline bool security_ftr_enabled(u64 feature)
 	 SEC_FTR_L1D_FLUSH_PR | \
 	 SEC_FTR_BNDS_CHK_SPEC_BAR | \
 	 SEC_FTR_L1D_FLUSH_ENTRY | \
+	 SEC_FTR_L1D_FLUSH_UACCESS | \
 	 SEC_FTR_FAVOUR_SECURITY)
 
 #endif /* _ASM_POWERPC_SECURITY_FEATURES_H */
diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h
index e2fcd3e874f8..a466749703f1 100644
--- a/arch/powerpc/include/asm/setup.h
+++ b/arch/powerpc/include/asm/setup.h
@@ -60,6 +60,7 @@ void setup_barrier_nospec(void);
 #else
 static inline void setup_barrier_nospec(void) { };
 #endif
+void do_uaccess_flush_fixups(enum l1d_flush_type types);
 void do_entry_flush_fixups(enum l1d_flush_type types);
 void do_barrier_nospec_fixups(bool enable);
 extern bool barrier_nospec_enabled;
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 5577dd887d37..f63a3d3bca3d 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -2951,11 +2951,8 @@ TRAMP_REAL_BEGIN(stf_barrier_fallback)
 	.endr
 	blr
 
-TRAMP_REAL_BEGIN(entry_flush_fallback)
-	std	r9,PACA_EXRFI+EX_R9(r13)
-	std	r10,PACA_EXRFI+EX_R10(r13)
-	std	r11,PACA_EXRFI+EX_R11(r13)
-	mfctr	r9
+/* Clobbers r10, r11, ctr */
+.macro L1D_DISPLACEMENT_FLUSH
 	ld	r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
 	ld	r11,PACA_L1D_FLUSH_SIZE(r13)
 	srdi	r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
@@ -2981,7 +2978,14 @@ TRAMP_REAL_BEGIN(entry_flush_fallback)
 	ld	r11,(0x80 + 8)*7(r10)
 	addi	r10,r10,0x80*8
 	bdnz	1b
+.endm
 
+TRAMP_REAL_BEGIN(entry_flush_fallback)
+	std	r9,PACA_EXRFI+EX_R9(r13)
+	std	r10,PACA_EXRFI+EX_R10(r13)
+	std	r11,PACA_EXRFI+EX_R11(r13)
+	mfctr	r9
+	L1D_DISPLACEMENT_FLUSH
 	mtctr	r9
 	ld	r9,PACA_EXRFI+EX_R9(r13)
 	ld	r10,PACA_EXRFI+EX_R10(r13)
@@ -2997,32 +3001,7 @@ TRAMP_REAL_BEGIN(rfi_flush_fallback)
 	std	r10,PACA_EXRFI+EX_R10(r13)
 	std	r11,PACA_EXRFI+EX_R11(r13)
 	mfctr	r9
-	ld	r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
-	ld	r11,PACA_L1D_FLUSH_SIZE(r13)
-	srdi	r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
-	mtctr	r11
-	DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
-
-	/* order ld/st prior to dcbt stop all streams with flushing */
-	sync
-
-	/*
-	 * The load adresses are at staggered offsets within cachelines,
-	 * which suits some pipelines better (on others it should not
-	 * hurt).
-	 */
-1:
-	ld	r11,(0x80 + 8)*0(r10)
-	ld	r11,(0x80 + 8)*1(r10)
-	ld	r11,(0x80 + 8)*2(r10)
-	ld	r11,(0x80 + 8)*3(r10)
-	ld	r11,(0x80 + 8)*4(r10)
-	ld	r11,(0x80 + 8)*5(r10)
-	ld	r11,(0x80 + 8)*6(r10)
-	ld	r11,(0x80 + 8)*7(r10)
-	addi	r10,r10,0x80*8
-	bdnz	1b
-
+	L1D_DISPLACEMENT_FLUSH
 	mtctr	r9
 	ld	r9,PACA_EXRFI+EX_R9(r13)
 	ld	r10,PACA_EXRFI+EX_R10(r13)
@@ -3040,32 +3019,7 @@ TRAMP_REAL_BEGIN(hrfi_flush_fallback)
 	std	r10,PACA_EXRFI+EX_R10(r13)
 	std	r11,PACA_EXRFI+EX_R11(r13)
 	mfctr	r9
-	ld	r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
-	ld	r11,PACA_L1D_FLUSH_SIZE(r13)
-	srdi	r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
-	mtctr	r11
-	DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
-
-	/* order ld/st prior to dcbt stop all streams with flushing */
-	sync
-
-	/*
-	 * The load adresses are at staggered offsets within cachelines,
-	 * which suits some pipelines better (on others it should not
-	 * hurt).
-	 */
-1:
-	ld	r11,(0x80 + 8)*0(r10)
-	ld	r11,(0x80 + 8)*1(r10)
-	ld	r11,(0x80 + 8)*2(r10)
-	ld	r11,(0x80 + 8)*3(r10)
-	ld	r11,(0x80 + 8)*4(r10)
-	ld	r11,(0x80 + 8)*5(r10)
-	ld	r11,(0x80 + 8)*6(r10)
-	ld	r11,(0x80 + 8)*7(r10)
-	addi	r10,r10,0x80*8
-	bdnz	1b
-
+	L1D_DISPLACEMENT_FLUSH
 	mtctr	r9
 	ld	r9,PACA_EXRFI+EX_R9(r13)
 	ld	r10,PACA_EXRFI+EX_R10(r13)
@@ -3116,8 +3070,21 @@ TRAMP_REAL_BEGIN(rfscv_flush_fallback)
 	RFSCV
 
 USE_TEXT_SECTION()
-	MASKED_INTERRUPT
-	MASKED_INTERRUPT hsrr=1
+
+_GLOBAL(do_uaccess_flush)
+	UACCESS_FLUSH_FIXUP_SECTION
+	nop
+	nop
+	nop
+	blr
+	L1D_DISPLACEMENT_FLUSH
+	blr
+_ASM_NOKPROBE_SYMBOL(do_uaccess_flush)
+EXPORT_SYMBOL(do_uaccess_flush)
+
+
+MASKED_INTERRUPT
+MASKED_INTERRUPT hsrr=1
 
 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
 kvmppc_skip_interrupt:
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 7d447b43ad13..74fd47f46fa5 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -946,8 +946,12 @@ static enum l1d_flush_type enabled_flush_types;
 static void *l1d_flush_fallback_area;
 static bool no_rfi_flush;
 static bool no_entry_flush;
+static bool no_uaccess_flush;
 bool rfi_flush;
 bool entry_flush;
+bool uaccess_flush;
+DEFINE_STATIC_KEY_FALSE(uaccess_flush_key);
+EXPORT_SYMBOL(uaccess_flush_key);
 
 static int __init handle_no_rfi_flush(char *p)
 {
@@ -965,6 +969,14 @@ static int __init handle_no_entry_flush(char *p)
 }
 early_param("no_entry_flush", handle_no_entry_flush);
 
+static int __init handle_no_uaccess_flush(char *p)
+{
+	pr_info("uaccess-flush: disabled on command line.");
+	no_uaccess_flush = true;
+	return 0;
+}
+early_param("no_uaccess_flush", handle_no_uaccess_flush);
+
 /*
  * The RFI flush is not KPTI, but because users will see doco that says to use
  * nopti we hijack that option here to also disable the RFI flush.
@@ -1008,6 +1020,20 @@ void entry_flush_enable(bool enable)
 	entry_flush = enable;
 }
 
+void uaccess_flush_enable(bool enable)
+{
+	if (enable) {
+		do_uaccess_flush_fixups(enabled_flush_types);
+		static_branch_enable(&uaccess_flush_key);
+		on_each_cpu(do_nothing, NULL, 1);
+	} else {
+		static_branch_disable(&uaccess_flush_key);
+		do_uaccess_flush_fixups(L1D_FLUSH_NONE);
+	}
+
+	uaccess_flush = enable;
+}
+
 static void __ref init_fallback_flush(void)
 {
 	u64 l1d_size, limit;
@@ -1079,6 +1105,15 @@ void setup_entry_flush(bool enable)
 		entry_flush_enable(enable);
 }
 
+void setup_uaccess_flush(bool enable)
+{
+	if (cpu_mitigations_off())
+		return;
+
+	if (!no_uaccess_flush)
+		uaccess_flush_enable(enable);
+}
+
 #ifdef CONFIG_DEBUG_FS
 static int rfi_flush_set(void *data, u64 val)
 {
@@ -1132,10 +1167,37 @@ static int entry_flush_get(void *data, u64 *val)
 
 DEFINE_SIMPLE_ATTRIBUTE(fops_entry_flush, entry_flush_get, entry_flush_set, "%llu\n");
 
+static int uaccess_flush_set(void *data, u64 val)
+{
+	bool enable;
+
+	if (val == 1)
+		enable = true;
+	else if (val == 0)
+		enable = false;
+	else
+		return -EINVAL;
+
+	/* Only do anything if we're changing state */
+	if (enable != uaccess_flush)
+		uaccess_flush_enable(enable);
+
+	return 0;
+}
+
+static int uaccess_flush_get(void *data, u64 *val)
+{
+	*val = uaccess_flush ? 1 : 0;
+	return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(fops_uaccess_flush, uaccess_flush_get, uaccess_flush_set, "%llu\n");
+
 static __init int rfi_flush_debugfs_init(void)
 {
 	debugfs_create_file("rfi_flush", 0600, powerpc_debugfs_root, NULL, &fops_rfi_flush);
 	debugfs_create_file("entry_flush", 0600, powerpc_debugfs_root, NULL, &fops_entry_flush);
+	debugfs_create_file("uaccess_flush", 0600, powerpc_debugfs_root, NULL, &fops_uaccess_flush);
 	return 0;
 }
 device_initcall(rfi_flush_debugfs_init);
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index 715ec4d4614a..6db90cdf11da 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -131,6 +131,13 @@ SECTIONS
 		__stop___stf_entry_barrier_fixup = .;
 	}
 
+	. = ALIGN(8);
+	__uaccess_flush_fixup : AT(ADDR(__uaccess_flush_fixup) - LOAD_OFFSET) {
+		__start___uaccess_flush_fixup = .;
+		*(__uaccess_flush_fixup)
+		__stop___uaccess_flush_fixup = .;
+	}
+
 	. = ALIGN(8);
 	__entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) {
 		__start___entry_flush_fixup = .;
diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
index 70e83cfd74aa..321c12a9ef6b 100644
--- a/arch/powerpc/lib/feature-fixups.c
+++ b/arch/powerpc/lib/feature-fixups.c
@@ -234,6 +234,56 @@ void do_stf_barrier_fixups(enum stf_barrier_type types)
 	do_stf_exit_barrier_fixups(types);
 }
 
+void do_uaccess_flush_fixups(enum l1d_flush_type types)
+{
+	unsigned int instrs[4], *dest;
+	long *start, *end;
+	int i;
+
+	start = PTRRELOC(&__start___uaccess_flush_fixup);
+	end = PTRRELOC(&__stop___uaccess_flush_fixup);
+
+	instrs[0] = 0x60000000; /* nop */
+	instrs[1] = 0x60000000; /* nop */
+	instrs[2] = 0x60000000; /* nop */
+	instrs[3] = 0x4e800020; /* blr */
+
+	i = 0;
+	if (types == L1D_FLUSH_FALLBACK) {
+		instrs[3] = 0x60000000; /* nop */
+		/* fallthrough to fallback flush */
+	}
+
+	if (types & L1D_FLUSH_ORI) {
+		instrs[i++] = 0x63ff0000; /* ori 31,31,0 speculation barrier */
+		instrs[i++] = 0x63de0000; /* ori 30,30,0 L1d flush*/
+	}
+
+	if (types & L1D_FLUSH_MTTRIG)
+		instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */
+
+	for (i = 0; start < end; start++, i++) {
+		dest = (void *)start + *start;
+
+		pr_devel("patching dest %lx\n", (unsigned long)dest);
+
+		patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+
+		patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
+		patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+		patch_instruction((struct ppc_inst *)(dest + 3), ppc_inst(instrs[3]));
+	}
+
+	printk(KERN_DEBUG "uaccess-flush: patched %d locations (%s flush)\n", i,
+		(types == L1D_FLUSH_NONE)       ? "no" :
+		(types == L1D_FLUSH_FALLBACK)   ? "fallback displacement" :
+		(types &  L1D_FLUSH_ORI)        ? (types & L1D_FLUSH_MTTRIG)
+							? "ori+mttrig type"
+							: "ori type" :
+		(types &  L1D_FLUSH_MTTRIG)     ? "mttrig type"
+						: "unknown");
+}
+
 void do_entry_flush_fixups(enum l1d_flush_type types)
 {
 	unsigned int instrs[3], *dest;
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
index d04a085c423d..087ec92acfc4 100644
--- a/arch/powerpc/platforms/powernv/setup.c
+++ b/arch/powerpc/platforms/powernv/setup.c
@@ -124,10 +124,12 @@ static void pnv_setup_rfi_flush(void)
 
 	/*
 	 * If we are non-Power9 bare metal, we don't need to flush on kernel
-	 * entry: it fixes a P9 specific vulnerability.
+	 * entry or after user access: they fix a P9 specific vulnerability.
 	 */
-	if (!pvr_version_is(PVR_POWER9))
+	if (!pvr_version_is(PVR_POWER9)) {
 		security_ftr_clear(SEC_FTR_L1D_FLUSH_ENTRY);
+		security_ftr_clear(SEC_FTR_L1D_FLUSH_UACCESS);
+	}
 
 	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) && \
 		 (security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR)   || \
@@ -139,6 +141,10 @@ static void pnv_setup_rfi_flush(void)
 	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
 		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_ENTRY);
 	setup_entry_flush(enable);
+
+	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
+		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_UACCESS);
+	setup_uaccess_flush(enable);
 }
 
 static void __init pnv_check_guarded_cores(void)
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 8136c5368ee4..3617cdb079f6 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -583,6 +583,10 @@ void pseries_setup_rfi_flush(void)
 	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
 		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_ENTRY);
 	setup_entry_flush(enable);
+
+	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
+		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_UACCESS);
+	setup_uaccess_flush(enable);
 }
 
 #ifdef CONFIG_PCI_IOV
commit f79643787e0a0762d2409b7b8334e83f22d85695
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Tue Nov 17 16:59:12 2020 +1100

    powerpc/64s: flush L1D on kernel entry
    
    IBM Power9 processors can speculatively operate on data in the L1 cache
    before it has been completely validated, via a way-prediction mechanism. It
    is not possible for an attacker to determine the contents of impermissible
    memory using this method, since these systems implement a combination of
    hardware and software security measures to prevent scenarios where
    protected data could be leaked.
    
    However these measures don't address the scenario where an attacker induces
    the operating system to speculatively execute instructions using data that
    the attacker controls. This can be used for example to speculatively bypass
    "kernel user access prevention" techniques, as discovered by Anthony
    Steinhauser of Google's Safeside Project. This is not an attack by itself,
    but there is a possibility it could be used in conjunction with
    side-channels or other weaknesses in the privileged code to construct an
    attack.
    
    This issue can be mitigated by flushing the L1 cache between privilege
    boundaries of concern. This patch flushes the L1 cache on kernel entry.
    
    This is part of the fix for CVE-2020-4788.
    
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Signed-off-by: Daniel Axtens <dja at axtens.net>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 526d65d8573a..383889fe771f 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2858,6 +2858,7 @@
 					       mds=off [X86]
 					       tsx_async_abort=off [X86]
 					       kvm.nx_huge_pages=off [X86]
+					       no_entry_flush [PPC]
 
 				Exceptions:
 					       This does not have any effect on
@@ -3186,6 +3187,8 @@
 
 	noefi		Disable EFI runtime services support.
 
+	no_entry_flush  [PPC] Don't flush the L1-D cache when entering the kernel.
+
 	noexec		[IA-64]
 
 	noexec		[X86]
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index ebe95aa04d53..83fa88bc9935 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -57,11 +57,18 @@
 	nop;								\
 	nop
 
+#define ENTRY_FLUSH_SLOT						\
+	ENTRY_FLUSH_FIXUP_SECTION;					\
+	nop;								\
+	nop;								\
+	nop;
+
 /*
  * r10 must be free to use, r13 must be paca
  */
 #define INTERRUPT_TO_KERNEL						\
-	STF_ENTRY_BARRIER_SLOT
+	STF_ENTRY_BARRIER_SLOT;						\
+	ENTRY_FLUSH_SLOT
 
 /*
  * Macros for annotating the expected destination of (h)rfid
diff --git a/arch/powerpc/include/asm/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h
index b0af97add751..06a48219bbf2 100644
--- a/arch/powerpc/include/asm/feature-fixups.h
+++ b/arch/powerpc/include/asm/feature-fixups.h
@@ -205,6 +205,14 @@ label##3:					       	\
 	FTR_ENTRY_OFFSET 955b-956b;			\
 	.popsection;
 
+#define ENTRY_FLUSH_FIXUP_SECTION			\
+957:							\
+	.pushsection __entry_flush_fixup,"a";		\
+	.align 2;					\
+958:							\
+	FTR_ENTRY_OFFSET 957b-958b;			\
+	.popsection;
+
 #define RFI_FLUSH_FIXUP_SECTION				\
 951:							\
 	.pushsection __rfi_flush_fixup,"a";		\
@@ -237,8 +245,10 @@ label##3:					       	\
 #include <linux/types.h>
 
 extern long stf_barrier_fallback;
+extern long entry_flush_fallback;
 extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
 extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
+extern long __start___entry_flush_fixup, __stop___entry_flush_fixup;
 extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
 extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
 extern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
diff --git a/arch/powerpc/include/asm/security_features.h b/arch/powerpc/include/asm/security_features.h
index fbb8fa32150f..9e7459d2edca 100644
--- a/arch/powerpc/include/asm/security_features.h
+++ b/arch/powerpc/include/asm/security_features.h
@@ -86,12 +86,16 @@ static inline bool security_ftr_enabled(u64 feature)
 // Software required to flush link stack on context switch
 #define SEC_FTR_FLUSH_LINK_STACK	0x0000000000001000ull
 
+// The L1-D cache should be flushed when entering the kernel
+#define SEC_FTR_L1D_FLUSH_ENTRY		0x0000000000004000ull
+
 
 // Features enabled by default
 #define SEC_FTR_DEFAULT \
 	(SEC_FTR_L1D_FLUSH_HV | \
 	 SEC_FTR_L1D_FLUSH_PR | \
 	 SEC_FTR_BNDS_CHK_SPEC_BAR | \
+	 SEC_FTR_L1D_FLUSH_ENTRY | \
 	 SEC_FTR_FAVOUR_SECURITY)
 
 #endif /* _ASM_POWERPC_SECURITY_FEATURES_H */
diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h
index 9efbddee2bca..e2fcd3e874f8 100644
--- a/arch/powerpc/include/asm/setup.h
+++ b/arch/powerpc/include/asm/setup.h
@@ -52,12 +52,15 @@ enum l1d_flush_type {
 };
 
 void setup_rfi_flush(enum l1d_flush_type, bool enable);
+void setup_entry_flush(bool enable);
+void setup_uaccess_flush(bool enable);
 void do_rfi_flush_fixups(enum l1d_flush_type types);
 #ifdef CONFIG_PPC_BARRIER_NOSPEC
 void setup_barrier_nospec(void);
 #else
 static inline void setup_barrier_nospec(void) { };
 #endif
+void do_entry_flush_fixups(enum l1d_flush_type types);
 void do_barrier_nospec_fixups(bool enable);
 extern bool barrier_nospec_enabled;
 
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index f7d748b88705..5577dd887d37 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -2951,6 +2951,43 @@ TRAMP_REAL_BEGIN(stf_barrier_fallback)
 	.endr
 	blr
 
+TRAMP_REAL_BEGIN(entry_flush_fallback)
+	std	r9,PACA_EXRFI+EX_R9(r13)
+	std	r10,PACA_EXRFI+EX_R10(r13)
+	std	r11,PACA_EXRFI+EX_R11(r13)
+	mfctr	r9
+	ld	r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
+	ld	r11,PACA_L1D_FLUSH_SIZE(r13)
+	srdi	r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
+	mtctr	r11
+	DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
+
+	/* order ld/st prior to dcbt stop all streams with flushing */
+	sync
+
+	/*
+	 * The load addresses are at staggered offsets within cachelines,
+	 * which suits some pipelines better (on others it should not
+	 * hurt).
+	 */
+1:
+	ld	r11,(0x80 + 8)*0(r10)
+	ld	r11,(0x80 + 8)*1(r10)
+	ld	r11,(0x80 + 8)*2(r10)
+	ld	r11,(0x80 + 8)*3(r10)
+	ld	r11,(0x80 + 8)*4(r10)
+	ld	r11,(0x80 + 8)*5(r10)
+	ld	r11,(0x80 + 8)*6(r10)
+	ld	r11,(0x80 + 8)*7(r10)
+	addi	r10,r10,0x80*8
+	bdnz	1b
+
+	mtctr	r9
+	ld	r9,PACA_EXRFI+EX_R9(r13)
+	ld	r10,PACA_EXRFI+EX_R10(r13)
+	ld	r11,PACA_EXRFI+EX_R11(r13)
+	blr
+
 TRAMP_REAL_BEGIN(rfi_flush_fallback)
 	SET_SCRATCH0(r13);
 	GET_PACA(r13);
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index bb9cab3641d7..7d447b43ad13 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -945,7 +945,9 @@ early_initcall(disable_hardlockup_detector);
 static enum l1d_flush_type enabled_flush_types;
 static void *l1d_flush_fallback_area;
 static bool no_rfi_flush;
+static bool no_entry_flush;
 bool rfi_flush;
+bool entry_flush;
 
 static int __init handle_no_rfi_flush(char *p)
 {
@@ -955,6 +957,14 @@ static int __init handle_no_rfi_flush(char *p)
 }
 early_param("no_rfi_flush", handle_no_rfi_flush);
 
+static int __init handle_no_entry_flush(char *p)
+{
+	pr_info("entry-flush: disabled on command line.");
+	no_entry_flush = true;
+	return 0;
+}
+early_param("no_entry_flush", handle_no_entry_flush);
+
 /*
  * The RFI flush is not KPTI, but because users will see doco that says to use
  * nopti we hijack that option here to also disable the RFI flush.
@@ -986,6 +996,18 @@ void rfi_flush_enable(bool enable)
 	rfi_flush = enable;
 }
 
+void entry_flush_enable(bool enable)
+{
+	if (enable) {
+		do_entry_flush_fixups(enabled_flush_types);
+		on_each_cpu(do_nothing, NULL, 1);
+	} else {
+		do_entry_flush_fixups(L1D_FLUSH_NONE);
+	}
+
+	entry_flush = enable;
+}
+
 static void __ref init_fallback_flush(void)
 {
 	u64 l1d_size, limit;
@@ -1044,10 +1066,19 @@ void setup_rfi_flush(enum l1d_flush_type types, bool enable)
 
 	enabled_flush_types = types;
 
-	if (!no_rfi_flush && !cpu_mitigations_off())
+	if (!cpu_mitigations_off() && !no_rfi_flush)
 		rfi_flush_enable(enable);
 }
 
+void setup_entry_flush(bool enable)
+{
+	if (cpu_mitigations_off())
+		return;
+
+	if (!no_entry_flush)
+		entry_flush_enable(enable);
+}
+
 #ifdef CONFIG_DEBUG_FS
 static int rfi_flush_set(void *data, u64 val)
 {
@@ -1075,9 +1106,36 @@ static int rfi_flush_get(void *data, u64 *val)
 
 DEFINE_SIMPLE_ATTRIBUTE(fops_rfi_flush, rfi_flush_get, rfi_flush_set, "%llu\n");
 
+static int entry_flush_set(void *data, u64 val)
+{
+	bool enable;
+
+	if (val == 1)
+		enable = true;
+	else if (val == 0)
+		enable = false;
+	else
+		return -EINVAL;
+
+	/* Only do anything if we're changing state */
+	if (enable != entry_flush)
+		entry_flush_enable(enable);
+
+	return 0;
+}
+
+static int entry_flush_get(void *data, u64 *val)
+{
+	*val = entry_flush ? 1 : 0;
+	return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(fops_entry_flush, entry_flush_get, entry_flush_set, "%llu\n");
+
 static __init int rfi_flush_debugfs_init(void)
 {
 	debugfs_create_file("rfi_flush", 0600, powerpc_debugfs_root, NULL, &fops_rfi_flush);
+	debugfs_create_file("entry_flush", 0600, powerpc_debugfs_root, NULL, &fops_entry_flush);
 	return 0;
 }
 device_initcall(rfi_flush_debugfs_init);
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index e0548b4950de..715ec4d4614a 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -131,6 +131,13 @@ SECTIONS
 		__stop___stf_entry_barrier_fixup = .;
 	}
 
+	. = ALIGN(8);
+	__entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) {
+		__start___entry_flush_fixup = .;
+		*(__entry_flush_fixup)
+		__stop___entry_flush_fixup = .;
+	}
+
 	. = ALIGN(8);
 	__stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
 		__start___stf_exit_barrier_fixup = .;
diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
index 4c0a7ee9fa00..70e83cfd74aa 100644
--- a/arch/powerpc/lib/feature-fixups.c
+++ b/arch/powerpc/lib/feature-fixups.c
@@ -234,6 +234,60 @@ void do_stf_barrier_fixups(enum stf_barrier_type types)
 	do_stf_exit_barrier_fixups(types);
 }
 
+void do_entry_flush_fixups(enum l1d_flush_type types)
+{
+	unsigned int instrs[3], *dest;
+	long *start, *end;
+	int i;
+
+	start = PTRRELOC(&__start___entry_flush_fixup);
+	end = PTRRELOC(&__stop___entry_flush_fixup);
+
+	instrs[0] = 0x60000000; /* nop */
+	instrs[1] = 0x60000000; /* nop */
+	instrs[2] = 0x60000000; /* nop */
+
+	i = 0;
+	if (types == L1D_FLUSH_FALLBACK) {
+		instrs[i++] = 0x7d4802a6; /* mflr r10		*/
+		instrs[i++] = 0x60000000; /* branch patched below */
+		instrs[i++] = 0x7d4803a6; /* mtlr r10		*/
+	}
+
+	if (types & L1D_FLUSH_ORI) {
+		instrs[i++] = 0x63ff0000; /* ori 31,31,0 speculation barrier */
+		instrs[i++] = 0x63de0000; /* ori 30,30,0 L1d flush*/
+	}
+
+	if (types & L1D_FLUSH_MTTRIG)
+		instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */
+
+	for (i = 0; start < end; start++, i++) {
+		dest = (void *)start + *start;
+
+		pr_devel("patching dest %lx\n", (unsigned long)dest);
+
+		patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+
+		if (types == L1D_FLUSH_FALLBACK)
+			patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&entry_flush_fallback,
+				     BRANCH_SET_LINK);
+		else
+			patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
+
+		patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+	}
+
+	printk(KERN_DEBUG "entry-flush: patched %d locations (%s flush)\n", i,
+		(types == L1D_FLUSH_NONE)       ? "no" :
+		(types == L1D_FLUSH_FALLBACK)   ? "fallback displacement" :
+		(types &  L1D_FLUSH_ORI)        ? (types & L1D_FLUSH_MTTRIG)
+							? "ori+mttrig type"
+							: "ori type" :
+		(types &  L1D_FLUSH_MTTRIG)     ? "mttrig type"
+						: "unknown");
+}
+
 void do_rfi_flush_fixups(enum l1d_flush_type types)
 {
 	unsigned int instrs[3], *dest;
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
index 9acaa0f131b9..d04a085c423d 100644
--- a/arch/powerpc/platforms/powernv/setup.c
+++ b/arch/powerpc/platforms/powernv/setup.c
@@ -122,12 +122,23 @@ static void pnv_setup_rfi_flush(void)
 			type = L1D_FLUSH_ORI;
 	}
 
+	/*
+	 * If we are non-Power9 bare metal, we don't need to flush on kernel
+	 * entry: it fixes a P9 specific vulnerability.
+	 */
+	if (!pvr_version_is(PVR_POWER9))
+		security_ftr_clear(SEC_FTR_L1D_FLUSH_ENTRY);
+
 	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) && \
 		 (security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR)   || \
 		  security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV));
 
 	setup_rfi_flush(type, enable);
 	setup_count_cache_flush();
+
+	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
+		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_ENTRY);
+	setup_entry_flush(enable);
 }
 
 static void __init pnv_check_guarded_cores(void)
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 633c45ec406d..8136c5368ee4 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -579,6 +579,10 @@ void pseries_setup_rfi_flush(void)
 
 	setup_rfi_flush(types, enable);
 	setup_count_cache_flush();
+
+	enable = security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) &&
+		 security_ftr_enabled(SEC_FTR_L1D_FLUSH_ENTRY);
+	setup_entry_flush(enable);
 }
 
 #ifdef CONFIG_PCI_IOV
commit fcb48454c23c5679d1a2e252f127642e91b05cbe
Author: Russell Currey <ruscur at russell.cc>
Date:   Tue Nov 17 16:59:11 2020 +1100

    selftests/powerpc: rfi_flush: disable entry flush if present
    
    We are about to add an entry flush. The rfi (exit) flush test measures
    the number of L1D flushes over a syscall with the RFI flush enabled and
    disabled. But if the entry flush is also enabled, the effect of enabling
    and disabling the RFI flush is masked.
    
    If there is a debugfs entry for the entry flush, disable it during the RFI
    flush and restore it later.
    
    Reported-by: Spoorthy S <spoorts2 at in.ibm.com>
    Signed-off-by: Russell Currey <ruscur at russell.cc>
    Signed-off-by: Daniel Axtens <dja at axtens.net>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

diff --git a/tools/testing/selftests/powerpc/security/rfi_flush.c b/tools/testing/selftests/powerpc/security/rfi_flush.c
index 93a65bd1f231..4e7b2776c367 100644
--- a/tools/testing/selftests/powerpc/security/rfi_flush.c
+++ b/tools/testing/selftests/powerpc/security/rfi_flush.c
@@ -85,19 +85,33 @@ int rfi_flush_test(void)
 	__u64 l1d_misses_total = 0;
 	unsigned long iterations = 100000, zero_size = 24 * 1024;
 	unsigned long l1d_misses_expected;
-	int rfi_flush_org, rfi_flush;
+	int rfi_flush_orig, rfi_flush;
+	int have_entry_flush, entry_flush_orig;
 
 	SKIP_IF(geteuid() != 0);
 
 	// The PMU event we use only works on Power7 or later
 	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
 
-	if (read_debugfs_file("powerpc/rfi_flush", &rfi_flush_org)) {
+	if (read_debugfs_file("powerpc/rfi_flush", &rfi_flush_orig) < 0) {
 		perror("Unable to read powerpc/rfi_flush debugfs file");
 		SKIP_IF(1);
 	}
 
-	rfi_flush = rfi_flush_org;
+	if (read_debugfs_file("powerpc/entry_flush", &entry_flush_orig) < 0) {
+		have_entry_flush = 0;
+	} else {
+		have_entry_flush = 1;
+
+		if (entry_flush_orig != 0) {
+			if (write_debugfs_file("powerpc/entry_flush", 0) < 0) {
+				perror("error writing to powerpc/entry_flush debugfs file");
+				return 1;
+			}
+		}
+	}
+
+	rfi_flush = rfi_flush_orig;
 
 	fd = perf_event_open_counter(PERF_TYPE_RAW, /* L1d miss */ 0x400f0, -1);
 	FAIL_IF(fd < 0);
@@ -106,6 +120,7 @@ int rfi_flush_test(void)
 
 	FAIL_IF(perf_event_enable(fd));
 
+	// disable L1 prefetching
 	set_dscr(1);
 
 	iter = repetitions;
@@ -147,8 +162,8 @@ again:
 		       repetitions * l1d_misses_expected / 2,
 		       passes, repetitions);
 
-	if (rfi_flush == rfi_flush_org) {
-		rfi_flush = !rfi_flush_org;
+	if (rfi_flush == rfi_flush_orig) {
+		rfi_flush = !rfi_flush_orig;
 		if (write_debugfs_file("powerpc/rfi_flush", rfi_flush) < 0) {
 			perror("error writing to powerpc/rfi_flush debugfs file");
 			return 1;
@@ -164,11 +179,19 @@ again:
 
 	set_dscr(0);
 
-	if (write_debugfs_file("powerpc/rfi_flush", rfi_flush_org) < 0) {
+	if (write_debugfs_file("powerpc/rfi_flush", rfi_flush_orig) < 0) {
 		perror("unable to restore original value of powerpc/rfi_flush debugfs file");
 		return 1;
 	}
 
+	if (have_entry_flush) {
+		if (write_debugfs_file("powerpc/entry_flush", entry_flush_orig) < 0) {
+			perror("unable to restore original value of powerpc/entry_flush "
+			       "debugfs file");
+			return 1;
+		}
+	}
+
 	return rc;
 }
 
commit 3e3e59ef0cbe9bfbe8e55c4c8165dd98148decf2
Author: Christian König <christian.koenig at amd.com>
Date:   Tue Nov 17 16:50:45 2020 +0100

    drm/ttm: fix DMA32 handling in the global page pool
    
    When we have mixed DMA32 and non DMA32 device in one system
    it could otherwise happen that the DMA32 device gets pages
    it can't work with.
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Reviewed-by: Huang Rui <ray.huang at amd.com>
    Link: https://patchwork.freedesktop.org/patch/401317/

diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index 1b96780b4989..5455b2044759 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -63,6 +63,9 @@ static atomic_long_t allocated_pages;
 static struct ttm_pool_type global_write_combined[MAX_ORDER];
 static struct ttm_pool_type global_uncached[MAX_ORDER];
 
+static struct ttm_pool_type global_dma32_write_combined[MAX_ORDER];
+static struct ttm_pool_type global_dma32_uncached[MAX_ORDER];
+
 static spinlock_t shrinker_lock;
 static struct list_head shrinker_list;
 static struct shrinker mm_shrinker;
@@ -290,8 +293,14 @@ static struct ttm_pool_type *ttm_pool_select_type(struct ttm_pool *pool,
 #ifdef CONFIG_X86
 	switch (caching) {
 	case ttm_write_combined:
+		if (pool->use_dma32)
+			return &global_dma32_write_combined[order];
+
 		return &global_write_combined[order];
 	case ttm_uncached:
+		if (pool->use_dma32)
+			return &global_dma32_uncached[order];
+
 		return &global_uncached[order];
 	default:
 		break;
@@ -570,6 +579,11 @@ int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m)
 	seq_puts(m, "uc\t:");
 	ttm_pool_debugfs_orders(global_uncached, m);
 
+	seq_puts(m, "wc 32\t:");
+	ttm_pool_debugfs_orders(global_dma32_write_combined, m);
+	seq_puts(m, "uc 32\t:");
+	ttm_pool_debugfs_orders(global_dma32_uncached, m);
+
 	for (i = 0; i < TTM_NUM_CACHING_TYPES; ++i) {
 		seq_puts(m, "DMA ");
 		switch (i) {
@@ -640,6 +654,11 @@ int ttm_pool_mgr_init(unsigned long num_pages)
 		ttm_pool_type_init(&global_write_combined[i], NULL,
 				   ttm_write_combined, i);
 		ttm_pool_type_init(&global_uncached[i], NULL, ttm_uncached, i);
+
+		ttm_pool_type_init(&global_dma32_write_combined[i], NULL,
+				   ttm_write_combined, i);
+		ttm_pool_type_init(&global_dma32_uncached[i], NULL,
+				   ttm_uncached, i);
 	}
 
 	mm_shrinker.count_objects = ttm_pool_shrinker_count;
@@ -660,6 +679,9 @@ void ttm_pool_mgr_fini(void)
 	for (i = 0; i < MAX_ORDER; ++i) {
 		ttm_pool_type_fini(&global_write_combined[i]);
 		ttm_pool_type_fini(&global_uncached[i]);
+
+		ttm_pool_type_fini(&global_dma32_write_combined[i]);
+		ttm_pool_type_fini(&global_dma32_uncached[i]);
 	}
 
 	unregister_shrinker(&mm_shrinker);
commit 551310e7356cb8af4eb4c618961ad1e7b2f89e19
Author: Takashi Iwai <tiwai at suse.de>
Date:   Thu Nov 19 13:04:04 2020 +0100

    ALSA: hda/ca0132: Fix compile warning without PCI
    
    CONFIG_PCI=n leads to a compile warning like:
      sound/pci/hda/patch_ca0132.c:8214:10: warning: no case matching constant switch condition '0'
    due to the missed handling of QUIRK_NONE in ca0132_mmio_init().
    Fix it.
    
    Fixes: bf2aa9ccc8e5 ("ALSA: hda/ca0132 - Cleanup ca0132_mmio_init function.")
    Reported-by: kernel test robot <lkp at intel.com>
    Link: https://lore.kernel.org/r/20201119120404.16833-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c
index e0c38f2735c6..d8370a417e3d 100644
--- a/sound/pci/hda/patch_ca0132.c
+++ b/sound/pci/hda/patch_ca0132.c
@@ -9183,6 +9183,8 @@ static void ca0132_mmio_init(struct hda_codec *codec)
 	case QUIRK_AE5:
 		ca0132_mmio_init_ae5(codec);
 		break;
+	default:
+		break;
 	}
 }
 
commit 91c2c28d8de34815ea9bb4d16e9db7308ad33d3e
Author: Will Deacon <will at kernel.org>
Date:   Thu Nov 19 11:12:17 2020 +0000

    MAINTAINERS: Temporarily add myself to the IOMMU entry
    
    Joerg is recovering from an injury, so temporarily add myself to the
    IOMMU MAINTAINERS entry so that I'm more likely to get CC'd on patches
    while I help to look after the tree for him.
    
    Suggested-by: Joerg Roedel <joro at 8bytes.org>
    Link: https://lore.kernel.org/r/20201117100953.GR22888@8bytes.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index 3da6d8c154e4..9f60b7a25136 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9171,6 +9171,7 @@ F:	include/linux/iomap.h
 
 IOMMU DRIVERS
 M:	Joerg Roedel <joro at 8bytes.org>
+M:	Will Deacon <will at kernel.org>
 L:	iommu at lists.linux-foundation.org
 S:	Maintained
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
commit 3645a34f5b962aeedeb02f30cdf048eaae9b5f5c
Author: Lu Baolu <baolu.lu at linux.intel.com>
Date:   Thu Nov 19 13:51:19 2020 +0800

    iommu/vt-d: Fix compile error with CONFIG_PCI_ATS not set
    
    Fix the compile error below (CONFIG_PCI_ATS not set):
    
    drivers/iommu/intel/dmar.c: In function ‘vf_inherit_msi_domain’:
    drivers/iommu/intel/dmar.c:338:59: error: ‘struct pci_dev’ has no member named ‘physfn’; did you mean ‘is_physfn’?
      338 |  dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&pdev->physfn->dev));
          |                                                           ^~~~~~
          |                                                           is_physfn
    
    Fixes: ff828729be44 ("iommu/vt-d: Cure VF irqdomain hickup")
    Reported-by: Geert Uytterhoeven <geert at linux-m68k.org>
    Signed-off-by: Lu Baolu <baolu.lu at linux.intel.com>
    Cc: Thomas Gleixner <tglx at linutronix.de>
    Link: https://lore.kernel.org/linux-iommu/CAMuHMdXA7wfJovmfSH2nbAhN0cPyCiFHodTvg4a8Hm9rx5Dj-w@mail.gmail.com/
    Link: https://lore.kernel.org/r/20201119055119.2862701-1-baolu.lu@linux.intel.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index b2e804473209..11319e4dce4a 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -335,7 +335,9 @@ static void  dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
 
 static inline void vf_inherit_msi_domain(struct pci_dev *pdev)
 {
-	dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&pdev->physfn->dev));
+	struct pci_dev *physfn = pci_physfn(pdev);
+
+	dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&physfn->dev));
 }
 
 static int dmar_pci_bus_notifier(struct notifier_block *nb,
commit 388255ce95cfe456409efd9a8a2ab7be41dd422c
Merge: 4d213e76a359 ff828729be44
Author: Will Deacon <will at kernel.org>
Date:   Thu Nov 19 09:46:58 2020 +0000

    Merge tag 'x86-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into for-next/iommu/fixes
    
    Pull in x86 fixes from Thomas, as they include a change to the Intel DMAR
    code on which we depend:
    
    * tag 'x86-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      iommu/vt-d: Cure VF irqdomain hickup
      x86/platform/uv: Fix copied UV5 output archtype
      x86/platform/uv: Drop last traces of uv_flush_tlb_others

commit 05d5de6ba7dbe490dd413b5ca11d0875bd2bc006
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Nov 11 15:12:11 2020 +0100

    ARM: dts: dra76x: m_can: fix order of clocks
    
    According to the bosch,m_can.yaml bindings the first clock shall be the "hclk",
    while the second clock "cclk".
    
    This patch fixes the order accordingly.
    
    Fixes: 0adbe832f21a ("ARM: dts: dra76x: Add MCAN node")
    Cc: Faiz Abbas <faiz_abbas at ti.com>
    Cc: Tony Lindgren <tony at atomide.com>
    Cc: linux-omap at vger.kernel.org
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/arch/arm/boot/dts/dra76x.dtsi b/arch/arm/boot/dts/dra76x.dtsi
index b69c7d40f5d8..2f326151116b 100644
--- a/arch/arm/boot/dts/dra76x.dtsi
+++ b/arch/arm/boot/dts/dra76x.dtsi
@@ -32,8 +32,8 @@
 				interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
 					     <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
 				interrupt-names = "int0", "int1";
-				clocks = <&mcan_clk>, <&l3_iclk_div>;
-				clock-names = "cclk", "hclk";
+				clocks = <&l3_iclk_div>, <&mcan_clk>;
+				clock-names = "hclk", "cclk";
 				bosch,mram-cfg = <0x0 0 0 32 0 0 1 1>;
 			};
 		};
commit 295992fb815e791d14b18ef7cdbbaf1a76211a31
Author: Christian König <christian.koenig at amd.com>
Date:   Mon Sep 14 15:09:33 2020 +0200

    mm: introduce vma_set_file function v5
    
    Add the new vma_set_file() function to allow changing
    vma->vm_file with the necessary refcount dance.
    
    v2: add more users of this.
    v3: add missing EXPORT_SYMBOL, rebase on mmap cleanup,
        add comments why we drop the reference on two occasions.
    v4: make it clear that changing an anonymous vma is illegal.
    v5: move vma_set_file to mm/util.c
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch> (v2)
    Reviewed-by: Jason Gunthorpe <jgg at nvidia.com>
    Acked-by: Andrew Morton <akpm at linux-foundation.org>
    Link: https://patchwork.freedesktop.org/patch/399360/

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 282bd8b84170..e63684d4cd90 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -1183,8 +1183,7 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
 		return -EINVAL;
 
 	/* readjust the vma */
-	fput(vma->vm_file);
-	vma->vm_file = get_file(dmabuf->file);
+	vma_set_file(vma, dmabuf->file);
 	vma->vm_pgoff = pgoff;
 
 	return dmabuf->ops->mmap(dmabuf, vma);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index bbd235473645..6d38c5c17f23 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -145,10 +145,8 @@ static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
 		 * address_space (so unmap_mapping_range does what we want,
 		 * in particular in the case of mmap'd dmabufs)
 		 */
-		fput(vma->vm_file);
-		get_file(etnaviv_obj->base.filp);
 		vma->vm_pgoff = 0;
-		vma->vm_file  = etnaviv_obj->base.filp;
+		vma_set_file(vma, etnaviv_obj->base.filp);
 
 		vma->vm_page_prot = vm_page_prot;
 	}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index 0dd477e56573..04e9c04545ad 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -114,8 +114,7 @@ static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *
 	if (ret)
 		return ret;
 
-	fput(vma->vm_file);
-	vma->vm_file = get_file(obj->base.filp);
+	vma_set_file(vma, obj->base.filp);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 3d69e51f3e4d..ec28a6cde49b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -893,8 +893,9 @@ int i915_gem_mmap(struct file *filp, struct vm_area_struct *vma)
 	 * requires avoiding extraneous references to their filp, hence why
 	 * we prefer to use an anonymous file for their mmaps.
 	 */
-	fput(vma->vm_file);
-	vma->vm_file = anon;
+	vma_set_file(vma, anon);
+	/* Drop the initial creation reference, the vma is now holding one. */
+	fput(anon);
 
 	switch (mmo->mmap_type) {
 	case I915_MMAP_TYPE_WC:
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 2e1bce7c0b19..311721ceee50 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -212,10 +212,8 @@ int msm_gem_mmap_obj(struct drm_gem_object *obj,
 		 * address_space (so unmap_mapping_range does what we want,
 		 * in particular in the case of mmap'd dmabufs)
 		 */
-		fput(vma->vm_file);
-		get_file(obj->filp);
 		vma->vm_pgoff = 0;
-		vma->vm_file  = obj->filp;
+		vma_set_file(vma, obj->filp);
 
 		vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
 	}
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
index 68c271f4250b..30d299ca8795 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -564,9 +564,8 @@ int omap_gem_mmap_obj(struct drm_gem_object *obj,
 		 * address_space (so unmap_mapping_range does what we want,
 		 * in particular in the case of mmap'd dmabufs)
 		 */
-		fput(vma->vm_file);
 		vma->vm_pgoff = 0;
-		vma->vm_file  = get_file(obj->filp);
+		vma_set_file(vma, obj->filp);
 
 		vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
 	}
diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c
index 9a413091abb6..f8635ccaf9a1 100644
--- a/drivers/gpu/drm/vgem/vgem_drv.c
+++ b/drivers/gpu/drm/vgem/vgem_drv.c
@@ -403,8 +403,7 @@ static int vgem_prime_mmap(struct drm_gem_object *obj,
 	if (ret)
 		return ret;
 
-	fput(vma->vm_file);
-	vma->vm_file = get_file(obj->filp);
+	vma_set_file(vma, obj->filp);
 	vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
 	vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
 
diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
index 10b4be1f3e78..4789d36ddfd3 100644
--- a/drivers/staging/android/ashmem.c
+++ b/drivers/staging/android/ashmem.c
@@ -450,9 +450,9 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
 		vma_set_anonymous(vma);
 	}
 
-	if (vma->vm_file)
-		fput(vma->vm_file);
-	vma->vm_file = asma->file;
+	vma_set_file(vma, asma->file);
+	/* XXX: merge this with the get_file() above if possible */
+	fput(asma->file);
 
 out:
 	mutex_unlock(&ashmem_mutex);
diff --git a/include/linux/mm.h b/include/linux/mm.h
index db6ae4d3fb4e..47bff16c182d 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2719,6 +2719,8 @@ static inline void vma_set_page_prot(struct vm_area_struct *vma)
 }
 #endif
 
+void vma_set_file(struct vm_area_struct *vma, struct file *file);
+
 #ifdef CONFIG_NUMA_BALANCING
 unsigned long change_prot_numa(struct vm_area_struct *vma,
 			unsigned long start, unsigned long end);
diff --git a/mm/util.c b/mm/util.c
index 4ddb6e186dd5..8c9b7d1e7c49 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -311,6 +311,18 @@ int vma_is_stack_for_current(struct vm_area_struct *vma)
 	return (vma->vm_start <= KSTK_ESP(t) && vma->vm_end >= KSTK_ESP(t));
 }
 
+/*
+ * Change backing file, only valid to use during initial VMA setup.
+ */
+void vma_set_file(struct vm_area_struct *vma, struct file *file)
+{
+	/* Changing an anonymous vma with this is illegal */
+	get_file(file);
+	swap(vma->vm_file, file);
+	fput(file);
+}
+EXPORT_SYMBOL(vma_set_file);
+
 #ifndef STACK_RND_MASK
 #define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12))     /* 8MB of VA */
 #endif
commit 1527f926fd04490f648c42f42b45218a04754f87
Author: Christian König <christian.koenig at amd.com>
Date:   Fri Oct 9 15:08:55 2020 +0200

    mm: mmap: fix fput in error path v2
    
    Patch "495c10cc1c0c CHROMIUM: dma-buf: restore args..."
    adds a workaround for a bug in mmap_region.
    
    As the comment states ->mmap() callback can change
    vma->vm_file and so we might call fput() on the wrong file.
    
    Revert the workaround and proper fix this in mmap_region.
    
    v2: drop the extra if in dma_buf_mmap as well
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Reviewed-by: Jason Gunthorpe <jgg at nvidia.com>
    Acked-by: Andrew Morton <akpm at linux-foundation.org>
    Link: https://patchwork.freedesktop.org/patch/399359/

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 0eb80c1ecdab..282bd8b84170 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -1166,9 +1166,6 @@ EXPORT_SYMBOL_GPL(dma_buf_end_cpu_access);
 int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
 		 unsigned long pgoff)
 {
-	struct file *oldfile;
-	int ret;
-
 	if (WARN_ON(!dmabuf || !vma))
 		return -EINVAL;
 
@@ -1186,22 +1183,11 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
 		return -EINVAL;
 
 	/* readjust the vma */
-	get_file(dmabuf->file);
-	oldfile = vma->vm_file;
-	vma->vm_file = dmabuf->file;
+	fput(vma->vm_file);
+	vma->vm_file = get_file(dmabuf->file);
 	vma->vm_pgoff = pgoff;
 
-	ret = dmabuf->ops->mmap(dmabuf, vma);
-	if (ret) {
-		/* restore old parameters on failure */
-		vma->vm_file = oldfile;
-		fput(dmabuf->file);
-	} else {
-		if (oldfile)
-			fput(oldfile);
-	}
-	return ret;
-
+	return dmabuf->ops->mmap(dmabuf, vma);
 }
 EXPORT_SYMBOL_GPL(dma_buf_mmap);
 
diff --git a/mm/mmap.c b/mm/mmap.c
index d91ecb00d38c..30a4e8412a58 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1899,8 +1899,8 @@ out:
 	return addr;
 
 unmap_and_free_vma:
+	fput(vma->vm_file);
 	vma->vm_file = NULL;
-	fput(file);
 
 	/* Undo any partial mapping done by a device driver. */
 	unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end);
commit 65fb73676112f6fd107c5e542b2cbcfb206fe881
Author: Grygorii Strashko <grygorii.strashko at ti.com>
Date:   Wed Nov 18 16:19:00 2020 +0200

    bus: ti-sysc: suppress err msg for timers used as clockevent/source
    
    GP Timers used as clockevent/source are not available for ti-sysc bus and
    handled by Kernel timekeeping core. Now ti-sysc produces error message
    every time such timer is detected:
    
     "ti-sysc: probe of 48040000.target-module failed with error -16"
    
    Such messages are not necessary, so suppress them by returning -ENXIO
    instead of -EBUSY.
    
    Fixes: 6cfcd5563b4f ("clocksource/drivers/timer-ti-dm: Fix suspend and resume for am3 and am4")
    Signed-off-by: Grygorii Strashko <grygorii.strashko at ti.com>
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
index 16132e6e91f8..92ecf1a78ec7 100644
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -2889,7 +2889,7 @@ static int sysc_check_active_timer(struct sysc *ddata)
 
 	if ((ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) &&
 	    (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE))
-		return -EBUSY;
+		return -ENXIO;
 
 	return 0;
 }
commit cdf117d6d38a127026e74114d63f32972f620c06
Merge: 6654b57866b9 957a1ea35992
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Thu Nov 19 09:26:06 2020 +0100

    Merge tag 'drm/sun4i-dma-fix-pull-request' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mripard/linux into drm-misc-fixes
    
    Fix for drm/sun4i shared with arm-soc
    
    This patch is a preliminary fix that will conflict with subsequent work merged
    through arm-soc.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    
    # gpg: Signature made Wed 18 Nov 2020 09:51:53 AM CET
    # gpg:                using EDDSA key 5C1337A45ECA9AEB89060E9EE3EF0D6F671851C5
    # gpg: Good signature from "Maxime Ripard <maxime.ripard at anandra.org>" [unknown]
    # gpg:                 aka "Maxime Ripard <mripard at kernel.org>" [unknown]
    # gpg:                 aka "Maxime Ripard (Work Address) <maxime.ripard at bootlin.com>" [unknown]
    # gpg:                 aka "Maxime Ripard (Work Address) <maxime at bootlin.com>" [unknown]
    # gpg: WARNING: This key is not certified with a trusted signature!
    # gpg:          There is no indication that the signature belongs to the owner.
    # Primary key fingerprint: BE56 75C3 7E81 8C8B 5764  241C 254B CFC5 6BF6 CE8D
    #      Subkey fingerprint: 5C13 37A4 5ECA 9AEB 8906  0E9E E3EF 0D6F 6718 51C5
    From: Maxime Ripard <maxime at cerno.tech>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201118090455.sznrgpduuytlc22k@gilmour.lan

commit 3ce8d49ca199014ae91d6089ae0979402b8262c0
Merge: b4ca4354b42e 4ec2b69da5e1
Author: Rodrigo Vivi <rodrigo.vivi at intel.com>
Date:   Thu Nov 19 01:52:50 2020 -0500

    Merge tag 'gvt-fixes-2020-11-17' of https://github.com/intel/gvt-linux into drm-intel-fixes
    
    gvt-fixes-2020-11-17
    
    - Temporarily disable VFIO edid on BXT/APL (Colin)
    - Fix emulated DPCD for version 1.2 (Tina)
    - Fix error return when failing to take module reference (Xiongfeng)
    
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
    From: Zhenyu Wang <zhenyuw at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117023918.GB23899@zhen-hp.sh.intel.com

commit b4ca4354b42e59f13365a6901bdc5e729cf4adb4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Nov 18 13:38:39 2020 +0000

    drm/i915/gt: Remember to free the virtual breadcrumbs
    
    Since we allocate some breadcrumbs for the virtual engine, and the
    virtual engine has a custom destructor, we also need to free the
    breadcrumbs after use.
    
    Fixes: b3786b29379c ("drm/i915/gt: Distinguish the virtual breadcrumbs from the irq breadcrumbs")
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201118133839.1783-1-chris@chris-wilson.co.uk
    (cherry picked from commit 45e50f48b7907e650cfbbc7879abfe3a0c419c73)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index f82c6dd1de18..9bb16bdf93cf 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -5457,6 +5457,7 @@ static void virtual_context_destroy(struct kref *kref)
 		__execlists_context_fini(&ve->context);
 	intel_context_fini(&ve->context);
 
+	intel_breadcrumbs_free(ve->base.breadcrumbs);
 	intel_engine_free_request_pool(&ve->base);
 
 	kfree(ve->bonds);
commit d2e3fce9ddafe689c6f7cb355f23560637e30b9d
Author: Ville Syrjälä <ville.syrjala at linux.intel.com>
Date:   Tue Nov 10 23:04:47 2020 +0200

    drm/i915: Handle max_bpc==16
    
    EDID can declare the maximum supported bpc up to 16,
    and apparently there are displays that do so. Currently
    we assume 12 bpc is tha max. Fix the assumption and
    toss in a MISSING_CASE() for any other value we don't
    expect to see.
    
    This fixes modesets with a display with EDID max bpc > 12.
    Previously any modeset would just silently fail on platforms
    that didn't otherwise limit this via the max_bpc property.
    In particular we don't add the max_bpc property to HDMI
    ports on gmch platforms, and thus we would see the raw
    max_bpc coming from the EDID.
    
    I suppose we could already adjust this to also allow 16bpc,
    but seeing as no current platform supports that there is
    little point.
    
    Cc: stable at vger.kernel.org
    Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2632
    Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201110210447.27454-1-ville.syrjala@linux.intel.com
    Reviewed-by: José Roberto de Souza <jose.souza at intel.com>
    (cherry picked from commit 2ca5a7b85b0c2b97ef08afbd7799b022e29f192e)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 31337d2a2cde..99e682563d47 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -12878,10 +12878,11 @@ compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
 	case 10 ... 11:
 		bpp = 10 * 3;
 		break;
-	case 12:
+	case 12 ... 16:
 		bpp = 12 * 3;
 		break;
 	default:
+		MISSING_CASE(conn_state->max_bpc);
 		return -EINVAL;
 	}
 
commit 73cc291c270248567245f084dcdf5078069af6b5
Author: Can Guo <cang at codeaurora.org>
Date:   Tue Sep 22 00:09:04 2020 -0700

    scsi: ufs: Make sure clk scaling happens only when HBA is runtime ACTIVE
    
    If someone plays with the UFS clk scaling devfreq governor through sysfs,
    ufshcd_devfreq_scale may be called even when HBA is not runtime ACTIVE.
    This can lead to unexpected error. We cannot just protect it by calling
    pm_runtime_get_sync() because that may cause a race condition since HBA
    runtime suspend ops need to suspend clk scaling. To fix this call
    pm_runtime_get_noresume() and check HBA's runtime status. Only proceed if
    HBA is runtime ACTIVE, otherwise just bail.
    
    governor_store
     devfreq_performance_handler
      update_devfreq
       devfreq_set_target
        ufshcd_devfreq_target
         ufshcd_devfreq_scale
    
    Link: https://lore.kernel.org/r/1600758548-28576-1-git-send-email-cang@codeaurora.org
    Reviewed-by: Stanley Chu <stanley.chu at mediatek.com>
    Signed-off-by: Can Guo <cang at codeaurora.org>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 180e64dc6f2d..20b16de4c5e2 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1294,8 +1294,15 @@ static int ufshcd_devfreq_target(struct device *dev,
 	}
 	spin_unlock_irqrestore(hba->host->host_lock, irq_flags);
 
+	pm_runtime_get_noresume(hba->dev);
+	if (!pm_runtime_active(hba->dev)) {
+		pm_runtime_put_noidle(hba->dev);
+		ret = -EAGAIN;
+		goto out;
+	}
 	start = ktime_get();
 	ret = ufshcd_devfreq_scale(hba, scale_up);
+	pm_runtime_put(hba->dev);
 
 	trace_ufshcd_profile_clk_scaling(dev_name(hba->dev),
 		(scale_up ? "up" : "down"),
commit 1699f980d87fb678a669490462cf0b9517c1fb47
Author: Can Guo <cang at codeaurora.org>
Date:   Wed Oct 21 22:59:00 2020 -0700

    scsi: ufs: Fix unexpected values from ufshcd_read_desc_param()
    
    WB-related sysfs entries can be accessed even when an UFS device does not
    support the feature. The descriptors which are not supported by the UFS
    device may be wrongly reported when they are accessed from their
    corrsponding sysfs entries. Fix it by adding a sanity check of parameter
    offset against the actual decriptor length.
    
    Link: https://lore.kernel.org/r/1603346348-14149-1-git-send-email-cang@codeaurora.org
    Reviewed-by: Asutosh Das <asutoshd at codeaurora.org>
    Acked-by: Daejun Park <daejun7.park at samsung.com>
    Signed-off-by: Can Guo <cang at codeaurora.org>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 7a160b86adc6..180e64dc6f2d 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -3192,13 +3192,19 @@ int ufshcd_read_desc_param(struct ufs_hba *hba,
 	/* Get the length of descriptor */
 	ufshcd_map_desc_id_to_length(hba, desc_id, &buff_len);
 	if (!buff_len) {
-		dev_err(hba->dev, "%s: Failed to get desc length", __func__);
+		dev_err(hba->dev, "%s: Failed to get desc length\n", __func__);
+		return -EINVAL;
+	}
+
+	if (param_offset >= buff_len) {
+		dev_err(hba->dev, "%s: Invalid offset 0x%x in descriptor IDN 0x%x, length 0x%x\n",
+			__func__, param_offset, desc_id, buff_len);
 		return -EINVAL;
 	}
 
 	/* Check whether we need temp memory */
 	if (param_offset != 0 || param_size < buff_len) {
-		desc_buf = kmalloc(buff_len, GFP_KERNEL);
+		desc_buf = kzalloc(buff_len, GFP_KERNEL);
 		if (!desc_buf)
 			return -ENOMEM;
 	} else {
@@ -3212,14 +3218,14 @@ int ufshcd_read_desc_param(struct ufs_hba *hba,
 					desc_buf, &buff_len);
 
 	if (ret) {
-		dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d",
+		dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d\n",
 			__func__, desc_id, desc_index, param_offset, ret);
 		goto out;
 	}
 
 	/* Sanity check */
 	if (desc_buf[QUERY_DESC_DESC_TYPE_OFFSET] != desc_id) {
-		dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header",
+		dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header\n",
 			__func__, desc_buf[QUERY_DESC_DESC_TYPE_OFFSET]);
 		ret = -EINVAL;
 		goto out;
@@ -3229,12 +3235,12 @@ int ufshcd_read_desc_param(struct ufs_hba *hba,
 	buff_len = desc_buf[QUERY_DESC_LENGTH_OFFSET];
 	ufshcd_update_desc_length(hba, desc_id, desc_index, buff_len);
 
-	/* Check wherher we will not copy more data, than available */
-	if (is_kmalloc && (param_offset + param_size) > buff_len)
-		param_size = buff_len - param_offset;
-
-	if (is_kmalloc)
+	if (is_kmalloc) {
+		/* Make sure we don't copy more data than available */
+		if (param_offset + param_size > buff_len)
+			param_size = buff_len - param_offset;
 		memcpy(param_read_buf, &desc_buf[param_offset], param_size);
+	}
 out:
 	if (is_kmalloc)
 		kfree(desc_buf);
commit f0b0a2d8a1fd4e862f8f5bf8bf449d116264ce5c
Merge: 6d9c8d15af0e a1f634463aaf
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Wed Nov 18 17:49:24 2020 -0800

    Merge tag 'linux-can-fixes-for-5.10-20201118' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
    
    Marc Kleine-Budde says:
    
    ====================
    pull-request: can 2020-11-18
    
    Jimmy Assarsson provides two patches for the kvaser_pciefd and kvaser_usb
    drivers, where the can_bittiming_const are fixed.
    
    The next patch is by me and fixes an erroneous flexcan_transceiver_enable()
    during bus-off recovery in the flexcan driver.
    
    Jarkko Nikula's patch for the m_can driver fixes the IRQ handler to only
    process the interrupts if the device is not suspended.
    
    * tag 'linux-can-fixes-for-5.10-20201118' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
      can: m_can: process interrupt only when not runtime suspended
      can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable() during bus-off recovery
      can: kvaser_usb: kvaser_usb_hydra: Fix KCAN bittiming limits
      can: kvaser_pciefd: Fix KCAN bittiming limits
    ====================
    
    Link: https://lore.kernel.org/r/20201118160414.2731659-1-mkl@pengutronix.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 6d9c8d15af0ef20a66a0b432cac0d08319920602
Author: Aya Levin <ayal at nvidia.com>
Date:   Wed Nov 18 10:19:22 2020 +0200

    net/mlx4_core: Fix init_hca fields offset
    
    Slave function read the following capabilities from the wrong offset:
    1. log_mc_entry_sz
    2. fs_log_entry_sz
    3. log_mc_hash_sz
    
    Fix that by adjusting these capabilities offset to match firmware
    layout.
    
    Due to the wrong offset read, the following issues might occur:
    1+2. Negative value reported at max_mcast_qp_attach.
    3. Driver to init FW with multicast hash size of zero.
    
    Fixes: a40ded604365 ("net/mlx4_core: Add masking for a few queries on HCA caps")
    Signed-off-by: Aya Levin <ayal at nvidia.com>
    Reviewed-by: Moshe Shemesh <moshe at nvidia.com>
    Reviewed-by: Eran Ben Elisha <eranbe at nvidia.com>
    Signed-off-by: Tariq Toukan <tariqt at nvidia.com>
    Link: https://lore.kernel.org/r/20201118081922.553-1-tariqt@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index f6ff9620a137..f6cfec81ccc3 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -1864,8 +1864,8 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
 #define	 INIT_HCA_LOG_RD_OFFSET		 (INIT_HCA_QPC_OFFSET + 0x77)
 #define INIT_HCA_MCAST_OFFSET		 0x0c0
 #define	 INIT_HCA_MC_BASE_OFFSET	 (INIT_HCA_MCAST_OFFSET + 0x00)
-#define	 INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x12)
-#define	 INIT_HCA_LOG_MC_HASH_SZ_OFFSET	 (INIT_HCA_MCAST_OFFSET + 0x16)
+#define	 INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x13)
+#define	 INIT_HCA_LOG_MC_HASH_SZ_OFFSET	 (INIT_HCA_MCAST_OFFSET + 0x17)
 #define  INIT_HCA_UC_STEERING_OFFSET	 (INIT_HCA_MCAST_OFFSET + 0x18)
 #define	 INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b)
 #define  INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN	0x6
@@ -1873,7 +1873,7 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
 #define  INIT_HCA_DRIVER_VERSION_SZ       0x40
 #define  INIT_HCA_FS_PARAM_OFFSET         0x1d0
 #define  INIT_HCA_FS_BASE_OFFSET          (INIT_HCA_FS_PARAM_OFFSET + 0x00)
-#define  INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET  (INIT_HCA_FS_PARAM_OFFSET + 0x12)
+#define  INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET  (INIT_HCA_FS_PARAM_OFFSET + 0x13)
 #define  INIT_HCA_FS_A0_OFFSET		  (INIT_HCA_FS_PARAM_OFFSET + 0x18)
 #define  INIT_HCA_FS_LOG_TABLE_SZ_OFFSET  (INIT_HCA_FS_PARAM_OFFSET + 0x1b)
 #define  INIT_HCA_FS_ETH_BITS_OFFSET      (INIT_HCA_FS_PARAM_OFFSET + 0x21)
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.h b/drivers/net/ethernet/mellanox/mlx4/fw.h
index 650ae08c71de..8f020f26ebf5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.h
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.h
@@ -182,8 +182,8 @@ struct mlx4_init_hca_param {
 	u64 cmpt_base;
 	u64 mtt_base;
 	u64 global_caps;
-	u16 log_mc_entry_sz;
-	u16 log_mc_hash_sz;
+	u8 log_mc_entry_sz;
+	u8 log_mc_hash_sz;
 	u16 hca_core_clock; /* Internal Clock Frequency (in MHz) */
 	u8  log_num_qps;
 	u8  log_num_srqs;
commit f93e8497a9bc6d4b7a0efcb9f54e36f806544a38
Merge: 6dceaa9f56e2 68ec32daf7d5
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Wed Nov 18 17:17:32 2020 -0800

    Merge tag 'mlx5-fixes-2020-11-17' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
    
    Saeed Mahameed says:
    
    ====================
    mlx5 fixes 2020-11-17
    
    This series introduces some fixes to mlx5 driver.
    
    * tag 'mlx5-fixes-2020-11-17' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux:
      net/mlx5: fix error return code in mlx5e_tc_nic_init()
      net/mlx5: E-Switch, Fail mlx5_esw_modify_vport_rate if qos disabled
      net/mlx5: Disable QoS when min_rates on all VFs are zero
      net/mlx5: Clear bw_share upon VF disable
      net/mlx5: Add handling of port type in rule deletion
      net/mlx5e: Fix check if netdev is bond slave
      net/mlx5e: Fix IPsec packet drop by mlx5e_tc_update_skb
      net/mlx5e: Set IPsec WAs only in IP's non checksum partial case.
      net/mlx5e: Fix refcount leak on kTLS RX resync
    ====================
    
    Link: https://lore.kernel.org/r/20201117195702.386113-1-saeedm@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 6dceaa9f56e22d0f9b4c4ad2ed9e04e315ce7fe5
Author: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
Date:   Mon Nov 16 17:21:14 2020 +0100

    atm: nicstar: Unmap DMA on send error
    
    The `skb' is mapped for DMA in ns_send() but does not unmap DMA in case
    push_scqe() fails to submit the `skb'. The memory of the `skb' is
    released so only the DMA mapping is leaking.
    
    Unmap the DMA mapping in case push_scqe() failed.
    
    Fixes: 864a3ff635fa7 ("atm: [nicstar] remove virt_to_bus() and support 64-bit platforms")
    Cc: Chas Williams <3chas3 at gmail.com>
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 7af74fb450a0..09ad73361879 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -1706,6 +1706,8 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb)
 
 	if (push_scqe(card, vc, scq, &scqe, skb) != 0) {
 		atomic_inc(&vcc->stats->tx_err);
+		dma_unmap_single(&card->pcidev->dev, NS_PRV_DMA(skb), skb->len,
+				 DMA_TO_DEVICE);
 		dev_kfree_skb_any(skb);
 		return -EIO;
 	}
commit d8c19014bba8f565d8a2f1f46b4e38d1d97bf1a7
Author: Dongli Zhang <dongli.zhang at oracle.com>
Date:   Sun Nov 15 12:10:29 2020 -0800

    page_frag: Recover from memory pressure
    
    The ethernet driver may allocate skb (and skb->data) via napi_alloc_skb().
    This ends up to page_frag_alloc() to allocate skb->data from
    page_frag_cache->va.
    
    During the memory pressure, page_frag_cache->va may be allocated as
    pfmemalloc page. As a result, the skb->pfmemalloc is always true as
    skb->data is from page_frag_cache->va. The skb will be dropped if the
    sock (receiver) does not have SOCK_MEMALLOC. This is expected behaviour
    under memory pressure.
    
    However, once kernel is not under memory pressure any longer (suppose large
    amount of memory pages are just reclaimed), the page_frag_alloc() may still
    re-use the prior pfmemalloc page_frag_cache->va to allocate skb->data. As a
    result, the skb->pfmemalloc is always true unless page_frag_cache->va is
    re-allocated, even if the kernel is not under memory pressure any longer.
    
    Here is how kernel runs into issue.
    
    1. The kernel is under memory pressure and allocation of
    PAGE_FRAG_CACHE_MAX_ORDER in __page_frag_cache_refill() will fail. Instead,
    the pfmemalloc page is allocated for page_frag_cache->va.
    
    2: All skb->data from page_frag_cache->va (pfmemalloc) will have
    skb->pfmemalloc=true. The skb will always be dropped by sock without
    SOCK_MEMALLOC. This is an expected behaviour.
    
    3. Suppose a large amount of pages are reclaimed and kernel is not under
    memory pressure any longer. We expect skb->pfmemalloc drop will not happen.
    
    4. Unfortunately, page_frag_alloc() does not proactively re-allocate
    page_frag_alloc->va and will always re-use the prior pfmemalloc page. The
    skb->pfmemalloc is always true even kernel is not under memory pressure any
    longer.
    
    Fix this by freeing and re-allocating the page instead of recycling it.
    
    References: https://lore.kernel.org/lkml/20201103193239.1807-1-dongli.zhang@oracle.com/
    References: https://lore.kernel.org/linux-mm/20201105042140.5253-1-willy@infradead.org/
    Suggested-by: Matthew Wilcox (Oracle) <willy at infradead.org>
    Cc: Aruna Ramakrishna <aruna.ramakrishna at oracle.com>
    Cc: Bert Barbe <bert.barbe at oracle.com>
    Cc: Rama Nichanamatlu <rama.nichanamatlu at oracle.com>
    Cc: Venkat Venkatsubra <venkat.x.venkatsubra at oracle.com>
    Cc: Manjunath Patil <manjunath.b.patil at oracle.com>
    Cc: Joe Jin <joe.jin at oracle.com>
    Cc: SRINIVAS <srinivas.eeda at oracle.com>
    Fixes: 79930f5892e1 ("net: do not deplete pfmemalloc reserve")
    Signed-off-by: Dongli Zhang <dongli.zhang at oracle.com>
    Acked-by: Vlastimil Babka <vbabka at suse.cz>
    Reviewed-by: Eric Dumazet <edumazet at google.com>
    Link: https://lore.kernel.org/r/20201115201029.11903-1-dongli.zhang@oracle.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 23f5066bd4a5..eaa227a479e4 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5103,6 +5103,11 @@ refill:
 		if (!page_ref_sub_and_test(page, nc->pagecnt_bias))
 			goto refill;
 
+		if (unlikely(nc->pfmemalloc)) {
+			free_the_page(page, compound_order(page));
+			goto refill;
+		}
+
 #if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE)
 		/* if size can vary use size else just use PAGE_SIZE */
 		size = nc->size;
commit f9f92e7c583f9b120bbb09edae6a587b73feb3a9
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Nov 17 22:40:29 2020 +0100

    char/agp: Disable frontend without CONFIG_DRM_LEGACY
    
    It's probably full of bugs ready for exploiting by userspace. And
    there's not going to be any userspace for this without any of the drm
    legacy drivers enabled too. So just couple it together.
    
    Note that the frontend is only the /dev/agp ioctl interface, which per
    Adam is only used by the i810 userspace drivers. All other drivers go
    through the drm bufmap agp handling abstraction apparently.
    
    v2: Augment commit message a bit from m-l feedback.
    
    Acked-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Christian König <christian.koenig at amd.com>
    Acked-by: Thomas Zimmermann <tzimmermann at suse.de>
    Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
    Cc: David Airlie <airlied at linux.ie>
    Cc: Adam Jackson <ajax at redhat.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201117214029.591896-1-daniel.vetter@ffwll.ch

diff --git a/drivers/char/agp/Makefile b/drivers/char/agp/Makefile
index cb2497d157f6..90ed8c789e48 100644
--- a/drivers/char/agp/Makefile
+++ b/drivers/char/agp/Makefile
@@ -1,7 +1,11 @@
 # SPDX-License-Identifier: GPL-2.0
-agpgart-y := backend.o frontend.o generic.o isoch.o
+agpgart-y := backend.o generic.o isoch.o
 
+ifeq ($(CONFIG_DRM_LEGACY),y)
 agpgart-$(CONFIG_COMPAT)	+= compat_ioctl.o
+agpgart-y			+= frontend.o
+endif
+
 
 obj-$(CONFIG_AGP)		+= agpgart.o
 obj-$(CONFIG_AGP_ALI)		+= ali-agp.o
diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h
index 4eb1c772ded7..bb09d64cd51e 100644
--- a/drivers/char/agp/agp.h
+++ b/drivers/char/agp/agp.h
@@ -186,8 +186,13 @@ int agp_add_bridge(struct agp_bridge_data *bridge);
 void agp_remove_bridge(struct agp_bridge_data *bridge);
 
 /* Frontend routines. */
+#if IS_ENABLED(CONFIG_DRM_LEGACY)
 int agp_frontend_initialize(void);
 void agp_frontend_cleanup(void);
+#else
+static inline int agp_frontend_initialize(void) { return 0; }
+static inline void agp_frontend_cleanup(void) {}
+#endif
 
 /* Generic routines. */
 void agp_generic_enable(struct agp_bridge_data *bridge, u32 mode);
commit 58a74c6f1d6f3cf615c8f12281d42859ac7363a9
Author: Bernard Zhao <bernard at vivo.com>
Date:   Wed Nov 18 03:40:19 2020 -0800

    drm/via: fix assignment in if condition
    
    Fix check_patch.pl warning:
    ERROR: do not use assignment in if condition
    +                       if ((HALCYON_HEADER2 == (cmd = *buf)) &&
    
    ERROR: do not use assignment in if condition
    +                       if (HALCYON_HEADER2 == (cmd = *buf))
    
    Signed-off-by: Bernard Zhao <bernard at vivo.com>
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201118114021.105502-1-bernard@vivo.com

diff --git a/drivers/gpu/drm/via/via_verifier.c b/drivers/gpu/drm/via/via_verifier.c
index 8d8135f424ef..3d6e3a70f318 100644
--- a/drivers/gpu/drm/via/via_verifier.c
+++ b/drivers/gpu/drm/via/via_verifier.c
@@ -1001,8 +1001,8 @@ via_verify_command_stream(const uint32_t * buf, unsigned int size,
 			state = via_check_vheader6(&buf, buf_end);
 			break;
 		case state_command:
-			if ((HALCYON_HEADER2 == (cmd = *buf)) &&
-			    supported_3d)
+			cmd = *buf;
+			if ((cmd == HALCYON_HEADER2) && supported_3d)
 				state = state_header2;
 			else if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1)
 				state = state_header1;
@@ -1064,7 +1064,8 @@ via_parse_command_stream(struct drm_device *dev, const uint32_t *buf,
 			state = via_parse_vheader6(dev_priv, &buf, buf_end);
 			break;
 		case state_command:
-			if (HALCYON_HEADER2 == (cmd = *buf))
+			cmd = *buf;
+			if (cmd == HALCYON_HEADER2)
 				state = state_header2;
 			else if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1)
 				state = state_header1;
commit 2b3af2705645c87eee0f386e075871886fd429b3
Author: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
Date:   Tue Nov 17 09:33:51 2020 -0500

    drm/amd/display: Always get CRTC updated constant values inside commit tail
    
    We recently improved our display atomic commit and tail sequence to
    avoid some issues related to concurrency. One of the major changes
    consisted of moving the interrupt disable and the stream release from
    our atomic commit to our atomic tail (commit 6d90a208cfff
    ("drm/amd/display: Move disable interrupt into commit tail")) .
    However, the new code introduced inside our commit tail function was
    inserted right after the function
    drm_atomic_helper_update_legacy_modeset_state(), which has routines for
    updating internal data structs related to timestamps. As a result, in
    certain conditions, the display module can reach a situation where we
    update our constants and, after that, clean it. This situation generates
    the following warning:
    
     amdgpu 0000:03:00.0: drm_WARN_ON_ONCE(drm_drv_uses_atomic_modeset(dev))
     WARNING: CPU: 6 PID: 1269 at drivers/gpu/drm/drm_vblank.c:722
     drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x32b/0x340 [drm]
     ...
     RIP:
     0010:drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x32b/0x340
     [drm]
     ...
     Call Trace:
      ? dc_stream_get_vblank_counter+0x57/0x60 [amdgpu]
      drm_crtc_vblank_helper_get_vblank_timestamp+0x1c/0x20 [drm]
      drm_get_last_vbltimestamp+0xad/0xc0 [drm]
      drm_reset_vblank_timestamp+0x63/0xd0 [drm]
      drm_crtc_vblank_on+0x85/0x150 [drm]
      amdgpu_dm_atomic_commit_tail+0xaf1/0x2330 [amdgpu]
      commit_tail+0x99/0x130 [drm_kms_helper]
      drm_atomic_helper_commit+0x123/0x150 [drm_kms_helper]
      amdgpu_dm_atomic_commit+0x11/0x20 [amdgpu]
      drm_atomic_commit+0x4a/0x50 [drm]
      drm_atomic_helper_set_config+0x7c/0xc0 [drm_kms_helper]
      drm_mode_setcrtc+0x20b/0x7e0 [drm]
      ? tomoyo_path_number_perm+0x6f/0x200
      ? drm_mode_getcrtc+0x190/0x190 [drm]
      drm_ioctl_kernel+0xae/0xf0 [drm]
      drm_ioctl+0x245/0x400 [drm]
      ? drm_mode_getcrtc+0x190/0x190 [drm]
      amdgpu_drm_ioctl+0x4e/0x80 [amdgpu]
      __x64_sys_ioctl+0x91/0xc0
      do_syscall_64+0x38/0x90
      entry_SYSCALL_64_after_hwframe+0x44/0xa9
     ...
    
    For fixing this issue we rely upon a refactor introduced on
    drm_atomic_helper_update_legacy_modeset_state ("Remove the timestamping
    constant update from drm_atomic_helper_update_legacy_modeset_state()")
    which decouples constant values update from
    drm_atomic_helper_update_legacy_modeset_state to a new helper.
    Basically, this commit uses this new helper and place it right after our
    release module to avoid a situation where our CRTC struct gets wrong
    values.
    
    Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1373
    Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1349
    Reviewed-by: Harry Wentland <harry.wentland at amd.com>
    Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index e93e18c06c0e..0e7118000919 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7506,7 +7506,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 	bool mode_set_reset_required = false;
 
 	drm_atomic_helper_update_legacy_modeset_state(dev, state);
-	drm_atomic_helper_calc_timestamping_constants(state);
 
 	dm_state = dm_atomic_get_new_state(state);
 	if (dm_state && dm_state->context) {
@@ -7533,6 +7532,8 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 		}
 	}
 
+	drm_atomic_helper_calc_timestamping_constants(state);
+
 	/* update changed items */
 	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
 		struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
commit c2e7554e1b85935d962127efa3c2a76483b0b3b6
Merge: ce228d459424 20b329129009
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Nov 18 12:12:18 2020 -0800

    Merge tag 'gfs2-v5.10-rc4-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2
    
    Pull gfs2 fix from Andreas Gruenbacher:
     "Fix gfs2 freeze/thaw"
    
    * tag 'gfs2-v5.10-rc4-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
      gfs2: Fix regression in freeze_go_sync

commit ce228d45942492580968d698b0216d3356d75226
Merge: f86fee1845ee c3213d260a23
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Nov 18 12:06:34 2020 -0800

    Merge tag 'nfsd-5.10-2' of git://linux-nfs.org/~bfields/linux
    
    Pull nfsd fix from Bruce Fields:
     "Just one quick fix for a tracing oops"
    
    * tag 'nfsd-5.10-2' of git://linux-nfs.org/~bfields/linux:
      SUNRPC: Fix oops in the rpc_xdr_buf event class

commit f86fee1845eec29bed735e7120e6993ad8c4e295
Merge: 0fa8ee0d9ab9 3084db0e0d50
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Nov 18 11:57:55 2020 -0800

    Merge tag 'linux-kselftest-kunit-fixes-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest
    
    Pull Kunit fixes from Shuah Khan:
     "Several fixes to Kunit documentation and tools, and to not pollute
      the source directory.
    
      Also remove the incorrect kunit .gitattributes file"
    
    * tag 'linux-kselftest-kunit-fixes-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
      kunit: fix display of failed expectations for strings
      kunit: tool: fix extra trailing \n in raw + parsed test output
      kunit: tool: print out stderr from make (like build warnings)
      KUnit: Docs: usage: wording fixes
      KUnit: Docs: style: fix some Kconfig example issues
      KUnit: Docs: fix a wording typo
      kunit: Do not pollute source directory with generated files (test.log)
      kunit: Do not pollute source directory with generated files (.kunitconfig)
      kunit: tool: fix pre-existing python type annotation errors
      kunit: Fix kunit.py parse subcommand (use null build_dir)
      kunit: tool: unmark test_data as binary blobs

commit a3dcb3e7e70c72a68a79b30fc3a3adad5612731c
Author: Andrew Lunn <andrew at lunn.ch>
Date:   Mon Nov 16 08:43:01 2020 -0800

    net: dsa: mv88e6xxx: Wait for EEPROM done after HW reset
    
    When the switch is hardware reset, it reads the contents of the
    EEPROM. This can contain instructions for programming values into
    registers and to perform waits between such programming. Reading the
    EEPROM can take longer than the 100ms mv88e6xxx_hardware_reset() waits
    after deasserting the reset GPIO. So poll the EEPROM done bit to
    ensure it is complete.
    
    Signed-off-by: Andrew Lunn <andrew at lunn.ch>
    Signed-off-by: Ruslan Sushko <rus at sushko.dev>
    Link: https://lore.kernel.org/r/20201116164301.977661-1-rus@sushko.dev
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index bd297ae7cf9e..34cca0a4b31c 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -2297,6 +2297,8 @@ static void mv88e6xxx_hardware_reset(struct mv88e6xxx_chip *chip)
 		usleep_range(10000, 20000);
 		gpiod_set_value_cansleep(gpiod, 0);
 		usleep_range(10000, 20000);
+
+		mv88e6xxx_g1_wait_eeprom_done(chip);
 	}
 }
 
diff --git a/drivers/net/dsa/mv88e6xxx/global1.c b/drivers/net/dsa/mv88e6xxx/global1.c
index f62aa83ca08d..33d443a37efc 100644
--- a/drivers/net/dsa/mv88e6xxx/global1.c
+++ b/drivers/net/dsa/mv88e6xxx/global1.c
@@ -75,6 +75,37 @@ static int mv88e6xxx_g1_wait_init_ready(struct mv88e6xxx_chip *chip)
 	return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STS, bit, 1);
 }
 
+void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip)
+{
+	const unsigned long timeout = jiffies + 1 * HZ;
+	u16 val;
+	int err;
+
+	/* Wait up to 1 second for the switch to finish reading the
+	 * EEPROM.
+	 */
+	while (time_before(jiffies, timeout)) {
+		err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &val);
+		if (err) {
+			dev_err(chip->dev, "Error reading status");
+			return;
+		}
+
+		/* If the switch is still resetting, it may not
+		 * respond on the bus, and so MDIO read returns
+		 * 0xffff. Differentiate between that, and waiting for
+		 * the EEPROM to be done by bit 0 being set.
+		 */
+		if (val != 0xffff &&
+		    val & BIT(MV88E6XXX_G1_STS_IRQ_EEPROM_DONE))
+			return;
+
+		usleep_range(1000, 2000);
+	}
+
+	dev_err(chip->dev, "Timeout waiting for EEPROM done");
+}
+
 /* Offset 0x01: Switch MAC Address Register Bytes 0 & 1
  * Offset 0x02: Switch MAC Address Register Bytes 2 & 3
  * Offset 0x03: Switch MAC Address Register Bytes 4 & 5
diff --git a/drivers/net/dsa/mv88e6xxx/global1.h b/drivers/net/dsa/mv88e6xxx/global1.h
index 1e3546f8b072..e05abe61fa11 100644
--- a/drivers/net/dsa/mv88e6xxx/global1.h
+++ b/drivers/net/dsa/mv88e6xxx/global1.h
@@ -278,6 +278,7 @@ int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr);
 int mv88e6185_g1_reset(struct mv88e6xxx_chip *chip);
 int mv88e6352_g1_reset(struct mv88e6xxx_chip *chip);
 int mv88e6250_g1_reset(struct mv88e6xxx_chip *chip);
+void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip);
 
 int mv88e6185_g1_ppu_enable(struct mv88e6xxx_chip *chip);
 int mv88e6185_g1_ppu_disable(struct mv88e6xxx_chip *chip);
commit fc2635bff24c6b75291ead011c16da7a053fb4f5
Merge: 1532b9778478 1f492eab67bc
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Wed Nov 18 11:07:03 2020 -0800

    Merge branch 'mlxsw-couple-of-fixes'
    
    Ido Schimmel says:
    
    ====================
    mlxsw: Couple of fixes
    
    Patch #1 fixes firmware flashing when CONFIG_MLXSW_CORE=y and
    CONFIG_MLXFW=m.
    
    Patch #2 prevents EMAD transactions from needlessly failing when the
    system is under heavy load by using exponential backoff.
    
    Please consider patch #2 for stable.
    ====================
    
    Link: https://lore.kernel.org/r/20201117173352.288491-1-idosch@idosch.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 1f492eab67bced119a0ac7db75ef2047e29a30c6
Author: Ido Schimmel <idosch at nvidia.com>
Date:   Tue Nov 17 19:33:52 2020 +0200

    mlxsw: core: Use variable timeout for EMAD retries
    
    The driver sends Ethernet Management Datagram (EMAD) packets to the
    device for configuration purposes and waits for up to 200ms for a reply.
    A request is retried up to 5 times.
    
    When the system is under heavy load, replies are not always processed in
    time and EMAD transactions fail.
    
    Make the process more robust to such delays by using exponential
    backoff. First wait for up to 200ms, then retransmit and wait for up to
    400ms and so on.
    
    Fixes: caf7297e7ab5 ("mlxsw: core: Introduce support for asynchronous EMAD register access")
    Reported-by: Denis Yulevich <denisyu at nvidia.com>
    Tested-by: Denis Yulevich <denisyu at nvidia.com>
    Signed-off-by: Ido Schimmel <idosch at nvidia.com>
    Reviewed-by: Jiri Pirko <jiri at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index 937b8e46f8c7..1a86535c4968 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -571,7 +571,8 @@ static void mlxsw_emad_trans_timeout_schedule(struct mlxsw_reg_trans *trans)
 	if (trans->core->fw_flash_in_progress)
 		timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_DURING_FW_FLASH_MS);
 
-	queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw, timeout);
+	queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw,
+			   timeout << trans->retries);
 }
 
 static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core,
commit fb738b99ef229bd3d25f1b3e5503925dba9b1a7c
Author: Ido Schimmel <idosch at nvidia.com>
Date:   Tue Nov 17 19:33:51 2020 +0200

    mlxsw: Fix firmware flashing
    
    The commit cited below moved firmware flashing functionality from
    mlxsw_spectrum to mlxsw_core, but did not adjust the Kconfig
    dependencies. This makes it possible to have mlxsw_core as built-in and
    mlxfw as a module. The mlxfw code is therefore not reachable from
    mlxsw_core and firmware flashing fails:
    
    # devlink dev flash pci/0000:01:00.0 file mellanox/mlxsw_spectrum-13.2008.1310.mfa2
    devlink answers: Operation not supported
    
    Fix by having mlxsw_core select mlxfw.
    
    Fixes: b79cb787ac70 ("mlxsw: Move fw flashing code into core.c")
    Signed-off-by: Ido Schimmel <idosch at nvidia.com>
    Reported-by: Vadim Pasternak <vadimp at nvidia.com>
    Tested-by: Vadim Pasternak <vadimp at nvidia.com>
    Reviewed-by: Jiri Pirko <jiri at nvidia.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlxsw/Kconfig b/drivers/net/ethernet/mellanox/mlxsw/Kconfig
index 872e9910bb7c..a619d90559f7 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlxsw/Kconfig
@@ -6,6 +6,7 @@
 config MLXSW_CORE
 	tristate "Mellanox Technologies Switch ASICs support"
 	select NET_DEVLINK
+	select MLXFW
 	help
 	  This driver supports Mellanox Technologies Switch ASICs family.
 
@@ -82,7 +83,6 @@ config MLXSW_SPECTRUM
 	select GENERIC_ALLOCATOR
 	select PARMAN
 	select OBJAGG
-	select MLXFW
 	imply PTP_1588_CLOCK
 	select NET_PTP_CLASSIFY if PTP_1588_CLOCK
 	default m
commit 1532b9778478577152201adbafa7738b1e844868
Author: Florian Fainelli <f.fainelli at gmail.com>
Date:   Mon Nov 16 19:52:34 2020 -0800

    net: Have netpoll bring-up DSA management interface
    
    DSA network devices rely on having their DSA management interface up and
    running otherwise their ndo_open() will return -ENETDOWN. Without doing
    this it would not be possible to use DSA devices as netconsole when
    configured on the command line. These devices also do not utilize the
    upper/lower linking so the check about the netpoll device having upper
    is not going to be a problem.
    
    The solution adopted here is identical to the one done for
    net/ipv4/ipconfig.c with 728c02089a0e ("net: ipv4: handle DSA enabled
    master network devices"), with the network namespace scope being
    restricted to that of the process configuring netpoll.
    
    Fixes: 04ff53f96a93 ("net: dsa: Add netconsole support")
    Tested-by: Vladimir Oltean <olteanv at gmail.com>
    Signed-off-by: Florian Fainelli <f.fainelli at gmail.com>
    Link: https://lore.kernel.org/r/20201117035236.22658-1-f.fainelli@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index c310c7c1cef7..960948290001 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -29,6 +29,7 @@
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <linux/if_vlan.h>
+#include <net/dsa.h>
 #include <net/tcp.h>
 #include <net/udp.h>
 #include <net/addrconf.h>
@@ -657,15 +658,15 @@ EXPORT_SYMBOL_GPL(__netpoll_setup);
 
 int netpoll_setup(struct netpoll *np)
 {
-	struct net_device *ndev = NULL;
+	struct net_device *ndev = NULL, *dev = NULL;
+	struct net *net = current->nsproxy->net_ns;
 	struct in_device *in_dev;
 	int err;
 
 	rtnl_lock();
-	if (np->dev_name[0]) {
-		struct net *net = current->nsproxy->net_ns;
+	if (np->dev_name[0])
 		ndev = __dev_get_by_name(net, np->dev_name);
-	}
+
 	if (!ndev) {
 		np_err(np, "%s doesn't exist, aborting\n", np->dev_name);
 		err = -ENODEV;
@@ -673,6 +674,19 @@ int netpoll_setup(struct netpoll *np)
 	}
 	dev_hold(ndev);
 
+	/* bring up DSA management network devices up first */
+	for_each_netdev(net, dev) {
+		if (!netdev_uses_dsa(dev))
+			continue;
+
+		err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
+		if (err < 0) {
+			np_err(np, "%s failed to open %s\n",
+			       np->dev_name, dev->name);
+			goto put;
+		}
+	}
+
 	if (netdev_master_upper_dev_get(ndev)) {
 		np_err(np, "%s is a slave device, aborting\n", np->dev_name);
 		err = -EBUSY;
commit 3a36060bf294e7b7e33c5dddcc4f5d2c1c834e56
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Tue Nov 17 10:57:55 2020 +0800

    atl1e: fix error return code in atl1e_probe()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: a6a5325239c2 ("atl1e: Atheros L1E Gigabit Ethernet driver")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605581875-36281-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
index 098b0328e3cb..ff9f96de74b8 100644
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
@@ -2312,8 +2312,8 @@ static int atl1e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	 * various kernel subsystems to support the mechanics required by a
 	 * fixed-high-32-bit system.
 	 */
-	if ((dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)) != 0) ||
-	    (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)) != 0)) {
+	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+	if (err) {
 		dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
 		goto err_dma;
 	}
commit 537a14726582c4e7bfe4dff9cb7fca19dc912cf6
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Tue Nov 17 10:55:21 2020 +0800

    atl1c: fix error return code in atl1c_probe()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 43250ddd75a3 ("atl1c: Atheros L1C Gigabit Ethernet driver")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605581721-36028-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
index 0c12cf7bda50..3f65f2b370c5 100644
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
@@ -2543,8 +2543,8 @@ static int atl1c_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	 * various kernel subsystems to support the mechanics required by a
 	 * fixed-high-32-bit system.
 	 */
-	if ((dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)) != 0) ||
-	    (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)) != 0)) {
+	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+	if (err) {
 		dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
 		goto err_dma;
 	}
commit a5ebcbdf34b65fcc07f38eaf2d60563b42619a59
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Tue Nov 17 10:45:05 2020 +0800

    ah6: fix error return code in ah6_input()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605581105-35295-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c
index d88d97617f7e..440080da805b 100644
--- a/net/ipv6/ah6.c
+++ b/net/ipv6/ah6.c
@@ -588,7 +588,8 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
 	memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len);
 	memset(ah->auth_data, 0, ahp->icv_trunc_len);
 
-	if (ipv6_clear_mutable_options(ip6h, hdr_len, XFRM_POLICY_IN))
+	err = ipv6_clear_mutable_options(ip6h, hdr_len, XFRM_POLICY_IN);
+	if (err)
 		goto out_free;
 
 	ip6h->priority    = 0;
commit df8d85d8c69d6837817e54dcb73c84a8b5a13877
Author: Filip Moc <dev at moc6.cz>
Date:   Tue Nov 17 18:36:31 2020 +0100

    net: usb: qmi_wwan: Set DTR quirk for MR400
    
    LTE module MR400 embedded in TL-MR6400 v4 requires DTR to be set.
    
    Signed-off-by: Filip Moc <dev at moc6.cz>
    Acked-by: Bjørn Mork <bjorn at mork.no>
    Link: https://lore.kernel.org/r/20201117173631.GA550981@moc6.cz
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
index 581ed51abb53..fc378ff56775 100644
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -1070,7 +1070,7 @@ static const struct usb_device_id products[] = {
 	{QMI_FIXED_INTF(0x05c6, 0x9011, 4)},
 	{QMI_FIXED_INTF(0x05c6, 0x9021, 1)},
 	{QMI_FIXED_INTF(0x05c6, 0x9022, 2)},
-	{QMI_FIXED_INTF(0x05c6, 0x9025, 4)},	/* Alcatel-sbell ASB TL131 TDD LTE  (China Mobile) */
+	{QMI_QUIRK_SET_DTR(0x05c6, 0x9025, 4)},	/* Alcatel-sbell ASB TL131 TDD LTE (China Mobile) */
 	{QMI_FIXED_INTF(0x05c6, 0x9026, 3)},
 	{QMI_FIXED_INTF(0x05c6, 0x902e, 5)},
 	{QMI_FIXED_INTF(0x05c6, 0x9031, 5)},
commit 2ba546ebe0ce2af47833d8912ced9b4a579f13cb
Author: Nishanth Menon <nm at ti.com>
Date:   Wed Nov 18 08:50:09 2020 -0600

    regulator: ti-abb: Fix array out of bound read access on the first transition
    
    At the start of driver initialization, we do not know what bias
    setting the bootloader has configured the system for and we only know
    for certain the very first time we do a transition.
    
    However, since the initial value of the comparison index is -EINVAL,
    this negative value results in an array out of bound access on the
    very first transition.
    
    Since we don't know what the setting is, we just set the bias
    configuration as there is nothing to compare against. This prevents
    the array out of bound access.
    
    NOTE: Even though we could use a more relaxed check of "< 0" the only
    valid values(ignoring cosmic ray induced bitflips) are -EINVAL, 0+.
    
    Fixes: 40b1936efebd ("regulator: Introduce TI Adaptive Body Bias(ABB) on-chip LDO driver")
    Link: https://lore.kernel.org/linux-mm/CA+G9fYuk4imvhyCN7D7T6PMDH6oNp6HDCRiTUKMQ6QXXjBa4ag@mail.gmail.com/
    Reported-by: Naresh Kamboju <naresh.kamboju at linaro.org>
    Reviewed-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Nishanth Menon <nm at ti.com>
    Link: https://lore.kernel.org/r/20201118145009.10492-1-nm@ti.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/regulator/ti-abb-regulator.c b/drivers/regulator/ti-abb-regulator.c
index 3e60bff76194..9f0a4d50cead 100644
--- a/drivers/regulator/ti-abb-regulator.c
+++ b/drivers/regulator/ti-abb-regulator.c
@@ -342,8 +342,17 @@ static int ti_abb_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
 		return ret;
 	}
 
-	/* If data is exactly the same, then just update index, no change */
 	info = &abb->info[sel];
+	/*
+	 * When Linux kernel is starting up, we are'nt sure of the
+	 * Bias configuration that bootloader has configured.
+	 * So, we get to know the actual setting the first time
+	 * we are asked to transition.
+	 */
+	if (abb->current_info_idx == -EINVAL)
+		goto just_set_abb;
+
+	/* If data is exactly the same, then just update index, no change */
 	oinfo = &abb->info[abb->current_info_idx];
 	if (!memcmp(info, oinfo, sizeof(*info))) {
 		dev_dbg(dev, "%s: Same data new idx=%d, old idx=%d\n", __func__,
@@ -351,6 +360,7 @@ static int ti_abb_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
 		goto out;
 	}
 
+just_set_abb:
 	ret = ti_abb_set_opp(rdev, abb, info);
 
 out:
commit 879ee8b6f2bae0cc4a25536f8841db1dbc969523
Author: Guenter Roeck <linux at roeck-us.net>
Date:   Wed Nov 11 12:54:34 2020 -0800

    ASOC: Intel: kbl_rt5663_rt5514_max98927: Do not try to disable disabled clock
    
    In kabylake_set_bias_level(), enabling mclk may fail if the clock has
    already been enabled by the firmware. Attempts to disable that clock
    later will fail with a warning backtrace.
    
    mclk already disabled
    WARNING: CPU: 2 PID: 108 at drivers/clk/clk.c:952 clk_core_disable+0x1b6/0x1cf
    ...
    Call Trace:
     clk_disable+0x2d/0x3a
     kabylake_set_bias_level+0x72/0xfd [snd_soc_kbl_rt5663_rt5514_max98927]
     snd_soc_card_set_bias_level+0x2b/0x6f
     snd_soc_dapm_set_bias_level+0xe1/0x209
     dapm_pre_sequence_async+0x63/0x96
     async_run_entry_fn+0x3d/0xd1
     process_one_work+0x2a9/0x526
    ...
    
    Only disable the clock if it has been enabled.
    
    Fixes: 15747a802075 ("ASoC: eve: implement set_bias_level function for rt5514")
    Cc: Brent Lu <brent.lu at intel.com>
    Cc: Curtis Malainey <cujomalainey at chromium.org>
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>
    Link: https://lore.kernel.org/r/20201111205434.207610-1-linux@roeck-us.net
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
index 922cd0176e1f..f95546c184aa 100644
--- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
+++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
@@ -700,6 +700,8 @@ static int kabylake_set_bias_level(struct snd_soc_card *card,
 	switch (level) {
 	case SND_SOC_BIAS_PREPARE:
 		if (dapm->bias_level == SND_SOC_BIAS_ON) {
+			if (!__clk_is_enabled(priv->mclk))
+				return 0;
 			dev_dbg(card->dev, "Disable mclk");
 			clk_disable_unprepare(priv->mclk);
 		} else {
commit 595189c25c28a55523354336bf24453242c81c15
Author: Yu Kuai <yukuai3 at huawei.com>
Date:   Wed Nov 18 09:21:26 2020 -0800

    xfs: return corresponding errcode if xfs_initialize_perag() fail
    
    In xfs_initialize_perag(), if kmem_zalloc(), xfs_buf_hash_init(), or
    radix_tree_preload() failed, the returned value 'error' is not set
    accordingly.
    
    Reported-as-fixing: 8b26c5825e02 ("xfs: handle ENOMEM correctly during initialisation of perag structures")
    Fixes: 9b2471797942 ("xfs: cache unlinked pointers in an rhashtable")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Yu Kuai <yukuai3 at huawei.com>
    Reviewed-by: Darrick J. Wong <darrick.wong at oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>

diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index 150ee5cb8645..7110507a2b6b 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -194,20 +194,25 @@ xfs_initialize_perag(
 		}
 
 		pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL);
-		if (!pag)
+		if (!pag) {
+			error = -ENOMEM;
 			goto out_unwind_new_pags;
+		}
 		pag->pag_agno = index;
 		pag->pag_mount = mp;
 		spin_lock_init(&pag->pag_ici_lock);
 		INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC);
-		if (xfs_buf_hash_init(pag))
+
+		error = xfs_buf_hash_init(pag);
+		if (error)
 			goto out_free_pag;
 		init_waitqueue_head(&pag->pagb_wait);
 		spin_lock_init(&pag->pagb_lock);
 		pag->pagb_count = 0;
 		pag->pagb_tree = RB_ROOT;
 
-		if (radix_tree_preload(GFP_NOFS))
+		error = radix_tree_preload(GFP_NOFS);
+		if (error)
 			goto out_hash_destroy;
 
 		spin_lock(&mp->m_perag_lock);
commit 27c14b5daa82861220d6fa6e27b51f05f21ffaa7
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sat Nov 14 09:59:22 2020 -0800

    xfs: ensure inobt record walks always make forward progress
    
    The aim of the inode btree record iterator function is to call a
    callback on every record in the btree.  To avoid having to tear down and
    recreate the inode btree cursor around every callback, it caches a
    certain number of records in a memory buffer.  After each batch of
    callback invocations, we have to perform a btree lookup to find the
    next record after where we left off.
    
    However, if the keys of the inode btree are corrupt, the lookup might
    put us in the wrong part of the inode btree, causing the walk function
    to loop forever.  Therefore, we add extra cursor tracking to make sure
    that we never go backwards neither when performing the lookup nor when
    jumping to the next inobt record.  This also fixes an off by one error
    where upon resume the lookup should have been for the inode /after/ the
    point at which we stopped.
    
    Found by fuzzing xfs/460 with keys[2].startino = ones causing bulkstat
    and quotacheck to hang.
    
    Fixes: a211432c27ff ("xfs: create simplified inode walk function")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Chandan Babu R <chandanrlinux at gmail.com>

diff --git a/fs/xfs/xfs_iwalk.c b/fs/xfs/xfs_iwalk.c
index 233dcc8784db..2a45138831e3 100644
--- a/fs/xfs/xfs_iwalk.c
+++ b/fs/xfs/xfs_iwalk.c
@@ -55,6 +55,9 @@ struct xfs_iwalk_ag {
 	/* Where do we start the traversal? */
 	xfs_ino_t			startino;
 
+	/* What was the last inode number we saw when iterating the inobt? */
+	xfs_ino_t			lastino;
+
 	/* Array of inobt records we cache. */
 	struct xfs_inobt_rec_incore	*recs;
 
@@ -301,6 +304,9 @@ xfs_iwalk_ag_start(
 	if (XFS_IS_CORRUPT(mp, *has_more != 1))
 		return -EFSCORRUPTED;
 
+	iwag->lastino = XFS_AGINO_TO_INO(mp, agno,
+				irec->ir_startino + XFS_INODES_PER_CHUNK - 1);
+
 	/*
 	 * If the LE lookup yielded an inobt record before the cursor position,
 	 * skip it and see if there's another one after it.
@@ -347,15 +353,17 @@ xfs_iwalk_run_callbacks(
 	struct xfs_mount		*mp = iwag->mp;
 	struct xfs_trans		*tp = iwag->tp;
 	struct xfs_inobt_rec_incore	*irec;
-	xfs_agino_t			restart;
+	xfs_agino_t			next_agino;
 	int				error;
 
+	next_agino = XFS_INO_TO_AGINO(mp, iwag->lastino) + 1;
+
 	ASSERT(iwag->nr_recs > 0);
 
 	/* Delete cursor but remember the last record we cached... */
 	xfs_iwalk_del_inobt(tp, curpp, agi_bpp, 0);
 	irec = &iwag->recs[iwag->nr_recs - 1];
-	restart = irec->ir_startino + XFS_INODES_PER_CHUNK - 1;
+	ASSERT(next_agino == irec->ir_startino + XFS_INODES_PER_CHUNK);
 
 	error = xfs_iwalk_ag_recs(iwag);
 	if (error)
@@ -372,7 +380,7 @@ xfs_iwalk_run_callbacks(
 	if (error)
 		return error;
 
-	return xfs_inobt_lookup(*curpp, restart, XFS_LOOKUP_GE, has_more);
+	return xfs_inobt_lookup(*curpp, next_agino, XFS_LOOKUP_GE, has_more);
 }
 
 /* Walk all inodes in a single AG, from @iwag->startino to the end of the AG. */
@@ -396,6 +404,7 @@ xfs_iwalk_ag(
 
 	while (!error && has_more) {
 		struct xfs_inobt_rec_incore	*irec;
+		xfs_ino_t			rec_fsino;
 
 		cond_resched();
 		if (xfs_pwork_want_abort(&iwag->pwork))
@@ -407,6 +416,15 @@ xfs_iwalk_ag(
 		if (error || !has_more)
 			break;
 
+		/* Make sure that we always move forward. */
+		rec_fsino = XFS_AGINO_TO_INO(mp, agno, irec->ir_startino);
+		if (iwag->lastino != NULLFSINO &&
+		    XFS_IS_CORRUPT(mp, iwag->lastino >= rec_fsino)) {
+			error = -EFSCORRUPTED;
+			goto out;
+		}
+		iwag->lastino = rec_fsino + XFS_INODES_PER_CHUNK - 1;
+
 		/* No allocated inodes in this chunk; skip it. */
 		if (iwag->skip_empty && irec->ir_freecount == irec->ir_count) {
 			error = xfs_btree_increment(cur, 0, &has_more);
@@ -535,6 +553,7 @@ xfs_iwalk(
 		.trim_start	= 1,
 		.skip_empty	= 1,
 		.pwork		= XFS_PWORK_SINGLE_THREADED,
+		.lastino	= NULLFSINO,
 	};
 	xfs_agnumber_t		agno = XFS_INO_TO_AGNO(mp, startino);
 	int			error;
@@ -623,6 +642,7 @@ xfs_iwalk_threaded(
 		iwag->data = data;
 		iwag->startino = startino;
 		iwag->sz_recs = xfs_iwalk_prefetch(inode_records);
+		iwag->lastino = NULLFSINO;
 		xfs_pwork_queue(&pctl, &iwag->pwork);
 		startino = XFS_AGINO_TO_INO(mp, agno + 1, 0);
 		if (flags & XFS_INOBT_WALK_SAME_AG)
@@ -696,6 +716,7 @@ xfs_inobt_walk(
 		.startino	= startino,
 		.sz_recs	= xfs_inobt_walk_prefetch(inobt_records),
 		.pwork		= XFS_PWORK_SINGLE_THREADED,
+		.lastino	= NULLFSINO,
 	};
 	xfs_agnumber_t		agno = XFS_INO_TO_AGNO(mp, startino);
 	int			error;
commit ada49d64fb3538144192181db05de17e2ffc3551
Author: Gao Xiang <hsiangkao at redhat.com>
Date:   Sat Nov 14 11:06:01 2020 -0800

    xfs: fix forkoff miscalculation related to XFS_LITINO(mp)
    
    Currently, commit e9e2eae89ddb dropped a (int) decoration from
    XFS_LITINO(mp), and since sizeof() expression is also involved,
    the result of XFS_LITINO(mp) is simply as the size_t type
    (commonly unsigned long).
    
    Considering the expression in xfs_attr_shortform_bytesfit():
      offset = (XFS_LITINO(mp) - bytes) >> 3;
    let "bytes" be (int)340, and
        "XFS_LITINO(mp)" be (unsigned long)336.
    
    on 64-bit platform, the expression is
      offset = ((unsigned long)336 - (int)340) >> 3 =
               (int)(0xfffffffffffffffcUL >> 3) = -1
    
    but on 32-bit platform, the expression is
      offset = ((unsigned long)336 - (int)340) >> 3 =
               (int)(0xfffffffcUL >> 3) = 0x1fffffff
    instead.
    
    so offset becomes a large positive number on 32-bit platform, and
    cause xfs_attr_shortform_bytesfit() returns maxforkoff rather than 0.
    
    Therefore, one result is
      "ASSERT(new_size <= XFS_IFORK_SIZE(ip, whichfork));"
    
    assertion failure in xfs_idata_realloc(), which was also the root
    cause of the original bugreport from Dennis, see:
       https://bugzilla.redhat.com/show_bug.cgi?id=1894177
    
    And it can also be manually triggered with the following commands:
      $ touch a;
      $ setfattr -n user.0 -v "`seq 0 80`" a;
      $ setfattr -n user.1 -v "`seq 0 80`" a
    
    on 32-bit platform.
    
    Fix the case in xfs_attr_shortform_bytesfit() by bailing out
    "XFS_LITINO(mp) < bytes" in advance suggested by Eric and a misleading
    comment together with this bugfix suggested by Darrick. It seems the
    other users of XFS_LITINO(mp) are not impacted.
    
    Fixes: e9e2eae89ddb ("xfs: only check the superblock version for dinode size calculation")
    Cc: <stable at vger.kernel.org> # 5.7+
    Reported-and-tested-by: Dennis Gilmore <dgilmore at redhat.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Signed-off-by: Gao Xiang <hsiangkao at redhat.com>
    Reviewed-by: Darrick J. Wong <darrick.wong at oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>

diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
index bb128db220ac..d6ef69ab1c67 100644
--- a/fs/xfs/libxfs/xfs_attr_leaf.c
+++ b/fs/xfs/libxfs/xfs_attr_leaf.c
@@ -515,7 +515,7 @@ xfs_attr_copy_value(
  *========================================================================*/
 
 /*
- * Query whether the requested number of additional bytes of extended
+ * Query whether the total requested number of attr fork bytes of extended
  * attribute space will be able to fit inline.
  *
  * Returns zero if not, else the di_forkoff fork offset to be used in the
@@ -535,6 +535,12 @@ xfs_attr_shortform_bytesfit(
 	int			maxforkoff;
 	int			offset;
 
+	/*
+	 * Check if the new size could fit at all first:
+	 */
+	if (bytes > XFS_LITINO(mp))
+		return 0;
+
 	/* rounded down */
 	offset = (XFS_LITINO(mp) - bytes) >> 3;
 
commit 6b48e5b8a20f653b7d64ccf99a498f2523bff752
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:42 2020 -0800

    xfs: directory scrub should check the null bestfree entries too
    
    Teach the directory scrubber to check all the bestfree entries,
    including the null ones.  We want to be able to detect the case where
    the entry is null but there actually /is/ a directory data block.
    
    Found by fuzzing lbests[0] = ones in xfs/391.
    
    Fixes: df481968f33b ("xfs: scrub directory freespace")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Chandan Babu R <chandanrlinux at gmail.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/scrub/dir.c b/fs/xfs/scrub/dir.c
index 7c432997edad..b045e95c2ea7 100644
--- a/fs/xfs/scrub/dir.c
+++ b/fs/xfs/scrub/dir.c
@@ -558,14 +558,27 @@ xchk_directory_leaf1_bestfree(
 	/* Check all the bestfree entries. */
 	for (i = 0; i < bestcount; i++, bestp++) {
 		best = be16_to_cpu(*bestp);
-		if (best == NULLDATAOFF)
-			continue;
 		error = xfs_dir3_data_read(sc->tp, sc->ip,
-				i * args->geo->fsbcount, 0, &dbp);
+				xfs_dir2_db_to_da(args->geo, i),
+				XFS_DABUF_MAP_HOLE_OK,
+				&dbp);
 		if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, lblk,
 				&error))
 			break;
-		xchk_directory_check_freesp(sc, lblk, dbp, best);
+
+		if (!dbp) {
+			if (best != NULLDATAOFF) {
+				xchk_fblock_set_corrupt(sc, XFS_DATA_FORK,
+						lblk);
+				break;
+			}
+			continue;
+		}
+
+		if (best == NULLDATAOFF)
+			xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
+		else
+			xchk_directory_check_freesp(sc, lblk, dbp, best);
 		xfs_trans_brelse(sc->tp, dbp);
 		if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
 			break;
commit 498fe261f0d6d5189f8e11d283705dd97b474b54
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:41 2020 -0800

    xfs: strengthen rmap record flags checking
    
    We always know the correct state of the rmap record flags (attr, bmbt,
    unwritten) so check them by direct comparison.
    
    Fixes: d852657ccfc0 ("xfs: cross-reference reverse-mapping btree")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Chandan Babu R <chandanrlinux at gmail.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/scrub/bmap.c b/fs/xfs/scrub/bmap.c
index 412e2ec55e38..fed56d213a3f 100644
--- a/fs/xfs/scrub/bmap.c
+++ b/fs/xfs/scrub/bmap.c
@@ -218,13 +218,13 @@ xchk_bmap_xref_rmap(
 	 * which doesn't track unwritten state.
 	 */
 	if (owner != XFS_RMAP_OWN_COW &&
-	    irec->br_state == XFS_EXT_UNWRITTEN &&
-	    !(rmap.rm_flags & XFS_RMAP_UNWRITTEN))
+	    !!(irec->br_state == XFS_EXT_UNWRITTEN) !=
+	    !!(rmap.rm_flags & XFS_RMAP_UNWRITTEN))
 		xchk_fblock_xref_set_corrupt(info->sc, info->whichfork,
 				irec->br_startoff);
 
-	if (info->whichfork == XFS_ATTR_FORK &&
-	    !(rmap.rm_flags & XFS_RMAP_ATTR_FORK))
+	if (!!(info->whichfork == XFS_ATTR_FORK) !=
+	    !!(rmap.rm_flags & XFS_RMAP_ATTR_FORK))
 		xchk_fblock_xref_set_corrupt(info->sc, info->whichfork,
 				irec->br_startoff);
 	if (rmap.rm_flags & XFS_RMAP_BMBT_BLOCK)
commit e95b6c3ef1311dd7b20467d932a24b6d0fd88395
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:41 2020 -0800

    xfs: fix the minrecs logic when dealing with inode root child blocks
    
    The comment and logic in xchk_btree_check_minrecs for dealing with
    inode-rooted btrees isn't quite correct.  While the direct children of
    the inode root are allowed to have fewer records than what would
    normally be allowed for a regular ondisk btree block, this is only true
    if there is only one child block and the number of records don't fit in
    the inode root.
    
    Fixes: 08a3a692ef58 ("xfs: btree scrub should check minrecs")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Chandan Babu R <chandanrlinux at gmail.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/scrub/btree.c b/fs/xfs/scrub/btree.c
index f52a7b8256f9..debf392e0515 100644
--- a/fs/xfs/scrub/btree.c
+++ b/fs/xfs/scrub/btree.c
@@ -452,32 +452,41 @@ xchk_btree_check_minrecs(
 	int			level,
 	struct xfs_btree_block	*block)
 {
-	unsigned int		numrecs;
-	int			ok_level;
-
-	numrecs = be16_to_cpu(block->bb_numrecs);
+	struct xfs_btree_cur	*cur = bs->cur;
+	unsigned int		root_level = cur->bc_nlevels - 1;
+	unsigned int		numrecs = be16_to_cpu(block->bb_numrecs);
 
 	/* More records than minrecs means the block is ok. */
-	if (numrecs >= bs->cur->bc_ops->get_minrecs(bs->cur, level))
+	if (numrecs >= cur->bc_ops->get_minrecs(cur, level))
 		return;
 
 	/*
-	 * Certain btree blocks /can/ have fewer than minrecs records.  Any
-	 * level greater than or equal to the level of the highest dedicated
-	 * btree block are allowed to violate this constraint.
-	 *
-	 * For a btree rooted in a block, the btree root can have fewer than
-	 * minrecs records.  If the btree is rooted in an inode and does not
-	 * store records in the root, the direct children of the root and the
-	 * root itself can have fewer than minrecs records.
+	 * For btrees rooted in the inode, it's possible that the root block
+	 * contents spilled into a regular ondisk block because there wasn't
+	 * enough space in the inode root.  The number of records in that
+	 * child block might be less than the standard minrecs, but that's ok
+	 * provided that there's only one direct child of the root.
 	 */
-	ok_level = bs->cur->bc_nlevels - 1;
-	if (bs->cur->bc_flags & XFS_BTREE_ROOT_IN_INODE)
-		ok_level--;
-	if (level >= ok_level)
+	if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) &&
+	    level == cur->bc_nlevels - 2) {
+		struct xfs_btree_block	*root_block;
+		struct xfs_buf		*root_bp;
+		int			root_maxrecs;
+
+		root_block = xfs_btree_get_block(cur, root_level, &root_bp);
+		root_maxrecs = cur->bc_ops->get_dmaxrecs(cur, root_level);
+		if (be16_to_cpu(root_block->bb_numrecs) != 1 ||
+		    numrecs <= root_maxrecs)
+			xchk_btree_set_corrupt(bs->sc, cur, level);
 		return;
+	}
 
-	xchk_btree_set_corrupt(bs->sc, bs->cur, level);
+	/*
+	 * Otherwise, only the root level is allowed to have fewer than minrecs
+	 * records or keyptrs.
+	 */
+	if (level < root_level)
+		xchk_btree_set_corrupt(bs->sc, cur, level);
 }
 
 /*
commit 79af02af1d01ffab6118552c66b4d58eb0745f3e
Merge: 054409ab253d 735931f9a51a
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Wed Nov 18 12:04:05 2020 -0500

    Merge tag 'kvm-s390-master-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into kvm-master
    
    KVM: s390: Fix for destroy page ultravisor call
    
    - handle response code from older firmware
    - add uv.c to KVM: s390/s390 maintainer list

commit b1246bd4a18b50c0f424a877ab64605ce8ebad86
Author: Luben Tuikov <luben.tuikov at amd.com>
Date:   Tue Nov 10 00:15:48 2020 -0500

    drm/amdgpu: Fix missing prototype warning
    
    Fix a missing prototype warning for function
    amdgpu_info_ioctl(),
    
    drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c:482:5: warning: no previous prototype for 'amdgpu_info_ioctl' [-Wmissing-prototypes]
    
    Signed-off-by: Luben Tuikov <luben.tuikov at amd.com>
    Reported-by: kernel test robot <lkp at intel.com>
    Reviewed-by: Souptick Joarder <jrdr.linux at gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201110051548.685725-1-luben.tuikov@amd.com

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 183b09d71b64..6eceef23d838 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1276,6 +1276,8 @@ int amdgpu_enable_vblank_kms(struct drm_crtc *crtc);
 void amdgpu_disable_vblank_kms(struct drm_crtc *crtc);
 long amdgpu_kms_compat_ioctl(struct file *filp, unsigned int cmd,
 			     unsigned long arg);
+int amdgpu_info_ioctl(struct drm_device *dev, void *data,
+		      struct drm_file *filp);
 
 /*
  * functions used by amdgpu_encoder.c
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 1dfea15bbec3..f02aeb7c0aae 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1521,8 +1521,6 @@ int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv)
 	return 0;
 }
 
-int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
-
 const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
 	DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
commit a1f634463aaf2c94dfa13001dbdea011303124cc
Author: Jarkko Nikula <jarkko.nikula at linux.intel.com>
Date:   Tue Sep 15 16:47:15 2020 +0300

    can: m_can: process interrupt only when not runtime suspended
    
    Avoid processing bogus interrupt statuses when the HW is runtime suspended and
    the M_CAN_IR register read may get all bits 1's. Handler can be called if the
    interrupt request is shared with other peripherals or at the end of free_irq().
    
    Therefore check the runtime suspended status before processing.
    
    Fixes: cdf8259d6573 ("can: m_can: Add PM Support")
    Signed-off-by: Jarkko Nikula <jarkko.nikula at linux.intel.com>
    Link: https://lore.kernel.org/r/20200915134715.696303-1-jarkko.nikula@linux.intel.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index e7264043f79a..f3fc37e96b08 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -956,6 +956,8 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
 	struct net_device_stats *stats = &dev->stats;
 	u32 ir;
 
+	if (pm_runtime_suspended(cdev->dev))
+		return IRQ_NONE;
 	ir = m_can_read(cdev, M_CAN_IR);
 	if (!ir)
 		return IRQ_NONE;
commit 20b329129009caf1c646152abe09b697227e1c37
Author: Bob Peterson <rpeterso at redhat.com>
Date:   Wed Nov 18 08:54:31 2020 -0500

    gfs2: Fix regression in freeze_go_sync
    
    Patch 541656d3a513 ("gfs2: freeze should work on read-only mounts") changed
    the check for glock state in function freeze_go_sync() from "gl->gl_state
    == LM_ST_SHARED" to "gl->gl_req == LM_ST_EXCLUSIVE".  That's wrong and it
    regressed gfs2's freeze/thaw mechanism because it caused only the freezing
    node (which requests the glock in EX) to queue freeze work.
    
    All nodes go through this go_sync code path during the freeze to drop their
    SHared hold on the freeze glock, allowing the freezing node to acquire it
    in EXclusive mode. But all the nodes must freeze access to the file system
    locally, so they ALL must queue freeze work. The freeze_work calls
    freeze_func, which makes a request to reacquire the freeze glock in SH,
    effectively blocking until the thaw from the EX holder. Once thawed, the
    freezing node drops its EX hold on the freeze glock, then the (blocked)
    freeze_func reacquires the freeze glock in SH again (on all nodes, including
    the freezer) so all nodes go back to a thawed state.
    
    This patch changes the check back to gl_state == LM_ST_SHARED like it was
    prior to 541656d3a513.
    
    Fixes: 541656d3a513 ("gfs2: freeze should work on read-only mounts")
    Cc: stable at vger.kernel.org # v5.8+
    Signed-off-by: Bob Peterson <rpeterso at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index 6c1432d78dce..67f2921ae8d4 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -571,7 +571,18 @@ static int freeze_go_sync(struct gfs2_glock *gl)
 	int error = 0;
 	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
 
-	if (gl->gl_req == LM_ST_EXCLUSIVE && !gfs2_withdrawn(sdp)) {
+	/*
+	 * We need to check gl_state == LM_ST_SHARED here and not gl_req ==
+	 * LM_ST_EXCLUSIVE. That's because when any node does a freeze,
+	 * all the nodes should have the freeze glock in SH mode and they all
+	 * call do_xmote: One for EX and the others for UN. They ALL must
+	 * freeze locally, and they ALL must queue freeze work. The freeze_work
+	 * calls freeze_func, which tries to reacquire the freeze glock in SH,
+	 * effectively waiting for the thaw on the node who holds it in EX.
+	 * Once thawed, the work func acquires the freeze glock in
+	 * SH and everybody goes back to thawed.
+	 */
+	if (gl->gl_state == LM_ST_SHARED && !gfs2_withdrawn(sdp)) {
 		atomic_set(&sdp->sd_freeze_state, SFS_STARTING_FREEZE);
 		error = freeze_super(sdp->sd_vfs);
 		if (error) {
commit aefec40938e4a0e1214f9121520aba4d51697cd9
Author: Christian König <christian.koenig at amd.com>
Date:   Mon Nov 16 20:12:03 2020 +0100

    drm/amdgpu: fix check order in amdgpu_bo_move
    
    Reorder the code to fix checking if blitting is available.
    
    Signed-off-by: Christian König <christian.koenig at amd.com>
    Acked-by: Alex Deucher <alexander.deucher at amd.com>
    Link: https://patchwork.freedesktop.org/patch/401019/

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 676fb520e044..c438d290a6db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -551,25 +551,12 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
 	struct ttm_resource *old_mem = &bo->mem;
 	int r;
 
-	if ((old_mem->mem_type == TTM_PL_SYSTEM &&
-	     new_mem->mem_type == TTM_PL_VRAM) ||
-	    (old_mem->mem_type == TTM_PL_VRAM &&
-	     new_mem->mem_type == TTM_PL_SYSTEM)) {
-		hop->fpfn = 0;
-		hop->lpfn = 0;
-		hop->mem_type = TTM_PL_TT;
-		hop->flags = 0;
-		return -EMULTIHOP;
-	}
-
 	if (new_mem->mem_type == TTM_PL_TT) {
 		r = amdgpu_ttm_backend_bind(bo->bdev, bo->ttm, new_mem);
 		if (r)
 			return r;
 	}
 
-	amdgpu_bo_move_notify(bo, evict, new_mem);
-
 	/* Can't move a pinned BO */
 	abo = ttm_to_amdgpu_bo(bo);
 	if (WARN_ON_ONCE(abo->tbo.pin_count > 0))
@@ -579,24 +566,23 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
 
 	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
 		ttm_bo_move_null(bo, new_mem);
-		return 0;
+		goto out;
 	}
 	if (old_mem->mem_type == TTM_PL_SYSTEM &&
 	    new_mem->mem_type == TTM_PL_TT) {
 		ttm_bo_move_null(bo, new_mem);
-		return 0;
+		goto out;
 	}
-
 	if (old_mem->mem_type == TTM_PL_TT &&
 	    new_mem->mem_type == TTM_PL_SYSTEM) {
 		r = ttm_bo_wait_ctx(bo, ctx);
 		if (r)
-			goto fail;
+			return r;
 
 		amdgpu_ttm_backend_unbind(bo->bdev, bo->ttm);
 		ttm_resource_free(bo, &bo->mem);
 		ttm_bo_assign_mem(bo, new_mem);
-		return 0;
+		goto out;
 	}
 
 	if (old_mem->mem_type == AMDGPU_PL_GDS ||
@@ -607,27 +593,37 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
 	    new_mem->mem_type == AMDGPU_PL_OA) {
 		/* Nothing to save here */
 		ttm_bo_move_null(bo, new_mem);
-		return 0;
+		goto out;
 	}
 
-	if (!adev->mman.buffer_funcs_enabled) {
+	if (adev->mman.buffer_funcs_enabled) {
+		if (((old_mem->mem_type == TTM_PL_SYSTEM &&
+		      new_mem->mem_type == TTM_PL_VRAM) ||
+		     (old_mem->mem_type == TTM_PL_VRAM &&
+		      new_mem->mem_type == TTM_PL_SYSTEM))) {
+			hop->fpfn = 0;
+			hop->lpfn = 0;
+			hop->mem_type = TTM_PL_TT;
+			hop->flags = 0;
+			return -EMULTIHOP;
+		}
+
+		r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
+	} else {
 		r = -ENODEV;
-		goto memcpy;
 	}
 
-	r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
 	if (r) {
-memcpy:
 		/* Check that all memory is CPU accessible */
 		if (!amdgpu_mem_visible(adev, old_mem) ||
 		    !amdgpu_mem_visible(adev, new_mem)) {
 			pr_err("Move buffer fallback to memcpy unavailable\n");
-			goto fail;
+			return r;
 		}
 
 		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
 		if (r)
-			goto fail;
+			return r;
 	}
 
 	if (bo->type == ttm_bo_type_device &&
@@ -639,14 +635,11 @@ memcpy:
 		abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
 	}
 
+out:
 	/* update statistics */
 	atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &adev->num_bytes_moved);
+	amdgpu_bo_move_notify(bo, evict, new_mem);
 	return 0;
-fail:
-	swap(*new_mem, bo->mem);
-	amdgpu_bo_move_notify(bo, false, new_mem);
-	swap(*new_mem, bo->mem);
-	return r;
 }
 
 /**
commit cd9f13c59461351d7a5fd07924264fb49b287359
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Nov 18 16:01:48 2020 +0100

    can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable() during bus-off recovery
    
    If the CAN controller goes into bus off, the do_set_mode() callback with
    CAN_MODE_START can be used to recover the controller, which then calls
    flexcan_chip_start(). If configured, this is done automatically by the
    framework or manually by the user.
    
    In flexcan_chip_start() there is an explicit call to
    flexcan_transceiver_enable(), which does a regulator_enable() on the
    transceiver regulator. This results in a net usage counter increase, as there
    is no corresponding flexcan_transceiver_disable() in the bus off code path.
    This further leads to the transceiver stuck enabled, even if the CAN interface
    is shut down.
    
    To fix this problem the
    flexcan_transceiver_enable()/flexcan_transceiver_disable() are moved out of
    flexcan_chip_start()/flexcan_chip_stop() into flexcan_open()/flexcan_close().
    
    Fixes: e955cead0311 ("CAN: Add Flexcan CAN controller driver")
    Link: https://lore.kernel.org/r/20201118150148.2664024-1-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index d6a9cf0e9b60..99e5f272205d 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -1567,14 +1567,10 @@ static int flexcan_chip_start(struct net_device *dev)
 		priv->write(reg_ctrl2, &regs->ctrl2);
 	}
 
-	err = flexcan_transceiver_enable(priv);
-	if (err)
-		goto out_chip_disable;
-
 	/* synchronize with the can bus */
 	err = flexcan_chip_unfreeze(priv);
 	if (err)
-		goto out_transceiver_disable;
+		goto out_chip_disable;
 
 	priv->can.state = CAN_STATE_ERROR_ACTIVE;
 
@@ -1592,8 +1588,6 @@ static int flexcan_chip_start(struct net_device *dev)
 
 	return 0;
 
- out_transceiver_disable:
-	flexcan_transceiver_disable(priv);
  out_chip_disable:
 	flexcan_chip_disable(priv);
 	return err;
@@ -1623,7 +1617,6 @@ static int __flexcan_chip_stop(struct net_device *dev, bool disable_on_error)
 	priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
 		    &regs->ctrl);
 
-	flexcan_transceiver_disable(priv);
 	priv->can.state = CAN_STATE_STOPPED;
 
 	return 0;
@@ -1665,10 +1658,14 @@ static int flexcan_open(struct net_device *dev)
 	if (err)
 		goto out_runtime_put;
 
-	err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
+	err = flexcan_transceiver_enable(priv);
 	if (err)
 		goto out_close;
 
+	err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
+	if (err)
+		goto out_transceiver_disable;
+
 	if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
 		priv->mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN;
 	else
@@ -1720,6 +1717,8 @@ static int flexcan_open(struct net_device *dev)
 	can_rx_offload_del(&priv->offload);
  out_free_irq:
 	free_irq(dev->irq, dev);
+ out_transceiver_disable:
+	flexcan_transceiver_disable(priv);
  out_close:
 	close_candev(dev);
  out_runtime_put:
@@ -1738,6 +1737,7 @@ static int flexcan_close(struct net_device *dev)
 
 	can_rx_offload_del(&priv->offload);
 	free_irq(dev->irq, dev);
+	flexcan_transceiver_disable(priv);
 
 	close_candev(dev);
 	pm_runtime_put(priv->dev);
commit e297822b20e7fe683e107aea46e6402adcf99c70
Author: Pavel Begunkov <asml.silence at gmail.com>
Date:   Wed Nov 18 14:56:26 2020 +0000

    io_uring: order refnode recycling
    
    Don't recycle a refnode until we're done with all requests of nodes
    ejected before.
    
    Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
    Cc: stable at vger.kernel.org # v5.7+
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 5cb194ca4fce..7d4b755ab451 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -205,6 +205,7 @@ struct fixed_file_ref_node {
 	struct list_head		file_list;
 	struct fixed_file_data		*file_data;
 	struct llist_node		llist;
+	bool				done;
 };
 
 struct fixed_file_data {
@@ -7323,10 +7324,6 @@ static void __io_file_put_work(struct fixed_file_ref_node *ref_node)
 		kfree(pfile);
 	}
 
-	spin_lock(&file_data->lock);
-	list_del(&ref_node->node);
-	spin_unlock(&file_data->lock);
-
 	percpu_ref_exit(&ref_node->refs);
 	kfree(ref_node);
 	percpu_ref_put(&file_data->refs);
@@ -7353,17 +7350,32 @@ static void io_file_put_work(struct work_struct *work)
 static void io_file_data_ref_zero(struct percpu_ref *ref)
 {
 	struct fixed_file_ref_node *ref_node;
+	struct fixed_file_data *data;
 	struct io_ring_ctx *ctx;
-	bool first_add;
+	bool first_add = false;
 	int delay = HZ;
 
 	ref_node = container_of(ref, struct fixed_file_ref_node, refs);
-	ctx = ref_node->file_data->ctx;
+	data = ref_node->file_data;
+	ctx = data->ctx;
+
+	spin_lock(&data->lock);
+	ref_node->done = true;
+
+	while (!list_empty(&data->ref_list)) {
+		ref_node = list_first_entry(&data->ref_list,
+					struct fixed_file_ref_node, node);
+		/* recycle ref nodes in order */
+		if (!ref_node->done)
+			break;
+		list_del(&ref_node->node);
+		first_add |= llist_add(&ref_node->llist, &ctx->file_put_llist);
+	}
+	spin_unlock(&data->lock);
 
-	if (percpu_ref_is_dying(&ctx->file_data->refs))
+	if (percpu_ref_is_dying(&data->refs))
 		delay = 0;
 
-	first_add = llist_add(&ref_node->llist, &ctx->file_put_llist);
 	if (!delay)
 		mod_delayed_work(system_wq, &ctx->file_put_work, 0);
 	else if (first_add)
@@ -7387,6 +7399,7 @@ static struct fixed_file_ref_node *alloc_fixed_file_ref_node(
 	INIT_LIST_HEAD(&ref_node->node);
 	INIT_LIST_HEAD(&ref_node->file_list);
 	ref_node->file_data = ctx->file_data;
+	ref_node->done = false;
 	return ref_node;
 }
 
@@ -7482,7 +7495,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
 
 	file_data->node = ref_node;
 	spin_lock(&file_data->lock);
-	list_add(&ref_node->node, &file_data->ref_list);
+	list_add_tail(&ref_node->node, &file_data->ref_list);
 	spin_unlock(&file_data->lock);
 	percpu_ref_get(&file_data->refs);
 	return ret;
@@ -7641,7 +7654,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
 	if (needs_switch) {
 		percpu_ref_kill(&data->node->refs);
 		spin_lock(&data->lock);
-		list_add(&ref_node->node, &data->ref_list);
+		list_add_tail(&ref_node->node, &data->ref_list);
 		data->node = ref_node;
 		spin_unlock(&data->lock);
 		percpu_ref_get(&ctx->file_data->refs);
commit 1e5d770bb8a23dd01e28e92f4fb0b1093c8bdbe6
Author: Pavel Begunkov <asml.silence at gmail.com>
Date:   Wed Nov 18 14:56:25 2020 +0000

    io_uring: get an active ref_node from files_data
    
    An active ref_node always can be found in ctx->files_data, it's much
    safer to get it this way instead of poking into files_data->ref_list.
    
    Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
    Cc: stable at vger.kernel.org # v5.7+
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index b205c1df3f74..5cb194ca4fce 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -6974,9 +6974,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
 		return -ENXIO;
 
 	spin_lock(&data->lock);
-	if (!list_empty(&data->ref_list))
-		ref_node = list_first_entry(&data->ref_list,
-				struct fixed_file_ref_node, node);
+	ref_node = data->node;
 	spin_unlock(&data->lock);
 	if (ref_node)
 		percpu_ref_kill(&ref_node->refs);
commit 4d213e76a359e540ca786ee937da7f35faa8e5f8
Author: Zhenzhong Duan <zhenzhong.duan at gmail.com>
Date:   Tue Nov 10 15:19:08 2020 +0800

    iommu/vt-d: Avoid panic if iommu init fails in tboot system
    
    "intel_iommu=off" command line is used to disable iommu but iommu is force
    enabled in a tboot system for security reason.
    
    However for better performance on high speed network device, a new option
    "intel_iommu=tboot_noforce" is introduced to disable the force on.
    
    By default kernel should panic if iommu init fail in tboot for security
    reason, but it's unnecessory if we use "intel_iommu=tboot_noforce,off".
    
    Fix the code setting force_on and move intel_iommu_tboot_noforce
    from tboot code to intel iommu code.
    
    Fixes: 7304e8f28bb2 ("iommu/vt-d: Correctly disable Intel IOMMU force on")
    Signed-off-by: Zhenzhong Duan <zhenzhong.duan at gmail.com>
    Tested-by: Lukasz Hawrylko <lukasz.hawrylko at linux.intel.com>
    Acked-by: Lu Baolu <baolu.lu at linux.intel.com>
    Link: https://lore.kernel.org/r/20201110071908.3133-1-zhenzhong.duan@gmail.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
index 992fb1415c0f..420be871d9d4 100644
--- a/arch/x86/kernel/tboot.c
+++ b/arch/x86/kernel/tboot.c
@@ -514,9 +514,6 @@ int tboot_force_iommu(void)
 	if (!tboot_enabled())
 		return 0;
 
-	if (intel_iommu_tboot_noforce)
-		return 1;
-
 	if (no_iommu || swiotlb || dmar_disabled)
 		pr_warn("Forcing Intel-IOMMU to enabled\n");
 
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 1b1ca63e6bbe..4d9b298002f0 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -179,7 +179,7 @@ static int rwbf_quirk;
  * (used when kernel is launched w/ TXT)
  */
 static int force_on = 0;
-int intel_iommu_tboot_noforce;
+static int intel_iommu_tboot_noforce;
 static int no_platform_optin;
 
 #define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry))
@@ -4885,7 +4885,8 @@ int __init intel_iommu_init(void)
 	 * Intel IOMMU is required for a TXT/tboot launch or platform
 	 * opt in, so enforce that.
 	 */
-	force_on = tboot_force_iommu() || platform_optin_force_iommu();
+	force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
+		    platform_optin_force_iommu();
 
 	if (iommu_init_mempool()) {
 		if (force_on)
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index fbf5b3e7707e..d956987ed032 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -798,7 +798,6 @@ extern int iommu_calculate_agaw(struct intel_iommu *iommu);
 extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu);
 extern int dmar_disabled;
 extern int intel_iommu_enabled;
-extern int intel_iommu_tboot_noforce;
 extern int intel_iommu_gfx_mapped;
 #else
 static inline int iommu_calculate_agaw(struct intel_iommu *iommu)
commit 7e4be1290a38b3dd4a77cdf4565c9ffe7e620013
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Nov 13 13:16:31 2020 +0300

    dmaengine: fix error codes in channel_register()
    
    The error codes were not set on some of these error paths.
    
    Also the error handling was more confusing than it needed to be so I
    cleaned it up and shuffled it around a bit.
    
    Fixes: d2fb0a043838 ("dmaengine: break out channel registration")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Reviewed-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Link: https://lore.kernel.org/r/20201113101631.GE168908@mwanda
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
index 7974fa0400d8..962cbb5e5f7f 100644
--- a/drivers/dma/dmaengine.c
+++ b/drivers/dma/dmaengine.c
@@ -1039,16 +1039,15 @@ static int get_dma_id(struct dma_device *device)
 static int __dma_async_device_channel_register(struct dma_device *device,
 					       struct dma_chan *chan)
 {
-	int rc = 0;
+	int rc;
 
 	chan->local = alloc_percpu(typeof(*chan->local));
 	if (!chan->local)
-		goto err_out;
+		return -ENOMEM;
 	chan->dev = kzalloc(sizeof(*chan->dev), GFP_KERNEL);
 	if (!chan->dev) {
-		free_percpu(chan->local);
-		chan->local = NULL;
-		goto err_out;
+		rc = -ENOMEM;
+		goto err_free_local;
 	}
 
 	/*
@@ -1061,7 +1060,8 @@ static int __dma_async_device_channel_register(struct dma_device *device,
 	if (chan->chan_id < 0) {
 		pr_err("%s: unable to alloc ida for chan: %d\n",
 		       __func__, chan->chan_id);
-		goto err_out;
+		rc = chan->chan_id;
+		goto err_free_dev;
 	}
 
 	chan->dev->device.class = &dma_devclass;
@@ -1082,9 +1082,10 @@ static int __dma_async_device_channel_register(struct dma_device *device,
 	mutex_lock(&device->chan_mutex);
 	ida_free(&device->chan_ida, chan->chan_id);
 	mutex_unlock(&device->chan_mutex);
- err_out:
-	free_percpu(chan->local);
+ err_free_dev:
 	kfree(chan->dev);
+ err_free_local:
+	free_percpu(chan->local);
 	return rc;
 }
 
commit 735931f9a51ab09cf795721b37696b420484625f
Author: Christian Borntraeger <borntraeger at de.ibm.com>
Date:   Wed Nov 18 08:44:12 2020 +0100

    MAINTAINERS: add uv.c also to KVM/s390
    
    Most changes in uv.c are related to KVM. Involve also the KVM team
    regarding changes to uv.c.
    
    Signed-off-by: Christian Borntraeger <borntraeger at de.ibm.com>
    Reviewed-by: David Hildenbrand <david at redhat.com>
    Acked-by: Cornelia Huck <cohuck at redhat.com>
    Acked-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/MAINTAINERS b/MAINTAINERS
index e73636b75f29..06116d892a4b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9674,6 +9674,7 @@ F:	Documentation/virt/kvm/s390*
 F:	arch/s390/include/asm/gmap.h
 F:	arch/s390/include/asm/kvm*
 F:	arch/s390/include/uapi/asm/kvm*
+F:	arch/s390/kernel/uv.c
 F:	arch/s390/kvm/
 F:	arch/s390/mm/gmap.c
 F:	tools/testing/selftests/kvm/*/s390x/
commit 4c80d05714d347405865802b7098f1c97362cbef
Author: Christian Borntraeger <borntraeger at de.ibm.com>
Date:   Tue Nov 17 20:00:33 2020 +0100

    s390/uv: handle destroy page legacy interface
    
    Older firmware can return rc=0x107 rrc=0xd for destroy page if the
    page is already non-secure. This should be handled like a success
    as already done by newer firmware.
    
    Signed-off-by: Christian Borntraeger <borntraeger at de.ibm.com>
    Fixes: 1a80b54d1ce1 ("s390/uv: add destroy page call")
    Reviewed-by: David Hildenbrand <david at redhat.com>
    Acked-by: Cornelia Huck <cohuck at redhat.com>
    Reviewed-by: Janosch Frank <frankja at linux.ibm.com>

diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index 14bd9d58edc9..883bfed9f5c2 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -129,8 +129,15 @@ int uv_destroy_page(unsigned long paddr)
 		.paddr = paddr
 	};
 
-	if (uv_call(0, (u64)&uvcb))
+	if (uv_call(0, (u64)&uvcb)) {
+		/*
+		 * Older firmware uses 107/d as an indication of a non secure
+		 * page. Let us emulate the newer variant (no-op).
+		 */
+		if (uvcb.header.rc == 0x107 && uvcb.header.rrc == 0xd)
+			return 0;
 		return -EINVAL;
+	}
 	return 0;
 }
 
commit 860aaabac8235cfde10fe556aa82abbbe3117888
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Tue Nov 17 21:23:34 2020 +0100

    x86/dumpstack: Do not try to access user space code of other tasks
    
    sysrq-t ends up invoking show_opcodes() for each task which tries to access
    the user space code of other processes, which is obviously bogus.
    
    It either manages to dump where the foreign task's regs->ip points to in a
    valid mapping of the current task or triggers a pagefault and prints "Code:
    Bad RIP value.". Both is just wrong.
    
    Add a safeguard in copy_code() and check whether the @regs pointer matches
    currents pt_regs. If not, do not even try to access it.
    
    While at it, add commentary why using copy_from_user_nmi() is safe in
    copy_code() even if the function name suggests otherwise.
    
    Reported-by: Oleg Nesterov <oleg at redhat.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Reviewed-by: Borislav Petkov <bp at suse.de>
    Acked-by: Oleg Nesterov <oleg at redhat.com>
    Tested-by: Borislav Petkov <bp at suse.de>
    Link: https://lkml.kernel.org/r/20201117202753.667274723@linutronix.de

diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index 25c06b67e7e0..97aa900386cb 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -78,6 +78,9 @@ static int copy_code(struct pt_regs *regs, u8 *buf, unsigned long src,
 	if (!user_mode(regs))
 		return copy_from_kernel_nofault(buf, (u8 *)src, nbytes);
 
+	/* The user space code from other tasks cannot be accessed. */
+	if (regs != task_pt_regs(current))
+		return -EPERM;
 	/*
 	 * Make sure userspace isn't trying to trick us into dumping kernel
 	 * memory by pointing the userspace instruction pointer at it.
@@ -85,6 +88,12 @@ static int copy_code(struct pt_regs *regs, u8 *buf, unsigned long src,
 	if (__chk_range_not_ok(src, nbytes, TASK_SIZE_MAX))
 		return -EINVAL;
 
+	/*
+	 * Even if named copy_from_user_nmi() this can be invoked from
+	 * other contexts and will not try to resolve a pagefault, which is
+	 * the correct thing to do here as this code can be called from any
+	 * context.
+	 */
 	return copy_from_user_nmi(buf, (void __user *)src, nbytes);
 }
 
@@ -115,13 +124,19 @@ void show_opcodes(struct pt_regs *regs, const char *loglvl)
 	u8 opcodes[OPCODE_BUFSIZE];
 	unsigned long prologue = regs->ip - PROLOGUE_SIZE;
 
-	if (copy_code(regs, opcodes, prologue, sizeof(opcodes))) {
-		printk("%sCode: Unable to access opcode bytes at RIP 0x%lx.\n",
-		       loglvl, prologue);
-	} else {
+	switch (copy_code(regs, opcodes, prologue, sizeof(opcodes))) {
+	case 0:
 		printk("%sCode: %" __stringify(PROLOGUE_SIZE) "ph <%02x> %"
 		       __stringify(EPILOGUE_SIZE) "ph\n", loglvl, opcodes,
 		       opcodes[PROLOGUE_SIZE], opcodes + PROLOGUE_SIZE + 1);
+		break;
+	case -EPERM:
+		/* No access to the user space stack of other tasks. Ignore. */
+		break;
+	default:
+		printk("%sCode: Unable to access opcode bytes at RIP 0x%lx.\n",
+		       loglvl, prologue);
+		break;
 	}
 }
 
commit d003868d7f8579838ed58b6429af91844039b6f8
Author: Jimmy Assarsson <extja at kvaser.com>
Date:   Sun Nov 15 17:30:23 2020 +0100

    can: kvaser_usb: kvaser_usb_hydra: Fix KCAN bittiming limits
    
    Use correct bittiming limits for the KCAN CAN controller.
    
    Fixes: aec5fb2268b7 ("can: kvaser_usb: Add support for Kvaser USB hydra family")
    Signed-off-by: Jimmy Assarsson <extja at kvaser.com>
    Link: https://lore.kernel.org/r/20201115163027.16851-2-jimmyassarsson@gmail.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
index 7ab87a758754..218fadc91155 100644
--- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
+++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
@@ -367,7 +367,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
 	.tseg2_max = 32,
 	.sjw_max = 16,
 	.brp_min = 1,
-	.brp_max = 4096,
+	.brp_max = 8192,
 	.brp_inc = 1,
 };
 
commit 470e14c00c63752466ac44de392f584dfdddd82e
Author: Jimmy Assarsson <extja at kvaser.com>
Date:   Sun Nov 15 17:30:22 2020 +0100

    can: kvaser_pciefd: Fix KCAN bittiming limits
    
    Use correct bittiming limits for the KCAN CAN controller.
    
    Fixes: 26ad340e582d ("can: kvaser_pciefd: Add driver for Kvaser PCIEcan devices")
    Signed-off-by: Jimmy Assarsson <extja at kvaser.com>
    Link: https://lore.kernel.org/r/20201115163027.16851-1-jimmyassarsson@gmail.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
index 6f766918211a..72acd1ba162d 100644
--- a/drivers/net/can/kvaser_pciefd.c
+++ b/drivers/net/can/kvaser_pciefd.c
@@ -287,12 +287,12 @@ struct kvaser_pciefd_tx_packet {
 static const struct can_bittiming_const kvaser_pciefd_bittiming_const = {
 	.name = KVASER_PCIEFD_DRV_NAME,
 	.tseg1_min = 1,
-	.tseg1_max = 255,
+	.tseg1_max = 512,
 	.tseg2_min = 1,
 	.tseg2_max = 32,
 	.sjw_max = 16,
 	.brp_min = 1,
-	.brp_max = 4096,
+	.brp_max = 8192,
 	.brp_inc = 1,
 };
 
commit 957a1ea3599210e9996777a734ea5284eaef75c7
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Fri Nov 6 15:22:31 2020 +0100

    drm/sun4i: backend: Fix probe failure with multiple backends
    
    Commit e0d072782c73 ("dma-mapping: introduce DMA range map, supplanting
    dma_pfn_offset") introduced a regression in our code since the second
    backed to probe will now get -EINVAL back from dma_direct_set_offset and
    will prevent the entire DRM device from probing.
    
    Ignore -EINVAL as a temporary measure to get it back working, before
    removing that call entirely.
    
    Fixes: e0d072782c73 ("dma-mapping: introduce DMA range map, supplanting dma_pfn_offset")
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Reviewed-by: Chen-Yu Tsai <wens at csie.org>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c
index 77497b45f9a2..55960cbb1019 100644
--- a/drivers/gpu/drm/sun4i/sun4i_backend.c
+++ b/drivers/gpu/drm/sun4i/sun4i_backend.c
@@ -814,9 +814,15 @@ static int sun4i_backend_bind(struct device *dev, struct device *master,
 		 *
 		 * XXX(hch): this has no business in a driver and needs to move
 		 * to the device tree.
+		 *
+		 * If we have two subsequent calls to dma_direct_set_offset
+		 * returns -EINVAL. Unfortunately, this happens when we have two
+		 * backends in the system, and will result in the driver
+		 * reporting an error while it has been setup properly before.
+		 * Ignore EINVAL, but it should really be removed eventually.
 		 */
 		ret = dma_direct_set_offset(drm->dev, PHYS_OFFSET, 0, SZ_4G);
-		if (ret)
+		if (ret && ret != -EINVAL)
 			return ret;
 	}
 
commit f737561c709667013d832316dd3198a7fe3d1260
Author: Vineet Gupta <vgupta at synopsys.com>
Date:   Fri Nov 6 17:37:34 2020 -0800

    ARC: stack unwinding: reorganize how initial register state setup
    
    This is a non-functional change, if anything a better fall-back
    handling.
    
    Signed-off-by: Vineet Gupta <vgupta at synopsys.com>

diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c
index b2557f581ea8..f73da203b170 100644
--- a/arch/arc/kernel/stacktrace.c
+++ b/arch/arc/kernel/stacktrace.c
@@ -42,11 +42,23 @@ static int
 seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
 		       struct unwind_frame_info *frame_info)
 {
-	/*
-	 * synchronous unwinding (e.g. dump_stack)
-	 *  - uses current values of SP and friends
-	 */
-	if (regs == NULL && (tsk == NULL || tsk == current)) {
+	if (regs) {
+		/*
+		 * Asynchronous unwinding of intr/exception
+		 *  - Just uses the pt_regs passed
+		 */
+		frame_info->task = tsk;
+
+		frame_info->regs.r27 = regs->fp;
+		frame_info->regs.r28 = regs->sp;
+		frame_info->regs.r31 = regs->blink;
+		frame_info->regs.r63 = regs->ret;
+		frame_info->call_frame = 0;
+	} else if (tsk == NULL || tsk == current) {
+		/*
+		 * synchronous unwinding (e.g. dump_stack)
+		 *  - uses current values of SP and friends
+		 */
 		unsigned long fp, sp, blink, ret;
 		frame_info->task = current;
 
@@ -63,7 +75,7 @@ seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
 		frame_info->regs.r31 = blink;
 		frame_info->regs.r63 = ret;
 		frame_info->call_frame = 0;
-	} else if (regs == NULL) {
+	} else {
 		/*
 		 * Asynchronous unwinding of a likely sleeping task
 		 *  - first ensure it is actually sleeping
@@ -94,20 +106,7 @@ seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
 		frame_info->regs.r28 += 60;
 		frame_info->call_frame = 0;
 
-	} else {
-		/*
-		 * Asynchronous unwinding of intr/exception
-		 *  - Just uses the pt_regs passed
-		 */
-		frame_info->task = tsk;
-
-		frame_info->regs.r27 = regs->fp;
-		frame_info->regs.r28 = regs->sp;
-		frame_info->regs.r31 = regs->blink;
-		frame_info->regs.r63 = regs->ret;
-		frame_info->call_frame = 0;
 	}
-
 	return 0;
 }
 
commit e42404fa10fd11fe72d0a0e149a321d10e577715
Author: Vineet Gupta <vgupta at synopsys.com>
Date:   Fri Nov 6 16:59:27 2020 -0800

    ARC: stack unwinding: don't assume non-current task is sleeping
    
    To start stack unwinding (SP, PC and BLINK) are needed. When the
    explicit execution context (pt_regs etc) is not available, unwinder
    assumes the task is sleeping (in __switch_to()) and fetches SP and BLINK
    from kernel mode stack.
    
    But this assumption is not true, specially in a SMP system, when top
    runs on 1 core, there may be active running processes on all cores.
    
    So when unwinding non courrent tasks, ensure they are NOT running.
    
    And while at it, handle the self unwinding case explicitly.
    
    This came out of investigation of a customer reported hang with
    rcutorture+top
    
    Link: https://github.com/foss-for-synopsys-dwc-arc-processors/linux/issues/31
    Signed-off-by: Vineet Gupta <vgupta at synopsys.com>

diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c
index b23986f98450..b2557f581ea8 100644
--- a/arch/arc/kernel/stacktrace.c
+++ b/arch/arc/kernel/stacktrace.c
@@ -38,15 +38,15 @@
 
 #ifdef CONFIG_ARC_DW2_UNWIND
 
-static void seed_unwind_frame_info(struct task_struct *tsk,
-				   struct pt_regs *regs,
-				   struct unwind_frame_info *frame_info)
+static int
+seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
+		       struct unwind_frame_info *frame_info)
 {
 	/*
 	 * synchronous unwinding (e.g. dump_stack)
 	 *  - uses current values of SP and friends
 	 */
-	if (tsk == NULL && regs == NULL) {
+	if (regs == NULL && (tsk == NULL || tsk == current)) {
 		unsigned long fp, sp, blink, ret;
 		frame_info->task = current;
 
@@ -65,11 +65,15 @@ static void seed_unwind_frame_info(struct task_struct *tsk,
 		frame_info->call_frame = 0;
 	} else if (regs == NULL) {
 		/*
-		 * Asynchronous unwinding of sleeping task
-		 *  - Gets SP etc from task's pt_regs (saved bottom of kernel
-		 *    mode stack of task)
+		 * Asynchronous unwinding of a likely sleeping task
+		 *  - first ensure it is actually sleeping
+		 *  - if so, it will be in __switch_to, kernel mode SP of task
+		 *    is safe-kept and BLINK at a well known location in there
 		 */
 
+		if (tsk->state == TASK_RUNNING)
+			return -1;
+
 		frame_info->task = tsk;
 
 		frame_info->regs.r27 = TSK_K_FP(tsk);
@@ -103,6 +107,8 @@ static void seed_unwind_frame_info(struct task_struct *tsk,
 		frame_info->regs.r63 = regs->ret;
 		frame_info->call_frame = 0;
 	}
+
+	return 0;
 }
 
 #endif
@@ -116,7 +122,8 @@ arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs,
 	unsigned int address;
 	struct unwind_frame_info frame_info;
 
-	seed_unwind_frame_info(tsk, regs, &frame_info);
+	if (seed_unwind_frame_info(tsk, regs, &frame_info))
+		return 0;
 
 	while (1) {
 		address = UNW_PC(&frame_info);
commit 5f840df591a9554e4e1355ef1f8946bc2120ca9f
Author: Flavio Suligoi <f.suligoi at asem.it>
Date:   Mon Nov 9 14:21:30 2020 +0100

    ARC: mm: fix spelling mistakes
    
    Signed-off-by: Flavio Suligoi <f.suligoi at asem.it>
    Signed-off-by: Vineet Gupta <vgupta at synopsys.com>

diff --git a/arch/arc/mm/tlb.c b/arch/arc/mm/tlb.c
index c340acd989a0..9bb3c24f3677 100644
--- a/arch/arc/mm/tlb.c
+++ b/arch/arc/mm/tlb.c
@@ -30,14 +30,14 @@
  *  -Changes related to MMU v2 (Rel 4.8)
  *
  * Vineetg: Aug 29th 2008
- *  -In TLB Flush operations (Metal Fix MMU) there is a explict command to
+ *  -In TLB Flush operations (Metal Fix MMU) there is a explicit command to
  *    flush Micro-TLBS. If TLB Index Reg is invalid prior to TLBIVUTLB cmd,
  *    it fails. Thus need to load it with ANY valid value before invoking
  *    TLBIVUTLB cmd
  *
  * Vineetg: Aug 21th 2008:
  *  -Reduced the duration of IRQ lockouts in TLB Flush routines
- *  -Multiple copies of TLB erase code seperated into a "single" function
+ *  -Multiple copies of TLB erase code separated into a "single" function
  *  -In TLB Flush routines, interrupt disabling moved UP to retrieve ASID
  *       in interrupt-safe region.
  *
@@ -66,7 +66,7 @@
  *
  * Although J-TLB is 2 way set assoc, ARC700 caches J-TLB into uTLBS which has
  * much higher associativity. u-D-TLB is 8 ways, u-I-TLB is 4 ways.
- * Given this, the thrasing problem should never happen because once the 3
+ * Given this, the thrashing problem should never happen because once the 3
  * J-TLB entries are created (even though 3rd will knock out one of the prev
  * two), the u-D-TLB and u-I-TLB will have what is required to accomplish memcpy
  *
@@ -127,7 +127,7 @@ static void utlb_invalidate(void)
 	 * There was however an obscure hardware bug, where uTLB flush would
 	 * fail when a prior probe for J-TLB (both totally unrelated) would
 	 * return lkup err - because the entry didn't exist in MMU.
-	 * The Workround was to set Index reg with some valid value, prior to
+	 * The Workaround was to set Index reg with some valid value, prior to
 	 * flush. This was fixed in MMU v3
 	 */
 	unsigned int idx;
@@ -272,7 +272,7 @@ noinline void local_flush_tlb_all(void)
 }
 
 /*
- * Flush the entrie MM for userland. The fastest way is to move to Next ASID
+ * Flush the entire MM for userland. The fastest way is to move to Next ASID
  */
 noinline void local_flush_tlb_mm(struct mm_struct *mm)
 {
@@ -303,7 +303,7 @@ noinline void local_flush_tlb_mm(struct mm_struct *mm)
  * Difference between this and Kernel Range Flush is
  *  -Here the fastest way (if range is too large) is to move to next ASID
  *      without doing any explicit Shootdown
- *  -In case of kernel Flush, entry has to be shot down explictly
+ *  -In case of kernel Flush, entry has to be shot down explicitly
  */
 void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
 			   unsigned long end)
@@ -620,7 +620,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr_unaligned,
  * Super Page size is configurable in hardware (4K to 16M), but fixed once
  * RTL builds.
  *
- * The exact THP size a Linx configuration will support is a function of:
+ * The exact THP size a Linux configuration will support is a function of:
  *  - MMU page size (typical 8K, RTL fixed)
  *  - software page walker address split between PGD:PTE:PFN (typical
  *    11:8:13, but can be changed with 1 line)
@@ -698,7 +698,7 @@ void local_flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,
 
 #endif
 
-/* Read the Cache Build Confuration Registers, Decode them and save into
+/* Read the Cache Build Configuration Registers, Decode them and save into
  * the cpuinfo structure for later use.
  * No Validation is done here, simply read/convert the BCRs
  */
@@ -803,13 +803,13 @@ void arc_mmu_init(void)
 	pr_info("%s", arc_mmu_mumbojumbo(0, str, sizeof(str)));
 
 	/*
-	 * Can't be done in processor.h due to header include depenedencies
+	 * Can't be done in processor.h due to header include dependencies
 	 */
 	BUILD_BUG_ON(!IS_ALIGNED((CONFIG_ARC_KVADDR_SIZE << 20), PMD_SIZE));
 
 	/*
 	 * stack top size sanity check,
-	 * Can't be done in processor.h due to header include depenedencies
+	 * Can't be done in processor.h due to header include dependencies
 	 */
 	BUILD_BUG_ON(!IS_ALIGNED(STACK_TOP, PMD_SIZE));
 
@@ -881,7 +881,7 @@ void arc_mmu_init(void)
  *      the duplicate one.
  * -Knob to be verbose abt it.(TODO: hook them up to debugfs)
  */
-volatile int dup_pd_silent; /* Be slient abt it or complain (default) */
+volatile int dup_pd_silent; /* Be silent abt it or complain (default) */
 
 void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
 			  struct pt_regs *regs)
@@ -948,7 +948,7 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
 
 /***********************************************************************
  * Diagnostic Routines
- *  -Called from Low Level TLB Hanlders if things don;t look good
+ *  -Called from Low Level TLB Handlers if things don;t look good
  **********************************************************************/
 
 #ifdef CONFIG_ARC_DBG_TLB_PARANOIA
commit 78aec9bb1f3c79e4570eb50260d6320063f823a2
Author: Gustavo Pimentel <gustavo.pimentel at synopsys.com>
Date:   Wed Oct 21 23:12:20 2020 +0200

    ARC: bitops: Remove unecessary operation and value
    
    The 1-bit shift rotation to the left on x variable located on
    4   last if statement can be removed because the computed value is will
    not be used afront.
    
    Signed-off-by: Gustavo Pimentel <gustavo.pimentel at synopsys.com>
    Signed-off-by: Vineet Gupta <vgupta at synopsys.com>

diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h
index c6606f4d20d6..fb98440c0bd4 100644
--- a/arch/arc/include/asm/bitops.h
+++ b/arch/arc/include/asm/bitops.h
@@ -243,10 +243,8 @@ static inline int constant_fls(unsigned int x)
 		x <<= 2;
 		r -= 2;
 	}
-	if (!(x & 0x80000000u)) {
-		x <<= 1;
+	if (!(x & 0x80000000u))
 		r -= 1;
-	}
 	return r;
 }
 
commit cd81acc600a9684ea4b4d25a47900d38a3890eab
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Tue Nov 17 23:56:17 2020 +1000

    powerpc/64s/exception: KVM Fix for host DSI being taken in HPT guest MMU context
    
    Commit 2284ffea8f0c ("powerpc/64s/exception: Only test KVM in SRR
    interrupts when PR KVM is supported") removed KVM guest tests from
    interrupts that do not set HV=1, when PR-KVM is not configured.
    
    This is wrong for HV-KVM HPT guest MMIO emulation case which attempts
    to load the faulting instruction word with MSR[DR]=1 and MSR[HV]=1 with
    the guest MMU context loaded. This can cause host DSI, DSLB interrupts
    which must test for KVM guest. Restore this and add a comment.
    
    Fixes: 2284ffea8f0c ("powerpc/64s/exception: Only test KVM in SRR interrupts when PR KVM is supported")
    Cc: stable at vger.kernel.org # v5.7+
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201117135617.3521127-1-npiggin@gmail.com

diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 07d64883c0b5..8e6b2cc8db67 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1410,6 +1410,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
  *   If none is found, do a Linux page fault. Linux page faults can happen in
  *   kernel mode due to user copy operations of course.
  *
+ *   KVM: The KVM HDSI handler may perform a load with MSR[DR]=1 in guest
+ *   MMU context, which may cause a DSI in the host, which must go to the
+ *   KVM handler. MSR[IR] is not enabled, so the real-mode handler will
+ *   always be used regardless of AIL setting.
+ *
  * - Radix MMU
  *   The hardware loads from the Linux page table directly, so a fault goes
  *   immediately to Linux page fault.
@@ -1420,10 +1425,8 @@ INT_DEFINE_BEGIN(data_access)
 	IVEC=0x300
 	IDAR=1
 	IDSISR=1
-#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
 	IKVM_SKIP=1
 	IKVM_REAL=1
-#endif
 INT_DEFINE_END(data_access)
 
 EXC_REAL_BEGIN(data_access, 0x300, 0x80)
@@ -1462,6 +1465,8 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
  *   ppc64_bolted_size (first segment). The kernel handler must avoid stomping
  *   on user-handler data structures.
  *
+ *   KVM: Same as 0x300, DSLB must test for KVM guest.
+ *
  * A dedicated save area EXSLB is used (XXX: but it actually need not be
  * these days, we could use EXGEN).
  */
@@ -1470,10 +1475,8 @@ INT_DEFINE_BEGIN(data_access_slb)
 	IAREA=PACA_EXSLB
 	IRECONCILE=0
 	IDAR=1
-#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
 	IKVM_SKIP=1
 	IKVM_REAL=1
-#endif
 INT_DEFINE_END(data_access_slb)
 
 EXC_REAL_BEGIN(data_access_slb, 0x380, 0x80)
commit c09c8a27b9baa417864b9adc3228b10ae5eeec93
Author: Florian Klink <flokli at flokli.de>
Date:   Sun Nov 15 23:45:09 2020 +0100

    ipv4: use IS_ENABLED instead of ifdef
    
    Checking for ifdef CONFIG_x fails if CONFIG_x=m.
    
    Use IS_ENABLED instead, which is true for both built-ins and modules.
    
    Otherwise, a
    > ip -4 route add 1.2.3.4/32 via inet6 fe80::2 dev eth1
    fails with the message "Error: IPv6 support not enabled in kernel." if
    CONFIG_IPV6 is `m`.
    
    In the spirit of b8127113d01e53adba15b41aefd37b90ed83d631.
    
    Fixes: d15662682db2 ("ipv4: Allow ipv6 gateway with ipv4 routes")
    Cc: Kim Phillips <kim.phillips at arm.com>
    Signed-off-by: Florian Klink <flokli at flokli.de>
    Reviewed-by: David Ahern <dsahern at kernel.org>
    Link: https://lore.kernel.org/r/20201115224509.2020651-1-flokli@flokli.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 86a23e4a6a50..b87140a1fa28 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -696,7 +696,7 @@ int fib_gw_from_via(struct fib_config *cfg, struct nlattr *nla,
 		cfg->fc_gw4 = *((__be32 *)via->rtvia_addr);
 		break;
 	case AF_INET6:
-#ifdef CONFIG_IPV6
+#if IS_ENABLED(CONFIG_IPV6)
 		if (alen != sizeof(struct in6_addr)) {
 			NL_SET_ERR_MSG(extack, "Invalid IPv6 address in RTA_VIA");
 			return -EINVAL;
commit 93be52612431e71ee8cb980ef11468997857e4c4
Author: Dmitry Bogdanov <dbogdanov at marvell.com>
Date:   Mon Nov 16 16:29:44 2020 +0300

    qed: fix ILT configuration of SRC block
    
    The code refactoring of ILT configuration was not complete, the old
    unused variables were used for the SRC block. That could lead to the memory
    corruption by HW when rx filters are configured.
    This patch completes that refactoring.
    
    Fixes: 8a52bbab39c9 (qed: Debug feature: ilt and mdump)
    Signed-off-by: Igor Russkikh <irusskikh at marvell.com>
    Signed-off-by: Ariel Elior <aelior at marvell.com>
    Signed-off-by: Dmitry Bogdanov <dbogdanov at marvell.com>
    Link: https://lore.kernel.org/r/20201116132944.2055-1-dbogdanov@marvell.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c
index 0e4cd8890cff..0a22f8ce9a2c 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c
@@ -1647,9 +1647,9 @@ static void qed_src_init_pf(struct qed_hwfn *p_hwfn)
 		     ilog2(rounded_conn_num));
 
 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_FIRSTFREE_RT_OFFSET,
-			 p_hwfn->p_cxt_mngr->first_free);
+			 p_hwfn->p_cxt_mngr->src_t2.first_free);
 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_LASTFREE_RT_OFFSET,
-			 p_hwfn->p_cxt_mngr->last_free);
+			 p_hwfn->p_cxt_mngr->src_t2.last_free);
 }
 
 /* Timers PF */
diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.h b/drivers/net/ethernet/qlogic/qed/qed_cxt.h
index 8b64495f8745..056e79620a0e 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_cxt.h
+++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.h
@@ -326,9 +326,6 @@ struct qed_cxt_mngr {
 
 	/* SRC T2 */
 	struct qed_src_t2 src_t2;
-	u32 t2_num_pages;
-	u64 first_free;
-	u64 last_free;
 
 	/* total number of SRQ's for this hwfn */
 	u32 srq_count;
commit e33de7c5317e2827b2ba6fd120a505e9eb727b05
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Mon Nov 16 16:20:18 2020 +0800

    inet_diag: Fix error path to cancel the meseage in inet_req_diag_fill()
    
    nlmsg_cancel() needs to be called in the error path of
    inet_req_diag_fill to cancel the message.
    
    Fixes: d545caca827b ("net: inet: diag: expose the socket mark to privileged processes.")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Link: https://lore.kernel.org/r/20201116082018.16496-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 366a4507b5a3..93474b1bea4e 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -479,8 +479,10 @@ static int inet_req_diag_fill(struct sock *sk, struct sk_buff *skb,
 	r->idiag_inode	= 0;
 
 	if (net_admin && nla_put_u32(skb, INET_DIAG_MARK,
-				     inet_rsk(reqsk)->ir_mark))
+				     inet_rsk(reqsk)->ir_mark)) {
+		nlmsg_cancel(skb, nlh);
 		return -EMSGSIZE;
+	}
 
 	nlmsg_end(skb, nlh);
 	return 0;
commit ee415d73dcc24caef7f6bbf292dcc365613d2188
Author: Maor Gottlieb <maorg at nvidia.com>
Date:   Sun Nov 15 14:06:23 2020 +0200

    tools/testing/scatterlist: Fix test to compile and run
    
    Add missing define of ALIGN_DOWN to make the test build and run.  In
    addition, __sg_alloc_table_from_pages now support unaligned maximum
    segment, so adapt the test result accordingly.
    
    Fixes: 07da1223ec93 ("lib/scatterlist: Add support in dynamic allocation of SG table from pages")
    Link: https://lore.kernel.org/r/20201115120623.139113-1-leon@kernel.org
    Signed-off-by: Maor Gottlieb <maorg at nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro at nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/tools/testing/scatterlist/linux/mm.h b/tools/testing/scatterlist/linux/mm.h
index 6ae907f375d2..f9a12005fcea 100644
--- a/tools/testing/scatterlist/linux/mm.h
+++ b/tools/testing/scatterlist/linux/mm.h
@@ -33,6 +33,7 @@ typedef unsigned long dma_addr_t;
 #define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
 #define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
 #define ALIGN(x, a)			__ALIGN_KERNEL((x), (a))
+#define ALIGN_DOWN(x, a)		__ALIGN_KERNEL((x) - ((a) - 1), (a))
 
 #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
 
diff --git a/tools/testing/scatterlist/main.c b/tools/testing/scatterlist/main.c
index b2c7e9f7b8d3..f561aed7c657 100644
--- a/tools/testing/scatterlist/main.c
+++ b/tools/testing/scatterlist/main.c
@@ -52,9 +52,9 @@ int main(void)
 {
 	const unsigned int sgmax = SCATTERLIST_MAX_SEGMENT;
 	struct test *test, tests[] = {
-		{ -EINVAL, 1, pfn(0), PAGE_SIZE, PAGE_SIZE + 1, 1 },
 		{ -EINVAL, 1, pfn(0), PAGE_SIZE, 0, 1 },
-		{ -EINVAL, 1, pfn(0), PAGE_SIZE, sgmax + 1, 1 },
+		{ 0, 1, pfn(0), PAGE_SIZE, PAGE_SIZE + 1, 1 },
+		{ 0, 1, pfn(0), PAGE_SIZE, sgmax + 1, 1 },
 		{ 0, 1, pfn(0), PAGE_SIZE, sgmax, 1 },
 		{ 0, 1, pfn(0), 1, sgmax, 1 },
 		{ 0, 2, pfn(0, 1), 2 * PAGE_SIZE, sgmax, 1 },
commit 4363023d2668e621b0743db351a9555d6e6ea57e
Author: John Fastabend <john.fastabend at gmail.com>
Date:   Mon Nov 16 14:29:28 2020 -0800

    bpf, sockmap: Avoid failures from skb_to_sgvec when skb has frag_list
    
    When skb has a frag_list its possible for skb_to_sgvec() to fail. This
    happens when the scatterlist has fewer elements to store pages than would
    be needed for the initial skb plus any of its frags.
    
    This case appears rare, but is possible when running an RX parser/verdict
    programs exposed to the internet. Currently, when this happens we throw
    an error, break the pipe, and kfree the msg. This effectively breaks the
    application or forces it to do a retry.
    
    Lets catch this case and handle it by doing an skb_linearize() on any
    skb we receive with frags. At this point skb_to_sgvec should not fail
    because the failing conditions would require frags to be in place.
    
    Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
    Signed-off-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Jakub Sitnicki <jakub at cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556576837.73229.14800682790808797635.stgit@john-XPS-13-9370

diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index 514bc9f6f8ae..25cdbb20f3a0 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -423,9 +423,16 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,
 					struct sock *sk,
 					struct sk_msg *msg)
 {
-	int num_sge = skb_to_sgvec(skb, msg->sg.data, 0, skb->len);
-	int copied;
+	int num_sge, copied;
 
+	/* skb linearize may fail with ENOMEM, but lets simply try again
+	 * later if this happens. Under memory pressure we don't want to
+	 * drop the skb. We need to linearize the skb so that the mapping
+	 * in skb_to_sgvec can not error.
+	 */
+	if (skb_linearize(skb))
+		return -EAGAIN;
+	num_sge = skb_to_sgvec(skb, msg->sg.data, 0, skb->len);
 	if (unlikely(num_sge < 0)) {
 		kfree(msg);
 		return num_sge;
commit 2443ca66676d50a4eb3305c236bccd84a9828ce2
Author: John Fastabend <john.fastabend at gmail.com>
Date:   Mon Nov 16 14:29:08 2020 -0800

    bpf, sockmap: Handle memory acct if skb_verdict prog redirects to self
    
    If the skb_verdict_prog redirects an skb knowingly to itself, fix your
    BPF program this is not optimal and an abuse of the API please use
    SK_PASS. That said there may be cases, such as socket load balancing,
    where picking the socket is hashed based or otherwise picks the same
    socket it was received on in some rare cases. If this happens we don't
    want to confuse userspace giving them an EAGAIN error if we can avoid
    it.
    
    To avoid double accounting in these cases. At the moment even if the
    skb has already been charged against the sockets rcvbuf and forward
    alloc we check it again and do set_owner_r() causing it to be orphaned
    and recharged. For one this is useless work, but more importantly we
    can have a case where the skb could be put on the ingress queue, but
    because we are under memory pressure we return EAGAIN. The trouble
    here is the skb has already been accounted for so any rcvbuf checks
    include the memory associated with the packet already. This rolls
    up and can result in unnecessary EAGAIN errors in userspace read()
    calls.
    
    Fix by doing an unlikely check and skipping checks if skb->sk == sk.
    
    Fixes: 51199405f9672 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Signed-off-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Jakub Sitnicki <jakub at cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556574804.73229.11328201020039674147.stgit@john-XPS-13-9370

diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index 9aed5a2c7c5b..514bc9f6f8ae 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -442,11 +442,19 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,
 	return copied;
 }
 
+static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb);
+
 static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
 {
 	struct sock *sk = psock->sk;
 	struct sk_msg *msg;
 
+	/* If we are receiving on the same sock skb->sk is already assigned,
+	 * skip memory accounting and owner transition seeing it already set
+	 * correctly.
+	 */
+	if (unlikely(skb->sk == sk))
+		return sk_psock_skb_ingress_self(psock, skb);
 	msg = sk_psock_create_ingress_msg(sk, skb);
 	if (!msg)
 		return -EAGAIN;
commit 6fa9201a898983da731fca068bb4b5c941537588
Author: John Fastabend <john.fastabend at gmail.com>
Date:   Mon Nov 16 14:28:46 2020 -0800

    bpf, sockmap: Avoid returning unneeded EAGAIN when redirecting to self
    
    If a socket redirects to itself and it is under memory pressure it is
    possible to get a socket stuck so that recv() returns EAGAIN and the
    socket can not advance for some time. This happens because when
    redirecting a skb to the same socket we received the skb on we first
    check if it is OK to enqueue the skb on the receiving socket by checking
    memory limits. But, if the skb is itself the object holding the memory
    needed to enqueue the skb we will keep retrying from kernel side
    and always fail with EAGAIN. Then userspace will get a recv() EAGAIN
    error if there are no skbs in the psock ingress queue. This will continue
    until either some skbs get kfree'd causing the memory pressure to
    reduce far enough that we can enqueue the pending packet or the
    socket is destroyed. In some cases its possible to get a socket
    stuck for a noticeable amount of time if the socket is only receiving
    skbs from sk_skb verdict programs. To reproduce I make the socket
    memory limits ridiculously low so sockets are always under memory
    pressure. More often though if under memory pressure it looks like
    a spurious EAGAIN error on user space side causing userspace to retry
    and typically enough has moved on the memory side that it works.
    
    To fix skip memory checks and skb_orphan if receiving on the same
    sock as already assigned.
    
    For SK_PASS cases this is easy, its always the same socket so we
    can just omit the orphan/set_owner pair.
    
    For backlog cases we need to check skb->sk and decide if the orphan
    and set_owner pair are needed.
    
    Fixes: 51199405f9672 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Signed-off-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Jakub Sitnicki <jakub at cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556572660.73229.12566203819812939627.stgit@john-XPS-13-9370

diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index d09426ce4af3..9aed5a2c7c5b 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -399,38 +399,38 @@ out:
 }
 EXPORT_SYMBOL_GPL(sk_msg_memcopy_from_iter);
 
-static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
+static struct sk_msg *sk_psock_create_ingress_msg(struct sock *sk,
+						  struct sk_buff *skb)
 {
-	struct sock *sk = psock->sk;
-	int copied = 0, num_sge;
 	struct sk_msg *msg;
 
 	if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
-		return -EAGAIN;
+		return NULL;
+
+	if (!sk_rmem_schedule(sk, skb, skb->truesize))
+		return NULL;
 
 	msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_ATOMIC);
 	if (unlikely(!msg))
-		return -EAGAIN;
-	if (!sk_rmem_schedule(sk, skb, skb->truesize)) {
-		kfree(msg);
-		return -EAGAIN;
-	}
+		return NULL;
 
 	sk_msg_init(msg);
-	num_sge = skb_to_sgvec(skb, msg->sg.data, 0, skb->len);
+	return msg;
+}
+
+static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,
+					struct sk_psock *psock,
+					struct sock *sk,
+					struct sk_msg *msg)
+{
+	int num_sge = skb_to_sgvec(skb, msg->sg.data, 0, skb->len);
+	int copied;
+
 	if (unlikely(num_sge < 0)) {
 		kfree(msg);
 		return num_sge;
 	}
 
-	/* This will transition ownership of the data from the socket where
-	 * the BPF program was run initiating the redirect to the socket
-	 * we will eventually receive this data on. The data will be released
-	 * from skb_consume found in __tcp_bpf_recvmsg() after its been copied
-	 * into user buffers.
-	 */
-	skb_set_owner_r(skb, sk);
-
 	copied = skb->len;
 	msg->sg.start = 0;
 	msg->sg.size = copied;
@@ -442,6 +442,40 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
 	return copied;
 }
 
+static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
+{
+	struct sock *sk = psock->sk;
+	struct sk_msg *msg;
+
+	msg = sk_psock_create_ingress_msg(sk, skb);
+	if (!msg)
+		return -EAGAIN;
+
+	/* This will transition ownership of the data from the socket where
+	 * the BPF program was run initiating the redirect to the socket
+	 * we will eventually receive this data on. The data will be released
+	 * from skb_consume found in __tcp_bpf_recvmsg() after its been copied
+	 * into user buffers.
+	 */
+	skb_set_owner_r(skb, sk);
+	return sk_psock_skb_ingress_enqueue(skb, psock, sk, msg);
+}
+
+/* Puts an skb on the ingress queue of the socket already assigned to the
+ * skb. In this case we do not need to check memory limits or skb_set_owner_r
+ * because the skb is already accounted for here.
+ */
+static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb)
+{
+	struct sk_msg *msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_ATOMIC);
+	struct sock *sk = psock->sk;
+
+	if (unlikely(!msg))
+		return -EAGAIN;
+	sk_msg_init(msg);
+	return sk_psock_skb_ingress_enqueue(skb, psock, sk, msg);
+}
+
 static int sk_psock_handle_skb(struct sk_psock *psock, struct sk_buff *skb,
 			       u32 off, u32 len, bool ingress)
 {
@@ -801,7 +835,7 @@ static void sk_psock_verdict_apply(struct sk_psock *psock,
 		 * retrying later from workqueue.
 		 */
 		if (skb_queue_empty(&psock->ingress_skb)) {
-			err = sk_psock_skb_ingress(psock, skb);
+			err = sk_psock_skb_ingress_self(psock, skb);
 		}
 		if (err < 0) {
 			skb_queue_tail(&psock->ingress_skb, skb);
commit 70796fb751f1d34cc650e640572a174faf009cd4
Author: John Fastabend <john.fastabend at gmail.com>
Date:   Mon Nov 16 14:28:26 2020 -0800

    bpf, sockmap: Use truesize with sk_rmem_schedule()
    
    We use skb->size with sk_rmem_scheduled() which is not correct. Instead
    use truesize to align with socket and tcp stack usage of sk_rmem_schedule.
    
    Suggested-by: Daniel Borkman <daniel at iogearbox.net>
    Signed-off-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Jakub Sitnicki <jakub at cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556570616.73229.17003722112077507863.stgit@john-XPS-13-9370

diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index fe44280c033e..d09426ce4af3 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -411,7 +411,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
 	msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_ATOMIC);
 	if (unlikely(!msg))
 		return -EAGAIN;
-	if (!sk_rmem_schedule(sk, skb, skb->len)) {
+	if (!sk_rmem_schedule(sk, skb, skb->truesize)) {
 		kfree(msg);
 		return -EAGAIN;
 	}
commit 36cd0e696a832a00247fca522034703566ac8885
Author: John Fastabend <john.fastabend at gmail.com>
Date:   Mon Nov 16 14:28:06 2020 -0800

    bpf, sockmap: Ensure SO_RCVBUF memory is observed on ingress redirect
    
    Fix sockmap sk_skb programs so that they observe sk_rcvbuf limits. This
    allows users to tune SO_RCVBUF and sockmap will honor them.
    
    We can refactor the if(charge) case out in later patches. But, keep this
    fix to the point.
    
    Fixes: 51199405f9672 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Suggested-by: Jakub Sitnicki <jakub at cloudflare.com>
    Signed-off-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Jakub Sitnicki <jakub at cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556568657.73229.8404601585878439060.stgit@john-XPS-13-9370

diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index 654182ecf87b..fe44280c033e 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -170,10 +170,12 @@ static int sk_msg_free_elem(struct sock *sk, struct sk_msg *msg, u32 i,
 	struct scatterlist *sge = sk_msg_elem(msg, i);
 	u32 len = sge->length;
 
-	if (charge)
-		sk_mem_uncharge(sk, len);
-	if (!msg->skb)
+	/* When the skb owns the memory we free it from consume_skb path. */
+	if (!msg->skb) {
+		if (charge)
+			sk_mem_uncharge(sk, len);
 		put_page(sg_page(sge));
+	}
 	memset(sge, 0, sizeof(*sge));
 	return len;
 }
@@ -403,6 +405,9 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
 	int copied = 0, num_sge;
 	struct sk_msg *msg;
 
+	if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
+		return -EAGAIN;
+
 	msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_ATOMIC);
 	if (unlikely(!msg))
 		return -EAGAIN;
@@ -418,7 +423,14 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
 		return num_sge;
 	}
 
-	sk_mem_charge(sk, skb->len);
+	/* This will transition ownership of the data from the socket where
+	 * the BPF program was run initiating the redirect to the socket
+	 * we will eventually receive this data on. The data will be released
+	 * from skb_consume found in __tcp_bpf_recvmsg() after its been copied
+	 * into user buffers.
+	 */
+	skb_set_owner_r(skb, sk);
+
 	copied = skb->len;
 	msg->sg.start = 0;
 	msg->sg.size = copied;
diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
index 8e950b0bfabc..bc7d2a586e18 100644
--- a/net/ipv4/tcp_bpf.c
+++ b/net/ipv4/tcp_bpf.c
@@ -45,7 +45,8 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
 			if (likely(!peek)) {
 				sge->offset += copy;
 				sge->length -= copy;
-				sk_mem_uncharge(sk, copy);
+				if (!msg_rx->skb)
+					sk_mem_uncharge(sk, copy);
 				msg_rx->sg.size -= copy;
 
 				if (!sge->length) {
commit c9c89dcd872ea33327673fcb97398993a1f22736
Author: John Fastabend <john.fastabend at gmail.com>
Date:   Mon Nov 16 14:27:46 2020 -0800

    bpf, sockmap: Fix partial copy_page_to_iter so progress can still be made
    
    If copy_page_to_iter() fails or even partially completes, but with fewer
    bytes copied than expected we currently reset sg.start and return EFAULT.
    This proves problematic if we already copied data into the user buffer
    before we return an error. Because we leave the copied data in the user
    buffer and fail to unwind the scatterlist so kernel side believes data
    has been copied and user side believes data has _not_ been received.
    
    Expected behavior should be to return number of bytes copied and then
    on the next read we need to return the error assuming its still there. This
    can happen if we have a copy length spanning multiple scatterlist elements
    and one or more complete before the error is hit.
    
    The error is rare enough though that my normal testing with server side
    programs, such as nginx, httpd, envoy, etc., I have never seen this. The
    only reliable way to reproduce that I've found is to stream movies over
    my browser for a day or so and wait for it to hang. Not very scientific,
    but with a few extra WARN_ON()s in the code the bug was obvious.
    
    When we review the errors from copy_page_to_iter() it seems we are hitting
    a page fault from copy_page_to_iter_iovec() where the code checks
    fault_in_pages_writeable(buf, copy) where buf is the user buffer. It
    also seems typical server applications don't hit this case.
    
    The other way to try and reproduce this is run the sockmap selftest tool
    test_sockmap with data verification enabled, but it doesn't reproduce the
    fault. Perhaps we can trigger this case artificially somehow from the
    test tools. I haven't sorted out a way to do that yet though.
    
    Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
    Signed-off-by: John Fastabend <john.fastabend at gmail.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Jakub Sitnicki <jakub at cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556566659.73229.15694973114605301063.stgit@john-XPS-13-9370

diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
index 37f4cb2bba5c..8e950b0bfabc 100644
--- a/net/ipv4/tcp_bpf.c
+++ b/net/ipv4/tcp_bpf.c
@@ -15,8 +15,8 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
 {
 	struct iov_iter *iter = &msg->msg_iter;
 	int peek = flags & MSG_PEEK;
-	int i, ret, copied = 0;
 	struct sk_msg *msg_rx;
+	int i, copied = 0;
 
 	msg_rx = list_first_entry_or_null(&psock->ingress_msg,
 					  struct sk_msg, list);
@@ -37,11 +37,9 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
 			page = sg_page(sge);
 			if (copied + copy > len)
 				copy = len - copied;
-			ret = copy_page_to_iter(page, sge->offset, copy, iter);
-			if (ret != copy) {
-				msg_rx->sg.start = i;
-				return -EFAULT;
-			}
+			copy = copy_page_to_iter(page, sge->offset, copy, iter);
+			if (!copy)
+				return copied ? copied : -EFAULT;
 
 			copied += copy;
 			if (likely(!peek)) {
@@ -56,6 +54,11 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
 						put_page(page);
 				}
 			} else {
+				/* Lets not optimize peek case if copy_page_to_iter
+				 * didn't copy the entire length lets just break.
+				 */
+				if (copy != sge->length)
+					return copied;
 				sk_msg_iter_var_next(i);
 			}
 
commit 138559b9f99d3b6b1d5e75c78facc067a23871c6
Author: Tariq Toukan <tariqt at nvidia.com>
Date:   Sun Nov 15 15:14:48 2020 +0200

    net/tls: Fix wrong record sn in async mode of device resync
    
    In async_resync mode, we log the TCP seq of records until the async request
    is completed.  Later, in case one of the logged seqs matches the resync
    request, we return it, together with its record serial number.  Before this
    fix, we mistakenly returned the serial number of the current record
    instead.
    
    Fixes: ed9b7646b06a ("net/tls: Add asynchronous resync")
    Signed-off-by: Tariq Toukan <tariqt at nvidia.com>
    Reviewed-by: Boris Pismenny <borisp at nvidia.com>
    Link: https://lore.kernel.org/r/20201115131448.2702-1-tariqt@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/tls.h b/include/net/tls.h
index baf1e99d8193..cf1473099453 100644
--- a/include/net/tls.h
+++ b/include/net/tls.h
@@ -300,7 +300,8 @@ enum tls_offload_sync_type {
 #define TLS_DEVICE_RESYNC_ASYNC_LOGMAX		13
 struct tls_offload_resync_async {
 	atomic64_t req;
-	u32 loglen;
+	u16 loglen;
+	u16 rcd_delta;
 	u32 log[TLS_DEVICE_RESYNC_ASYNC_LOGMAX];
 };
 
@@ -471,6 +472,18 @@ static inline bool tls_bigint_increment(unsigned char *seq, int len)
 	return (i == -1);
 }
 
+static inline void tls_bigint_subtract(unsigned char *seq, int  n)
+{
+	u64 rcd_sn;
+	__be64 *p;
+
+	BUILD_BUG_ON(TLS_MAX_REC_SEQ_SIZE != 8);
+
+	p = (__be64 *)seq;
+	rcd_sn = be64_to_cpu(*p);
+	*p = cpu_to_be64(rcd_sn - n);
+}
+
 static inline struct tls_context *tls_get_ctx(const struct sock *sk)
 {
 	struct inet_connection_sock *icsk = inet_csk(sk);
@@ -639,6 +652,7 @@ tls_offload_rx_resync_async_request_start(struct sock *sk, __be32 seq, u16 len)
 	atomic64_set(&rx_ctx->resync_async->req, ((u64)ntohl(seq) << 32) |
 		     ((u64)len << 16) | RESYNC_REQ | RESYNC_REQ_ASYNC);
 	rx_ctx->resync_async->loglen = 0;
+	rx_ctx->resync_async->rcd_delta = 0;
 }
 
 static inline void
diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c
index cec86229a6a0..54d3e161d198 100644
--- a/net/tls/tls_device.c
+++ b/net/tls/tls_device.c
@@ -694,36 +694,51 @@ static void tls_device_resync_rx(struct tls_context *tls_ctx,
 
 static bool
 tls_device_rx_resync_async(struct tls_offload_resync_async *resync_async,
-			   s64 resync_req, u32 *seq)
+			   s64 resync_req, u32 *seq, u16 *rcd_delta)
 {
 	u32 is_async = resync_req & RESYNC_REQ_ASYNC;
 	u32 req_seq = resync_req >> 32;
 	u32 req_end = req_seq + ((resync_req >> 16) & 0xffff);
+	u16 i;
+
+	*rcd_delta = 0;
 
 	if (is_async) {
+		/* shouldn't get to wraparound:
+		 * too long in async stage, something bad happened
+		 */
+		if (WARN_ON_ONCE(resync_async->rcd_delta == USHRT_MAX))
+			return false;
+
 		/* asynchronous stage: log all headers seq such that
 		 * req_seq <= seq <= end_seq, and wait for real resync request
 		 */
-		if (between(*seq, req_seq, req_end) &&
+		if (before(*seq, req_seq))
+			return false;
+		if (!after(*seq, req_end) &&
 		    resync_async->loglen < TLS_DEVICE_RESYNC_ASYNC_LOGMAX)
 			resync_async->log[resync_async->loglen++] = *seq;
 
+		resync_async->rcd_delta++;
+
 		return false;
 	}
 
 	/* synchronous stage: check against the logged entries and
 	 * proceed to check the next entries if no match was found
 	 */
-	while (resync_async->loglen) {
-		if (req_seq == resync_async->log[resync_async->loglen - 1] &&
-		    atomic64_try_cmpxchg(&resync_async->req,
-					 &resync_req, 0)) {
-			resync_async->loglen = 0;
+	for (i = 0; i < resync_async->loglen; i++)
+		if (req_seq == resync_async->log[i] &&
+		    atomic64_try_cmpxchg(&resync_async->req, &resync_req, 0)) {
+			*rcd_delta = resync_async->rcd_delta - i;
 			*seq = req_seq;
+			resync_async->loglen = 0;
+			resync_async->rcd_delta = 0;
 			return true;
 		}
-		resync_async->loglen--;
-	}
+
+	resync_async->loglen = 0;
+	resync_async->rcd_delta = 0;
 
 	if (req_seq == *seq &&
 	    atomic64_try_cmpxchg(&resync_async->req,
@@ -741,6 +756,7 @@ void tls_device_rx_resync_new_rec(struct sock *sk, u32 rcd_len, u32 seq)
 	u32 sock_data, is_req_pending;
 	struct tls_prot_info *prot;
 	s64 resync_req;
+	u16 rcd_delta;
 	u32 req_seq;
 
 	if (tls_ctx->rx_conf != TLS_HW)
@@ -786,8 +802,9 @@ void tls_device_rx_resync_new_rec(struct sock *sk, u32 rcd_len, u32 seq)
 			return;
 
 		if (!tls_device_rx_resync_async(rx_ctx->resync_async,
-						resync_req, &seq))
+						resync_req, &seq, &rcd_delta))
 			return;
+		tls_bigint_subtract(rcd_sn, rcd_delta);
 		break;
 	}
 
commit 9caf2d956cfa254c6d89c5f4d7b3f8235d75b28f
Author: Georgi Djakov <georgi.djakov at linaro.org>
Date:   Mon Nov 9 14:45:12 2020 +0200

    interconnect: qcom: msm8974: Don't boost the NoC rate during boot
    
    It has been reported that on Fairphone 2 (msm8974-based), increasing
    the clock rate for some of the NoCs during boot may lead to hangs.
    Let's restore the original behavior and not touch the clock rate of
    any of the NoCs to fix the regression.
    
    Reported-by: Luca Weiss <luca at z3ntu.xyz>
    Tested-by: Luca Weiss <luca at z3ntu.xyz>
    Fixes: b1d681d8d324 ("interconnect: Add sync state support")
    Link: https://lore.kernel.org/r/20201109124512.10776-1-georgi.djakov@linaro.org
    Signed-off-by: Georgi Djakov <georgi.djakov at linaro.org>

diff --git a/drivers/interconnect/qcom/msm8974.c b/drivers/interconnect/qcom/msm8974.c
index b6b639dad691..da68ce375a89 100644
--- a/drivers/interconnect/qcom/msm8974.c
+++ b/drivers/interconnect/qcom/msm8974.c
@@ -637,6 +637,14 @@ static int msm8974_icc_set(struct icc_node *src, struct icc_node *dst)
 	return 0;
 }
 
+static int msm8974_get_bw(struct icc_node *node, u32 *avg, u32 *peak)
+{
+	*avg = 0;
+	*peak = 0;
+
+	return 0;
+}
+
 static int msm8974_icc_probe(struct platform_device *pdev)
 {
 	const struct msm8974_icc_desc *desc;
@@ -690,6 +698,7 @@ static int msm8974_icc_probe(struct platform_device *pdev)
 	provider->aggregate = icc_std_aggregate;
 	provider->xlate = of_icc_xlate_onecell;
 	provider->data = data;
+	provider->get_bw = msm8974_get_bw;
 
 	ret = icc_provider_add(provider);
 	if (ret) {
commit 7381e27b1e563aa8a1c6bcf74a8cadb6901c283a
Author: Georgi Djakov <georgi.djakov at linaro.org>
Date:   Fri Nov 6 16:48:47 2020 +0200

    interconnect: qcom: msm8974: Prevent integer overflow in rate
    
    When sync_state support got introduced recently, by default we try to
    set the NoCs to run initially at maximum rate. But as these values are
    aggregated, we may end with a really big clock rate value, which is
    then converted from "u64" to "long" during the clock rate rounding.
    But on 32bit platforms this may result an overflow. Fix it by making
    sure that the rate is within range.
    
    Reported-by: Luca Weiss <luca at z3ntu.xyz>
    Reviewed-by: Brian Masney <masneyb at onstation.org>
    Link: https://lore.kernel.org/r/20201106144847.7726-1-georgi.djakov@linaro.org
    Signed-off-by: Georgi Djakov <georgi.djakov at linaro.org>

diff --git a/drivers/interconnect/qcom/msm8974.c b/drivers/interconnect/qcom/msm8974.c
index 3a313e11e73d..b6b639dad691 100644
--- a/drivers/interconnect/qcom/msm8974.c
+++ b/drivers/interconnect/qcom/msm8974.c
@@ -618,6 +618,8 @@ static int msm8974_icc_set(struct icc_node *src, struct icc_node *dst)
 
 	do_div(rate, src_qn->buswidth);
 
+	rate = min_t(u32, rate, INT_MAX);
+
 	if (src_qn->rate == rate)
 		return 0;
 
@@ -758,6 +760,7 @@ static struct platform_driver msm8974_noc_driver = {
 	.driver = {
 		.name = "qnoc-msm8974",
 		.of_match_table = msm8974_noc_of_match,
+		.sync_state = icc_sync_state,
 	},
 };
 module_platform_driver(msm8974_noc_driver);
commit c993df5a688975bf9ce899706ca13d2bc8d6be25
Author: Jens Axboe <axboe at kernel.dk>
Date:   Tue Nov 17 07:59:16 2020 -0700

    io_uring: don't double complete failed reissue request
    
    Zorro reports that an xfstest test case is failing, and it turns out that
    for the reissue path we can potentially issue a double completion on the
    request for the failure path. There's an issue around the retry as well,
    but for now, at least just make sure that we handle the error path
    correctly.
    
    Cc: stable at vger.kernel.org
    Fixes: b63534c41e20 ("io_uring: re-issue block requests that failed because of resources")
    Reported-by: Zorro Lang <zlang at redhat.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index f05978a74ce1..b205c1df3f74 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2578,7 +2578,6 @@ static bool io_resubmit_prep(struct io_kiocb *req, int error)
 	}
 end_req:
 	req_set_fail_links(req);
-	io_req_complete(req, ret);
 	return false;
 }
 #endif
commit a5bbcbf29089a1252c201b1a7fd38151de355db9
Author: Taehee Yoo <ap420073 at gmail.com>
Date:   Sun Nov 15 10:30:41 2020 +0000

    netdevsim: set .owner to THIS_MODULE
    
    If THIS_MODULE is not set, the module would be removed while debugfs is
    being used.
    It eventually makes kernel panic.
    
    Fixes: 82c93a87bf8b ("netdevsim: implement couple of testing devlink health reporters")
    Fixes: 424be63ad831 ("netdevsim: add UDP tunnel port offload support")
    Fixes: 4418f862d675 ("netdevsim: implement support for devlink region and snapshots")
    Fixes: d3cbb907ae57 ("netdevsim: add ACL trap reporting cookie as a metadata")
    Signed-off-by: Taehee Yoo <ap420073 at gmail.com>
    Link: https://lore.kernel.org/r/20201115103041.30701-1-ap420073@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index d07061417675..e7972e88ffe0 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c
@@ -96,6 +96,7 @@ static const struct file_operations nsim_dev_take_snapshot_fops = {
 	.open = simple_open,
 	.write = nsim_dev_take_snapshot_write,
 	.llseek = generic_file_llseek,
+	.owner = THIS_MODULE,
 };
 
 static ssize_t nsim_dev_trap_fa_cookie_read(struct file *file,
@@ -188,6 +189,7 @@ static const struct file_operations nsim_dev_trap_fa_cookie_fops = {
 	.read = nsim_dev_trap_fa_cookie_read,
 	.write = nsim_dev_trap_fa_cookie_write,
 	.llseek = generic_file_llseek,
+	.owner = THIS_MODULE,
 };
 
 static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)
diff --git a/drivers/net/netdevsim/health.c b/drivers/net/netdevsim/health.c
index 62958b238d50..21e2974660e7 100644
--- a/drivers/net/netdevsim/health.c
+++ b/drivers/net/netdevsim/health.c
@@ -261,6 +261,7 @@ static const struct file_operations nsim_dev_health_break_fops = {
 	.open = simple_open,
 	.write = nsim_dev_health_break_write,
 	.llseek = generic_file_llseek,
+	.owner = THIS_MODULE,
 };
 
 int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink)
diff --git a/drivers/net/netdevsim/udp_tunnels.c b/drivers/net/netdevsim/udp_tunnels.c
index 6ab023acefd6..02dc3123eb6c 100644
--- a/drivers/net/netdevsim/udp_tunnels.c
+++ b/drivers/net/netdevsim/udp_tunnels.c
@@ -124,6 +124,7 @@ static const struct file_operations nsim_udp_tunnels_info_reset_fops = {
 	.open = simple_open,
 	.write = nsim_udp_tunnels_info_reset_write,
 	.llseek = generic_file_llseek,
+	.owner = THIS_MODULE,
 };
 
 int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
commit 5fa9c5f9a4076d32913b5857bac7620f46f27267
Merge: 09162bc32c88 5f714771d01e
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 17 22:20:17 2020 +0100

    Merge tag 'intel-pinctrl-v5.10-3' of gitolite.kernel.org:pub/scm/linux/kernel/git/pinctrl/intel into fixes
    
    intel-pinctrl for v5.10-3
    
    * Fix HOSTSW_OWN offset and unhide SPI group of pins on Jasper Lake
    * Fix debounce configuration on Baytrail when it's turned off
    * Fix default bias setting on Merrifield
    
    The following is an automated git shortlog grouped by driver:
    
    baytrail:
     -  Avoid clearing debounce value when turning it off
    
    jasperlake:
     -  Fix HOSTSW_OWN offset
     -  Unhide SPI group of pins
    
    merrifield:
     -  Set default bias in case no particular value given

commit fb14528e443646dd3fd02df4437fcf5265b66baa
Author: Mickaël Salaün <mic at linux.microsoft.com>
Date:   Fri Oct 30 13:38:49 2020 +0100

    seccomp: Set PF_SUPERPRIV when checking capability
    
    Replace the use of security_capable(current_cred(), ...) with
    ns_capable_noaudit() which set PF_SUPERPRIV.
    
    Since commit 98f368e9e263 ("kernel: Add noaudit variant of
    ns_capable()"), a new ns_capable_noaudit() helper is available.  Let's
    use it!
    
    Cc: Jann Horn <jannh at google.com>
    Cc: Kees Cook <keescook at chromium.org>
    Cc: Tyler Hicks <tyhicks at linux.microsoft.com>
    Cc: Will Drewry <wad at chromium.org>
    Cc: stable at vger.kernel.org
    Fixes: e2cfabdfd075 ("seccomp: add system call filtering using BPF")
    Signed-off-by: Mickaël Salaün <mic at linux.microsoft.com>
    Reviewed-by: Jann Horn <jannh at google.com>
    Signed-off-by: Kees Cook <keescook at chromium.org>
    Link: https://lore.kernel.org/r/20201030123849.770769-3-mic@digikod.net

diff --git a/kernel/seccomp.c b/kernel/seccomp.c
index 8ad7a293255a..53a7d1512dd7 100644
--- a/kernel/seccomp.c
+++ b/kernel/seccomp.c
@@ -38,7 +38,7 @@
 #include <linux/filter.h>
 #include <linux/pid.h>
 #include <linux/ptrace.h>
-#include <linux/security.h>
+#include <linux/capability.h>
 #include <linux/tracehook.h>
 #include <linux/uaccess.h>
 #include <linux/anon_inodes.h>
@@ -558,8 +558,7 @@ static struct seccomp_filter *seccomp_prepare_filter(struct sock_fprog *fprog)
 	 * behavior of privileged children.
 	 */
 	if (!task_no_new_privs(current) &&
-	    security_capable(current_cred(), current_user_ns(),
-				     CAP_SYS_ADMIN, CAP_OPT_NOAUDIT) != 0)
+			!ns_capable_noaudit(current_user_ns(), CAP_SYS_ADMIN))
 		return ERR_PTR(-EACCES);
 
 	/* Allocate a new seccomp_filter */
commit cf23705244c947151179f929774fabf71e239eee
Author: Mickaël Salaün <mic at linux.microsoft.com>
Date:   Fri Oct 30 13:38:48 2020 +0100

    ptrace: Set PF_SUPERPRIV when checking capability
    
    Commit 69f594a38967 ("ptrace: do not audit capability check when outputing
    /proc/pid/stat") replaced the use of ns_capable() with
    has_ns_capability{,_noaudit}() which doesn't set PF_SUPERPRIV.
    
    Commit 6b3ad6649a4c ("ptrace: reintroduce usage of subjective credentials in
    ptrace_has_cap()") replaced has_ns_capability{,_noaudit}() with
    security_capable(), which doesn't set PF_SUPERPRIV neither.
    
    Since commit 98f368e9e263 ("kernel: Add noaudit variant of ns_capable()"), a
    new ns_capable_noaudit() helper is available.  Let's use it!
    
    As a result, the signature of ptrace_has_cap() is restored to its original one.
    
    Cc: Christian Brauner <christian.brauner at ubuntu.com>
    Cc: Eric Paris <eparis at redhat.com>
    Cc: Jann Horn <jannh at google.com>
    Cc: Kees Cook <keescook at chromium.org>
    Cc: Oleg Nesterov <oleg at redhat.com>
    Cc: Serge E. Hallyn <serge at hallyn.com>
    Cc: Tyler Hicks <tyhicks at linux.microsoft.com>
    Cc: stable at vger.kernel.org
    Fixes: 6b3ad6649a4c ("ptrace: reintroduce usage of subjective credentials in ptrace_has_cap()")
    Fixes: 69f594a38967 ("ptrace: do not audit capability check when outputing /proc/pid/stat")
    Signed-off-by: Mickaël Salaün <mic at linux.microsoft.com>
    Reviewed-by: Jann Horn <jannh at google.com>
    Signed-off-by: Kees Cook <keescook at chromium.org>
    Link: https://lore.kernel.org/r/20201030123849.770769-2-mic@digikod.net

diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 43d6179508d6..79de1294f8eb 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -264,17 +264,11 @@ static int ptrace_check_attach(struct task_struct *child, bool ignore_state)
 	return ret;
 }
 
-static bool ptrace_has_cap(const struct cred *cred, struct user_namespace *ns,
-			   unsigned int mode)
+static bool ptrace_has_cap(struct user_namespace *ns, unsigned int mode)
 {
-	int ret;
-
 	if (mode & PTRACE_MODE_NOAUDIT)
-		ret = security_capable(cred, ns, CAP_SYS_PTRACE, CAP_OPT_NOAUDIT);
-	else
-		ret = security_capable(cred, ns, CAP_SYS_PTRACE, CAP_OPT_NONE);
-
-	return ret == 0;
+		return ns_capable_noaudit(ns, CAP_SYS_PTRACE);
+	return ns_capable(ns, CAP_SYS_PTRACE);
 }
 
 /* Returns 0 on success, -errno on denial. */
@@ -326,7 +320,7 @@ static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
 	    gid_eq(caller_gid, tcred->sgid) &&
 	    gid_eq(caller_gid, tcred->gid))
 		goto ok;
-	if (ptrace_has_cap(cred, tcred->user_ns, mode))
+	if (ptrace_has_cap(tcred->user_ns, mode))
 		goto ok;
 	rcu_read_unlock();
 	return -EPERM;
@@ -345,7 +339,7 @@ ok:
 	mm = task->mm;
 	if (mm &&
 	    ((get_dumpable(mm) != SUID_DUMP_USER) &&
-	     !ptrace_has_cap(cred, mm->user_ns, mode)))
+	     !ptrace_has_cap(mm->user_ns, mode)))
 	    return -EPERM;
 
 	return security_ptrace_access_check(task, mode);
commit fd5736bf9f235d26c83cac8a16c70bbdafa55abe
Author: Alex Marginean <alexandru.marginean at nxp.com>
Date:   Thu Nov 12 20:26:08 2020 +0200

    enetc: Workaround for MDIO register access issue
    
    Due to a hardware issue, an access to MDIO registers
    that is concurrent with other ENETC register accesses
    may lead to the MDIO access being dropped or corrupted.
    The workaround introduces locking for all register accesses
    to the ENETC register space.  To reduce performance impact,
    a readers-writers locking scheme has been implemented.
    The writer in this case is the MDIO access code (irrelevant
    whether that MDIO access is a register read or write), and
    the reader is any access code to non-MDIO ENETC registers.
    Also, the datapath functions acquire the read lock fewer times
    and use _hot accessors.  All the rest of the code uses the _wa
    accessors which lock every register access.
    The commit introducing MDIO support is -
    commit ebfcb23d62ab ("enetc: Add ENETC PF level external MDIO support")
    but due to subsequent refactoring this patch is applicable on
    top of a later commit.
    
    Fixes: 6517798dd343 ("enetc: Make MDIO accessors more generic and export to include/linux/fsl")
    Signed-off-by: Alex Marginean <alexandru.marginean at nxp.com>
    Signed-off-by: Vladimir Oltean <vladimir.oltean at nxp.com>
    Signed-off-by: Claudiu Manoil <claudiu.manoil at nxp.com>
    Link: https://lore.kernel.org/r/20201112182608.26177-1-claudiu.manoil@nxp.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/enetc/Kconfig b/drivers/net/ethernet/freescale/enetc/Kconfig
index 0fa18b00c49b..d99ea0f4e4a6 100644
--- a/drivers/net/ethernet/freescale/enetc/Kconfig
+++ b/drivers/net/ethernet/freescale/enetc/Kconfig
@@ -16,6 +16,7 @@ config FSL_ENETC
 config FSL_ENETC_VF
 	tristate "ENETC VF driver"
 	depends on PCI && PCI_MSI
+	select FSL_ENETC_MDIO
 	select PHYLINK
 	select DIMLIB
 	help
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 52be6e315752..fc2075ea57fe 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -33,7 +33,10 @@ netdev_tx_t enetc_xmit(struct sk_buff *skb, struct net_device *ndev)
 		return NETDEV_TX_BUSY;
 	}
 
+	enetc_lock_mdio();
 	count = enetc_map_tx_buffs(tx_ring, skb, priv->active_offloads);
+	enetc_unlock_mdio();
+
 	if (unlikely(!count))
 		goto drop_packet_err;
 
@@ -239,7 +242,7 @@ static int enetc_map_tx_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb,
 	skb_tx_timestamp(skb);
 
 	/* let H/W know BD ring has been updated */
-	enetc_wr_reg(tx_ring->tpir, i); /* includes wmb() */
+	enetc_wr_reg_hot(tx_ring->tpir, i); /* includes wmb() */
 
 	return count;
 
@@ -262,12 +265,16 @@ static irqreturn_t enetc_msix(int irq, void *data)
 	struct enetc_int_vector	*v = data;
 	int i;
 
+	enetc_lock_mdio();
+
 	/* disable interrupts */
-	enetc_wr_reg(v->rbier, 0);
-	enetc_wr_reg(v->ricr1, v->rx_ictt);
+	enetc_wr_reg_hot(v->rbier, 0);
+	enetc_wr_reg_hot(v->ricr1, v->rx_ictt);
 
 	for_each_set_bit(i, &v->tx_rings_map, ENETC_MAX_NUM_TXQS)
-		enetc_wr_reg(v->tbier_base + ENETC_BDR_OFF(i), 0);
+		enetc_wr_reg_hot(v->tbier_base + ENETC_BDR_OFF(i), 0);
+
+	enetc_unlock_mdio();
 
 	napi_schedule(&v->napi);
 
@@ -334,19 +341,23 @@ static int enetc_poll(struct napi_struct *napi, int budget)
 
 	v->rx_napi_work = false;
 
+	enetc_lock_mdio();
+
 	/* enable interrupts */
-	enetc_wr_reg(v->rbier, ENETC_RBIER_RXTIE);
+	enetc_wr_reg_hot(v->rbier, ENETC_RBIER_RXTIE);
 
 	for_each_set_bit(i, &v->tx_rings_map, ENETC_MAX_NUM_TXQS)
-		enetc_wr_reg(v->tbier_base + ENETC_BDR_OFF(i),
-			     ENETC_TBIER_TXTIE);
+		enetc_wr_reg_hot(v->tbier_base + ENETC_BDR_OFF(i),
+				 ENETC_TBIER_TXTIE);
+
+	enetc_unlock_mdio();
 
 	return work_done;
 }
 
 static int enetc_bd_ready_count(struct enetc_bdr *tx_ring, int ci)
 {
-	int pi = enetc_rd_reg(tx_ring->tcir) & ENETC_TBCIR_IDX_MASK;
+	int pi = enetc_rd_reg_hot(tx_ring->tcir) & ENETC_TBCIR_IDX_MASK;
 
 	return pi >= ci ? pi - ci : tx_ring->bd_count - ci + pi;
 }
@@ -386,7 +397,10 @@ static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget)
 
 	i = tx_ring->next_to_clean;
 	tx_swbd = &tx_ring->tx_swbd[i];
+
+	enetc_lock_mdio();
 	bds_to_clean = enetc_bd_ready_count(tx_ring, i);
+	enetc_unlock_mdio();
 
 	do_tstamp = false;
 
@@ -429,16 +443,20 @@ static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget)
 			tx_swbd = tx_ring->tx_swbd;
 		}
 
+		enetc_lock_mdio();
+
 		/* BD iteration loop end */
 		if (is_eof) {
 			tx_frm_cnt++;
 			/* re-arm interrupt source */
-			enetc_wr_reg(tx_ring->idr, BIT(tx_ring->index) |
-				     BIT(16 + tx_ring->index));
+			enetc_wr_reg_hot(tx_ring->idr, BIT(tx_ring->index) |
+					 BIT(16 + tx_ring->index));
 		}
 
 		if (unlikely(!bds_to_clean))
 			bds_to_clean = enetc_bd_ready_count(tx_ring, i);
+
+		enetc_unlock_mdio();
 	}
 
 	tx_ring->next_to_clean = i;
@@ -515,8 +533,6 @@ static int enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
 	if (likely(j)) {
 		rx_ring->next_to_alloc = i; /* keep track from page reuse */
 		rx_ring->next_to_use = i;
-		/* update ENETC's consumer index */
-		enetc_wr_reg(rx_ring->rcir, i);
 	}
 
 	return j;
@@ -534,8 +550,8 @@ static void enetc_get_rx_tstamp(struct net_device *ndev,
 	u64 tstamp;
 
 	if (le16_to_cpu(rxbd->r.flags) & ENETC_RXBD_FLAG_TSTMP) {
-		lo = enetc_rd(hw, ENETC_SICTR0);
-		hi = enetc_rd(hw, ENETC_SICTR1);
+		lo = enetc_rd_reg_hot(hw->reg + ENETC_SICTR0);
+		hi = enetc_rd_reg_hot(hw->reg + ENETC_SICTR1);
 		rxbd = enetc_rxbd_ext(rxbd);
 		tstamp_lo = le32_to_cpu(rxbd->ext.tstamp);
 		if (lo <= tstamp_lo)
@@ -684,23 +700,31 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
 		u32 bd_status;
 		u16 size;
 
+		enetc_lock_mdio();
+
 		if (cleaned_cnt >= ENETC_RXBD_BUNDLE) {
 			int count = enetc_refill_rx_ring(rx_ring, cleaned_cnt);
 
+			/* update ENETC's consumer index */
+			enetc_wr_reg_hot(rx_ring->rcir, rx_ring->next_to_use);
 			cleaned_cnt -= count;
 		}
 
 		rxbd = enetc_rxbd(rx_ring, i);
 		bd_status = le32_to_cpu(rxbd->r.lstatus);
-		if (!bd_status)
+		if (!bd_status) {
+			enetc_unlock_mdio();
 			break;
+		}
 
-		enetc_wr_reg(rx_ring->idr, BIT(rx_ring->index));
+		enetc_wr_reg_hot(rx_ring->idr, BIT(rx_ring->index));
 		dma_rmb(); /* for reading other rxbd fields */
 		size = le16_to_cpu(rxbd->r.buf_len);
 		skb = enetc_map_rx_buff_to_skb(rx_ring, i, size);
-		if (!skb)
+		if (!skb) {
+			enetc_unlock_mdio();
 			break;
+		}
 
 		enetc_get_offloads(rx_ring, rxbd, skb);
 
@@ -712,6 +736,7 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
 
 		if (unlikely(bd_status &
 			     ENETC_RXBD_LSTATUS(ENETC_RXBD_ERR_MASK))) {
+			enetc_unlock_mdio();
 			dev_kfree_skb(skb);
 			while (!(bd_status & ENETC_RXBD_LSTATUS_F)) {
 				dma_rmb();
@@ -751,6 +776,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
 
 		enetc_process_skb(rx_ring, skb);
 
+		enetc_unlock_mdio();
+
 		napi_gro_receive(napi, skb);
 
 		rx_frm_cnt++;
@@ -1225,6 +1252,7 @@ static void enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
 	rx_ring->idr = hw->reg + ENETC_SIRXIDR;
 
 	enetc_refill_rx_ring(rx_ring, enetc_bd_unused(rx_ring));
+	enetc_wr(hw, ENETC_SIRXIDR, rx_ring->next_to_use);
 
 	/* enable ring */
 	enetc_rxbdr_wr(hw, idx, ENETC_RBMR, rbmr);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
index 17cf7c94fdb5..eb6bbf1113c7 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
@@ -324,14 +324,100 @@ struct enetc_hw {
 	void __iomem *global;
 };
 
-/* general register accessors */
-#define enetc_rd_reg(reg)	ioread32((reg))
-#define enetc_wr_reg(reg, val)	iowrite32((val), (reg))
+/* ENETC register accessors */
+
+/* MDIO issue workaround (on LS1028A) -
+ * Due to a hardware issue, an access to MDIO registers
+ * that is concurrent with other ENETC register accesses
+ * may lead to the MDIO access being dropped or corrupted.
+ * To protect the MDIO accesses a readers-writers locking
+ * scheme is used, where the MDIO register accesses are
+ * protected by write locks to insure exclusivity, while
+ * the remaining ENETC registers are accessed under read
+ * locks since they only compete with MDIO accesses.
+ */
+extern rwlock_t enetc_mdio_lock;
+
+/* use this locking primitive only on the fast datapath to
+ * group together multiple non-MDIO register accesses to
+ * minimize the overhead of the lock
+ */
+static inline void enetc_lock_mdio(void)
+{
+	read_lock(&enetc_mdio_lock);
+}
+
+static inline void enetc_unlock_mdio(void)
+{
+	read_unlock(&enetc_mdio_lock);
+}
+
+/* use these accessors only on the fast datapath under
+ * the enetc_lock_mdio() locking primitive to minimize
+ * the overhead of the lock
+ */
+static inline u32 enetc_rd_reg_hot(void __iomem *reg)
+{
+	lockdep_assert_held(&enetc_mdio_lock);
+
+	return ioread32(reg);
+}
+
+static inline void enetc_wr_reg_hot(void __iomem *reg, u32 val)
+{
+	lockdep_assert_held(&enetc_mdio_lock);
+
+	iowrite32(val, reg);
+}
+
+/* internal helpers for the MDIO w/a */
+static inline u32 _enetc_rd_reg_wa(void __iomem *reg)
+{
+	u32 val;
+
+	enetc_lock_mdio();
+	val = ioread32(reg);
+	enetc_unlock_mdio();
+
+	return val;
+}
+
+static inline void _enetc_wr_reg_wa(void __iomem *reg, u32 val)
+{
+	enetc_lock_mdio();
+	iowrite32(val, reg);
+	enetc_unlock_mdio();
+}
+
+static inline u32 _enetc_rd_mdio_reg_wa(void __iomem *reg)
+{
+	unsigned long flags;
+	u32 val;
+
+	write_lock_irqsave(&enetc_mdio_lock, flags);
+	val = ioread32(reg);
+	write_unlock_irqrestore(&enetc_mdio_lock, flags);
+
+	return val;
+}
+
+static inline void _enetc_wr_mdio_reg_wa(void __iomem *reg, u32 val)
+{
+	unsigned long flags;
+
+	write_lock_irqsave(&enetc_mdio_lock, flags);
+	iowrite32(val, reg);
+	write_unlock_irqrestore(&enetc_mdio_lock, flags);
+}
+
 #ifdef ioread64
-#define enetc_rd_reg64(reg)	ioread64((reg))
+static inline u64 _enetc_rd_reg64(void __iomem *reg)
+{
+	return ioread64(reg);
+}
 #else
 /* using this to read out stats on 32b systems */
-static inline u64 enetc_rd_reg64(void __iomem *reg)
+static inline u64 _enetc_rd_reg64(void __iomem *reg)
 {
 	u32 low, high, tmp;
 
@@ -345,12 +431,29 @@ static inline u64 enetc_rd_reg64(void __iomem *reg)
 }
 #endif
 
+static inline u64 _enetc_rd_reg64_wa(void __iomem *reg)
+{
+	u64 val;
+
+	enetc_lock_mdio();
+	val = _enetc_rd_reg64(reg);
+	enetc_unlock_mdio();
+
+	return val;
+}
+
+/* general register accessors */
+#define enetc_rd_reg(reg)		_enetc_rd_reg_wa((reg))
+#define enetc_wr_reg(reg, val)		_enetc_wr_reg_wa((reg), (val))
 #define enetc_rd(hw, off)		enetc_rd_reg((hw)->reg + (off))
 #define enetc_wr(hw, off, val)		enetc_wr_reg((hw)->reg + (off), val)
-#define enetc_rd64(hw, off)		enetc_rd_reg64((hw)->reg + (off))
+#define enetc_rd64(hw, off)		_enetc_rd_reg64_wa((hw)->reg + (off))
 /* port register accessors - PF only */
 #define enetc_port_rd(hw, off)		enetc_rd_reg((hw)->port + (off))
 #define enetc_port_wr(hw, off, val)	enetc_wr_reg((hw)->port + (off), val)
+#define enetc_port_rd_mdio(hw, off)	_enetc_rd_mdio_reg_wa((hw)->port + (off))
+#define enetc_port_wr_mdio(hw, off, val)	_enetc_wr_mdio_reg_wa(\
+							(hw)->port + (off), val)
 /* global register accessors - PF only */
 #define enetc_global_rd(hw, off)	enetc_rd_reg((hw)->global + (off))
 #define enetc_global_wr(hw, off, val)	enetc_wr_reg((hw)->global + (off), val)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
index 48c32a171afa..ee0116ed4738 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
@@ -16,13 +16,13 @@
 
 static inline u32 _enetc_mdio_rd(struct enetc_mdio_priv *mdio_priv, int off)
 {
-	return enetc_port_rd(mdio_priv->hw, mdio_priv->mdio_base + off);
+	return enetc_port_rd_mdio(mdio_priv->hw, mdio_priv->mdio_base + off);
 }
 
 static inline void _enetc_mdio_wr(struct enetc_mdio_priv *mdio_priv, int off,
 				  u32 val)
 {
-	enetc_port_wr(mdio_priv->hw, mdio_priv->mdio_base + off, val);
+	enetc_port_wr_mdio(mdio_priv->hw, mdio_priv->mdio_base + off, val);
 }
 
 #define enetc_mdio_rd(mdio_priv, off) \
@@ -174,3 +174,7 @@ struct enetc_hw *enetc_hw_alloc(struct device *dev, void __iomem *port_regs)
 	return hw;
 }
 EXPORT_SYMBOL_GPL(enetc_hw_alloc);
+
+/* Lock for MDIO access errata on LS1028A */
+DEFINE_RWLOCK(enetc_mdio_lock);
+EXPORT_SYMBOL_GPL(enetc_mdio_lock);
commit c464e26f2375a5529ec7bad7b38914e1b87df1e2
Author: Sylvain Lemieux <slemieux at tycoint.com>
Date:   Fri Sep 18 10:15:27 2020 -0400

    MAINTAINERS: Remove myself as LPC32xx maintainers
    
    I appreciate my time as a kernel maintainer for the last few years.
    
    I am no longer working on the LPC32xx platform
    and cannot commit time for support and discussions.
    
    Signed-off-by: Sylvain Lemieux <slemieux at tycoint.com>
    Acked-by: Vladimir Zapolskiy <vz at mleia.com>
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/MAINTAINERS b/MAINTAINERS
index 3da6d8c154e4..30c7e3910d66 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1994,7 +1994,6 @@ N:	lpc18xx
 
 ARM/LPC32XX SOC SUPPORT
 M:	Vladimir Zapolskiy <vz at mleia.com>
-M:	Sylvain Lemieux <slemieux.tyco at gmail.com>
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
 T:	git git://github.com/vzapolskiy/linux-lpc32xx.git
commit 0fa8ee0d9ab95c9350b8b84574824d9a384a9f7d
Merge: 111e91a6df50 ae3d6083acf6
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 17 12:00:40 2020 -0800

    Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
    
    Pull input fixes from Dmitry Torokhov:
     "A fix for use-after-free in the Sun keyboard driver, a fix to firmware
      updates on newer ICs in the Elan touchpad diver, and a couple misc
      driver fixes"
    
    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
      Input: elan_i2c - fix firmware update on newer ICs
      Input: resistive-adc-touch - fix kconfig dependency on IIO_BUFFER
      Input: sunkbd - avoid use-after-free in teardown paths
      Input: i8042 - allow insmod to succeed on devices without an i8042 controller
      Input: adxl34x - clean up a data type in adxl34x_probe()

commit 68ec32daf7d50a9f7425f8607a7402c13aa0c587
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Sat Nov 14 19:52:23 2020 +0800

    net/mlx5: fix error return code in mlx5e_tc_nic_init()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: aedd133d17bc ("net/mlx5e: Support CT offload for tc nic flows")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 2e2fa0440032..ce710f22b1ff 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -5229,8 +5229,10 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
 
 	tc->ct = mlx5_tc_ct_init(priv, tc->chains, &priv->fs.tc.mod_hdr,
 				 MLX5_FLOW_NAMESPACE_KERNEL);
-	if (IS_ERR(tc->ct))
+	if (IS_ERR(tc->ct)) {
+		err = PTR_ERR(tc->ct);
 		goto err_ct;
+	}
 
 	tc->netdevice_nb.notifier_call = mlx5e_tc_netdev_event;
 	err = register_netdevice_notifier_dev_net(priv->netdev,
commit 5b8631c7b21ca8bc039f0bc030048973b039e0d2
Author: Eli Cohen <elic at nvidia.com>
Date:   Mon Nov 9 11:35:52 2020 +0200

    net/mlx5: E-Switch, Fail mlx5_esw_modify_vport_rate if qos disabled
    
    Avoid calling mlx5_esw_modify_vport_rate() if qos is not enabled and
    avoid unnecessary syndrome messages from firmware.
    
    Fixes: fcb64c0f5640 ("net/mlx5: E-Switch, add ingress rate support")
    Signed-off-by: Eli Cohen <elic at nvidia.com>
    Reviewed-by: Roi Dayan <roid at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index 5ad2308a2a6b..d4ee0a9c03db 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -1142,6 +1142,10 @@ int mlx5_esw_modify_vport_rate(struct mlx5_eswitch *esw, u16 vport_num,
 	struct mlx5_vport *vport;
 
 	vport = mlx5_eswitch_get_vport(esw, vport_num);
+
+	if (!vport->qos.enabled)
+		return -EOPNOTSUPP;
+
 	MLX5_SET(scheduling_context, ctx, max_average_bw, rate_mbps);
 
 	return mlx5_modify_scheduling_element_cmd(esw->dev,
commit 470b74758260e4abc2508cf1614573c00a00465c
Author: Vladyslav Tarasiuk <vladyslavt at nvidia.com>
Date:   Wed Oct 21 11:05:41 2020 +0300

    net/mlx5: Disable QoS when min_rates on all VFs are zero
    
    Currently when QoS is enabled for VF and any min_rate is configured,
    the driver sets bw_share value to at least 1 and doesn’t allow to set
    it to 0 to make minimal rate unlimited. It means there is always a
    minimal rate configured for every VF, even if user tries to remove it.
    
    In order to make QoS disable possible, check whether all vports have
    configured min_rate = 0. If this is true, set their bw_share to 0 to
    disable min_rate limitations.
    
    Fixes: c9497c98901c ("net/mlx5: Add support for setting VF min rate")
    Signed-off-by: Vladyslav Tarasiuk <vladyslavt at nvidia.com>
    Reviewed-by: Moshe Shemesh <moshe at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index 6562f4d484e6..5ad2308a2a6b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -2222,12 +2222,15 @@ static u32 calculate_vports_min_rate_divider(struct mlx5_eswitch *esw)
 		max_guarantee = evport->info.min_rate;
 	}
 
-	return max_t(u32, max_guarantee / fw_max_bw_share, 1);
+	if (max_guarantee)
+		return max_t(u32, max_guarantee / fw_max_bw_share, 1);
+	return 0;
 }
 
-static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
+static int normalize_vports_min_rate(struct mlx5_eswitch *esw)
 {
 	u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
+	u32 divider = calculate_vports_min_rate_divider(esw);
 	struct mlx5_vport *evport;
 	u32 vport_max_rate;
 	u32 vport_min_rate;
@@ -2240,9 +2243,9 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
 			continue;
 		vport_min_rate = evport->info.min_rate;
 		vport_max_rate = evport->info.max_rate;
-		bw_share = MLX5_MIN_BW_SHARE;
+		bw_share = 0;
 
-		if (vport_min_rate)
+		if (divider)
 			bw_share = MLX5_RATE_TO_BW_SHARE(vport_min_rate,
 							 divider,
 							 fw_max_bw_share);
@@ -2267,7 +2270,6 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
 	struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
 	u32 fw_max_bw_share;
 	u32 previous_min_rate;
-	u32 divider;
 	bool min_rate_supported;
 	bool max_rate_supported;
 	int err = 0;
@@ -2292,8 +2294,7 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
 
 	previous_min_rate = evport->info.min_rate;
 	evport->info.min_rate = min_rate;
-	divider = calculate_vports_min_rate_divider(esw);
-	err = normalize_vports_min_rate(esw, divider);
+	err = normalize_vports_min_rate(esw);
 	if (err) {
 		evport->info.min_rate = previous_min_rate;
 		goto unlock;
commit 1ce5fc724a26e0b476e42c5d588bdb80caea003b
Author: Vladyslav Tarasiuk <vladyslavt at nvidia.com>
Date:   Mon Nov 2 13:45:24 2020 +0200

    net/mlx5: Clear bw_share upon VF disable
    
    Currently, if user disables VFs with some min and max rates configured,
    they are cleared. But QoS data is not cleared and restored upon next VF
    enable placing limits on minimal rate for given VF, when user expects
    none.
    
    To match cleared vport->info struct with QoS-related min and max rates
    upon VF disable, clear vport->qos struct too.
    
    Fixes: 556b9d16d3f5 ("net/mlx5: Clear VF's configuration on disabling SRIOV")
    Signed-off-by: Vladyslav Tarasiuk <vladyslavt at nvidia.com>
    Reviewed-by: Moshe Shemesh <moshe at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index e8e6294c7cca..6562f4d484e6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -1408,6 +1408,7 @@ static void mlx5_eswitch_clear_vf_vports_info(struct mlx5_eswitch *esw)
 	int i;
 
 	mlx5_esw_for_each_vf_vport(esw, i, vport, esw->esw_funcs.num_vfs) {
+		memset(&vport->qos, 0, sizeof(vport->qos));
 		memset(&vport->info, 0, sizeof(vport->info));
 		vport->info.link_state = MLX5_VPORT_ADMIN_STATE_AUTO;
 	}
commit 8cbcc5ef2a281f6bb10099f4572a08cb765ffbf4
Author: Michael Guralnik <michaelgur at nvidia.com>
Date:   Mon Nov 2 17:34:44 2020 +0200

    net/mlx5: Add handling of port type in rule deletion
    
    Handle destruction of rules with port destination type to enable
    full destruction of flow.
    
    Without this handling of TX rules the deletion of these rules fails.
    Dmesg of flow destruction failure:
    
    [  203.714146] mlx5_core 0000:00:0b.0: mlx5_cmd_check:753:(pid 342): SET_FLOW_TABLE_ENTRY(0x936) op_mod(0x0) failed, status bad parameter(0x3), syndrome (0x144b7a)
    [  210.547387] ------------[ cut here ]------------
    [  210.548663] refcount_t: decrement hit 0; leaking memory.
    [  210.550651] WARNING: CPU: 4 PID: 342 at lib/refcount.c:31 refcount_warn_saturate+0x5c/0x110
    [  210.550654] Modules linked in: mlx5_ib mlx5_core ib_ipoib rdma_ucm rdma_cm iw_cm ib_cm ib_umad ib_uverbs ib_core
    [  210.550675] CPU: 4 PID: 342 Comm: test Not tainted 5.8.0-rc2+ #116
    [  210.550678] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
    [  210.550680] RIP: 0010:refcount_warn_saturate+0x5c/0x110
    [  210.550685] Code: c6 d1 1b 01 00 0f 84 ad 00 00 00 5b 5d c3 80 3d b5 d1 1b 01 00 75 f4 48 c7 c7 20 d1 15 82 c6 05 a5 d1 1b 01 01 e8 a7 eb af ff <0f> 0b eb dd 80 3d 99 d1 1b 01 00 75 d4 48 c7 c7 c0 cf 15 82 c6 05
    [  210.550687] RSP: 0018:ffff8881642e77e8 EFLAGS: 00010282
    [  210.550691] RAX: 0000000000000000 RBX: 0000000000000004 RCX: 0000000000000000
    [  210.550694] RDX: 0000000000000027 RSI: 0000000000000004 RDI: ffffed102c85ceef
    [  210.550696] RBP: ffff888161720428 R08: ffffffff8124c10e R09: ffffed103243beae
    [  210.550698] R10: ffff8881921df56b R11: ffffed103243bead R12: ffff8881841b4180
    [  210.550701] R13: ffff888161720428 R14: ffff8881616d0000 R15: ffff888161720380
    [  210.550704] FS:  00007fc27f025740(0000) GS:ffff888192000000(0000) knlGS:0000000000000000
    [  210.550706] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [  210.550708] CR2: 0000557e4b41a6a0 CR3: 0000000002415004 CR4: 0000000000360ea0
    [  210.550711] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [  210.550713] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [  210.550715] Call Trace:
    [  210.550717]  mlx5_del_flow_rules+0x484/0x490 [mlx5_core]
    [  210.550720]  ? mlx5_cmd_set_fte+0xa80/0xa80 [mlx5_core]
    [  210.550722]  mlx5_ib_destroy_flow+0x17f/0x280 [mlx5_ib]
    [  210.550724]  uverbs_free_flow+0x4c/0x90 [ib_uverbs]
    [  210.550726]  destroy_hw_idr_uobject+0x41/0xb0 [ib_uverbs]
    [  210.550728]  uverbs_destroy_uobject+0xaa/0x390 [ib_uverbs]
    [  210.550731]  __uverbs_cleanup_ufile+0x129/0x1b0 [ib_uverbs]
    [  210.550733]  ? uverbs_destroy_uobject+0x390/0x390 [ib_uverbs]
    [  210.550735]  uverbs_destroy_ufile_hw+0x78/0x190 [ib_uverbs]
    [  210.550737]  ib_uverbs_close+0x36/0x140 [ib_uverbs]
    [  210.550739]  __fput+0x181/0x380
    [  210.550741]  task_work_run+0x88/0xd0
    [  210.550743]  do_exit+0x5f6/0x13b0
    [  210.550745]  ? sched_clock_cpu+0x30/0x140
    [  210.550747]  ? is_current_pgrp_orphaned+0x70/0x70
    [  210.550750]  ? lock_downgrade+0x360/0x360
    [  210.550752]  ? mark_held_locks+0x1d/0x90
    [  210.550754]  do_group_exit+0x8a/0x140
    [  210.550756]  get_signal+0x20a/0xf50
    [  210.550758]  do_signal+0x8c/0xbe0
    [  210.550760]  ? hrtimer_nanosleep+0x1d8/0x200
    [  210.550762]  ? nanosleep_copyout+0x50/0x50
    [  210.550764]  ? restore_sigcontext+0x320/0x320
    [  210.550766]  ? __hrtimer_init+0xf0/0xf0
    [  210.550768]  ? timespec64_add_safe+0x150/0x150
    [  210.550770]  ? mark_held_locks+0x1d/0x90
    [  210.550772]  ? lockdep_hardirqs_on_prepare+0x14c/0x240
    [  210.550774]  __prepare_exit_to_usermode+0x119/0x170
    [  210.550776]  do_syscall_64+0x65/0x300
    [  210.550778]  ? trace_hardirqs_off+0x10/0x120
    [  210.550781]  ? mark_held_locks+0x1d/0x90
    [  210.550783]  ? asm_sysvec_apic_timer_interrupt+0xa/0x20
    [  210.550785]  ? lockdep_hardirqs_on+0x112/0x190
    [  210.550787]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [  210.550789] RIP: 0033:0x7fc27f1cd157
    [  210.550791] Code: Bad RIP value.
    [  210.550793] RSP: 002b:00007ffd4db27ea8 EFLAGS: 00000246 ORIG_RAX: 0000000000000023
    [  210.550798] RAX: fffffffffffffdfc RBX: ffffffffffffff80 RCX: 00007fc27f1cd157
    [  210.550800] RDX: 00007fc27f025740 RSI: 00007ffd4db27eb0 RDI: 00007ffd4db27eb0
    [  210.550803] RBP: 0000000000000016 R08: 0000000000000000 R09: 000000000000000e
    [  210.550805] R10: 00007ffd4db27dc7 R11: 0000000000000246 R12: 0000000000400c00
    [  210.550808] R13: 00007ffd4db285f0 R14: 0000000000000000 R15: 0000000000000000
    [  210.550809] irq event stamp: 49399
    [  210.550812] hardirqs last  enabled at (49399): [<ffffffff81172d36>] console_unlock+0x556/0x6f0
    [  210.550815] hardirqs last disabled at (49398): [<ffffffff81172897>] console_unlock+0xb7/0x6f0
    [  210.550818] softirqs last  enabled at (48706): [<ffffffff81e0037b>] __do_softirq+0x37b/0x60c
    [  210.550820] softirqs last disabled at (48697): [<ffffffff81c00e2f>] asm_call_on_stack+0xf/0x20
    [  210.550822] ---[ end trace ad18c0e6fa846454 ]---
    [  210.581862] mlx5_core 0000:00:0c.0: mlx5_destroy_flow_table:2132:(pid 342): Flow table 262150 wasn't destroyed, refcount > 1
    
    Fixes: a7ee18bdee83 ("RDMA/mlx5: Allow creating a matcher for a NIC TX flow table")
    Signed-off-by: Michael Guralnik <michaelgur at nvidia.com>
    Reviewed-by: Mark Bloch <mbloch at nvidia.com>
    Reviewed-by: Maor Gottlieb <maorg at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 325a5b0d6829..9fdd99272e31 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -534,6 +534,13 @@ static void del_sw_hw_rule(struct fs_node *node)
 		goto out;
 	}
 
+	if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_PORT &&
+	    --fte->dests_size) {
+		fte->modify_mask |= BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION);
+		fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_ALLOW;
+		goto out;
+	}
+
 	if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
 	    --fte->dests_size) {
 		fte->modify_mask |=
commit 219b3267ca102a35092f5998921a9e6f99074af2
Author: Maor Dickman <maord at nvidia.com>
Date:   Wed Nov 4 14:10:30 2020 +0200

    net/mlx5e: Fix check if netdev is bond slave
    
    Bond events handler uses bond_slave_get_rtnl to check if net device
    is bond slave. bond_slave_get_rtnl return the rcu rx_handler pointer
    from the netdev which exists for bond slaves but also exists for
    devices that are attached to linux bridge so using it as indication
    for bond slave is wrong.
    
    Fix by using netif_is_lag_port instead.
    
    Fixes: 7e51891a237f ("net/mlx5e: Use netdev events to set/del egress acl forward-to-vport rule")
    Signed-off-by: Maor Dickman <maord at nvidia.com>
    Reviewed-by: Raed Salem <raeds at nvidia.com>
    Reviewed-by: Ariel Levkovich <lariel at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c
index 3e44e4d820c5..95f2b26a3ee3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c
@@ -187,7 +187,7 @@ static bool mlx5e_rep_is_lag_netdev(struct net_device *netdev)
 	struct mlx5e_priv *priv;
 
 	/* A given netdev is not a representor or not a slave of LAG configuration */
-	if (!mlx5e_eswitch_rep(netdev) || !bond_slave_get_rtnl(netdev))
+	if (!mlx5e_eswitch_rep(netdev) || !netif_is_lag_port(netdev))
 		return false;
 
 	priv = netdev_priv(netdev);
commit 6248ce991f8eed4f2f0fdec694f5749156105629
Author: Huy Nguyen <huyn at mellanox.com>
Date:   Tue Nov 3 12:56:18 2020 -0600

    net/mlx5e: Fix IPsec packet drop by mlx5e_tc_update_skb
    
    Both TC and IPsec crypto offload use metadata_regB to store
    private information. Since TC does not use bit 31 of regB, IPsec
    will use bit 31 as the IPsec packet marker. The IPsec's regB usage
    is changed to:
    Bit31: IPsec marker
    Bit30-24: IPsec syndrome
    Bit23-0: IPsec obj id
    
    Fixes: b2ac7541e377 ("net/mlx5e: IPsec: Add Connect-X IPsec Rx data path offload")
    Signed-off-by: Huy Nguyen <huyn at mellanox.com>
    Reviewed-by: Raed Salem <raeds at nvidia.com>
    Reviewed-by: Ariel Levkovich <lariel at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c
index 0e45590662a8..381a9c8c9da9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c
@@ -64,13 +64,13 @@ static int rx_err_add_rule(struct mlx5e_priv *priv,
 	if (!spec)
 		return -ENOMEM;
 
-	/* Action to copy 7 bit ipsec_syndrome to regB[0:6] */
+	/* Action to copy 7 bit ipsec_syndrome to regB[24:30] */
 	MLX5_SET(copy_action_in, action, action_type, MLX5_ACTION_TYPE_COPY);
 	MLX5_SET(copy_action_in, action, src_field, MLX5_ACTION_IN_FIELD_IPSEC_SYNDROME);
 	MLX5_SET(copy_action_in, action, src_offset, 0);
 	MLX5_SET(copy_action_in, action, length, 7);
 	MLX5_SET(copy_action_in, action, dst_field, MLX5_ACTION_IN_FIELD_METADATA_REG_B);
-	MLX5_SET(copy_action_in, action, dst_offset, 0);
+	MLX5_SET(copy_action_in, action, dst_offset, 24);
 
 	modify_hdr = mlx5_modify_header_alloc(mdev, MLX5_FLOW_NAMESPACE_KERNEL,
 					      1, action);
@@ -488,13 +488,13 @@ static int rx_add_rule(struct mlx5e_priv *priv,
 
 	setup_fte_common(attrs, ipsec_obj_id, spec, &flow_act);
 
-	/* Set 1  bit ipsec marker */
-	/* Set 24 bit ipsec_obj_id */
+	/* Set bit[31] ipsec marker */
+	/* Set bit[23-0] ipsec_obj_id */
 	MLX5_SET(set_action_in, action, action_type, MLX5_ACTION_TYPE_SET);
 	MLX5_SET(set_action_in, action, field, MLX5_ACTION_IN_FIELD_METADATA_REG_B);
-	MLX5_SET(set_action_in, action, data, (ipsec_obj_id << 1) | 0x1);
-	MLX5_SET(set_action_in, action, offset, 7);
-	MLX5_SET(set_action_in, action, length, 25);
+	MLX5_SET(set_action_in, action, data, (ipsec_obj_id | BIT(31)));
+	MLX5_SET(set_action_in, action, offset, 0);
+	MLX5_SET(set_action_in, action, length, 32);
 
 	modify_hdr = mlx5_modify_header_alloc(priv->mdev, MLX5_FLOW_NAMESPACE_KERNEL,
 					      1, action);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c
index 11e31a3db2be..a9b45606dbdb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c
@@ -453,7 +453,6 @@ void mlx5e_ipsec_offload_handle_rx_skb(struct net_device *netdev,
 				       struct mlx5_cqe64 *cqe)
 {
 	u32 ipsec_meta_data = be32_to_cpu(cqe->ft_metadata);
-	u8 ipsec_syndrome = ipsec_meta_data & 0xFF;
 	struct mlx5e_priv *priv;
 	struct xfrm_offload *xo;
 	struct xfrm_state *xs;
@@ -481,7 +480,7 @@ void mlx5e_ipsec_offload_handle_rx_skb(struct net_device *netdev,
 	xo = xfrm_offload(skb);
 	xo->flags = CRYPTO_DONE;
 
-	switch (ipsec_syndrome & MLX5_IPSEC_METADATA_SYNDROM_MASK) {
+	switch (MLX5_IPSEC_METADATA_SYNDROM(ipsec_meta_data)) {
 	case MLX5E_IPSEC_OFFLOAD_RX_SYNDROME_DECRYPTED:
 		xo->status = CRYPTO_SUCCESS;
 		if (WARN_ON_ONCE(priv->ipsec->no_trailer))
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h
index 056dacb612b0..9df9b9a8e09b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h
@@ -39,9 +39,10 @@
 #include "en.h"
 #include "en/txrx.h"
 
-#define MLX5_IPSEC_METADATA_MARKER_MASK      (0x80)
-#define MLX5_IPSEC_METADATA_SYNDROM_MASK     (0x7F)
-#define MLX5_IPSEC_METADATA_HANDLE(metadata) (((metadata) >> 8) & 0xFF)
+/* Bit31: IPsec marker, Bit30-24: IPsec syndrome, Bit23-0: IPsec obj id */
+#define MLX5_IPSEC_METADATA_MARKER(metadata)  (((metadata) >> 31) & 0x1)
+#define MLX5_IPSEC_METADATA_SYNDROM(metadata) (((metadata) >> 24) & GENMASK(6, 0))
+#define MLX5_IPSEC_METADATA_HANDLE(metadata)  ((metadata) & GENMASK(23, 0))
 
 struct mlx5e_accel_tx_ipsec_state {
 	struct xfrm_offload *xo;
@@ -78,7 +79,7 @@ static inline unsigned int mlx5e_ipsec_tx_ids_len(struct mlx5e_accel_tx_ipsec_st
 
 static inline bool mlx5_ipsec_is_rx_flow(struct mlx5_cqe64 *cqe)
 {
-	return !!(MLX5_IPSEC_METADATA_MARKER_MASK & be32_to_cpu(cqe->ft_metadata));
+	return MLX5_IPSEC_METADATA_MARKER(be32_to_cpu(cqe->ft_metadata));
 }
 
 static inline bool mlx5e_ipsec_is_tx_flow(struct mlx5e_accel_tx_ipsec_state *ipsec_st)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
index 3b979008143d..4a2ce241522e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
@@ -283,6 +283,9 @@ static inline bool mlx5e_cqe_regb_chain(struct mlx5_cqe64 *cqe)
 
 	reg_b = be32_to_cpu(cqe->ft_metadata);
 
+	if (reg_b >> (MLX5E_TC_TABLE_CHAIN_TAG_BITS + ZONE_RESTORE_BITS))
+		return false;
+
 	chain = reg_b & MLX5E_TC_TABLE_CHAIN_TAG_MASK;
 	if (chain)
 		return true;
commit 5cfb540ef27b5b763a3b181d142847ef0411728e
Author: Huy Nguyen <huyn at mellanox.com>
Date:   Thu Oct 22 11:22:56 2020 -0500

    net/mlx5e: Set IPsec WAs only in IP's non checksum partial case.
    
    The IP's checksum partial still requires L4 csum flag on Ethernet WQE.
    Make the IPsec WAs only for the IP's non checksum partial case
    (for example icmd packet)
    
    Fixes: 5be019040cb7 ("net/mlx5e: IPsec: Add Connect-X IPsec Tx data path offload")
    Signed-off-by: Huy Nguyen <huyn at mellanox.com>
    Reviewed-by: Raed Salem <raeds at nvidia.com>
    Reviewed-by: Alaa Hleihel <alaa at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
index 82b4419af9d4..6dd3ea3cbbed 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
@@ -144,7 +144,9 @@ static inline void mlx5e_insert_vlan(void *start, struct sk_buff *skb, u16 ihs)
 	memcpy(&vhdr->h_vlan_encapsulated_proto, skb->data + cpy1_sz, cpy2_sz);
 }
 
-/* RM 2311217: no L4 inner checksum for IPsec tunnel type packet */
+/* If packet is not IP's CHECKSUM_PARTIAL (e.g. icmd packet),
+ * need to set L3 checksum flag for IPsec
+ */
 static void
 ipsec_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 			    struct mlx5_wqe_eth_seg *eseg)
@@ -154,7 +156,6 @@ ipsec_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 		eseg->cs_flags |= MLX5_ETH_WQE_L3_INNER_CSUM;
 		sq->stats->csum_partial_inner++;
 	} else {
-		eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM;
 		sq->stats->csum_partial++;
 	}
 }
@@ -162,11 +163,6 @@ ipsec_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 static inline void
 mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg)
 {
-	if (unlikely(eseg->flow_table_metadata & cpu_to_be32(MLX5_ETH_WQE_FT_META_IPSEC))) {
-		ipsec_txwqe_build_eseg_csum(sq, skb, eseg);
-		return;
-	}
-
 	if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
 		eseg->cs_flags = MLX5_ETH_WQE_L3_CSUM;
 		if (skb->encapsulation) {
@@ -177,6 +173,9 @@ mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct
 			eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM;
 			sq->stats->csum_partial++;
 		}
+	} else if (unlikely(eseg->flow_table_metadata & cpu_to_be32(MLX5_ETH_WQE_FT_META_IPSEC))) {
+		ipsec_txwqe_build_eseg_csum(sq, skb, eseg);
+
 	} else
 		sq->stats->csum_none++;
 }
commit ea63609857321c38fd4ad096388b413b66001c6c
Author: Maxim Mikityanskiy <maximmi at mellanox.com>
Date:   Thu Oct 8 12:34:10 2020 +0300

    net/mlx5e: Fix refcount leak on kTLS RX resync
    
    On resync, the driver calls inet_lookup_established
    (__inet6_lookup_established) that increases sk_refcnt of the socket. To
    decrease it, the driver set skb->destructor to sock_edemux. However, it
    didn't work well, because the TCP stack also sets this destructor for
    early demux, and the refcount gets decreased only once, while increased
    two times (in mlx5e and in the TCP stack). It leads to a socket leak, a
    TLS context leak, which in the end leads to calling tls_dev_del twice:
    on socket close and on driver unload, which in turn leads to a crash.
    
    This commit fixes the refcount leak by calling sock_gen_put right away
    after using the socket, thus fixing all the subsequent issues.
    
    Fixes: 0419d8c9d8f8 ("net/mlx5e: kTLS, Add kTLS RX resync support")
    Signed-off-by: Maxim Mikityanskiy <maximmi at mellanox.com>
    Reviewed-by: Tariq Toukan <tariqt at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
index 7f6221b8b1f7..6a1d82503ef8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
@@ -476,19 +476,22 @@ static void resync_update_sn(struct mlx5e_rq *rq, struct sk_buff *skb)
 
 	depth += sizeof(struct tcphdr);
 
-	if (unlikely(!sk || sk->sk_state == TCP_TIME_WAIT))
+	if (unlikely(!sk))
 		return;
 
-	if (unlikely(!resync_queue_get_psv(sk)))
-		return;
+	if (unlikely(sk->sk_state == TCP_TIME_WAIT))
+		goto unref;
 
-	skb->sk = sk;
-	skb->destructor = sock_edemux;
+	if (unlikely(!resync_queue_get_psv(sk)))
+		goto unref;
 
 	seq = th->seq;
 	datalen = skb->len - depth;
 	tls_offload_rx_resync_async_request_start(sk, seq, datalen);
 	rq->stats->tls_resync_req_start++;
+
+unref:
+	sock_gen_put(sk);
 }
 
 void mlx5e_ktls_rx_resync(struct net_device *netdev, struct sock *sk,
commit 111e91a6df505e532a3809ead372787a01e23e0c
Merge: ed129cd75ac1 78d732e1f326
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 17 11:22:03 2020 -0800

    Merge tag 's390-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
    
    Pull s390 fixes from Heiko Carstens:
    
     - fix system call exit path; avoid return to user space with any
       TIF/CIF/PIF set
    
     - fix file permission for cpum_sfb_size parameter
    
     - another small defconfig update
    
    * tag 's390-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
      s390/cpum_sf.c: fix file permission for cpum_sfb_size
      s390: update defconfigs
      s390: fix system call exit path

commit ed129cd75ac1073f32d04d0f2012ede40e86fb77
Merge: be1dd6692adb ac3b57adf87a
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 17 11:15:08 2020 -0800

    Merge tag 'mips_fixes_5.10_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
    
    Pull MIPS fixes from Thomas Bogendoerfer:
    
     - fix bug preventing booting on several platforms
    
     - fix for build error, when modules need has_transparent_hugepage
    
     - fix for memleak in alchemy clk setup
    
    * tag 'mips_fixes_5.10_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux:
      MIPS: Alchemy: Fix memleak in alchemy_clk_setup_cpu
      MIPS: kernel: Fix for_each_memblock conversion
      MIPS: export has_transparent_hugepage() for modules

commit 1b9e2a8c99a5c021041bfb2d512dc3ed92a94ffd
Author: Ryan Sharpelletti <sharpelletti at google.com>
Date:   Mon Nov 16 17:44:13 2020 +0000

    tcp: only postpone PROBE_RTT if RTT is < current min_rtt estimate
    
    During loss recovery, retransmitted packets are forced to use TCP
    timestamps to calculate the RTT samples, which have a millisecond
    granularity. BBR is designed using a microsecond granularity. As a
    result, multiple RTT samples could be truncated to the same RTT value
    during loss recovery. This is problematic, as BBR will not enter
    PROBE_RTT if the RTT sample is <= the current min_rtt sample, meaning
    that if there are persistent losses, PROBE_RTT will constantly be
    pushed off and potentially never re-entered. This patch makes sure
    that BBR enters PROBE_RTT by checking if RTT sample is < the current
    min_rtt sample, rather than <=.
    
    The Netflix transport/TCP team discovered this bug in the Linux TCP
    BBR code during lab tests.
    
    Fixes: 0f8782ea1497 ("tcp_bbr: add BBR congestion control")
    Signed-off-by: Ryan Sharpelletti <sharpelletti at google.com>
    Signed-off-by: Neal Cardwell <ncardwell at google.com>
    Signed-off-by: Soheil Hassas Yeganeh <soheil at google.com>
    Signed-off-by: Yuchung Cheng <ycheng at google.com>
    Link: https://lore.kernel.org/r/20201116174412.1433277-1-sharpelletti.kdev@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
index 6c4d79baff26..6ea3dc2e4219 100644
--- a/net/ipv4/tcp_bbr.c
+++ b/net/ipv4/tcp_bbr.c
@@ -945,7 +945,7 @@ static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs)
 	filter_expired = after(tcp_jiffies32,
 			       bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);
 	if (rs->rtt_us >= 0 &&
-	    (rs->rtt_us <= bbr->min_rtt_us ||
+	    (rs->rtt_us < bbr->min_rtt_us ||
 	     (filter_expired && !rs->is_ack_delayed))) {
 		bbr->min_rtt_us = rs->rtt_us;
 		bbr->min_rtt_stamp = tcp_jiffies32;
commit 3d5179458d22dc0b4fdc724e4bed4231a655112a
Author: Joel Stanley <joel at jms.id.au>
Date:   Tue Nov 17 13:14:48 2020 +1030

    net: ftgmac100: Fix crash when removing driver
    
    When removing the driver we would hit BUG_ON(!list_empty(&dev->ptype_specific))
    in net/core/dev.c due to still having the NC-SI packet handler
    registered.
    
     # echo 1e660000.ethernet > /sys/bus/platform/drivers/ftgmac100/unbind
      ------------[ cut here ]------------
      kernel BUG at net/core/dev.c:10254!
      Internal error: Oops - BUG: 0 [#1] SMP ARM
      CPU: 0 PID: 115 Comm: sh Not tainted 5.10.0-rc3-next-20201111-00007-g02e0365710c4 #46
      Hardware name: Generic DT based system
      PC is at netdev_run_todo+0x314/0x394
      LR is at cpumask_next+0x20/0x24
      pc : [<806f5830>]    lr : [<80863cb0>]    psr: 80000153
      sp : 855bbd58  ip : 00000001  fp : 855bbdac
      r10: 80c03d00  r9 : 80c06228  r8 : 81158c54
      r7 : 00000000  r6 : 80c05dec  r5 : 80c05d18  r4 : 813b9280
      r3 : 813b9054  r2 : 8122c470  r1 : 00000002  r0 : 00000002
      Flags: Nzcv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment none
      Control: 00c5387d  Table: 85514008  DAC: 00000051
      Process sh (pid: 115, stack limit = 0x7cb5703d)
     ...
      Backtrace:
      [<806f551c>] (netdev_run_todo) from [<80707eec>] (rtnl_unlock+0x18/0x1c)
       r10:00000051 r9:854ed710 r8:81158c54 r7:80c76bb0 r6:81158c10 r5:8115b410
       r4:813b9000
      [<80707ed4>] (rtnl_unlock) from [<806f5db8>] (unregister_netdev+0x2c/0x30)
      [<806f5d8c>] (unregister_netdev) from [<805a8180>] (ftgmac100_remove+0x20/0xa8)
       r5:8115b410 r4:813b9000
      [<805a8160>] (ftgmac100_remove) from [<805355e4>] (platform_drv_remove+0x34/0x4c)
    
    Fixes: bd466c3fb5a4 ("net/faraday: Support NCSI mode")
    Signed-off-by: Joel Stanley <joel at jms.id.au>
    Link: https://lore.kernel.org/r/20201117024448.1170761-1-joel@jms.id.au
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 00024dd41147..80fb1f537bb3 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -1907,6 +1907,8 @@ err_register_netdev:
 	clk_disable_unprepare(priv->rclk);
 	clk_disable_unprepare(priv->clk);
 err_ncsi_dev:
+	if (priv->ndev)
+		ncsi_unregister_dev(priv->ndev);
 	ftgmac100_destroy_mdio(netdev);
 err_setup_mdio:
 	iounmap(priv->base);
@@ -1926,6 +1928,8 @@ static int ftgmac100_remove(struct platform_device *pdev)
 	netdev = platform_get_drvdata(pdev);
 	priv = netdev_priv(netdev);
 
+	if (priv->ndev)
+		ncsi_unregister_dev(priv->ndev);
 	unregister_netdev(netdev);
 
 	clk_disable_unprepare(priv->rclk);
commit 23bde34771f1ea92fb5e6682c0d8c04304d34b3b
Author: Zenghui Yu <yuzenghui at huawei.com>
Date:   Tue Nov 17 23:16:29 2020 +0800

    KVM: arm64: vgic-v3: Drop the reporting of GICR_TYPER.Last for userspace
    
    It was recently reported that if GICR_TYPER is accessed before the RD base
    address is set, we'll suffer from the unset @rdreg dereferencing. Oops...
    
            gpa_t last_rdist_typer = rdreg->base + GICR_TYPER +
                            (rdreg->free_index - 1) * KVM_VGIC_V3_REDIST_SIZE;
    
    It's "expected" that users will access registers in the redistributor if
    the RD has been properly configured (e.g., the RD base address is set). But
    it hasn't yet been covered by the existing documentation.
    
    Per discussion on the list [1], the reporting of the GICR_TYPER.Last bit
    for userspace never actually worked. And it's difficult for us to emulate
    it correctly given that userspace has the flexibility to access it any
    time. Let's just drop the reporting of the Last bit for userspace for now
    (userspace should have full knowledge about it anyway) and it at least
    prevents kernel from panic ;-)
    
    [1] https://lore.kernel.org/kvmarm/c20865a267e44d1e2c0d52ce4e012263@kernel.org/
    
    Fixes: ba7b3f1275fd ("KVM: arm/arm64: Revisit Redistributor TYPER last bit computation")
    Reported-by: Keqian Zhu <zhukeqian1 at huawei.com>
    Signed-off-by: Zenghui Yu <yuzenghui at huawei.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Reviewed-by: Eric Auger <eric.auger at redhat.com>
    Link: https://lore.kernel.org/r/20201117151629.1738-1-yuzenghui@huawei.com
    Cc: stable at vger.kernel.org

diff --git a/arch/arm64/kvm/vgic/vgic-mmio-v3.c b/arch/arm64/kvm/vgic/vgic-mmio-v3.c
index 52d6f24f65dc..15a6c98ee92f 100644
--- a/arch/arm64/kvm/vgic/vgic-mmio-v3.c
+++ b/arch/arm64/kvm/vgic/vgic-mmio-v3.c
@@ -273,6 +273,23 @@ static unsigned long vgic_mmio_read_v3r_typer(struct kvm_vcpu *vcpu,
 	return extract_bytes(value, addr & 7, len);
 }
 
+static unsigned long vgic_uaccess_read_v3r_typer(struct kvm_vcpu *vcpu,
+						 gpa_t addr, unsigned int len)
+{
+	unsigned long mpidr = kvm_vcpu_get_mpidr_aff(vcpu);
+	int target_vcpu_id = vcpu->vcpu_id;
+	u64 value;
+
+	value = (u64)(mpidr & GENMASK(23, 0)) << 32;
+	value |= ((target_vcpu_id & 0xffff) << 8);
+
+	if (vgic_has_its(vcpu->kvm))
+		value |= GICR_TYPER_PLPIS;
+
+	/* reporting of the Last bit is not supported for userspace */
+	return extract_bytes(value, addr & 7, len);
+}
+
 static unsigned long vgic_mmio_read_v3r_iidr(struct kvm_vcpu *vcpu,
 					     gpa_t addr, unsigned int len)
 {
@@ -593,8 +610,9 @@ static const struct vgic_register_region vgic_v3_rd_registers[] = {
 	REGISTER_DESC_WITH_LENGTH(GICR_IIDR,
 		vgic_mmio_read_v3r_iidr, vgic_mmio_write_wi, 4,
 		VGIC_ACCESS_32bit),
-	REGISTER_DESC_WITH_LENGTH(GICR_TYPER,
-		vgic_mmio_read_v3r_typer, vgic_mmio_write_wi, 8,
+	REGISTER_DESC_WITH_LENGTH_UACCESS(GICR_TYPER,
+		vgic_mmio_read_v3r_typer, vgic_mmio_write_wi,
+		vgic_uaccess_read_v3r_typer, vgic_mmio_uaccess_write_wi, 8,
 		VGIC_ACCESS_64bit | VGIC_ACCESS_32bit),
 	REGISTER_DESC_WITH_LENGTH(GICR_WAKER,
 		vgic_mmio_read_raz, vgic_mmio_write_wi, 4,
commit 7b027c249da54f492699c43e26cba486cfd48035
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Tue Nov 17 11:02:11 2020 +0800

    net: b44: fix error return code in b44_init_one()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 39a6f4bce6b4 ("b44: replace the ssb_dma API with the generic DMA API")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Reviewed-by: Michael Chan <michael.chan at broadcom.com>
    Link: https://lore.kernel.org/r/1605582131-36735-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c
index 74c1778d841e..b455b60a5434 100644
--- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c
@@ -2383,7 +2383,8 @@ static int b44_init_one(struct ssb_device *sdev,
 		goto err_out_free_dev;
 	}
 
-	if (dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30))) {
+	err = dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30));
+	if (err) {
 		dev_err(sdev->dev,
 			"Required 30BIT DMA mask unsupported by the system\n");
 		goto err_out_powerdown;
commit be1dd6692adbdb1d70da47da124ac8376bba5ad5
Merge: 9dacf44c3837 568beb27959b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 17 10:47:45 2020 -0800

    Merge tag 'perf-tools-fixes-for-v5.10-2020-11-17' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux
    
    Pull perf tools fixes from Arnaldo Carvalho de Melo:
    
     - Fix file corruption due to event deletion in 'perf inject'.
    
     - Update arch/x86/lib/mem{cpy,set}_64.S copies used in 'perf bench mem
       memcpy', silencing perf build warning.
    
     - Avoid an msan warning in a copied stack in 'perf test'.
    
     - Correct tracepoint field name "flags" in ARM's CS-ETM hardware
       tracing 'perf test' entry.
    
     - Update branch sample pattern for cs-etm to cope with excluding guest
       in userspace counting.
    
     - Don't free "lock_seq_stat" if read_count isn't zero in 'perf lock'.
    
    * tag 'perf-tools-fixes-for-v5.10-2020-11-17' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux:
      perf test: Avoid an msan warning in a copied stack.
      perf inject: Fix file corruption due to event deletion
      perf test: Update branch sample pattern for cs-etm
      perf test: Fix a typo in cs-etm testing
      tools arch: Update arch/x86/lib/mem{cpy,set}_64.S copies used in 'perf bench mem memcpy'
      perf lock: Don't free "lock_seq_stat" if read_count isn't zero
      perf lock: Correct field name "flags"

commit cb47d16ea21045c66eebbf5ed792e74a8537e27a
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Mon Nov 16 21:07:13 2020 +0800

    qed: fix error return code in qed_iwarp_ll2_start()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 469981b17a4f ("qed: Add unaligned and packed packet processing")
    Fixes: fcb39f6c10b2 ("qed: Add mpa buffer descriptors for storing and processing mpa fpdus")
    Fixes: 1e28eaad07ea ("qed: Add iWARP support for fpdu spanned over more than two tcp packets")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Acked-by: Michal Kalderon <michal.kalderon at marvell.com>
    Link: https://lore.kernel.org/r/1605532033-27373-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
index 512cbef24097..a99861124630 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
@@ -2754,14 +2754,18 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn,
 	iwarp_info->partial_fpdus = kcalloc((u16)p_hwfn->p_rdma_info->num_qps,
 					    sizeof(*iwarp_info->partial_fpdus),
 					    GFP_KERNEL);
-	if (!iwarp_info->partial_fpdus)
+	if (!iwarp_info->partial_fpdus) {
+		rc = -ENOMEM;
 		goto err;
+	}
 
 	iwarp_info->max_num_partial_fpdus = (u16)p_hwfn->p_rdma_info->num_qps;
 
 	iwarp_info->mpa_intermediate_buf = kzalloc(buff_size, GFP_KERNEL);
-	if (!iwarp_info->mpa_intermediate_buf)
+	if (!iwarp_info->mpa_intermediate_buf) {
+		rc = -ENOMEM;
 		goto err;
+	}
 
 	/* The mpa_bufs array serves for pending RX packets received on the
 	 * mpa ll2 that don't have place on the tx ring and require later
@@ -2771,8 +2775,10 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn,
 	iwarp_info->mpa_bufs = kcalloc(data.input.rx_num_desc,
 				       sizeof(*iwarp_info->mpa_bufs),
 				       GFP_KERNEL);
-	if (!iwarp_info->mpa_bufs)
+	if (!iwarp_info->mpa_bufs) {
+		rc = -ENOMEM;
 		goto err;
+	}
 
 	INIT_LIST_HEAD(&iwarp_info->mpa_buf_pending_list);
 	INIT_LIST_HEAD(&iwarp_info->mpa_buf_list);
commit 9dacf44c3837b7f1cf460de904f352714e7cd107
Merge: 9c87c9f41245 c583bcb8f5ed
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 17 10:31:56 2020 -0800

    Merge branch 'urgent-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu
    
    Pull RCU fix from Paul McKenney:
     "A single commit that fixes a bug that was introduced a couple of merge
      windows ago, but which rather more recently converged to an
      agreed-upon fix. The bug is that interrupts can be incorrectly enabled
      while holding an irq-disabled spinlock. This can of course result in
      self-deadlocks.
    
      The bug is a bit difficult to trigger. It requires that a preempted
      task be blocking a preemptible-RCU grace period long enough to trigger
      an RCU CPU stall warning. In addition, an interrupt must occur at just
      the right time, and that interrupt's handler must acquire that same
      irq-disabled spinlock. Still, a deadlock is a deadlock.
    
      Furthermore, we do now have a fix, and that fix survives kernel test
      robot, -next, and rcutorture testing. It has also been verified by
      Sebastian as fixing the bug. Therefore..."
    
    * 'urgent-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu:
      rcu: Don't invoke try_invoke_on_locked_down_task() with irqs disabled

commit 6654b57866b98230a270953dd34f67de17ab1708
Author: Xiongfeng Wang <wangxiongfeng2 at huawei.com>
Date:   Mon Nov 16 09:09:29 2020 +0800

    drm/sun4i: dw-hdmi: fix error return code in sun8i_dw_hdmi_bind()
    
    Fix to return a negative error code from the error handling case instead
    of 0 in function sun8i_dw_hdmi_bind().
    
    Fixes: b7c7436a5ff0 ("drm/sun4i: Implement A83T HDMI driver")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Xiongfeng Wang <wangxiongfeng2 at huawei.com>
    Reviewed-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://patchwork.freedesktop.org/patch/msgid/1605488969-5211-1-git-send-email-wangxiongfeng2@huawei.com

diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
index d4c08043dd81..92add2cef2e7 100644
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
@@ -208,6 +208,7 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
 	phy_node = of_parse_phandle(dev->of_node, "phys", 0);
 	if (!phy_node) {
 		dev_err(dev, "Can't found PHY phandle\n");
+		ret = -EINVAL;
 		goto err_disable_clk_tmds;
 	}
 
commit 04a9cd51d3f3308a98cbc6adc07acb12fbade011
Author: Lukas Wunner <lukas at wunner.de>
Date:   Mon Nov 16 09:23:10 2020 +0100

    spi: npcm-fiu: Don't leak SPI master in probe error path
    
    If the calls to of_match_device(), of_alias_get_id(),
    devm_ioremap_resource(), devm_regmap_init_mmio() or devm_clk_get()
    fail on probe of the NPCM FIU SPI driver, the spi_controller struct is
    erroneously not freed.
    
    Fix by switching over to the new devm_spi_alloc_master() helper.
    
    Fixes: ace55c411b11 ("spi: npcm-fiu: add NPCM FIU controller driver")
    Signed-off-by: Lukas Wunner <lukas at wunner.de>
    Cc: <stable at vger.kernel.org> # v5.4+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation
    Cc: <stable at vger.kernel.org> # v5.4+
    Cc: Tomer Maimon <tmaimon77 at gmail.com>
    Link: https://lore.kernel.org/r/a420c23a363a3bc9aa684c6e790c32a8af106d17.1605512876.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-npcm-fiu.c b/drivers/spi/spi-npcm-fiu.c
index 341f7cffeaac..1cb9329de945 100644
--- a/drivers/spi/spi-npcm-fiu.c
+++ b/drivers/spi/spi-npcm-fiu.c
@@ -679,7 +679,7 @@ static int npcm_fiu_probe(struct platform_device *pdev)
 	struct resource *res;
 	int id;
 
-	ctrl = spi_alloc_master(dev, sizeof(*fiu));
+	ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
 	if (!ctrl)
 		return -ENOMEM;
 
commit a41b0ad07bfa081584218431cb0cd7e7ecc71210
Author: Serge Semin <Sergey.Semin at baikalelectronics.ru>
Date:   Tue Nov 17 12:40:54 2020 +0300

    spi: dw: Set transfer handler before unmasking the IRQs
    
    It turns out the IRQs most like can be unmasked before the controller is
    enabled with no problematic consequences. The manual doesn't explicitly
    state that, but the examples perform the controller initialization
    procedure in that order. So the commit da8f58909e7e ("spi: dw: Unmask IRQs
    after enabling the chip") hasn't been that required as I thought. But
    anyway setting the IRQs up after the chip enabling still worth adding
    since it has simplified the code a bit. The problem is that it has
    introduced a potential bug. The transfer handler pointer is now
    initialized after the IRQs are enabled. That may and eventually will cause
    an invalid or uninitialized callback invocation. Fix that just by
    performing the callback initialization before the IRQ unmask procedure.
    
    Fixes: da8f58909e7e ("spi: dw: Unmask IRQs after enabling the chip")
    Signed-off-by: Serge Semin <Sergey.Semin at baikalelectronics.ru>
    Link: https://lore.kernel.org/r/20201117094054.4696-1-Sergey.Semin@baikalelectronics.ru
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
index 2e50cc0a9291..0b2236ade412 100644
--- a/drivers/spi/spi-dw-core.c
+++ b/drivers/spi/spi-dw-core.c
@@ -357,11 +357,11 @@ static void dw_spi_irq_setup(struct dw_spi *dws)
 	dw_writel(dws, DW_SPI_TXFTLR, level);
 	dw_writel(dws, DW_SPI_RXFTLR, level - 1);
 
+	dws->transfer_handler = dw_spi_transfer_handler;
+
 	imask = SPI_INT_TXEI | SPI_INT_TXOI | SPI_INT_RXUI | SPI_INT_RXOI |
 		SPI_INT_RXFI;
 	spi_umask_intr(dws, imask);
-
-	dws->transfer_handler = dw_spi_transfer_handler;
 }
 
 /*
commit 67aa3ec3dbc43d6e34401d9b2a40040ff7bb57af
Author: Mikulas Patocka <mpatocka at redhat.com>
Date:   Tue Nov 10 07:45:13 2020 -0500

    dm writecache: fix the maximum number of arguments
    
    Advance the maximum number of arguments to 16.
    This fixes issue where certain operations, combined with table
    configured args, exceed 10 arguments.
    
    Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
    Fixes: 48debafe4f2f ("dm: add writecache target")
    Cc: stable at vger.kernel.org # v4.18+
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
index 1ea923af47c6..7d277de26b3a 100644
--- a/drivers/md/dm-writecache.c
+++ b/drivers/md/dm-writecache.c
@@ -2041,7 +2041,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
 	struct wc_memory_superblock s;
 
 	static struct dm_arg _args[] = {
-		{0, 10, "Invalid number of feature args"},
+		{0, 16, "Invalid number of feature args"},
 	};
 
 	as.argc = argc;
commit e5d41cbca1b2036362c9e29d705d3a175a01eff8
Author: Mikulas Patocka <mpatocka at redhat.com>
Date:   Tue Nov 10 07:44:01 2020 -0500

    dm writecache: advance the number of arguments when reporting max_age
    
    When reporting the "max_age" value the number of arguments must
    advance by two.
    
    Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
    Fixes: 3923d4854e18 ("dm writecache: implement gradual cleanup")
    Cc: stable at vger.kernel.org # v5.7+
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
index 9ae4ce7df95c..1ea923af47c6 100644
--- a/drivers/md/dm-writecache.c
+++ b/drivers/md/dm-writecache.c
@@ -2479,6 +2479,8 @@ static void writecache_status(struct dm_target *ti, status_type_t type,
 			extra_args += 2;
 		if (wc->autocommit_time_set)
 			extra_args += 2;
+		if (wc->max_age != MAX_AGE_UNSPECIFIED)
+			extra_args += 2;
 		if (wc->cleaner)
 			extra_args++;
 		if (wc->writeback_fua_set)
commit a7a10bce8a04f48238a8306ec97d430b77917015
Author: Mikulas Patocka <mpatocka at redhat.com>
Date:   Thu Oct 15 13:21:44 2020 -0400

    dm integrity: don't use drivers that have CRYPTO_ALG_ALLOCATES_MEMORY
    
    Don't use crypto drivers that have the flag CRYPTO_ALG_ALLOCATES_MEMORY
    set. These drivers allocate memory and thus they are not suitable for
    block I/O processing.
    
    Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
    Signed-off-by: Mike Snitzer <snitzer at redhat.com>

diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index 3fc3757def55..5a7a1b90e671 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -3462,7 +3462,7 @@ static int get_mac(struct crypto_shash **hash, struct alg_spec *a, char **error,
 	int r;
 
 	if (a->alg_string) {
-		*hash = crypto_alloc_shash(a->alg_string, 0, 0);
+		*hash = crypto_alloc_shash(a->alg_string, 0, CRYPTO_ALG_ALLOCATES_MEMORY);
 		if (IS_ERR(*hash)) {
 			*error = error_alg;
 			r = PTR_ERR(*hash);
@@ -3519,7 +3519,7 @@ static int create_journal(struct dm_integrity_c *ic, char **error)
 		struct journal_completion comp;
 
 		comp.ic = ic;
-		ic->journal_crypt = crypto_alloc_skcipher(ic->journal_crypt_alg.alg_string, 0, 0);
+		ic->journal_crypt = crypto_alloc_skcipher(ic->journal_crypt_alg.alg_string, 0, CRYPTO_ALG_ALLOCATES_MEMORY);
 		if (IS_ERR(ic->journal_crypt)) {
 			*error = "Invalid journal cipher";
 			r = PTR_ERR(ic->journal_crypt);
commit e3389b0a14952aac7f2998bb98f633afb21eaa92
Author: Zhen Lei <thunder.leizhen at huawei.com>
Date:   Fri Oct 16 17:08:33 2020 +0800

    arm64: dts: qcom: clear the warnings caused by empty dma-ranges
    
    The scripts/dtc/checks.c requires that the node have empty "dma-ranges"
    property must have the same "#address-cells" and "#size-cells" values as
    the parent node. Otherwise, the following warnings is reported:
    
    arch/arm64/boot/dts/qcom/ipq6018.dtsi:185.3-14: Warning \
    (dma_ranges_format): /soc:dma-ranges: empty "dma-ranges" property but \
    its #address-cells (1) differs from / (2)
    arch/arm64/boot/dts/qcom/ipq6018.dtsi:185.3-14: Warning \
    (dma_ranges_format): /soc:dma-ranges: empty "dma-ranges" property but \
    its #size-cells (1) differs from / (2)
    
    Arnd Bergmann figured out why it's necessary:
    Also note that the #address-cells=<1> means that any device under
    this bus is assumed to only support 32-bit addressing, and DMA will
    have to go through a slow swiotlb in the absence of an IOMMU.
    
    Suggested-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Zhen Lei <thunder.leizhen at huawei.com>
    Reviewed-by: Bjorn Andersson <bjorn.andersson at linaro.org>
    Link: https://lore.kernel.org/r/20201016090833.1892-3-thunder.leizhen@huawei.com'
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/arch/arm64/boot/dts/qcom/ipq6018.dtsi b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
index a94dac76bf3f..59e0cbfa2214 100644
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
@@ -179,22 +179,22 @@
 	};
 
 	soc: soc {
-		#address-cells = <1>;
-		#size-cells = <1>;
-		ranges = <0 0 0 0xffffffff>;
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges = <0 0 0 0 0x0 0xffffffff>;
 		dma-ranges;
 		compatible = "simple-bus";
 
 		prng: qrng at e1000 {
 			compatible = "qcom,prng-ee";
-			reg = <0xe3000 0x1000>;
+			reg = <0x0 0xe3000 0x0 0x1000>;
 			clocks = <&gcc GCC_PRNG_AHB_CLK>;
 			clock-names = "core";
 		};
 
 		cryptobam: dma at 704000 {
 			compatible = "qcom,bam-v1.7.0";
-			reg = <0x00704000 0x20000>;
+			reg = <0x0 0x00704000 0x0 0x20000>;
 			interrupts = <GIC_SPI 207 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&gcc GCC_CRYPTO_AHB_CLK>;
 			clock-names = "bam_clk";
@@ -206,7 +206,7 @@
 
 		crypto: crypto at 73a000 {
 			compatible = "qcom,crypto-v5.1";
-			reg = <0x0073a000 0x6000>;
+			reg = <0x0 0x0073a000 0x0 0x6000>;
 			clocks = <&gcc GCC_CRYPTO_AHB_CLK>,
 				<&gcc GCC_CRYPTO_AXI_CLK>,
 				<&gcc GCC_CRYPTO_CLK>;
@@ -217,7 +217,7 @@
 
 		tlmm: pinctrl at 1000000 {
 			compatible = "qcom,ipq6018-pinctrl";
-			reg = <0x01000000 0x300000>;
+			reg = <0x0 0x01000000 0x0 0x300000>;
 			interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
 			gpio-controller;
 			#gpio-cells = <2>;
@@ -235,7 +235,7 @@
 
 		gcc: gcc at 1800000 {
 			compatible = "qcom,gcc-ipq6018";
-			reg = <0x01800000 0x80000>;
+			reg = <0x0 0x01800000 0x0 0x80000>;
 			clocks = <&xo>, <&sleep_clk>;
 			clock-names = "xo", "sleep_clk";
 			#clock-cells = <1>;
@@ -244,17 +244,17 @@
 
 		tcsr_mutex_regs: syscon at 1905000 {
 			compatible = "syscon";
-			reg = <0x01905000 0x8000>;
+			reg = <0x0 0x01905000 0x0 0x8000>;
 		};
 
 		tcsr_q6: syscon at 1945000 {
 			compatible = "syscon";
-			reg = <0x01945000 0xe000>;
+			reg = <0x0 0x01945000 0x0 0xe000>;
 		};
 
 		blsp_dma: dma at 7884000 {
 			compatible = "qcom,bam-v1.7.0";
-			reg = <0x07884000 0x2b000>;
+			reg = <0x0 0x07884000 0x0 0x2b000>;
 			interrupts = <GIC_SPI 238 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&gcc GCC_BLSP1_AHB_CLK>;
 			clock-names = "bam_clk";
@@ -264,7 +264,7 @@
 
 		blsp1_uart3: serial at 78b1000 {
 			compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
-			reg = <0x078b1000 0x200>;
+			reg = <0x0 0x078b1000 0x0 0x200>;
 			interrupts = <GIC_SPI 306 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&gcc GCC_BLSP1_UART3_APPS_CLK>,
 				<&gcc GCC_BLSP1_AHB_CLK>;
@@ -276,7 +276,7 @@
 			compatible = "qcom,spi-qup-v2.2.1";
 			#address-cells = <1>;
 			#size-cells = <0>;
-			reg = <0x078b5000 0x600>;
+			reg = <0x0 0x078b5000 0x0 0x600>;
 			interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
 			spi-max-frequency = <50000000>;
 			clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>,
@@ -291,7 +291,7 @@
 			compatible = "qcom,spi-qup-v2.2.1";
 			#address-cells = <1>;
 			#size-cells = <0>;
-			reg = <0x078b6000 0x600>;
+			reg = <0x0 0x078b6000 0x0 0x600>;
 			interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
 			spi-max-frequency = <50000000>;
 			clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>,
@@ -306,7 +306,7 @@
 			compatible = "qcom,i2c-qup-v2.2.1";
 			#address-cells = <1>;
 			#size-cells = <0>;
-			reg = <0x078b6000 0x600>;
+			reg = <0x0 0x078b6000 0x0 0x600>;
 			interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&gcc GCC_BLSP1_AHB_CLK>,
 				<&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>;
@@ -321,7 +321,7 @@
 			compatible = "qcom,i2c-qup-v2.2.1";
 			#address-cells = <1>;
 			#size-cells = <0>;
-			reg = <0x078b7000 0x600>;
+			reg = <0x0 0x078b7000 0x0 0x600>;
 			interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&gcc GCC_BLSP1_AHB_CLK>,
 				<&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>;
@@ -336,24 +336,24 @@
 			compatible = "qcom,msm-qgic2";
 			interrupt-controller;
 			#interrupt-cells = <0x3>;
-			reg =   <0x0b000000 0x1000>,  /*GICD*/
-				<0x0b002000 0x1000>,  /*GICC*/
-				<0x0b001000 0x1000>,  /*GICH*/
-				<0x0b004000 0x1000>;  /*GICV*/
+			reg =   <0x0 0x0b000000 0x0 0x1000>,  /*GICD*/
+				<0x0 0x0b002000 0x0 0x1000>,  /*GICC*/
+				<0x0 0x0b001000 0x0 0x1000>,  /*GICH*/
+				<0x0 0x0b004000 0x0 0x1000>;  /*GICV*/
 			interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
 		};
 
 		watchdog at b017000 {
 			compatible = "qcom,kpss-wdt";
 			interrupts = <GIC_SPI 3 IRQ_TYPE_EDGE_RISING>;
-			reg = <0x0b017000 0x40>;
+			reg = <0x0 0x0b017000 0x0 0x40>;
 			clocks = <&sleep_clk>;
 			timeout-sec = <10>;
 		};
 
 		apcs_glb: mailbox at b111000 {
 			compatible = "qcom,ipq6018-apcs-apps-global";
-			reg = <0x0b111000 0x1000>;
+			reg = <0x0 0x0b111000 0x0 0x1000>;
 			#clock-cells = <1>;
 			clocks = <&a53pll>, <&xo>;
 			clock-names = "pll", "xo";
@@ -362,7 +362,7 @@
 
 		a53pll: clock at b116000 {
 			compatible = "qcom,ipq6018-a53pll";
-			reg = <0x0b116000 0x40>;
+			reg = <0x0 0x0b116000 0x0 0x40>;
 			#clock-cells = <0>;
 			clocks = <&xo>;
 			clock-names = "xo";
@@ -377,68 +377,68 @@
 		};
 
 		timer at b120000 {
-			#address-cells = <1>;
-			#size-cells = <1>;
+			#address-cells = <2>;
+			#size-cells = <2>;
 			ranges;
 			compatible = "arm,armv7-timer-mem";
-			reg = <0x0b120000 0x1000>;
+			reg = <0x0 0x0b120000 0x0 0x1000>;
 			clock-frequency = <19200000>;
 
 			frame at b120000 {
 				frame-number = <0>;
 				interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
 					     <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0x0b121000 0x1000>,
-				      <0x0b122000 0x1000>;
+				reg = <0x0 0x0b121000 0x0 0x1000>,
+				      <0x0 0x0b122000 0x0 0x1000>;
 			};
 
 			frame at b123000 {
 				frame-number = <1>;
 				interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0xb123000 0x1000>;
+				reg = <0x0 0xb123000 0x0 0x1000>;
 				status = "disabled";
 			};
 
 			frame at b124000 {
 				frame-number = <2>;
 				interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0x0b124000 0x1000>;
+				reg = <0x0 0x0b124000 0x0 0x1000>;
 				status = "disabled";
 			};
 
 			frame at b125000 {
 				frame-number = <3>;
 				interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0x0b125000 0x1000>;
+				reg = <0x0 0x0b125000 0x0 0x1000>;
 				status = "disabled";
 			};
 
 			frame at b126000 {
 				frame-number = <4>;
 				interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0x0b126000 0x1000>;
+				reg = <0x0 0x0b126000 0x0 0x1000>;
 				status = "disabled";
 			};
 
 			frame at b127000 {
 				frame-number = <5>;
 				interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0x0b127000 0x1000>;
+				reg = <0x0 0x0b127000 0x0 0x1000>;
 				status = "disabled";
 			};
 
 			frame at b128000 {
 				frame-number = <6>;
 				interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
-				reg = <0x0b128000 0x1000>;
+				reg = <0x0 0x0b128000 0x0 0x1000>;
 				status = "disabled";
 			};
 		};
 
 		q6v5_wcss: remoteproc at cd00000 {
 			compatible = "qcom,ipq8074-wcss-pil";
-			reg = <0x0cd00000 0x4040>,
-				<0x004ab000 0x20>;
+			reg = <0x0 0x0cd00000 0x0 0x4040>,
+			      <0x0 0x004ab000 0x0 0x20>;
 			reg-names = "qdsp6",
 				    "rmb";
 			interrupts-extended = <&intc GIC_SPI 325 IRQ_TYPE_EDGE_RISING>,
commit 2013a4b684b6eb614ee5c9a3c07b0ae6f5ca96d9
Author: Zhen Lei <thunder.leizhen at huawei.com>
Date:   Fri Oct 16 17:08:32 2020 +0800

    arm64: dts: broadcom: clear the warnings caused by empty dma-ranges
    
    The scripts/dtc/checks.c requires that the node have empty "dma-ranges"
    property must have the same "#address-cells" and "#size-cells" values as
    the parent node. Otherwise, the following warnings is reported:
    
    arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi:7.3-14: Warning \
    (dma_ranges_format): /usb:dma-ranges: empty "dma-ranges" property but \
    its #address-cells (1) differs from / (2)
    arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi:7.3-14: Warning \
    (dma_ranges_format): /usb:dma-ranges: empty "dma-ranges" property but \
    its #size-cells (1) differs from / (2)
    
    Arnd Bergmann figured out why it's necessary:
    Also note that the #address-cells=<1> means that any device under
    this bus is assumed to only support 32-bit addressing, and DMA will
    have to go through a slow swiotlb in the absence of an IOMMU.
    
    Suggested-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Zhen Lei <thunder.leizhen at huawei.com>
    Link: https://lore.kernel.org/r/20201016090833.1892-2-thunder.leizhen@huawei.com'
    Acked-by: Florian Fainelli <f.fainelli at gmail.com>
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi
index 55259f973b5a..aef8f2b00778 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi
+++ b/arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi
@@ -5,20 +5,20 @@
 	usb {
 		compatible = "simple-bus";
 		dma-ranges;
-		#address-cells = <1>;
-		#size-cells = <1>;
-		ranges = <0x0 0x0 0x68500000 0x00400000>;
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges = <0x0 0x0 0x0 0x68500000 0x0 0x00400000>;
 
 		usbphy0: usb-phy at 0 {
 			compatible = "brcm,sr-usb-combo-phy";
-			reg = <0x00000000 0x100>;
+			reg = <0x0 0x00000000 0x0 0x100>;
 			#phy-cells = <1>;
 			status = "disabled";
 		};
 
 		xhci0: usb at 1000 {
 			compatible = "generic-xhci";
-			reg = <0x00001000 0x1000>;
+			reg = <0x0 0x00001000 0x0 0x1000>;
 			interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>;
 			phys = <&usbphy0 1>, <&usbphy0 0>;
 			phy-names = "phy0", "phy1";
@@ -28,7 +28,7 @@
 
 		bdc0: usb at 2000 {
 			compatible = "brcm,bdc-v0.16";
-			reg = <0x00002000 0x1000>;
+			reg = <0x0 0x00002000 0x0 0x1000>;
 			interrupts = <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH>;
 			phys = <&usbphy0 0>, <&usbphy0 1>;
 			phy-names = "phy0", "phy1";
@@ -38,21 +38,21 @@
 
 		usbphy1: usb-phy at 10000 {
 			compatible = "brcm,sr-usb-combo-phy";
-			reg = <0x00010000 0x100>;
+			reg = <0x0 0x00010000 0x0 0x100>;
 			#phy-cells = <1>;
 			status = "disabled";
 		};
 
 		usbphy2: usb-phy at 20000 {
 			compatible = "brcm,sr-usb-hs-phy";
-			reg = <0x00020000 0x100>;
+			reg = <0x0 0x00020000 0x0 0x100>;
 			#phy-cells = <0>;
 			status = "disabled";
 		};
 
 		xhci1: usb at 11000 {
 			compatible = "generic-xhci";
-			reg = <0x00011000 0x1000>;
+			reg = <0x0 0x00011000 0x0 0x1000>;
 			interrupts = <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH>;
 			phys = <&usbphy1 1>, <&usbphy2>, <&usbphy1 0>;
 			phy-names = "phy0", "phy1", "phy2";
@@ -62,7 +62,7 @@
 
 		bdc1: usb at 21000 {
 			compatible = "brcm,bdc-v0.16";
-			reg = <0x00021000 0x1000>;
+			reg = <0x0 0x00021000 0x0 0x1000>;
 			interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>;
 			phys = <&usbphy2>;
 			phy-names = "phy0";
commit dc293f2106903ab9c24e9cea18c276e32c394c33
Author: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Date:   Tue Sep 1 00:09:37 2020 +0300

    xtensa: uaccess: Add missing __user to strncpy_from_user() prototype
    
    When adding __user annotations in commit 2adf5352a34a, the
    strncpy_from_user() function declaration for the
    CONFIG_GENERIC_STRNCPY_FROM_USER case was missed. Fix it.
    
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
    Message-Id: <20200831210937.17938-1-laurent.pinchart at ideasonboard.com>
    Signed-off-by: Max Filippov <jcmvbkbc at gmail.com>

diff --git a/arch/xtensa/include/asm/uaccess.h b/arch/xtensa/include/asm/uaccess.h
index b9758119feca..5c9fb8005aa8 100644
--- a/arch/xtensa/include/asm/uaccess.h
+++ b/arch/xtensa/include/asm/uaccess.h
@@ -302,7 +302,7 @@ strncpy_from_user(char *dst, const char __user *src, long count)
 	return -EFAULT;
 }
 #else
-long strncpy_from_user(char *dst, const char *src, long count);
+long strncpy_from_user(char *dst, const char __user *src, long count);
 #endif
 
 /*
commit 54a2a3898f469a915510038fe84ef4f083131d3e
Author: Joakim Tjernlund <joakim.tjernlund at infinera.com>
Date:   Tue Nov 17 13:28:03 2020 +0100

    ALSA: usb-audio: Add delay quirk for all Logitech USB devices
    
    Found one more Logitech device, BCC950 ConferenceCam, which needs
    the same delay here. This makes 3 out of 3 devices I have tried.
    
    Therefore, add a delay for all Logitech devices as it does not hurt.
    
    Signed-off-by: Joakim Tjernlund <joakim.tjernlund at infinera.com>
    Cc: <stable at vger.kernel.org> # 4.19.y, 5.4.y
    Link: https://lore.kernel.org/r/20201117122803.24310-1-joakim.tjernlund@infinera.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index c989ad8052ae..c50be2f75f70 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1672,13 +1672,13 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
 	    && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
 		msleep(20);
 
-	/* Zoom R16/24, Logitech H650e/H570e, Jabra 550a, Kingston HyperX
-	 *  needs a tiny delay here, otherwise requests like get/set
-	 *  frequency return as failed despite actually succeeding.
+	/* Zoom R16/24, many Logitech(at least H650e/H570e/BCC950),
+	 * Jabra 550a, Kingston HyperX needs a tiny delay here,
+	 * otherwise requests like get/set frequency return
+	 * as failed despite actually succeeding.
 	 */
 	if ((chip->usb_id == USB_ID(0x1686, 0x00dd) ||
-	     chip->usb_id == USB_ID(0x046d, 0x0a46) ||
-	     chip->usb_id == USB_ID(0x046d, 0x0a56) ||
+	     USB_ID_VENDOR(chip->usb_id) == 0x046d  || /* Logitech */
 	     chip->usb_id == USB_ID(0x0b0e, 0x0349) ||
 	     chip->usb_id == USB_ID(0x0951, 0x16ad)) &&
 	    (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
commit 14c620cf2ee81349527491110a47a157ac6d511c
Merge: 09162bc32c88 8410e7f3b31e
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Tue Nov 17 13:25:06 2020 +0100

    Merge branch 'cpufreq/arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm
    
    Pull cpufreq-arm fixes for 5.10-rc5 from Viresh Kumar:
    
    "- tegra186: Fix ->get() callback.
     - arm/scmi: Add dummy clock provider to fix failure."
    
    * 'cpufreq/arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
      cpufreq: scmi: Fix OPP addition failure with a dummy clock provider
      cpufreq: tegra186: Fix get frequency callback

commit ebd19fc372e3e78bf165f230e7c084e304441c08
Author: Sami Tolvanen <samitolvanen at google.com>
Date:   Fri Nov 13 10:31:26 2020 -0800

    perf/x86: fix sysfs type mismatches
    
    This change switches rapl to use PMU_FORMAT_ATTR, and fixes two other
    macros to use device_attribute instead of kobj_attribute to avoid
    callback type mismatches that trip indirect call checking with Clang's
    Control-Flow Integrity (CFI).
    
    Reported-by: Sedat Dilek <sedat.dilek at gmail.com>
    Signed-off-by: Sami Tolvanen <samitolvanen at google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Reviewed-by: Kees Cook <keescook at chromium.org>
    Link: https://lkml.kernel.org/r/20201113183126.1239404-1-samitolvanen@google.com

diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c
index 442e1ed4acd4..4eb7ee5fed72 100644
--- a/arch/x86/events/intel/cstate.c
+++ b/arch/x86/events/intel/cstate.c
@@ -107,14 +107,14 @@
 MODULE_LICENSE("GPL");
 
 #define DEFINE_CSTATE_FORMAT_ATTR(_var, _name, _format)		\
-static ssize_t __cstate_##_var##_show(struct kobject *kobj,	\
-				struct kobj_attribute *attr,	\
+static ssize_t __cstate_##_var##_show(struct device *dev,	\
+				struct device_attribute *attr,	\
 				char *page)			\
 {								\
 	BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);		\
 	return sprintf(page, _format "\n");			\
 }								\
-static struct kobj_attribute format_attr_##_var =		\
+static struct device_attribute format_attr_##_var =		\
 	__ATTR(_name, 0444, __cstate_##_var##_show, NULL)
 
 static ssize_t cstate_get_attr_cpumask(struct device *dev,
diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
index 86d012b3e0b4..80d52cbe2fde 100644
--- a/arch/x86/events/intel/uncore.c
+++ b/arch/x86/events/intel/uncore.c
@@ -94,8 +94,8 @@ end:
 	return map;
 }
 
-ssize_t uncore_event_show(struct kobject *kobj,
-			  struct kobj_attribute *attr, char *buf)
+ssize_t uncore_event_show(struct device *dev,
+			  struct device_attribute *attr, char *buf)
 {
 	struct uncore_event_desc *event =
 		container_of(attr, struct uncore_event_desc, attr);
diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h
index 83d2a7d490e0..9efea154349d 100644
--- a/arch/x86/events/intel/uncore.h
+++ b/arch/x86/events/intel/uncore.h
@@ -157,7 +157,7 @@ struct intel_uncore_box {
 #define UNCORE_BOX_FLAG_CFL8_CBOX_MSR_OFFS	2
 
 struct uncore_event_desc {
-	struct kobj_attribute attr;
+	struct device_attribute attr;
 	const char *config;
 };
 
@@ -179,8 +179,8 @@ struct pci2phy_map {
 struct pci2phy_map *__find_pci2phy_map(int segment);
 int uncore_pcibus_to_physid(struct pci_bus *bus);
 
-ssize_t uncore_event_show(struct kobject *kobj,
-			  struct kobj_attribute *attr, char *buf);
+ssize_t uncore_event_show(struct device *dev,
+			  struct device_attribute *attr, char *buf);
 
 static inline struct intel_uncore_pmu *dev_to_uncore_pmu(struct device *dev)
 {
@@ -201,14 +201,14 @@ extern int __uncore_max_dies;
 }
 
 #define DEFINE_UNCORE_FORMAT_ATTR(_var, _name, _format)			\
-static ssize_t __uncore_##_var##_show(struct kobject *kobj,		\
-				struct kobj_attribute *attr,		\
+static ssize_t __uncore_##_var##_show(struct device *dev,		\
+				struct device_attribute *attr,		\
 				char *page)				\
 {									\
 	BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);			\
 	return sprintf(page, _format "\n");				\
 }									\
-static struct kobj_attribute format_attr_##_var =			\
+static struct device_attribute format_attr_##_var =			\
 	__ATTR(_name, 0444, __uncore_##_var##_show, NULL)
 
 static inline bool uncore_pmc_fixed(int idx)
diff --git a/arch/x86/events/rapl.c b/arch/x86/events/rapl.c
index 7c0120e2e957..7dbbeaacd995 100644
--- a/arch/x86/events/rapl.c
+++ b/arch/x86/events/rapl.c
@@ -93,18 +93,6 @@ static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {
  * any other bit is reserved
  */
 #define RAPL_EVENT_MASK	0xFFULL
-
-#define DEFINE_RAPL_FORMAT_ATTR(_var, _name, _format)		\
-static ssize_t __rapl_##_var##_show(struct kobject *kobj,	\
-				struct kobj_attribute *attr,	\
-				char *page)			\
-{								\
-	BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);		\
-	return sprintf(page, _format "\n");			\
-}								\
-static struct kobj_attribute format_attr_##_var =		\
-	__ATTR(_name, 0444, __rapl_##_var##_show, NULL)
-
 #define RAPL_CNTR_WIDTH 32
 
 #define RAPL_EVENT_ATTR_STR(_name, v, str)					\
@@ -441,7 +429,7 @@ static struct attribute_group rapl_pmu_events_group = {
 	.attrs = attrs_empty,
 };
 
-DEFINE_RAPL_FORMAT_ATTR(event, event, "config:0-7");
+PMU_FORMAT_ATTR(event, "config:0-7");
 static struct attribute *rapl_formats_attr[] = {
 	&format_attr_event.attr,
 	NULL,
commit 43be4388e94b915799a24f0eaf664bf95b85231f
Author: Boqun Feng <boqun.feng at gmail.com>
Date:   Fri Nov 13 19:05:03 2020 +0800

    lockdep: Put graph lock/unlock under lock_recursion protection
    
    A warning was hit when running xfstests/generic/068 in a Hyper-V guest:
    
    [...] ------------[ cut here ]------------
    [...] DEBUG_LOCKS_WARN_ON(lockdep_hardirqs_enabled())
    [...] WARNING: CPU: 2 PID: 1350 at kernel/locking/lockdep.c:5280 check_flags.part.0+0x165/0x170
    [...] ...
    [...] Workqueue: events pwq_unbound_release_workfn
    [...] RIP: 0010:check_flags.part.0+0x165/0x170
    [...] ...
    [...] Call Trace:
    [...]  lock_is_held_type+0x72/0x150
    [...]  ? lock_acquire+0x16e/0x4a0
    [...]  rcu_read_lock_sched_held+0x3f/0x80
    [...]  __send_ipi_one+0x14d/0x1b0
    [...]  hv_send_ipi+0x12/0x30
    [...]  __pv_queued_spin_unlock_slowpath+0xd1/0x110
    [...]  __raw_callee_save___pv_queued_spin_unlock_slowpath+0x11/0x20
    [...]  .slowpath+0x9/0xe
    [...]  lockdep_unregister_key+0x128/0x180
    [...]  pwq_unbound_release_workfn+0xbb/0xf0
    [...]  process_one_work+0x227/0x5c0
    [...]  worker_thread+0x55/0x3c0
    [...]  ? process_one_work+0x5c0/0x5c0
    [...]  kthread+0x153/0x170
    [...]  ? __kthread_bind_mask+0x60/0x60
    [...]  ret_from_fork+0x1f/0x30
    
    The cause of the problem is we have call chain lockdep_unregister_key()
    -> <irq disabled by raw_local_irq_save()> lockdep_unlock() ->
    arch_spin_unlock() -> __pv_queued_spin_unlock_slowpath() -> pv_kick() ->
    __send_ipi_one() -> trace_hyperv_send_ipi_one().
    
    Although this particular warning is triggered because Hyper-V has a
    trace point in ipi sending, but in general arch_spin_unlock() may call
    another function having a trace point in it, so put the arch_spin_lock()
    and arch_spin_unlock() after lock_recursion protection to fix this
    problem and avoid similiar problems.
    
    Signed-off-by: Boqun Feng <boqun.feng at gmail.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201113110512.1056501-1-boqun.feng@gmail.com

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index d9fb9e19d2ed..c1418b47f625 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -108,19 +108,21 @@ static inline void lockdep_lock(void)
 {
 	DEBUG_LOCKS_WARN_ON(!irqs_disabled());
 
+	__this_cpu_inc(lockdep_recursion);
 	arch_spin_lock(&__lock);
 	__owner = current;
-	__this_cpu_inc(lockdep_recursion);
 }
 
 static inline void lockdep_unlock(void)
 {
+	DEBUG_LOCKS_WARN_ON(!irqs_disabled());
+
 	if (debug_locks && DEBUG_LOCKS_WARN_ON(__owner != current))
 		return;
 
-	__this_cpu_dec(lockdep_recursion);
 	__owner = NULL;
 	arch_spin_unlock(&__lock);
+	__this_cpu_dec(lockdep_recursion);
 }
 
 static inline bool lockdep_assert_locked(void)
commit 2279f540ea7d05f22d2f0c4224319330228586bc
Author: Juri Lelli <juri.lelli at redhat.com>
Date:   Tue Nov 17 07:14:32 2020 +0100

    sched/deadline: Fix priority inheritance with multiple scheduling classes
    
    Glenn reported that "an application [he developed produces] a BUG in
    deadline.c when a SCHED_DEADLINE task contends with CFS tasks on nested
    PTHREAD_PRIO_INHERIT mutexes.  I believe the bug is triggered when a CFS
    task that was boosted by a SCHED_DEADLINE task boosts another CFS task
    (nested priority inheritance).
    
     ------------[ cut here ]------------
     kernel BUG at kernel/sched/deadline.c:1462!
     invalid opcode: 0000 [#1] PREEMPT SMP
     CPU: 12 PID: 19171 Comm: dl_boost_bug Tainted: ...
     Hardware name: ...
     RIP: 0010:enqueue_task_dl+0x335/0x910
     Code: ...
     RSP: 0018:ffffc9000c2bbc68 EFLAGS: 00010002
     RAX: 0000000000000009 RBX: ffff888c0af94c00 RCX: ffffffff81e12500
     RDX: 000000000000002e RSI: ffff888c0af94c00 RDI: ffff888c10b22600
     RBP: ffffc9000c2bbd08 R08: 0000000000000009 R09: 0000000000000078
     R10: ffffffff81e12440 R11: ffffffff81e1236c R12: ffff888bc8932600
     R13: ffff888c0af94eb8 R14: ffff888c10b22600 R15: ffff888bc8932600
     FS:  00007fa58ac55700(0000) GS:ffff888c10b00000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 00007fa58b523230 CR3: 0000000bf44ab003 CR4: 00000000007606e0
     DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
     DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
     PKRU: 55555554
     Call Trace:
      ? intel_pstate_update_util_hwp+0x13/0x170
      rt_mutex_setprio+0x1cc/0x4b0
      task_blocks_on_rt_mutex+0x225/0x260
      rt_spin_lock_slowlock_locked+0xab/0x2d0
      rt_spin_lock_slowlock+0x50/0x80
      hrtimer_grab_expiry_lock+0x20/0x30
      hrtimer_cancel+0x13/0x30
      do_nanosleep+0xa0/0x150
      hrtimer_nanosleep+0xe1/0x230
      ? __hrtimer_init_sleeper+0x60/0x60
      __x64_sys_nanosleep+0x8d/0xa0
      do_syscall_64+0x4a/0x100
      entry_SYSCALL_64_after_hwframe+0x49/0xbe
     RIP: 0033:0x7fa58b52330d
     ...
     ---[ end trace 0000000000000002 ]—
    
    He also provided a simple reproducer creating the situation below:
    
     So the execution order of locking steps are the following
     (N1 and N2 are non-deadline tasks. D1 is a deadline task. M1 and M2
     are mutexes that are enabled * with priority inheritance.)
    
     Time moves forward as this timeline goes down:
    
     N1              N2               D1
     |               |                |
     |               |                |
     Lock(M1)        |                |
     |               |                |
     |             Lock(M2)           |
     |               |                |
     |               |              Lock(M2)
     |               |                |
     |             Lock(M1)           |
     |             (!!bug triggered!) |
    
    Daniel reported a similar situation as well, by just letting ksoftirqd
    run with DEADLINE (and eventually block on a mutex).
    
    Problem is that boosted entities (Priority Inheritance) use static
    DEADLINE parameters of the top priority waiter. However, there might be
    cases where top waiter could be a non-DEADLINE entity that is currently
    boosted by a DEADLINE entity from a different lock chain (i.e., nested
    priority chains involving entities of non-DEADLINE classes). In this
    case, top waiter static DEADLINE parameters could be null (initialized
    to 0 at fork()) and replenish_dl_entity() would hit a BUG().
    
    Fix this by keeping track of the original donor and using its parameters
    when a task is boosted.
    
    Reported-by: Glenn Elliott <glenn at aurora.tech>
    Reported-by: Daniel Bristot de Oliveira <bristot at redhat.com>
    Signed-off-by: Juri Lelli <juri.lelli at redhat.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Tested-by: Daniel Bristot de Oliveira <bristot at redhat.com>
    Link: https://lkml.kernel.org/r/20201117061432.517340-1-juri.lelli@redhat.com

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 0e91b451d2a2..095fdec07b38 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -551,7 +551,6 @@ struct sched_dl_entity {
 	 * overruns.
 	 */
 	unsigned int			dl_throttled      : 1;
-	unsigned int			dl_boosted        : 1;
 	unsigned int			dl_yielded        : 1;
 	unsigned int			dl_non_contending : 1;
 	unsigned int			dl_overrun	  : 1;
@@ -570,6 +569,15 @@ struct sched_dl_entity {
 	 * time.
 	 */
 	struct hrtimer inactive_timer;
+
+#ifdef CONFIG_RT_MUTEXES
+	/*
+	 * Priority Inheritance. When a DEADLINE scheduling entity is boosted
+	 * pi_se points to the donor, otherwise points to the dl_se it belongs
+	 * to (the original one/itself).
+	 */
+	struct sched_dl_entity *pi_se;
+#endif
 };
 
 #ifdef CONFIG_UCLAMP_TASK
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 9f0ebfb0d17b..e7e453492cff 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -4912,20 +4912,21 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task)
 		if (!dl_prio(p->normal_prio) ||
 		    (pi_task && dl_prio(pi_task->prio) &&
 		     dl_entity_preempt(&pi_task->dl, &p->dl))) {
-			p->dl.dl_boosted = 1;
+			p->dl.pi_se = pi_task->dl.pi_se;
 			queue_flag |= ENQUEUE_REPLENISH;
-		} else
-			p->dl.dl_boosted = 0;
+		} else {
+			p->dl.pi_se = &p->dl;
+		}
 		p->sched_class = &dl_sched_class;
 	} else if (rt_prio(prio)) {
 		if (dl_prio(oldprio))
-			p->dl.dl_boosted = 0;
+			p->dl.pi_se = &p->dl;
 		if (oldprio < prio)
 			queue_flag |= ENQUEUE_HEAD;
 		p->sched_class = &rt_sched_class;
 	} else {
 		if (dl_prio(oldprio))
-			p->dl.dl_boosted = 0;
+			p->dl.pi_se = &p->dl;
 		if (rt_prio(oldprio))
 			p->rt.timeout = 0;
 		p->sched_class = &fair_sched_class;
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 6d93f4518734..949bc5c083c1 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -43,6 +43,28 @@ static inline int on_dl_rq(struct sched_dl_entity *dl_se)
 	return !RB_EMPTY_NODE(&dl_se->rb_node);
 }
 
+#ifdef CONFIG_RT_MUTEXES
+static inline struct sched_dl_entity *pi_of(struct sched_dl_entity *dl_se)
+{
+	return dl_se->pi_se;
+}
+
+static inline bool is_dl_boosted(struct sched_dl_entity *dl_se)
+{
+	return pi_of(dl_se) != dl_se;
+}
+#else
+static inline struct sched_dl_entity *pi_of(struct sched_dl_entity *dl_se)
+{
+	return dl_se;
+}
+
+static inline bool is_dl_boosted(struct sched_dl_entity *dl_se)
+{
+	return false;
+}
+#endif
+
 #ifdef CONFIG_SMP
 static inline struct dl_bw *dl_bw_of(int i)
 {
@@ -698,7 +720,7 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
 	struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
 	struct rq *rq = rq_of_dl_rq(dl_rq);
 
-	WARN_ON(dl_se->dl_boosted);
+	WARN_ON(is_dl_boosted(dl_se));
 	WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
 
 	/*
@@ -736,21 +758,20 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
  * could happen are, typically, a entity voluntarily trying to overcome its
  * runtime, or it just underestimated it during sched_setattr().
  */
-static void replenish_dl_entity(struct sched_dl_entity *dl_se,
-				struct sched_dl_entity *pi_se)
+static void replenish_dl_entity(struct sched_dl_entity *dl_se)
 {
 	struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
 	struct rq *rq = rq_of_dl_rq(dl_rq);
 
-	BUG_ON(pi_se->dl_runtime <= 0);
+	BUG_ON(pi_of(dl_se)->dl_runtime <= 0);
 
 	/*
 	 * This could be the case for a !-dl task that is boosted.
 	 * Just go with full inherited parameters.
 	 */
 	if (dl_se->dl_deadline == 0) {
-		dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline;
-		dl_se->runtime = pi_se->dl_runtime;
+		dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
+		dl_se->runtime = pi_of(dl_se)->dl_runtime;
 	}
 
 	if (dl_se->dl_yielded && dl_se->runtime > 0)
@@ -763,8 +784,8 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se,
 	 * arbitrary large.
 	 */
 	while (dl_se->runtime <= 0) {
-		dl_se->deadline += pi_se->dl_period;
-		dl_se->runtime += pi_se->dl_runtime;
+		dl_se->deadline += pi_of(dl_se)->dl_period;
+		dl_se->runtime += pi_of(dl_se)->dl_runtime;
 	}
 
 	/*
@@ -778,8 +799,8 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se,
 	 */
 	if (dl_time_before(dl_se->deadline, rq_clock(rq))) {
 		printk_deferred_once("sched: DL replenish lagged too much\n");
-		dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline;
-		dl_se->runtime = pi_se->dl_runtime;
+		dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
+		dl_se->runtime = pi_of(dl_se)->dl_runtime;
 	}
 
 	if (dl_se->dl_yielded)
@@ -812,8 +833,7 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se,
  * task with deadline equal to period this is the same of using
  * dl_period instead of dl_deadline in the equation above.
  */
-static bool dl_entity_overflow(struct sched_dl_entity *dl_se,
-			       struct sched_dl_entity *pi_se, u64 t)
+static bool dl_entity_overflow(struct sched_dl_entity *dl_se, u64 t)
 {
 	u64 left, right;
 
@@ -835,9 +855,9 @@ static bool dl_entity_overflow(struct sched_dl_entity *dl_se,
 	 * of anything below microseconds resolution is actually fiction
 	 * (but still we want to give the user that illusion >;).
 	 */
-	left = (pi_se->dl_deadline >> DL_SCALE) * (dl_se->runtime >> DL_SCALE);
+	left = (pi_of(dl_se)->dl_deadline >> DL_SCALE) * (dl_se->runtime >> DL_SCALE);
 	right = ((dl_se->deadline - t) >> DL_SCALE) *
-		(pi_se->dl_runtime >> DL_SCALE);
+		(pi_of(dl_se)->dl_runtime >> DL_SCALE);
 
 	return dl_time_before(right, left);
 }
@@ -922,24 +942,23 @@ static inline bool dl_is_implicit(struct sched_dl_entity *dl_se)
  * Please refer to the comments update_dl_revised_wakeup() function to find
  * more about the Revised CBS rule.
  */
-static void update_dl_entity(struct sched_dl_entity *dl_se,
-			     struct sched_dl_entity *pi_se)
+static void update_dl_entity(struct sched_dl_entity *dl_se)
 {
 	struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
 	struct rq *rq = rq_of_dl_rq(dl_rq);
 
 	if (dl_time_before(dl_se->deadline, rq_clock(rq)) ||
-	    dl_entity_overflow(dl_se, pi_se, rq_clock(rq))) {
+	    dl_entity_overflow(dl_se, rq_clock(rq))) {
 
 		if (unlikely(!dl_is_implicit(dl_se) &&
 			     !dl_time_before(dl_se->deadline, rq_clock(rq)) &&
-			     !dl_se->dl_boosted)){
+			     !is_dl_boosted(dl_se))) {
 			update_dl_revised_wakeup(dl_se, rq);
 			return;
 		}
 
-		dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline;
-		dl_se->runtime = pi_se->dl_runtime;
+		dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
+		dl_se->runtime = pi_of(dl_se)->dl_runtime;
 	}
 }
 
@@ -1038,7 +1057,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer)
 	 * The task might have been boosted by someone else and might be in the
 	 * boosting/deboosting path, its not throttled.
 	 */
-	if (dl_se->dl_boosted)
+	if (is_dl_boosted(dl_se))
 		goto unlock;
 
 	/*
@@ -1066,7 +1085,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer)
 	 * but do not enqueue -- wait for our wakeup to do that.
 	 */
 	if (!task_on_rq_queued(p)) {
-		replenish_dl_entity(dl_se, dl_se);
+		replenish_dl_entity(dl_se);
 		goto unlock;
 	}
 
@@ -1156,7 +1175,7 @@ static inline void dl_check_constrained_dl(struct sched_dl_entity *dl_se)
 
 	if (dl_time_before(dl_se->deadline, rq_clock(rq)) &&
 	    dl_time_before(rq_clock(rq), dl_next_period(dl_se))) {
-		if (unlikely(dl_se->dl_boosted || !start_dl_timer(p)))
+		if (unlikely(is_dl_boosted(dl_se) || !start_dl_timer(p)))
 			return;
 		dl_se->dl_throttled = 1;
 		if (dl_se->runtime > 0)
@@ -1287,7 +1306,7 @@ throttle:
 			dl_se->dl_overrun = 1;
 
 		__dequeue_task_dl(rq, curr, 0);
-		if (unlikely(dl_se->dl_boosted || !start_dl_timer(curr)))
+		if (unlikely(is_dl_boosted(dl_se) || !start_dl_timer(curr)))
 			enqueue_task_dl(rq, curr, ENQUEUE_REPLENISH);
 
 		if (!is_leftmost(curr, &rq->dl))
@@ -1481,8 +1500,7 @@ static void __dequeue_dl_entity(struct sched_dl_entity *dl_se)
 }
 
 static void
-enqueue_dl_entity(struct sched_dl_entity *dl_se,
-		  struct sched_dl_entity *pi_se, int flags)
+enqueue_dl_entity(struct sched_dl_entity *dl_se, int flags)
 {
 	BUG_ON(on_dl_rq(dl_se));
 
@@ -1493,9 +1511,9 @@ enqueue_dl_entity(struct sched_dl_entity *dl_se,
 	 */
 	if (flags & ENQUEUE_WAKEUP) {
 		task_contending(dl_se, flags);
-		update_dl_entity(dl_se, pi_se);
+		update_dl_entity(dl_se);
 	} else if (flags & ENQUEUE_REPLENISH) {
-		replenish_dl_entity(dl_se, pi_se);
+		replenish_dl_entity(dl_se);
 	} else if ((flags & ENQUEUE_RESTORE) &&
 		  dl_time_before(dl_se->deadline,
 				 rq_clock(rq_of_dl_rq(dl_rq_of_se(dl_se))))) {
@@ -1512,19 +1530,7 @@ static void dequeue_dl_entity(struct sched_dl_entity *dl_se)
 
 static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags)
 {
-	struct task_struct *pi_task = rt_mutex_get_top_task(p);
-	struct sched_dl_entity *pi_se = &p->dl;
-
-	/*
-	 * Use the scheduling parameters of the top pi-waiter task if:
-	 * - we have a top pi-waiter which is a SCHED_DEADLINE task AND
-	 * - our dl_boosted is set (i.e. the pi-waiter's (absolute) deadline is
-	 *   smaller than our deadline OR we are a !SCHED_DEADLINE task getting
-	 *   boosted due to a SCHED_DEADLINE pi-waiter).
-	 * Otherwise we keep our runtime and deadline.
-	 */
-	if (pi_task && dl_prio(pi_task->normal_prio) && p->dl.dl_boosted) {
-		pi_se = &pi_task->dl;
+	if (is_dl_boosted(&p->dl)) {
 		/*
 		 * Because of delays in the detection of the overrun of a
 		 * thread's runtime, it might be the case that a thread
@@ -1557,7 +1563,7 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags)
 		 * the throttle.
 		 */
 		p->dl.dl_throttled = 0;
-		BUG_ON(!p->dl.dl_boosted || flags != ENQUEUE_REPLENISH);
+		BUG_ON(!is_dl_boosted(&p->dl) || flags != ENQUEUE_REPLENISH);
 		return;
 	}
 
@@ -1594,7 +1600,7 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags)
 		return;
 	}
 
-	enqueue_dl_entity(&p->dl, pi_se, flags);
+	enqueue_dl_entity(&p->dl, flags);
 
 	if (!task_current(rq, p) && p->nr_cpus_allowed > 1)
 		enqueue_pushable_dl_task(rq, p);
@@ -2787,11 +2793,14 @@ void __dl_clear_params(struct task_struct *p)
 	dl_se->dl_bw			= 0;
 	dl_se->dl_density		= 0;
 
-	dl_se->dl_boosted		= 0;
 	dl_se->dl_throttled		= 0;
 	dl_se->dl_yielded		= 0;
 	dl_se->dl_non_contending	= 0;
 	dl_se->dl_overrun		= 0;
+
+#ifdef CONFIG_RT_MUTEXES
+	dl_se->pi_se			= dl_se;
+#endif
 }
 
 bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr)
commit ec618b84f6e15281cc3660664d34cd0dd2f2579e
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Thu Sep 24 13:50:42 2020 +0200

    sched: Fix rq->nr_iowait ordering
    
      schedule()                            ttwu()
        deactivate_task();                    if (p->on_rq && ...) // false
                                                atomic_dec(&task_rq(p)->nr_iowait);
        if (prev->in_iowait)
          atomic_inc(&rq->nr_iowait);
    
    Allows nr_iowait to be decremented before it gets incremented,
    resulting in more dodgy IO-wait numbers than usual.
    
    Note that because we can now do ttwu_queue_wakelist() before
    p->on_cpu==0, we lose the natural ordering and have to further delay
    the decrement.
    
    Fixes: c6e7bd7afaeb ("sched/core: Optimize ttwu() spinning on p->on_cpu")
    Reported-by: Tejun Heo <tj at kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Acked-by: Mel Gorman <mgorman at techsingularity.net>
    Link: https://lkml.kernel.org/r/20201117093829.GD3121429@hirez.programming.kicks-ass.net

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index d2003a7d5ab5..9f0ebfb0d17b 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2501,7 +2501,12 @@ ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags,
 #ifdef CONFIG_SMP
 	if (wake_flags & WF_MIGRATED)
 		en_flags |= ENQUEUE_MIGRATED;
+	else
 #endif
+	if (p->in_iowait) {
+		delayacct_blkio_end(p);
+		atomic_dec(&task_rq(p)->nr_iowait);
+	}
 
 	activate_task(rq, p, en_flags);
 	ttwu_do_wakeup(rq, p, wake_flags, rf);
@@ -2888,11 +2893,6 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
 	if (READ_ONCE(p->on_rq) && ttwu_runnable(p, wake_flags))
 		goto unlock;
 
-	if (p->in_iowait) {
-		delayacct_blkio_end(p);
-		atomic_dec(&task_rq(p)->nr_iowait);
-	}
-
 #ifdef CONFIG_SMP
 	/*
 	 * Ensure we load p->on_cpu _after_ p->on_rq, otherwise it would be
@@ -2963,6 +2963,11 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
 
 	cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags);
 	if (task_cpu(p) != cpu) {
+		if (p->in_iowait) {
+			delayacct_blkio_end(p);
+			atomic_dec(&task_rq(p)->nr_iowait);
+		}
+
 		wake_flags |= WF_MIGRATED;
 		psi_ttwu_dequeue(p);
 		set_task_cpu(p, cpu);
commit f97bb5272d9e95d400d6c8643ebb146b3e3e7842
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Tue Nov 17 09:08:41 2020 +0100

    sched: Fix data-race in wakeup
    
    Mel reported that on some ARM64 platforms loadavg goes bananas and
    Will tracked it down to the following race:
    
      CPU0                                  CPU1
    
      schedule()
        prev->sched_contributes_to_load = X;
        deactivate_task(prev);
    
                                            try_to_wake_up()
                                              if (p->on_rq &&) // false
                                              if (smp_load_acquire(&p->on_cpu) && // true
                                                  ttwu_queue_wakelist())
                                                    p->sched_remote_wakeup = Y;
    
        smp_store_release(prev->on_cpu, 0);
    
    where both p->sched_contributes_to_load and p->sched_remote_wakeup are
    in the same word, and thus the stores X and Y race (and can clobber
    one another's data).
    
    Whereas prior to commit c6e7bd7afaeb ("sched/core: Optimize ttwu()
    spinning on p->on_cpu") the p->on_cpu handoff serialized access to
    p->sched_remote_wakeup (just as it still does with
    p->sched_contributes_to_load) that commit broke that by calling
    ttwu_queue_wakelist() with p->on_cpu != 0.
    
    However, due to
    
      p->XXX = X                    ttwu()
      schedule()                      if (p->on_rq && ...) // false
        smp_mb__after_spinlock()      if (smp_load_acquire(&p->on_cpu) &&
        deactivate_task()                 ttwu_queue_wakelist())
          p->on_rq = 0;                     p->sched_remote_wakeup = Y;
    
    We can be sure any 'current' store is complete and 'current' is
    guaranteed asleep. Therefore we can move p->sched_remote_wakeup into
    the current flags word.
    
    Note: while the observed failure was loadavg accounting gone wrong due
    to ttwu() cobbering p->sched_contributes_to_load, the reverse problem
    is also possible where schedule() clobbers p->sched_remote_wakeup,
    this could result in enqueue_entity() wrecking ->vruntime and causing
    scheduling artifacts.
    
    Fixes: c6e7bd7afaeb ("sched/core: Optimize ttwu() spinning on p->on_cpu")
    Reported-by: Mel Gorman <mgorman at techsingularity.net>
    Debugged-by: Will Deacon <will at kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201117083016.GK3121392@hirez.programming.kicks-ass.net

diff --git a/include/linux/sched.h b/include/linux/sched.h
index d383cf09e78f..0e91b451d2a2 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -769,7 +769,6 @@ struct task_struct {
 	unsigned			sched_reset_on_fork:1;
 	unsigned			sched_contributes_to_load:1;
 	unsigned			sched_migrated:1;
-	unsigned			sched_remote_wakeup:1;
 #ifdef CONFIG_PSI
 	unsigned			sched_psi_wake_requeue:1;
 #endif
@@ -779,6 +778,21 @@ struct task_struct {
 
 	/* Unserialized, strictly 'current' */
 
+	/*
+	 * This field must not be in the scheduler word above due to wakelist
+	 * queueing no longer being serialized by p->on_cpu. However:
+	 *
+	 * p->XXX = X;			ttwu()
+	 * schedule()			  if (p->on_rq && ..) // false
+	 *   smp_mb__after_spinlock();	  if (smp_load_acquire(&p->on_cpu) && //true
+	 *   deactivate_task()		      ttwu_queue_wakelist())
+	 *     p->on_rq = 0;			p->sched_remote_wakeup = Y;
+	 *
+	 * guarantees all stores of 'current' are visible before
+	 * ->sched_remote_wakeup gets used, so it can be in this word.
+	 */
+	unsigned			sched_remote_wakeup:1;
+
 	/* Bit to tell LSMs we're in execve(): */
 	unsigned			in_execve:1;
 	unsigned			in_iowait:1;
commit 8e1ac4299a6e8726de42310d9c1379f188140c71
Author: Quentin Perret <qperret at google.com>
Date:   Thu Nov 12 11:12:01 2020 +0000

    sched/fair: Fix overutilized update in enqueue_task_fair()
    
    enqueue_task_fair() attempts to skip the overutilized update for new
    tasks as their util_avg is not accurate yet. However, the flag we check
    to do so is overwritten earlier on in the function, which makes the
    condition pretty much a nop.
    
    Fix this by saving the flag early on.
    
    Fixes: 2802bf3cd936 ("sched/fair: Add over-utilization/tipping point indicator")
    Reported-by: Rick Yiu <rickyiu at google.com>
    Signed-off-by: Quentin Perret <qperret at google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Reviewed-by: Vincent Guittot <vincent.guittot at linaro.org>
    Reviewed-by: Valentin Schneider <valentin.schneider at arm.com>
    Link: https://lkml.kernel.org/r/20201112111201.2081902-1-qperret@google.com

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 8e563cf2b5e7..56a8ca93a971 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5477,6 +5477,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
 	struct cfs_rq *cfs_rq;
 	struct sched_entity *se = &p->se;
 	int idle_h_nr_running = task_has_idle_policy(p);
+	int task_new = !(flags & ENQUEUE_WAKEUP);
 
 	/*
 	 * The code below (indirectly) updates schedutil which looks at
@@ -5549,7 +5550,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
 	 * into account, but that is not straightforward to implement,
 	 * and the following generally works well enough in practice.
 	 */
-	if (flags & ENQUEUE_WAKEUP)
+	if (!task_new)
 		update_overutilized_status(rq);
 
 enqueue_throttle:
commit ac3b57adf87ad9bac7e33ca26bbbb13fae1ed62b
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Fri Nov 13 21:18:56 2020 +0800

    MIPS: Alchemy: Fix memleak in alchemy_clk_setup_cpu
    
    If the clk_register fails, we should free h before
    function returns to prevent memleak.
    
    Fixes: 474402291a0ad ("MIPS: Alchemy: clock framework integration of onchip clocks")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend at alpha.franken.de>

diff --git a/arch/mips/alchemy/common/clock.c b/arch/mips/alchemy/common/clock.c
index a95a894aceaf..f0c830337104 100644
--- a/arch/mips/alchemy/common/clock.c
+++ b/arch/mips/alchemy/common/clock.c
@@ -152,6 +152,7 @@ static struct clk __init *alchemy_clk_setup_cpu(const char *parent_name,
 {
 	struct clk_init_data id;
 	struct clk_hw *h;
+	struct clk *clk;
 
 	h = kzalloc(sizeof(*h), GFP_KERNEL);
 	if (!h)
@@ -164,7 +165,13 @@ static struct clk __init *alchemy_clk_setup_cpu(const char *parent_name,
 	id.ops = &alchemy_clkops_cpu;
 	h->init = &id;
 
-	return clk_register(NULL, h);
+	clk = clk_register(NULL, h);
+	if (IS_ERR(clk)) {
+		pr_err("failed to register clock\n");
+		kfree(h);
+	}
+
+	return clk;
 }
 
 /* AUXPLLs ************************************************************/
commit d06d60d52ec0b0eef702dd3e7b4699f0b589ad0f
Author: Manish Narani <manish.narani at xilinx.com>
Date:   Mon Nov 16 14:02:45 2020 +0530

    mmc: sdhci-of-arasan: Issue DLL reset explicitly
    
    In the current implementation DLL reset will be issued for
    each ITAP and OTAP setting inside ATF, this is creating issues
    in some scenarios and this sequence is not inline with the TRM.
    To fix the issue, DLL reset should be removed from the ATF and
    host driver will request it explicitly.
    This patch update host driver to explicitly request for DLL reset
    before ITAP (assert DLL) and after OTAP (release DLL) settings.
    
    Fixes: a5c8b2ae2e51 ("mmc: sdhci-of-arasan: Add support for ZynqMP Platform Tap Delays Setup")
    Signed-off-by: Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri at xilinx.com>
    Signed-off-by: Manish Narani <manish.narani at xilinx.com>
    Acked-by: Michal Simek <michal.simek at xilinx.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/1605515565-117562-4-git-send-email-manish.narani@xilinx.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index 3ec5ecad637c..d25a4b50c2f3 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -635,6 +635,9 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
 	if (ret)
 		pr_err("Error setting Output Tap Delay\n");
 
+	/* Release DLL Reset */
+	zynqmp_pm_sd_dll_reset(node_id, PM_DLL_RESET_RELEASE);
+
 	return ret;
 }
 
@@ -669,6 +672,9 @@ static int sdhci_zynqmp_sampleclk_set_phase(struct clk_hw *hw, int degrees)
 	if (host->version < SDHCI_SPEC_300)
 		return 0;
 
+	/* Assert DLL Reset */
+	zynqmp_pm_sd_dll_reset(node_id, PM_DLL_RESET_ASSERT);
+
 	switch (host->timing) {
 	case MMC_TIMING_MMC_HS:
 	case MMC_TIMING_SD_HS:
commit d338c6d01dc614cad253d6c042501fa0eb242d5c
Author: Manish Narani <manish.narani at xilinx.com>
Date:   Mon Nov 16 14:02:44 2020 +0530

    mmc: sdhci-of-arasan: Use Mask writes for Tap delays
    
    Mask the ITAP and OTAP delay bits before updating with the new
    tap value for Versal platform.
    
    Fixes: 1a470721c8f5 ("sdhci: arasan: Add support for Versal Tap Delays")
    Signed-off-by: Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri at xilinx.com>
    Signed-off-by: Manish Narani <manish.narani at xilinx.com>
    Acked-by: Michal Simek <michal.simek at xilinx.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/1605515565-117562-3-git-send-email-manish.narani@xilinx.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index 100621e55427..3ec5ecad637c 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -30,7 +30,10 @@
 #define SDHCI_ARASAN_VENDOR_REGISTER	0x78
 
 #define SDHCI_ARASAN_ITAPDLY_REGISTER	0xF0F8
+#define SDHCI_ARASAN_ITAPDLY_SEL_MASK	0xFF
+
 #define SDHCI_ARASAN_OTAPDLY_REGISTER	0xF0FC
+#define SDHCI_ARASAN_OTAPDLY_SEL_MASK	0x3F
 
 #define SDHCI_ARASAN_CQE_BASE_ADDR	0x200
 #define VENDOR_ENHANCED_STROBE		BIT(0)
@@ -755,6 +758,7 @@ static int sdhci_versal_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
 		regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
 		regval |= SDHCI_OTAPDLY_ENABLE;
 		sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
+		regval &= ~SDHCI_ARASAN_OTAPDLY_SEL_MASK;
 		regval |= tap_delay;
 		sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
 	}
@@ -822,6 +826,7 @@ static int sdhci_versal_sampleclk_set_phase(struct clk_hw *hw, int degrees)
 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
 		regval |= SDHCI_ITAPDLY_ENABLE;
 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
+		regval &= ~SDHCI_ARASAN_ITAPDLY_SEL_MASK;
 		regval |= tap_delay;
 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
 		regval &= ~SDHCI_ITAPDLY_CHGWIN;
commit 9e9534329306fcd7ea1b84f14860a3c04ebe7f1a
Author: Manish Narani <manish.narani at xilinx.com>
Date:   Mon Nov 16 14:02:43 2020 +0530

    mmc: sdhci-of-arasan: Allow configuring zero tap values
    
    Allow configuring the Output and Input tap values with zero to avoid
    failures in some cases (one of them is SD boot mode) where the output
    and input tap values may be already set to non-zero.
    
    Fixes: a5c8b2ae2e51 ("mmc: sdhci-of-arasan: Add support for ZynqMP Platform Tap Delays Setup")
    Signed-off-by: Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri at xilinx.com>
    Signed-off-by: Manish Narani <manish.narani at xilinx.com>
    Acked-by: Michal Simek <michal.simek at xilinx.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/1605515565-117562-2-git-send-email-manish.narani@xilinx.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index 829ccef87426..100621e55427 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -600,14 +600,8 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
 	u8 tap_delay, tap_max = 0;
 	int ret;
 
-	/*
-	 * This is applicable for SDHCI_SPEC_300 and above
-	 * ZynqMP does not set phase for <=25MHz clock.
-	 * If degrees is zero, no need to do anything.
-	 */
-	if (host->version < SDHCI_SPEC_300 ||
-	    host->timing == MMC_TIMING_LEGACY ||
-	    host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
+	/* This is applicable for SDHCI_SPEC_300 and above */
+	if (host->version < SDHCI_SPEC_300)
 		return 0;
 
 	switch (host->timing) {
@@ -668,14 +662,8 @@ static int sdhci_zynqmp_sampleclk_set_phase(struct clk_hw *hw, int degrees)
 	u8 tap_delay, tap_max = 0;
 	int ret;
 
-	/*
-	 * This is applicable for SDHCI_SPEC_300 and above
-	 * ZynqMP does not set phase for <=25MHz clock.
-	 * If degrees is zero, no need to do anything.
-	 */
-	if (host->version < SDHCI_SPEC_300 ||
-	    host->timing == MMC_TIMING_LEGACY ||
-	    host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
+	/* This is applicable for SDHCI_SPEC_300 and above */
+	if (host->version < SDHCI_SPEC_300)
 		return 0;
 
 	switch (host->timing) {
@@ -733,14 +721,8 @@ static int sdhci_versal_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
 	struct sdhci_host *host = sdhci_arasan->host;
 	u8 tap_delay, tap_max = 0;
 
-	/*
-	 * This is applicable for SDHCI_SPEC_300 and above
-	 * Versal does not set phase for <=25MHz clock.
-	 * If degrees is zero, no need to do anything.
-	 */
-	if (host->version < SDHCI_SPEC_300 ||
-	    host->timing == MMC_TIMING_LEGACY ||
-	    host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
+	/* This is applicable for SDHCI_SPEC_300 and above */
+	if (host->version < SDHCI_SPEC_300)
 		return 0;
 
 	switch (host->timing) {
@@ -804,14 +786,8 @@ static int sdhci_versal_sampleclk_set_phase(struct clk_hw *hw, int degrees)
 	struct sdhci_host *host = sdhci_arasan->host;
 	u8 tap_delay, tap_max = 0;
 
-	/*
-	 * This is applicable for SDHCI_SPEC_300 and above
-	 * Versal does not set phase for <=25MHz clock.
-	 * If degrees is zero, no need to do anything.
-	 */
-	if (host->version < SDHCI_SPEC_300 ||
-	    host->timing == MMC_TIMING_LEGACY ||
-	    host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
+	/* This is applicable for SDHCI_SPEC_300 and above */
+	if (host->version < SDHCI_SPEC_300)
 		return 0;
 
 	switch (host->timing) {
commit 60d53566100abde4acc5504b524bc97f89015690
Author: Adrian Hunter <adrian.hunter at intel.com>
Date:   Thu Nov 12 15:36:56 2020 +0200

    mmc: sdhci-pci: Prefer SDR25 timing for High Speed mode for BYT-based Intel controllers
    
    A UHS setting of SDR25 can give better results for High Speed mode.
    This is because there is no setting corresponding to high speed.  Currently
    SDHCI sets no value, which means zero which is also the setting for SDR12.
    There was an attempt to change this in sdhci.c but it caused problems for
    some drivers, so it was reverted and the change was made to sdhci-brcmstb
    in commit 2fefc7c5f7d16e ("mmc: sdhci-brcmstb: Fix incorrect switch to HS
    mode").  Several other drivers also do this.
    
    Signed-off-by: Adrian Hunter <adrian.hunter at intel.com>
    Cc: stable at vger.kernel.org # v5.4+
    Link: https://lore.kernel.org/r/20201112133656.20317-1-adrian.hunter@intel.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c
index 23da7f7fe093..9552708846ca 100644
--- a/drivers/mmc/host/sdhci-pci-core.c
+++ b/drivers/mmc/host/sdhci-pci-core.c
@@ -665,6 +665,15 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
 	}
 }
 
+static void sdhci_intel_set_uhs_signaling(struct sdhci_host *host,
+					  unsigned int timing)
+{
+	/* Set UHS timing to SDR25 for High Speed mode */
+	if (timing == MMC_TIMING_MMC_HS || timing == MMC_TIMING_SD_HS)
+		timing = MMC_TIMING_UHS_SDR25;
+	sdhci_set_uhs_signaling(host, timing);
+}
+
 #define INTEL_HS400_ES_REG 0x78
 #define INTEL_HS400_ES_BIT BIT(0)
 
@@ -721,7 +730,7 @@ static const struct sdhci_ops sdhci_intel_byt_ops = {
 	.enable_dma		= sdhci_pci_enable_dma,
 	.set_bus_width		= sdhci_set_bus_width,
 	.reset			= sdhci_reset,
-	.set_uhs_signaling	= sdhci_set_uhs_signaling,
+	.set_uhs_signaling	= sdhci_intel_set_uhs_signaling,
 	.hw_reset		= sdhci_pci_hw_reset,
 };
 
@@ -731,7 +740,7 @@ static const struct sdhci_ops sdhci_intel_glk_ops = {
 	.enable_dma		= sdhci_pci_enable_dma,
 	.set_bus_width		= sdhci_set_bus_width,
 	.reset			= sdhci_cqhci_reset,
-	.set_uhs_signaling	= sdhci_set_uhs_signaling,
+	.set_uhs_signaling	= sdhci_intel_set_uhs_signaling,
 	.hw_reset		= sdhci_pci_hw_reset,
 	.irq			= sdhci_cqhci_irq,
 };
commit e02152ba2810f7c88cb54e71cda096268dfa9241
Author: Michael Ellerman <mpe at ellerman.id.au>
Date:   Mon Nov 16 23:09:13 2020 +1100

    powerpc: Drop -me200 addition to build flags
    
    Currently a build with CONFIG_E200=y will fail with:
    
      Error: invalid switch -me200
      Error: unrecognized option -me200
    
    Upstream binutils has never supported an -me200 option. Presumably it
    was supported at some point by either a fork or Freescale internal
    binutils.
    
    We can't support code that we can't even build test, so drop the
    addition of -me200 to the build flags, so we can at least build with
    CONFIG_E200=y.
    
    Reported-by: Németh Márton <nm127 at freemail.hu>
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Acked-by: Scott Wood <oss at buserror.net>
    Link: https://lore.kernel.org/r/20201116120913.165317-1-mpe@ellerman.id.au

diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index a4d56f0a41d9..16b8336f91dd 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -248,7 +248,6 @@ KBUILD_CFLAGS		+= $(call cc-option,-mno-string)
 cpu-as-$(CONFIG_40x)		+= -Wa,-m405
 cpu-as-$(CONFIG_44x)		+= -Wa,-m440
 cpu-as-$(CONFIG_ALTIVEC)	+= $(call as-option,-Wa$(comma)-maltivec)
-cpu-as-$(CONFIG_E200)		+= -Wa,-me200
 cpu-as-$(CONFIG_E500)		+= -Wa,-me500
 
 # When using '-many -mpower4' gas will first try and find a matching power4
commit 2dde2821b57f12fa8601d35d438b5e300fcbbe1d
Merge: 18db36a073db e5b1032a656e
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Tue Nov 17 10:53:00 2020 +0100

    Merge tag 'iio-fixes-for-5.10a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
    
    Jonathan writes:
    
    First set of IIO and counter fixes for the 5.10 cycle.
    
    IIO
    
    cros_ec
     - Provide defauts for max and min frequency when older machines fail
       to return them correctly.
    ingenic-adc
     - Fix wrong vref value for JZ4770 SoC
     - Fix AUX / VBAT readings when touchscreen in use by pausing touchscreen
       readings during a read of these channels.
    kxcjk1013
     - Fix an issue with KIOX010A ACPI id using devices which need to run
       a ACPI device specific method to avoid leaving the keyboard disabled.
       Includes a minor precursor patch to make this fix easier to do.
    mt6577-auxadc
     - Fix an issue with dev_comp not being set resulting in a null ptr deref.
    st_lsm6dsx
     - Set a 10ms min shub slave timeout to handle fast snesors where more time
       is needed to set up the config than the cycles allowed.
    stm32-adc
     - Fix an issue due to a clash between an ADC configured to use IRQs and
       a second configured to use DMA cause by some incorrect register masking.
    vcnl4035
     - Kconfig missing dependency
    
    Counter
    
    ti-eqep
     - wrong value for max_register as one beyond the end instead of the end.
    
    * tag 'iio-fixes-for-5.10a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
      iio: accel: kxcjk1013: Add support for KIOX010A ACPI DSM for setting tablet-mode
      iio: accel: kxcjk1013: Replace is_smo8500_device with an acpi_type enum
      iio: light: fix kconfig dependency bug for VCNL4035
      iio/adc: ingenic: Fix AUX/VBAT readings when touchscreen is used
      iio/adc: ingenic: Fix battery VREF for JZ4770 SoC
      iio: imu: st_lsm6dsx: set 10ms as min shub slave timeout
      counter/ti-eqep: Fix regmap max_register
      iio: adc: stm32-adc: fix a regression when using dma and irq
      iio: adc: mediatek: fix unset field
      iio: cros_ec: Use default frequencies when EC returns invalid information

commit 1a371e67dc77125736cc56d3a0893f06b75855b6
Author: Chen Yu <yu.c.chen at intel.com>
Date:   Fri Nov 13 09:59:23 2020 +0800

    x86/microcode/intel: Check patch signature before saving microcode for early loading
    
    Currently, scan_microcode() leverages microcode_matches() to check
    if the microcode matches the CPU by comparing the family and model.
    However, the processor stepping and flags of the microcode signature
    should also be considered when saving a microcode patch for early
    update.
    
    Use find_matching_signature() in scan_microcode() and get rid of the
    now-unused microcode_matches() which is a good cleanup in itself.
    
    Complete the verification of the patch being saved for early loading in
    save_microcode_patch() directly. This needs to be done there too because
    save_mc_for_early() will call save_microcode_patch() too.
    
    The second reason why this needs to be done is because the loader still
    tries to support, at least hypothetically, mixed-steppings systems and
    thus adds all patches to the cache that belong to the same CPU model
    albeit with different steppings.
    
    For example:
    
      microcode: CPU: sig=0x906ec, pf=0x2, rev=0xd6
      microcode: mc_saved[0]: sig=0x906e9, pf=0x2a, rev=0xd6, total size=0x19400, date = 2020-04-23
      microcode: mc_saved[1]: sig=0x906ea, pf=0x22, rev=0xd6, total size=0x19000, date = 2020-04-27
      microcode: mc_saved[2]: sig=0x906eb, pf=0x2, rev=0xd6, total size=0x19400, date = 2020-04-23
      microcode: mc_saved[3]: sig=0x906ec, pf=0x22, rev=0xd6, total size=0x19000, date = 2020-04-27
      microcode: mc_saved[4]: sig=0x906ed, pf=0x22, rev=0xd6, total size=0x19400, date = 2020-04-23
    
    The patch which is being saved for early loading, however, can only be
    the one which fits the CPU this runs on so do the signature verification
    before saving.
    
     [ bp: Do signature verification in save_microcode_patch()
           and rewrite commit message. ]
    
    Fixes: ec400ddeff20 ("x86/microcode_intel_early.c: Early update ucode on Intel's CPU")
    Signed-off-by: Chen Yu <yu.c.chen at intel.com>
    Signed-off-by: Borislav Petkov <bp at suse.de>
    Cc: stable at vger.kernel.org
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=208535
    Link: https://lkml.kernel.org/r/20201113015923.13960-1-yu.c.chen@intel.com

diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index 6a99535d7f37..7e8e07bddd5f 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -100,53 +100,6 @@ static int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev
 	return find_matching_signature(mc, csig, cpf);
 }
 
-/*
- * Given CPU signature and a microcode patch, this function finds if the
- * microcode patch has matching family and model with the CPU.
- *
- * %true - if there's a match
- * %false - otherwise
- */
-static bool microcode_matches(struct microcode_header_intel *mc_header,
-			      unsigned long sig)
-{
-	unsigned long total_size = get_totalsize(mc_header);
-	unsigned long data_size = get_datasize(mc_header);
-	struct extended_sigtable *ext_header;
-	unsigned int fam_ucode, model_ucode;
-	struct extended_signature *ext_sig;
-	unsigned int fam, model;
-	int ext_sigcount, i;
-
-	fam   = x86_family(sig);
-	model = x86_model(sig);
-
-	fam_ucode   = x86_family(mc_header->sig);
-	model_ucode = x86_model(mc_header->sig);
-
-	if (fam == fam_ucode && model == model_ucode)
-		return true;
-
-	/* Look for ext. headers: */
-	if (total_size <= data_size + MC_HEADER_SIZE)
-		return false;
-
-	ext_header   = (void *) mc_header + data_size + MC_HEADER_SIZE;
-	ext_sig      = (void *)ext_header + EXT_HEADER_SIZE;
-	ext_sigcount = ext_header->count;
-
-	for (i = 0; i < ext_sigcount; i++) {
-		fam_ucode   = x86_family(ext_sig->sig);
-		model_ucode = x86_model(ext_sig->sig);
-
-		if (fam == fam_ucode && model == model_ucode)
-			return true;
-
-		ext_sig++;
-	}
-	return false;
-}
-
 static struct ucode_patch *memdup_patch(void *data, unsigned int size)
 {
 	struct ucode_patch *p;
@@ -164,7 +117,7 @@ static struct ucode_patch *memdup_patch(void *data, unsigned int size)
 	return p;
 }
 
-static void save_microcode_patch(void *data, unsigned int size)
+static void save_microcode_patch(struct ucode_cpu_info *uci, void *data, unsigned int size)
 {
 	struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
 	struct ucode_patch *iter, *tmp, *p = NULL;
@@ -210,6 +163,9 @@ static void save_microcode_patch(void *data, unsigned int size)
 	if (!p)
 		return;
 
+	if (!find_matching_signature(p->data, uci->cpu_sig.sig, uci->cpu_sig.pf))
+		return;
+
 	/*
 	 * Save for early loading. On 32-bit, that needs to be a physical
 	 * address as the APs are running from physical addresses, before
@@ -344,13 +300,14 @@ scan_microcode(void *data, size_t size, struct ucode_cpu_info *uci, bool save)
 
 		size -= mc_size;
 
-		if (!microcode_matches(mc_header, uci->cpu_sig.sig)) {
+		if (!find_matching_signature(data, uci->cpu_sig.sig,
+					     uci->cpu_sig.pf)) {
 			data += mc_size;
 			continue;
 		}
 
 		if (save) {
-			save_microcode_patch(data, mc_size);
+			save_microcode_patch(uci, data, mc_size);
 			goto next;
 		}
 
@@ -483,14 +440,14 @@ static void show_saved_mc(void)
  * Save this microcode patch. It will be loaded early when a CPU is
  * hot-added or resumes.
  */
-static void save_mc_for_early(u8 *mc, unsigned int size)
+static void save_mc_for_early(struct ucode_cpu_info *uci, u8 *mc, unsigned int size)
 {
 	/* Synchronization during CPU hotplug. */
 	static DEFINE_MUTEX(x86_cpu_microcode_mutex);
 
 	mutex_lock(&x86_cpu_microcode_mutex);
 
-	save_microcode_patch(mc, size);
+	save_microcode_patch(uci, mc, size);
 	show_saved_mc();
 
 	mutex_unlock(&x86_cpu_microcode_mutex);
@@ -935,7 +892,7 @@ static enum ucode_state generic_load_microcode(int cpu, struct iov_iter *iter)
 	 * permanent memory. So it will be loaded early when a CPU is hot added
 	 * or resumes.
 	 */
-	save_mc_for_early(new_mc, new_mc_size);
+	save_mc_for_early(uci, new_mc, new_mc_size);
 
 	pr_debug("CPU%d found a matching microcode update with version 0x%x (current=0x%x)\n",
 		 cpu, new_rev, uci->cpu_sig.rev);
commit 61a2f1aecf6052f7bcf900829ca2b9d74437ec07
Author: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
Date:   Mon Nov 16 18:45:15 2020 +0100

    MIPS: kernel: Fix for_each_memblock conversion
    
    The loop over all memblocks works with PFNs and not physical
    addresses, so we need for_each_mem_pfn_range().
    
    Fixes: b10d6bca8720 ("arch, drivers: replace for_each_membock() with for_each_mem_range()")
    Signed-off-by: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
    Reviewed-by: Mike Rapoport <rppt at linux.ibm.com>
    Reviewed-by: Serge Semin <fancer.lancer at gmail.com>

diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 0d4253208bde..ca579deef939 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -262,8 +262,8 @@ static void __init bootmem_init(void)
 static void __init bootmem_init(void)
 {
 	phys_addr_t ramstart, ramend;
-	phys_addr_t start, end;
-	u64 i;
+	unsigned long start, end;
+	int i;
 
 	ramstart = memblock_start_of_DRAM();
 	ramend = memblock_end_of_DRAM();
@@ -300,7 +300,7 @@ static void __init bootmem_init(void)
 
 	min_low_pfn = ARCH_PFN_OFFSET;
 	max_pfn = PFN_DOWN(ramend);
-	for_each_mem_range(i, &start, &end) {
+	for_each_mem_pfn_range(i, MAX_NUMNODES, &start, &end, NULL) {
 		/*
 		 * Skip highmem here so we get an accurate max_low_pfn if low
 		 * memory stops short of high memory.
commit 054409ab253d9f31bec5760105144166b4b71e22
Author: Chen Zhou <chenzhou10 at huawei.com>
Date:   Tue Nov 17 10:54:26 2020 +0800

    KVM: SVM: fix error return code in svm_create_vcpu()
    
    Fix to return a negative error code from the error handling case
    instead of 0 in function svm_create_vcpu(), as done elsewhere in this
    function.
    
    Fixes: f4c847a95654 ("KVM: SVM: refactor msr permission bitmap allocation")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Chen Zhou <chenzhou10 at huawei.com>
    Message-Id: <20201117025426.167824-1-chenzhou10 at huawei.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 1e81cfebd491..79b3a564f1c9 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -1309,8 +1309,10 @@ static int svm_create_vcpu(struct kvm_vcpu *vcpu)
 		svm->avic_is_running = true;
 
 	svm->msrpm = svm_vcpu_alloc_msrpm();
-	if (!svm->msrpm)
+	if (!svm->msrpm) {
+		err = -ENOMEM;
 		goto error_free_vmcb_page;
+	}
 
 	svm_vcpu_init_msrpm(vcpu, svm->msrpm);
 
commit 8410e7f3b31e53bfa7a34c282b4313e79ed7ff8d
Author: Sudeep Holla <sudeep.holla at arm.com>
Date:   Tue Nov 10 11:10:40 2020 +0000

    cpufreq: scmi: Fix OPP addition failure with a dummy clock provider
    
    Commit dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return
    -EPROBE_DEFER") handles -EPROBE_DEFER for the clock/interconnects within
    _allocate_opp_table() which is called from dev_pm_opp_add and it
    now propagates the error back to the caller.
    
    SCMI performance domain re-used clock bindings to keep it simple. However
    with the above mentioned change, if clock property is present in a device
    node, opps fails to get added with below errors until clk_get succeeds.
    
     cpu0: failed to add opp 450000000Hz
     cpu0: failed to add opps to the device
     ....(errors on cpu1-cpu4)
     cpu5: failed to add opp 450000000Hz
     cpu5: failed to add opps to the device
    
    So, in order to fix the issue, we need to register dummy clock provider.
    With the dummy clock provider, clk_get returns NULL(no errors!), then opp
    core proceeds to add OPPs for the CPUs.
    
    Cc: Rafael J. Wysocki <rjw at rjwysocki.net>
    Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER")
    Signed-off-by: Sudeep Holla <sudeep.holla at arm.com>
    Signed-off-by: Viresh Kumar <viresh.kumar at linaro.org>

diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
index e855e8612a67..78318508a6d6 100644
--- a/drivers/cpufreq/scmi-cpufreq.c
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -8,6 +8,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/clk-provider.h>
 #include <linux/cpu.h>
 #include <linux/cpufreq.h>
 #include <linux/cpumask.h>
@@ -228,12 +229,17 @@ static struct cpufreq_driver scmi_cpufreq_driver = {
 static int scmi_cpufreq_probe(struct scmi_device *sdev)
 {
 	int ret;
+	struct device *dev = &sdev->dev;
 
 	handle = sdev->handle;
 
 	if (!handle || !handle->perf_ops)
 		return -ENODEV;
 
+	/* dummy clock provider as needed by OPP if clocks property is used */
+	if (of_find_property(dev->of_node, "#clock-cells", NULL))
+		devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL);
+
 	ret = cpufreq_register_driver(&scmi_cpufreq_driver);
 	if (ret) {
 		dev_err(&sdev->dev, "%s: registering cpufreq failed, err: %d\n",
commit e010d1d25e47642fb91023479a4965000cf934a8
Author: Jon Hunter <jonathanh at nvidia.com>
Date:   Tue Nov 3 11:55:14 2020 +0000

    cpufreq: tegra186: Fix get frequency callback
    
    Commit b89c01c96051 ("cpufreq: tegra186: Fix initial frequency")
    implemented the CPUFREQ 'get' callback to determine the current
    operating frequency for each CPU. This implementation used a simple
    looked up to determine the current operating frequency. The problem
    with this is that frequency table for different Tegra186 devices may
    vary and so the default boot frequency for Tegra186 device may or may
    not be present in the frequency table. If the default boot frequency is
    not present in the frequency table, this causes the function
    tegra186_cpufreq_get() to return 0 and in turn causes cpufreq_online()
    to fail which prevents CPUFREQ from working.
    
    Fix this by always calculating the CPU frequency based upon the current
    'ndiv' setting for the CPU. Note that the CPU frequency for Tegra186 is
    calculated by reading the current 'ndiv' setting, multiplying by the
    CPU reference clock and dividing by a constant divisor.
    
    Fixes: b89c01c96051 ("cpufreq: tegra186: Fix initial frequency")
    
    Signed-off-by: Jon Hunter <jonathanh at nvidia.com>
    Signed-off-by: Viresh Kumar <viresh.kumar at linaro.org>

diff --git a/drivers/cpufreq/tegra186-cpufreq.c b/drivers/cpufreq/tegra186-cpufreq.c
index 4b4079f51559..7eb2c56c65de 100644
--- a/drivers/cpufreq/tegra186-cpufreq.c
+++ b/drivers/cpufreq/tegra186-cpufreq.c
@@ -42,6 +42,8 @@ static const struct tegra186_cpufreq_cluster_info tegra186_clusters[] = {
 struct tegra186_cpufreq_cluster {
 	const struct tegra186_cpufreq_cluster_info *info;
 	struct cpufreq_frequency_table *table;
+	u32 ref_clk_khz;
+	u32 div;
 };
 
 struct tegra186_cpufreq_data {
@@ -94,7 +96,7 @@ static int tegra186_cpufreq_set_target(struct cpufreq_policy *policy,
 
 static unsigned int tegra186_cpufreq_get(unsigned int cpu)
 {
-	struct cpufreq_frequency_table *tbl;
+	struct tegra186_cpufreq_data *data = cpufreq_get_driver_data();
 	struct cpufreq_policy *policy;
 	void __iomem *edvd_reg;
 	unsigned int i, freq = 0;
@@ -104,17 +106,23 @@ static unsigned int tegra186_cpufreq_get(unsigned int cpu)
 	if (!policy)
 		return 0;
 
-	tbl = policy->freq_table;
 	edvd_reg = policy->driver_data;
 	ndiv = readl(edvd_reg) & EDVD_CORE_VOLT_FREQ_F_MASK;
 
-	for (i = 0; tbl[i].frequency != CPUFREQ_TABLE_END; i++) {
-		if ((tbl[i].driver_data & EDVD_CORE_VOLT_FREQ_F_MASK) == ndiv) {
-			freq = tbl[i].frequency;
-			break;
+	for (i = 0; i < data->num_clusters; i++) {
+		struct tegra186_cpufreq_cluster *cluster = &data->clusters[i];
+		int core;
+
+		for (core = 0; core < ARRAY_SIZE(cluster->info->cpus); core++) {
+			if (cluster->info->cpus[core] != policy->cpu)
+				continue;
+
+			freq = (cluster->ref_clk_khz * ndiv) / cluster->div;
+			goto out;
 		}
 	}
 
+out:
 	cpufreq_cpu_put(policy);
 
 	return freq;
@@ -133,7 +141,7 @@ static struct cpufreq_driver tegra186_cpufreq_driver = {
 
 static struct cpufreq_frequency_table *init_vhint_table(
 	struct platform_device *pdev, struct tegra_bpmp *bpmp,
-	unsigned int cluster_id)
+	struct tegra186_cpufreq_cluster *cluster)
 {
 	struct cpufreq_frequency_table *table;
 	struct mrq_cpu_vhint_request req;
@@ -152,7 +160,7 @@ static struct cpufreq_frequency_table *init_vhint_table(
 
 	memset(&req, 0, sizeof(req));
 	req.addr = phys;
-	req.cluster_id = cluster_id;
+	req.cluster_id = cluster->info->bpmp_cluster_id;
 
 	memset(&msg, 0, sizeof(msg));
 	msg.mrq = MRQ_CPU_VHINT;
@@ -185,6 +193,9 @@ static struct cpufreq_frequency_table *init_vhint_table(
 		goto free;
 	}
 
+	cluster->ref_clk_khz = data->ref_clk_hz / 1000;
+	cluster->div = data->pdiv * data->mdiv;
+
 	for (i = data->vfloor, j = 0; i <= data->vceil; i++) {
 		struct cpufreq_frequency_table *point;
 		u16 ndiv = data->ndiv[i];
@@ -202,8 +213,7 @@ static struct cpufreq_frequency_table *init_vhint_table(
 
 		point = &table[j++];
 		point->driver_data = edvd_val;
-		point->frequency = data->ref_clk_hz * ndiv / data->pdiv /
-			data->mdiv / 1000;
+		point->frequency = (cluster->ref_clk_khz * ndiv) / cluster->div;
 	}
 
 	table[j].frequency = CPUFREQ_TABLE_END;
@@ -245,8 +255,7 @@ static int tegra186_cpufreq_probe(struct platform_device *pdev)
 		struct tegra186_cpufreq_cluster *cluster = &data->clusters[i];
 
 		cluster->info = &tegra186_clusters[i];
-		cluster->table = init_vhint_table(
-			pdev, bpmp, cluster->info->bpmp_cluster_id);
+		cluster->table = init_vhint_table(pdev, bpmp, cluster);
 		if (IS_ERR(cluster->table)) {
 			err = PTR_ERR(cluster->table);
 			goto put_bpmp;
commit f36199355c64a39fe82cfddc7623d827c7e050da
Author: Mike Christie <michael.christie at oracle.com>
Date:   Fri Nov 13 19:46:18 2020 -0600

    scsi: target: iscsi: Fix cmd abort fabric stop race
    
    Maurizio found a race where the abort and cmd stop paths can race as
    follows:
    
     1. thread1 runs iscsit_release_commands_from_conn and sets
        CMD_T_FABRIC_STOP.
    
     2. thread2 runs iscsit_aborted_task and then does __iscsit_free_cmd. It
        then returns from the aborted_task callout and we finish
        target_handle_abort and do:
    
        target_handle_abort -> transport_cmd_check_stop_to_fabric ->
            lio_check_stop_free -> target_put_sess_cmd
    
        The cmd is now freed.
    
     3. thread1 now finishes iscsit_release_commands_from_conn and runs
        iscsit_free_cmd while accessing a command we just released.
    
    In __target_check_io_state we check for CMD_T_FABRIC_STOP and set the
    CMD_T_ABORTED if the driver is not cleaning up the cmd because of a session
    shutdown. However, iscsit_release_commands_from_conn only sets the
    CMD_T_FABRIC_STOP and does not check to see if the abort path has claimed
    completion ownership of the command.
    
    This adds a check in iscsit_release_commands_from_conn so only the abort or
    fabric stop path cleanup the command.
    
    Link: https://lore.kernel.org/r/1605318378-9269-1-git-send-email-michael.christie@oracle.com
    Reported-by: Maurizio Lombardi <mlombard at redhat.com>
    Reviewed-by: Maurizio Lombardi <mlombard at redhat.com>
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index f77e5eee6b80..518fac4864cf 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -483,8 +483,7 @@ EXPORT_SYMBOL(iscsit_queue_rsp);
 void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
 {
 	spin_lock_bh(&conn->cmd_lock);
-	if (!list_empty(&cmd->i_conn_node) &&
-	    !(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP))
+	if (!list_empty(&cmd->i_conn_node))
 		list_del_init(&cmd->i_conn_node);
 	spin_unlock_bh(&conn->cmd_lock);
 
@@ -4083,12 +4082,22 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
 	spin_lock_bh(&conn->cmd_lock);
 	list_splice_init(&conn->conn_cmd_list, &tmp_list);
 
-	list_for_each_entry(cmd, &tmp_list, i_conn_node) {
+	list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) {
 		struct se_cmd *se_cmd = &cmd->se_cmd;
 
 		if (se_cmd->se_tfo != NULL) {
 			spin_lock_irq(&se_cmd->t_state_lock);
-			se_cmd->transport_state |= CMD_T_FABRIC_STOP;
+			if (se_cmd->transport_state & CMD_T_ABORTED) {
+				/*
+				 * LIO's abort path owns the cleanup for this,
+				 * so put it back on the list and let
+				 * aborted_task handle it.
+				 */
+				list_move_tail(&cmd->i_conn_node,
+					       &conn->conn_cmd_list);
+			} else {
+				se_cmd->transport_state |= CMD_T_FABRIC_STOP;
+			}
 			spin_unlock_irq(&se_cmd->t_state_lock);
 		}
 	}
commit fe0a8a95e7134d0b44cd407bc0085b9ba8d8fe31
Author: Lee Duncan <lduncan at suse.com>
Date:   Fri Nov 6 11:33:17 2020 -0800

    scsi: libiscsi: Fix NOP race condition
    
    iSCSI NOPs are sometimes "lost", mistakenly sent to the user-land iscsid
    daemon instead of handled in the kernel, as they should be, resulting in a
    message from the daemon like:
    
      iscsid: Got nop in, but kernel supports nop handling.
    
    This can occur because of the new forward- and back-locks, and the fact
    that an iSCSI NOP response can occur before processing of the NOP send is
    complete. This can result in "conn->ping_task" being NULL in
    iscsi_nop_out_rsp(), when the pointer is actually in the process of being
    set.
    
    To work around this, we add a new state to the "ping_task" pointer. In
    addition to NULL (not assigned) and a pointer (assigned), we add the state
    "being set", which is signaled with an INVALID pointer (using "-1").
    
    Link: https://lore.kernel.org/r/20201106193317.16993-1-leeman.duncan@gmail.com
    Reviewed-by: Mike Christie <michael.christie at oracle.com>
    Signed-off-by: Lee Duncan <lduncan at suse.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 1e9c3171fa9f..f9314f1393fb 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -533,8 +533,8 @@ static void iscsi_complete_task(struct iscsi_task *task, int state)
 	if (conn->task == task)
 		conn->task = NULL;
 
-	if (conn->ping_task == task)
-		conn->ping_task = NULL;
+	if (READ_ONCE(conn->ping_task) == task)
+		WRITE_ONCE(conn->ping_task, NULL);
 
 	/* release get from queueing */
 	__iscsi_put_task(task);
@@ -738,6 +738,9 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
 						   task->conn->session->age);
 	}
 
+	if (unlikely(READ_ONCE(conn->ping_task) == INVALID_SCSI_TASK))
+		WRITE_ONCE(conn->ping_task, task);
+
 	if (!ihost->workq) {
 		if (iscsi_prep_mgmt_task(conn, task))
 			goto free_task;
@@ -941,8 +944,11 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
         struct iscsi_nopout hdr;
 	struct iscsi_task *task;
 
-	if (!rhdr && conn->ping_task)
-		return -EINVAL;
+	if (!rhdr) {
+		if (READ_ONCE(conn->ping_task))
+			return -EINVAL;
+		WRITE_ONCE(conn->ping_task, INVALID_SCSI_TASK);
+	}
 
 	memset(&hdr, 0, sizeof(struct iscsi_nopout));
 	hdr.opcode = ISCSI_OP_NOOP_OUT | ISCSI_OP_IMMEDIATE;
@@ -957,11 +963,12 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
 
 	task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0);
 	if (!task) {
+		if (!rhdr)
+			WRITE_ONCE(conn->ping_task, NULL);
 		iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n");
 		return -EIO;
 	} else if (!rhdr) {
 		/* only track our nops */
-		conn->ping_task = task;
 		conn->last_ping = jiffies;
 	}
 
@@ -984,7 +991,7 @@ static int iscsi_nop_out_rsp(struct iscsi_task *task,
 	struct iscsi_conn *conn = task->conn;
 	int rc = 0;
 
-	if (conn->ping_task != task) {
+	if (READ_ONCE(conn->ping_task) != task) {
 		/*
 		 * If this is not in response to one of our
 		 * nops then it must be from userspace.
@@ -1923,7 +1930,7 @@ static void iscsi_start_tx(struct iscsi_conn *conn)
  */
 static int iscsi_has_ping_timed_out(struct iscsi_conn *conn)
 {
-	if (conn->ping_task &&
+	if (READ_ONCE(conn->ping_task) &&
 	    time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) +
 			   (conn->ping_timeout * HZ), jiffies))
 		return 1;
@@ -2058,7 +2065,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
 	 * Checking the transport already or nop from a cmd timeout still
 	 * running
 	 */
-	if (conn->ping_task) {
+	if (READ_ONCE(conn->ping_task)) {
 		task->have_checked_conn = true;
 		rc = BLK_EH_RESET_TIMER;
 		goto done;
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
index c25fb86ffae9..b3bbd10eb3f0 100644
--- a/include/scsi/libiscsi.h
+++ b/include/scsi/libiscsi.h
@@ -132,6 +132,9 @@ struct iscsi_task {
 	void			*dd_data;	/* driver/transport data */
 };
 
+/* invalid scsi_task pointer */
+#define	INVALID_SCSI_TASK	(struct iscsi_task *)-1l
+
 static inline int iscsi_task_has_unsol_data(struct iscsi_task *task)
 {
 	return task->unsol_r2t.data_length > task->unsol_r2t.sent;
commit d5bd32a876c8cb677c9cc88dcc7eb498cd0c9397
Merge: 064c9c32b17c 0ae0a779efb8
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Nov 16 17:39:49 2020 -0800

    Merge branch 'bnxt_en-bug-fixes'
    
    Michael Chan says:
    
    ====================
    bnxt_en: Bug fixes.
    
    This first patch fixes a module eeprom A2h addressing issue.  The next
    2 patches fix counter related issues.  The last one skips an
    unsupported firmware call on the VF to avoid the error log.
    ====================
    
    Link: https://lore.kernel.org/r/1605486472-28156-1-git-send-email-michael.chan@broadcom.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 0ae0a779efb8840a0cdb2d6bd9a5d07663ac3ee2
Author: Vasundhara Volam <vasundhara-v.volam at broadcom.com>
Date:   Sun Nov 15 19:27:52 2020 -0500

    bnxt_en: Avoid unnecessary NVM_GET_DEV_INFO cmd error log on VFs.
    
    VFs do not have access permissions to issue NVM_GET_DEV_INFO
    firmware command.
    
    Fixes: 4933f6753b50 ("bnxt_en: Add bnxt_hwrm_nvm_get_dev_info() to query NVM info.")
    Signed-off-by: Vasundhara Volam <vasundhara-v.volam at broadcom.com>
    Signed-off-by: Michael Chan <michael.chan at broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index f133ea5674cb..1471c9a36238 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -2079,6 +2079,9 @@ int bnxt_hwrm_nvm_get_dev_info(struct bnxt *bp,
 	struct hwrm_nvm_get_dev_info_input req = {0};
 	int rc;
 
+	if (BNXT_VF(bp))
+		return -EOPNOTSUPP;
+
 	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_DEV_INFO, -1, -1);
 	mutex_lock(&bp->hwrm_cmd_lock);
 	rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
commit fa97f303fa4cf8469fd3d1ef29da69c0a3f6ddc8
Author: Michael Chan <michael.chan at broadcom.com>
Date:   Sun Nov 15 19:27:51 2020 -0500

    bnxt_en: Fix counter overflow logic.
    
    bnxt_add_one_ctr() adds a hardware counter to a software counter and
    adjusts for the hardware counter wraparound against the mask.  The logic
    assumes that the hardware counter is always smaller than or equal to
    the mask.
    
    This assumption is mostly correct.  But in some cases if the firmware
    is older and does not provide the accurate mask, the driver can use
    a mask that is smaller than the actual hardware mask.  This can cause
    some extra carry bits to be added to the software counter, resulting in
    counters that far exceed the actual value.  Fix it by masking the
    hardware counter with the mask passed into bnxt_add_one_ctr().
    
    Fixes: fea6b3335527 ("bnxt_en: Accumulate all counters.")
    Reviewed-by: Vasundhara Volam <vasundhara-v.volam at broadcom.com>
    Reviewed-by: Pavan Chebbi <pavan.chebbi at broadcom.com>
    Reviewed-by: Edwin Peer <edwin.peer at broadcom.com>
    Signed-off-by: Michael Chan <michael.chan at broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 448e1ba762ee..7c21aaa8b9af 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -7758,6 +7758,7 @@ static void bnxt_add_one_ctr(u64 hw, u64 *sw, u64 mask)
 {
 	u64 sw_tmp;
 
+	hw &= mask;
 	sw_tmp = (*sw & ~mask) | hw;
 	if (hw < (*sw & mask))
 		sw_tmp += mask + 1;
commit eba93de6d31c1734dee59909020a162de612e41e
Author: Michael Chan <michael.chan at broadcom.com>
Date:   Sun Nov 15 19:27:50 2020 -0500

    bnxt_en: Free port stats during firmware reset.
    
    Firmware is unable to retain the port counters during any kind of
    fatal or non-fatal resets, so we must clear the port counters to
    avoid false detection of port counter overflow.
    
    Fixes: fea6b3335527 ("bnxt_en: Accumulate all counters.")
    Reviewed-by: Edwin Peer <edwin.peer at broadcom.com>
    Reviewed-by: Vasundhara Volam <vasundhara-v.volam at broadcom.com>
    Signed-off-by: Michael Chan <michael.chan at broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 7975f59735d6..448e1ba762ee 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -4099,7 +4099,8 @@ static void bnxt_free_mem(struct bnxt *bp, bool irq_re_init)
 	bnxt_free_ntp_fltrs(bp, irq_re_init);
 	if (irq_re_init) {
 		bnxt_free_ring_stats(bp);
-		if (!(bp->fw_cap & BNXT_FW_CAP_PORT_STATS_NO_RESET))
+		if (!(bp->fw_cap & BNXT_FW_CAP_PORT_STATS_NO_RESET) ||
+		    test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
 			bnxt_free_port_stats(bp);
 		bnxt_free_ring_grps(bp);
 		bnxt_free_vnics(bp);
commit 4260330b32b14330cfe427d568ac5f5b29b5be3d
Author: Edwin Peer <edwin.peer at broadcom.com>
Date:   Sun Nov 15 19:27:49 2020 -0500

    bnxt_en: read EEPROM A2h address using page 0
    
    The module eeprom address range returned by bnxt_get_module_eeprom()
    should be 256 bytes of A0h address space, the lower half of the A2h
    address space, and page 0 for the upper half of the A2h address space.
    
    Fix the firmware call by passing page_number 0 for the A2h slave address
    space.
    
    Fixes: 42ee18fe4ca2 ("bnxt_en: Add Support for ETHTOOL_GMODULEINFO and ETHTOOL_GMODULEEEPRO")
    Signed-off-by: Edwin Peer <edwin.peer at broadcom.com>
    Signed-off-by: Michael Chan <michael.chan at broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index 53687bc7fcf5..f133ea5674cb 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -2997,7 +2997,7 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
 	/* Read A2 portion of the EEPROM */
 	if (length) {
 		start -= ETH_MODULE_SFF_8436_LEN;
-		rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 1,
+		rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 0,
 						      start, length, data);
 	}
 	return rc;
commit 064c9c32b17ca9b36f95eba32ee790dbbebd9a5f
Author: Alex Elder <elder at linaro.org>
Date:   Sat Nov 14 12:20:17 2020 -0600

    net: ipa: lock when freeing transaction
    
    Transactions sit on one of several lists, depending on their state
    (allocated, pending, complete, or polled).  A spinlock protects
    against concurrent access when transactions are moved between these
    lists.
    
    Transactions are also reference counted.  A newly-allocated
    transaction has an initial count of 1; a transaction is released in
    gsi_trans_free() only if its decremented reference count reaches 0.
    Releasing a transaction includes removing it from the polled (or if
    unused, allocated) list, so the spinlock is acquired when we release
    a transaction.
    
    The reference count is used to allow a caller to synchronously wait
    for a committed transaction to complete.  In this case, the waiter
    takes an extra reference to the transaction *before* committing it
    (so it won't be freed), and releases its reference (calls
    gsi_trans_free()) when it is done with it.
    
    Similarly, gsi_channel_update() takes an extra reference to ensure a
    transaction isn't released before the function is done operating on
    it.  Until the transaction is moved to the completed list (by this
    function) it won't be freed, so this reference is taken "safely."
    
    But in the quiesce path, we want to wait for the "last" transaction,
    which we find in the completed or polled list.  Transactions on
    these lists can be freed at any time, so we (try to) prevent that
    by taking the reference while holding the spinlock.
    
    Currently gsi_trans_free() decrements a transaction's reference
    count unconditionally, acquiring the lock to remove the transaction
    from its list *only* when the count reaches 0.  This does not
    protect the quiesce path, which depends on the lock to ensure its
    extra reference prevents release of the transaction.
    
    Fix this by only dropping the last reference to a transaction
    in gsi_trans_free() while holding the spinlock.
    
    Fixes: 9dd441e4ed575 ("soc: qcom: ipa: GSI transactions")
    Reported-by: Stephen Boyd <swboyd at chromium.org>
    Signed-off-by: Alex Elder <elder at linaro.org>
    Link: https://lore.kernel.org/r/20201114182017.28270-1-elder@linaro.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ipa/gsi_trans.c b/drivers/net/ipa/gsi_trans.c
index 92642030e735..e8599bb948c0 100644
--- a/drivers/net/ipa/gsi_trans.c
+++ b/drivers/net/ipa/gsi_trans.c
@@ -362,22 +362,31 @@ struct gsi_trans *gsi_channel_trans_alloc(struct gsi *gsi, u32 channel_id,
 	return trans;
 }
 
-/* Free a previously-allocated transaction (used only in case of error) */
+/* Free a previously-allocated transaction */
 void gsi_trans_free(struct gsi_trans *trans)
 {
+	refcount_t *refcount = &trans->refcount;
 	struct gsi_trans_info *trans_info;
+	bool last;
 
-	if (!refcount_dec_and_test(&trans->refcount))
+	/* We must hold the lock to release the last reference */
+	if (refcount_dec_not_one(refcount))
 		return;
 
 	trans_info = &trans->gsi->channel[trans->channel_id].trans_info;
 
 	spin_lock_bh(&trans_info->spinlock);
 
-	list_del(&trans->links);
+	/* Reference might have been added before we got the lock */
+	last = refcount_dec_and_test(refcount);
+	if (last)
+		list_del(&trans->links);
 
 	spin_unlock_bh(&trans_info->spinlock);
 
+	if (!last)
+		return;
+
 	ipa_gsi_trans_release(trans);
 
 	/* Releasing the reserved TREs implicitly frees the sgl[] and
commit 3fe16edf6767decd640fa2654308bc64f8d656dc
Author: Vadim Fedorenko <vfedorenko at novek.ru>
Date:   Sun Nov 15 07:16:00 2020 +0300

    net/tls: fix corrupted data in recvmsg
    
    If tcp socket has more data than Encrypted Handshake Message then
    tls_sw_recvmsg will try to decrypt next record instead of returning
    full control message to userspace as mentioned in comment. The next
    message - usually Application Data - gets corrupted because it uses
    zero copy for decryption that's why the data is not stored in skb
    for next iteration. Revert check to not decrypt next record if
    current is not Application Data.
    
    Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records")
    Signed-off-by: Vadim Fedorenko <vfedorenko at novek.ru>
    Link: https://lore.kernel.org/r/1605413760-21153-1-git-send-email-vfedorenko@novek.ru
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index 95ab5545a931..2fe9e2cf8659 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -1913,7 +1913,7 @@ pick_next_record:
 			 * another message type
 			 */
 			msg->msg_flags |= MSG_EOR;
-			if (ctx->control != TLS_RECORD_TYPE_DATA)
+			if (control != TLS_RECORD_TYPE_DATA)
 				goto recv_end;
 		} else {
 			break;
commit fc70f5bf5e525dde81565f0a30d5e39168062eba
Author: Subash Abhinov Kasiviswanathan <subashab at codeaurora.org>
Date:   Fri Nov 13 13:12:05 2020 -0700

    net: qualcomm: rmnet: Fix incorrect receive packet handling during cleanup
    
    During rmnet unregistration, the real device rx_handler is first cleared
    followed by the removal of rx_handler_data after the rcu synchronization.
    
    Any packets in the receive path may observe that the rx_handler is NULL.
    However, there is no check when dereferencing this value to use the
    rmnet_port information.
    
    This fixes following splat by adding the NULL check.
    
    Unable to handle kernel NULL pointer dereference at virtual
    address 000000000000000d
    pc : rmnet_rx_handler+0x124/0x284
    lr : rmnet_rx_handler+0x124/0x284
     rmnet_rx_handler+0x124/0x284
     __netif_receive_skb_core+0x758/0xd74
     __netif_receive_skb+0x50/0x17c
     process_backlog+0x15c/0x1b8
     napi_poll+0x88/0x284
     net_rx_action+0xbc/0x23c
     __do_softirq+0x20c/0x48c
    
    Fixes: ceed73a2cf4a ("drivers: net: ethernet: qualcomm: rmnet: Initial implementation")
    Signed-off-by: Sean Tranchetti <stranche at codeaurora.org>
    Signed-off-by: Subash Abhinov Kasiviswanathan <subashab at codeaurora.org>
    Link: https://lore.kernel.org/r/1605298325-3705-1-git-send-email-subashab@codeaurora.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
index 29a7bfa2584d..3d7d3ab383f8 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
@@ -188,6 +188,11 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)
 
 	dev = skb->dev;
 	port = rmnet_get_port_rcu(dev);
+	if (unlikely(!port)) {
+		atomic_long_inc(&skb->dev->rx_nohandler);
+		kfree_skb(skb);
+		goto done;
+	}
 
 	switch (port->rmnet_mode) {
 	case RMNET_EPMODE_VND:
commit 9c79a8ab5f124db01eb1d7287454a702f0d4252f
Author: Lorenzo Bianconi <lorenzo at kernel.org>
Date:   Fri Nov 13 19:16:57 2020 +0100

    net: mvneta: fix possible memory leak in mvneta_swbm_add_rx_fragment
    
    Recycle the page running page_pool_put_full_page() in
    mvneta_swbm_add_rx_fragment routine when the last descriptor
    contains just the FCS or if the received packet contains more than
    MAX_SKB_FRAGS fragments
    
    Fixes: ca0e014609f0 ("net: mvneta: move skb build after descriptors processing")
    Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
    Link: https://lore.kernel.org/r/df6a2bad70323ee58d3901491ada31c1ca2a40b9.1605291228.git.lorenzo@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 54b0bf574c05..4a9041ee1b39 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -2287,6 +2287,7 @@ mvneta_swbm_add_rx_fragment(struct mvneta_port *pp,
 	dma_sync_single_for_cpu(dev->dev.parent,
 				rx_desc->buf_phys_addr,
 				len, dma_dir);
+	rx_desc->buf_phys_addr = 0;
 
 	if (data_len > 0 && sinfo->nr_frags < MAX_SKB_FRAGS) {
 		skb_frag_t *frag = &sinfo->frags[sinfo->nr_frags];
@@ -2295,8 +2296,8 @@ mvneta_swbm_add_rx_fragment(struct mvneta_port *pp,
 		skb_frag_size_set(frag, data_len);
 		__skb_frag_set_page(frag, page);
 		sinfo->nr_frags++;
-
-		rx_desc->buf_phys_addr = 0;
+	} else {
+		page_pool_put_full_page(rxq->page_pool, page, true);
 	}
 	*size -= len;
 }
commit 8e5debed39017836a850c6c7bfacc93299d19bad
Author: Wong Vee Khee <vee.khee.wong at intel.com>
Date:   Sun Nov 15 15:42:10 2020 +0800

    net: stmmac: Use rtnl_lock/unlock on netif_set_real_num_rx_queues() call
    
    Fix an issue where dump stack is printed on suspend resume flow due to
    netif_set_real_num_rx_queues() is not called with rtnl_lock held().
    
    Fixes: 686cff3d7022 ("net: stmmac: Fix incorrect location to set real_num_rx|tx_queues")
    Reported-by: Christophe ROULLIER <christophe.roullier at st.com>
    Tested-by: Christophe ROULLIER <christophe.roullier at st.com>
    Cc: Alexandre TORGUE <alexandre.torgue at st.com>
    Reviewed-by: Ong Boon Leong <boon.leong.ong at intel.com>
    Signed-off-by: Wong Vee Khee <vee.khee.wong at intel.com>
    Link: https://lore.kernel.org/r/20201115074210.23605-1-vee.khee.wong@intel.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index d833908b660a..ba45fe237512 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -5247,6 +5247,7 @@ int stmmac_resume(struct device *dev)
 			return ret;
 	}
 
+	rtnl_lock();
 	mutex_lock(&priv->lock);
 
 	stmmac_reset_queues_param(priv);
@@ -5262,6 +5263,7 @@ int stmmac_resume(struct device *dev)
 	stmmac_enable_all_queues(priv);
 
 	mutex_unlock(&priv->lock);
+	rtnl_unlock();
 
 	if (!device_may_wakeup(priv->device) || !priv->plat->pmt) {
 		rtnl_lock();
commit 7a30ecc9237681bb125cbd30eee92bef7e86293d
Author: Heiner Kallweit <hkallweit1 at gmail.com>
Date:   Fri Nov 13 10:27:27 2020 +0100

    net: bridge: add missing counters to ndo_get_stats64 callback
    
    In br_forward.c and br_input.c fields dev->stats.tx_dropped and
    dev->stats.multicast are populated, but they are ignored in
    ndo_get_stats64.
    
    Fixes: 28172739f0a2 ("net: fix 64 bit counters on 32 bit arches")
    Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
    Link: https://lore.kernel.org/r/58ea9963-77ad-a7cf-8dfd-fc95ab95f606@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 6f742fee874a..7730c8f3cb53 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -207,6 +207,7 @@ static void br_get_stats64(struct net_device *dev,
 {
 	struct net_bridge *br = netdev_priv(dev);
 
+	netdev_stats_to_stats64(stats, &dev->stats);
 	dev_fetch_sw_netstats(stats, br->stats);
 }
 
commit 35f735c665114840dcd3142f41148d07870f51f7
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Nov 13 14:49:33 2020 +0800

    net: ethernet: ti: cpsw: fix error return code in cpsw_probe()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 83a8471ba255 ("net: ethernet: ti: cpsw: refactor probe to group common hw initialization")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605250173-18438-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index fa2d1025cbb2..b0f00b4edd94 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -1634,6 +1634,7 @@ static int cpsw_probe(struct platform_device *pdev)
 				       CPSW_MAX_QUEUES, CPSW_MAX_QUEUES);
 	if (!ndev) {
 		dev_err(dev, "error allocating net_device\n");
+		ret = -ENOMEM;
 		goto clean_cpts;
 	}
 
commit 661710bfd5039267f911e42675ab743760b6449d
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Nov 13 14:34:03 2020 +0800

    net: stmmac: dwmac-intel-plat: fix error return code in intel_eth_plat_probe()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 9efc9b2b04c7 ("net: stmmac: Add dwmac-intel-plat for GBE driver")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605249243-17262-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
index f61cb997a8f6..82b1c7a5a7a9 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
@@ -113,8 +113,10 @@ static int intel_eth_plat_probe(struct platform_device *pdev)
 		/* Enable TX clock */
 		if (dwmac->data->tx_clk_en) {
 			dwmac->tx_clk = devm_clk_get(&pdev->dev, "tx_clk");
-			if (IS_ERR(dwmac->tx_clk))
+			if (IS_ERR(dwmac->tx_clk)) {
+				ret = PTR_ERR(dwmac->tx_clk);
 				goto err_remove_config_dt;
+			}
 
 			clk_prepare_enable(dwmac->tx_clk);
 
commit 63fa58d99a7bc07f2d70ccc7a50aba86dba652c0
Merge: bd6327fda2f3 1072460a1aab
Author: Mark Brown <broonie at kernel.org>
Date:   Mon Nov 16 23:29:07 2020 +0000

    Merge Intel catpt DSP fixes into asoc-5.10

commit 3beb9be165083c2964eba1923601c3bfac0b02d4
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Nov 13 14:16:26 2020 +0800

    qlcnic: fix error return code in qlcnic_83xx_restart_hw()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 3ced0a88cd4c ("qlcnic: Add support to run firmware POST")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605248186-16013-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index b8af59fc1aa4..d2c190732d3e 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -2231,7 +2231,8 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
 
 	/* Boot either flash image or firmware image from host file system */
 	if (qlcnic_load_fw_file == 1) {
-		if (qlcnic_83xx_load_fw_image_from_host(adapter))
+		err = qlcnic_83xx_load_fw_image_from_host(adapter);
+		if (err)
 			return err;
 	} else {
 		QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
commit cfbaa8b33e022aca62a3f2815ffbc02874d4cb8b
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Nov 13 14:07:07 2020 +0800

    cx82310_eth: fix error return code in cx82310_bind()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: ca139d76b0d9 ("cx82310_eth: re-enable ethernet mode after router reboot")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605247627-15385-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/usb/cx82310_eth.c b/drivers/net/usb/cx82310_eth.c
index ca89d8258dd3..c4568a491dc4 100644
--- a/drivers/net/usb/cx82310_eth.c
+++ b/drivers/net/usb/cx82310_eth.c
@@ -197,7 +197,8 @@ static int cx82310_bind(struct usbnet *dev, struct usb_interface *intf)
 	}
 
 	/* enable ethernet mode (?) */
-	if (cx82310_enable_ethernet(dev))
+	ret = cx82310_enable_ethernet(dev);
+	if (ret)
 		goto err;
 
 	/* get the MAC address */
commit 9c87c9f41245baa3fc4716cf39141439cf405b01
Merge: a5698b3835f5 cc05af8e2e91
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 16 15:07:08 2020 -0800

    Merge tag 'arm-soc-fixes-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
    
    Pull ARM SoC fixes from Arnd Bergmann:
     "Around one third of the fixes this time are for dts files that list
      their ethernet controller as using 'phy-mode="rgmii"' but are changed
      to 'phy-mode="rgmii-id"' now, because the PHY drivers (realtek,
      ksz9031, dp83867, ...) now configure the internal delay based on that
      when they used to stay on the hardware default.
    
      The long story is archived at
    
        https://lore.kernel.org/netdev/CAMj1kXEEF_Un-4NTaD5iUN0NoZYaJQn-rPediX0S6oRiuVuW-A@mail.gmail.com/
    
      I was trying to hold off on the bugfixes until there was a solution
      that would avoid breaking all boards, but that does not seem to be
      happening any time soon, so I am now sending the correct version of
      the dts files to ensure that at least these machines can use their
      network devices again.
    
      The other changes this time are:
    
       - Updating the MAINTAINER lists for Allwinner and Samsung SoCs
    
       - Multiple i.MX8MN machines get updates for their CPU operating
         points to match the data sheet
    
       - A revert for a dts patch that caused a regression in USB support on
         Odroid U3
    
       - Two fixes for the AMD Tee driver, addressing a memory leak and
         missing locking
    
       - Mark the network subsystem on qoriq-fman3 as cache coherent for
         correctness as better performance.
    
       - Minor dts fixes elsewhere, addressing dtc warnings and similar
         problems"
    
    * tag 'arm-soc-fixes-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (48 commits)
      ARM: dts: exynos: revert "add input clock to CMU in Exynos4412 Odroid"
      ARM: dts: imx50-evk: Fix the chip select 1 IOMUX
      arm64: dts: imx8mm: fix voltage for 1.6GHz CPU operating point
      ARM: dts: stm32: Keep VDDA LDO1 always on on DHCOM
      ARM: dts: stm32: Enable thermal sensor support on stm32mp15xx-dhcor
      ARM: dts: stm32: Define VIO regulator supply on DHCOM
      ARM: dts: stm32: Fix LED5 on STM32MP1 DHCOM PDK2
      ARM: dts: stm32: Fix TA3-GPIO-C key on STM32MP1 DHCOM PDK2
      arm64: dts: renesas: r8a774e1: Add missing audio_clk_b
      tee: amdtee: synchronize access to shm list
      tee: amdtee: fix memory leak due to reset of global shm list
      arm64: dts: agilex/stratix10: Fix qspi node compatible
      ARM: dts: imx6q-prti6q: fix PHY address
      ARM: dts: vf610-zii-dev-rev-b: Fix MDIO over clocking
      arm: dts: imx6qdl-udoo: fix rgmii phy-mode for ksz9031 phy
      arm64: dts imx8mn: Remove non-existent USB OTG2
      arm64: dts: imx8mm-beacon-som: Fix Choppy BT audio
      arm64: dts: fsl: DPAA FMan DMA operations are coherent
      arm64: dts: fsl: fix endianness issue of rcpm
      arm64: dts: imx8mn-evk: fix missing PMIC's interrupt line pull-up
      ...

commit b5462cc377748181af2b05729c69f5faecec3717
Author: Zhang Xiaoxu <zhangxiaoxu5 at huawei.com>
Date:   Mon Nov 16 09:35:40 2020 -0500

    drm/i915/selftests: Fix wrong return value of perf_request_latency()
    
    If intel context create failed, the perf_request_latency() will return 0
    rather than error, because we doesn't initialize the return value.
    
    Fixes: 25c26f18ea79 ("drm/i915/selftests: Measure dispatch latency")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5 at huawei.com>
    Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201116143540.3648870-1-zhangxiaoxu5@huawei.com
    (cherry picked from commit 19384452052a1e0525e663bfbdd62ac1399bb647)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
index 480b3da4d8a6..e424a6d1a68c 100644
--- a/drivers/gpu/drm/i915/selftests/i915_request.c
+++ b/drivers/gpu/drm/i915/selftests/i915_request.c
@@ -2293,8 +2293,10 @@ static int perf_request_latency(void *arg)
 		struct intel_context *ce;
 
 		ce = intel_context_create(engine);
-		if (IS_ERR(ce))
+		if (IS_ERR(ce)) {
+			err = PTR_ERR(ce);
 			goto out;
+		}
 
 		err = intel_context_pin(ce);
 		if (err) {
commit 2106edbdfd15e37afa6c5225421b8036bf0e38ec
Author: Zhang Xiaoxu <zhangxiaoxu5 at huawei.com>
Date:   Mon Nov 16 09:41:12 2020 -0500

    drm/i915/selftests: Fix wrong return value of perf_series_engines()
    
    If intel context create failed, the perf_series_engines() will return 0
    rather than error, because we doesn't initialize the return value.
    
    Fixes: cbfd3a0c5a55 ("drm/i915/selftests: Add request throughput measurement to perf")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5 at huawei.com>
    Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201116144112.3673011-1-zhangxiaoxu5@huawei.com
    (cherry picked from commit 01d708840c26c9532579677eaca942363a009fd5)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
index 64bbb8288249..480b3da4d8a6 100644
--- a/drivers/gpu/drm/i915/selftests/i915_request.c
+++ b/drivers/gpu/drm/i915/selftests/i915_request.c
@@ -2467,8 +2467,10 @@ static int perf_series_engines(void *arg)
 		struct intel_context *ce;
 
 		ce = intel_context_create(engine);
-		if (IS_ERR(ce))
+		if (IS_ERR(ce)) {
+			err = PTR_ERR(ce);
 			goto out;
+		}
 
 		err = intel_context_pin(ce);
 		if (err) {
commit 973dd87fa56ac943ce1060fd07244d7652115164
Author: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Date:   Fri Nov 13 13:25:10 2020 +0000

    drm/i915: Avoid memory leak with more than 16 workarounds on a list
    
    I forgot to free the old list when growing past 16 entries.
    
    Luckily, as much as I checked, none of the current platforms has more than
    16 workarounds on a single list.
    
    Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Fixes: 452420d22d5b ("drm/i915: Fuse per-context workaround handling with the common framework")
    Reported-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201113132510.2298483-1-tvrtko.ursulin@linux.intel.com
    (cherry picked from commit 77c296966e866a795742a46fc52a218771894867)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
index 6c580d0d9ea8..4a3bde7c9f21 100644
--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
@@ -131,8 +131,10 @@ static void _wa_add(struct i915_wa_list *wal, const struct i915_wa *wa)
 			return;
 		}
 
-		if (wal->list)
+		if (wal->list) {
 			memcpy(list, wal->list, sizeof(*wa) * wal->count);
+			kfree(wal->list);
+		}
 
 		wal->list = list;
 	}
commit 85a12d7eb8fe449cf38f1aa9ead5ca744729a98f
Author: Rodrigo Vivi <rodrigo.vivi at intel.com>
Date:   Wed Nov 11 09:09:36 2020 -0500

    drm/i915/tgl: Fix Media power gate sequence.
    
    Some media power gates are disabled by default. commit 5d86923060fc
    ("drm/i915/tgl: Enable VD HCP/MFX sub-pipe power gating")
    tried to enable it, but it duplicated an existent register.
    So, the main PG setup sequences ended up overwriting it.
    
    So, let's now merge this to the main PG setup sequence.
    
    v2: (Chris): s/BIT/REG_BIT, remove useless comment,
                 remove useless =0, use the right gt,
                 remove rc6 sequence doubt from commit message.
    
    Fixes: 5d86923060fc ("drm/i915/tgl: Enable VD HCP/MFX sub-pipe power gating")
    Cc: Lucas De Marchi <lucas.demarchi at intel.com>
    Cc: stable at vger.kernel.org#v5.5+
    Cc: Dale B Stimson <dale.b.stimson at intel.com>
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Cc: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201111072859.1186070-1-rodrigo.vivi@intel.com
    (cherry picked from commit 695dc55b573985569259e18f8e6261a77924342b)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_rc6.c b/drivers/gpu/drm/i915/gt/intel_rc6.c
index ab675d35030d..d7b8e4457fc2 100644
--- a/drivers/gpu/drm/i915/gt/intel_rc6.c
+++ b/drivers/gpu/drm/i915/gt/intel_rc6.c
@@ -56,9 +56,12 @@ static inline void set(struct intel_uncore *uncore, i915_reg_t reg, u32 val)
 
 static void gen11_rc6_enable(struct intel_rc6 *rc6)
 {
-	struct intel_uncore *uncore = rc6_to_uncore(rc6);
+	struct intel_gt *gt = rc6_to_gt(rc6);
+	struct intel_uncore *uncore = gt->uncore;
 	struct intel_engine_cs *engine;
 	enum intel_engine_id id;
+	u32 pg_enable;
+	int i;
 
 	/* 2b: Program RC6 thresholds.*/
 	set(uncore, GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16 | 85);
@@ -102,10 +105,19 @@ static void gen11_rc6_enable(struct intel_rc6 *rc6)
 		GEN6_RC_CTL_RC6_ENABLE |
 		GEN6_RC_CTL_EI_MODE(1);
 
-	set(uncore, GEN9_PG_ENABLE,
-	    GEN9_RENDER_PG_ENABLE |
-	    GEN9_MEDIA_PG_ENABLE |
-	    GEN11_MEDIA_SAMPLER_PG_ENABLE);
+	pg_enable =
+		GEN9_RENDER_PG_ENABLE |
+		GEN9_MEDIA_PG_ENABLE |
+		GEN11_MEDIA_SAMPLER_PG_ENABLE;
+
+	if (INTEL_GEN(gt->i915) >= 12) {
+		for (i = 0; i < I915_MAX_VCS; i++)
+			if (HAS_ENGINE(gt, _VCS(i)))
+				pg_enable |= (VDN_HCP_POWERGATE_ENABLE(i) |
+					      VDN_MFX_POWERGATE_ENABLE(i));
+	}
+
+	set(uncore, GEN9_PG_ENABLE, pg_enable);
 }
 
 static void gen9_rc6_enable(struct intel_rc6 *rc6)
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index d805d4da6181..664f3bf9af03 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -8971,10 +8971,6 @@ enum {
 #define   GEN9_PWRGT_MEDIA_STATUS_MASK		(1 << 0)
 #define   GEN9_PWRGT_RENDER_STATUS_MASK		(1 << 1)
 
-#define POWERGATE_ENABLE			_MMIO(0xa210)
-#define    VDN_HCP_POWERGATE_ENABLE(n)		BIT(((n) * 2) + 3)
-#define    VDN_MFX_POWERGATE_ENABLE(n)		BIT(((n) * 2) + 4)
-
 #define  GTFIFODBG				_MMIO(0x120000)
 #define    GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV	(0x1f << 20)
 #define    GT_FIFO_FREE_ENTRIES_CHV		(0x7f << 13)
@@ -9114,9 +9110,11 @@ enum {
 #define GEN9_MEDIA_PG_IDLE_HYSTERESIS		_MMIO(0xA0C4)
 #define GEN9_RENDER_PG_IDLE_HYSTERESIS		_MMIO(0xA0C8)
 #define GEN9_PG_ENABLE				_MMIO(0xA210)
-#define GEN9_RENDER_PG_ENABLE			REG_BIT(0)
-#define GEN9_MEDIA_PG_ENABLE			REG_BIT(1)
-#define GEN11_MEDIA_SAMPLER_PG_ENABLE		REG_BIT(2)
+#define   GEN9_RENDER_PG_ENABLE			REG_BIT(0)
+#define   GEN9_MEDIA_PG_ENABLE			REG_BIT(1)
+#define   GEN11_MEDIA_SAMPLER_PG_ENABLE		REG_BIT(2)
+#define   VDN_HCP_POWERGATE_ENABLE(n)		REG_BIT(3 + 2 * (n))
+#define   VDN_MFX_POWERGATE_ENABLE(n)		REG_BIT(4 + 2 * (n))
 #define GEN8_PUSHBUS_CONTROL			_MMIO(0xA248)
 #define GEN8_PUSHBUS_ENABLE			_MMIO(0xA250)
 #define GEN8_PUSHBUS_SHIFT			_MMIO(0xA25C)
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 34e0d22d456b..cfb806767fc5 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7118,23 +7118,10 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
 
 static void tgl_init_clock_gating(struct drm_i915_private *dev_priv)
 {
-	u32 vd_pg_enable = 0;
-	unsigned int i;
-
 	/* Wa_1409120013:tgl */
 	I915_WRITE(ILK_DPFC_CHICKEN,
 		   ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL);
 
-	/* This is not a WA. Enable VD HCP & MFX_ENC powergate */
-	for (i = 0; i < I915_MAX_VCS; i++) {
-		if (HAS_ENGINE(&dev_priv->gt, _VCS(i)))
-			vd_pg_enable |= VDN_HCP_POWERGATE_ENABLE(i) |
-					VDN_MFX_POWERGATE_ENABLE(i);
-	}
-
-	I915_WRITE(POWERGATE_ENABLE,
-		   I915_READ(POWERGATE_ENABLE) | vd_pg_enable);
-
 	/* Wa_1409825376:tgl (pre-prod)*/
 	if (IS_TGL_DISP_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_B1))
 		I915_WRITE(GEN9_CLKGATE_DIS_3, I915_READ(GEN9_CLKGATE_DIS_3) |
commit a5698b3835f5990deef30fa5397cae563af3c68a
Merge: a08f4523243c 92e4dc8b0566
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 16 15:02:33 2020 -0800

    Merge tag 'hyperv-fixes-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux
    
    Pull Hyper-V fix from Wei Liu:
     "One patch from Chris to fix kexec on Hyper-V"
    
    * tag 'hyperv-fixes-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux:
      Drivers: hv: vmbus: Allow cleanup of VMBUS_CONNECT_CPU if disconnected

commit a08f4523243c86fe35dec8c81c5ec50f721004ce
Merge: 09162bc32c88 efd838fec17b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 16 14:58:23 2020 -0800

    Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
    
    Pull vhost fixes from Michael Tsirkin:
     "Fixes all over the place, most notably vhost scsi IO error fixes"
    
    * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost:
      vhost scsi: Add support for LUN resets.
      vhost scsi: add lun parser helper
      vhost scsi: fix cmd completion race
      vhost scsi: alloc cmds per vq instead of session
      vhost: add helper to check if a vq has been setup
      vdpasim: fix "mac_pton" undefined error
      swiotlb: using SIZE_MAX needs limits.h included

commit 794e442ca39e6c8d46003c430559bdb67a73690c
Author: Raju Rangoju <rajur at chelsio.com>
Date:   Mon Nov 16 16:13:22 2020 +0530

    MAINTAINERS: update cxgb4 and cxgb3 maintainer
    
    Update cxgb4 and cxgb3 driver maintainer
    
    Signed-off-by: Raju Rangoju <rajur at chelsio.com>
    Link: https://lore.kernel.org/r/20201116104322.3959-1-rajur@chelsio.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index e0144f396462..8cb1aae96bdf 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4710,7 +4710,7 @@ T:	git git://linuxtv.org/anttip/media_tree.git
 F:	drivers/media/dvb-frontends/cxd2820r*
 
 CXGB3 ETHERNET DRIVER (CXGB3)
-M:	Vishal Kulkarni <vishal at chelsio.com>
+M:	Raju Rangoju <rajur at chelsio.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.chelsio.com
@@ -4742,7 +4742,7 @@ W:	http://www.chelsio.com
 F:	drivers/net/ethernet/chelsio/inline_crypto/
 
 CXGB4 ETHERNET DRIVER (CXGB4)
-M:	Vishal Kulkarni <vishal at chelsio.com>
+M:	Raju Rangoju <rajur at chelsio.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.chelsio.com
@@ -4764,7 +4764,7 @@ F:	drivers/infiniband/hw/cxgb4/
 F:	include/uapi/rdma/cxgb4-abi.h
 
 CXGB4VF ETHERNET DRIVER (CXGB4VF)
-M:	Vishal Kulkarni <vishal at gmail.com>
+M:	Raju Rangoju <rajur at chelsio.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.chelsio.com
commit c1609f0e2882095408708a80693e298a90f17904
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Mon Nov 16 10:10:52 2020 -0500

    drm/amdgpu: remove experimental flag from arcturus
    
    This has been stable for a while.
    
    Reviewed-by: Hawking Zhang <Hawking.Zhang at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 42d9748921f5..8e988f07f085 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1055,10 +1055,10 @@ static const struct pci_device_id pciidlist[] = {
 	{0x1002, 0x15dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
 	{0x1002, 0x15d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
 	/* Arcturus */
-	{0x1002, 0x738C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
-	{0x1002, 0x7388, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
-	{0x1002, 0x738E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
-	{0x1002, 0x7390, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
+	{0x1002, 0x738C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
+	{0x1002, 0x7388, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
+	{0x1002, 0x738E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
+	{0x1002, 0x7390, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
 	/* Navi10 */
 	{0x1002, 0x7310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
 	{0x1002, 0x7312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
commit 2a1828e378c1b5ba1ff283ed8f8c5cc37bb391dc
Author: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
Date:   Sun Nov 15 17:57:57 2020 +0100

    net: lantiq: Wait for the GPHY firmware to be ready
    
    A user reports (slightly shortened from the original message):
      libphy: lantiq,xrx200-mdio: probed
      mdio_bus 1e108000.switch-mii: MDIO device at address 17 is missing.
      gswip 1e108000.switch lan: no phy at 2
      gswip 1e108000.switch lan: failed to connect to port 2: -19
      lantiq,xrx200-net 1e10b308.eth eth0: error -19 setting up slave phy
    
    This is a single-port board using the internal Fast Ethernet PHY. The
    user reports that switching to PHY scanning instead of configuring the
    PHY within device-tree works around this issue.
    
    The documentation for the standalone variant of the PHY11G (which is
    probably very similar to what is used inside the xRX200 SoCs but having
    the firmware burnt onto that standalone chip in the factory) states that
    the PHY needs 300ms to be ready for MDIO communication after releasing
    the reset.
    
    Add a 300ms delay after initializing all GPHYs to ensure that the GPHY
    firmware had enough time to initialize and to appear on the MDIO bus.
    Unfortunately there is no (known) documentation on what the minimum time
    to wait after releasing the reset on an internal PHY so play safe and
    take the one for the external variant. Only wait after the last GPHY
    firmware is loaded to not slow down the initialization too much (
    xRX200 has two GPHYs but newer SoCs have at least three GPHYs).
    
    Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
    Reviewed-by: Andrew Lunn <andrew at lunn.ch>
    Signed-off-by: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
    Acked-by: Hauke Mehrtens <hauke at hauke-m.de>
    Reviewed-by: Florian Fainelli <f.fainelli at gmail.com>
    Link: https://lore.kernel.org/r/20201115165757.552641-1-martin.blumenstingl@googlemail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c
index 74db81dafee3..09701c17f3f6 100644
--- a/drivers/net/dsa/lantiq_gswip.c
+++ b/drivers/net/dsa/lantiq_gswip.c
@@ -26,6 +26,7 @@
  */
 
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/etherdevice.h>
 #include <linux/firmware.h>
 #include <linux/if_bridge.h>
@@ -1837,6 +1838,16 @@ static int gswip_gphy_fw_list(struct gswip_priv *priv,
 		i++;
 	}
 
+	/* The standalone PHY11G requires 300ms to be fully
+	 * initialized and ready for any MDIO communication after being
+	 * taken out of reset. For the SoC-internal GPHY variant there
+	 * is no (known) documentation for the minimum time after a
+	 * reset. Use the same value as for the standalone variant as
+	 * some users have reported internal PHYs not being detected
+	 * without any delay.
+	 */
+	msleep(300);
+
 	return 0;
 
 remove_gphy:
commit 2acc3c1bc8e98bc66b1badec42e9ea205b4fcdaa
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Mon Nov 16 18:16:33 2020 +0800

    selftests/bpf: Fix error return code in run_getsockopt_test()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 65b4414a05eb ("selftests/bpf: add sockopt test that exercises BPF_F_ALLOW_MULTI")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Link: https://lore.kernel.org/bpf/20201116101633.64627-1-wanghai38@huawei.com

diff --git a/tools/testing/selftests/bpf/prog_tests/sockopt_multi.c b/tools/testing/selftests/bpf/prog_tests/sockopt_multi.c
index 29188d6f5c8d..51fac975b316 100644
--- a/tools/testing/selftests/bpf/prog_tests/sockopt_multi.c
+++ b/tools/testing/selftests/bpf/prog_tests/sockopt_multi.c
@@ -138,7 +138,8 @@ static int run_getsockopt_test(struct bpf_object *obj, int cg_parent,
 	 */
 
 	buf = 0x40;
-	if (setsockopt(sock_fd, SOL_IP, IP_TOS, &buf, 1) < 0) {
+	err = setsockopt(sock_fd, SOL_IP, IP_TOS, &buf, 1);
+	if (err < 0) {
 		log_err("Failed to call setsockopt(IP_TOS)");
 		goto detach;
 	}
commit 0abed7c69b956d135cb6d320c350b2adb213e7d8
Author: Jens Axboe <axboe at kernel.dk>
Date:   Mon Nov 16 13:36:24 2020 -0700

    mm: never attempt async page lock if we've transferred data already
    
    We catch the case where we enter generic_file_buffered_read() with data
    already transferred, but we also need to be careful not to allow an async
    page lock if we're looping transferring data. If not, we could be
    returning -EIOCBQUEUED instead of the transferred amount, and it could
    result in double waitqueue additions as well.
    
    Cc: stable at vger.kernel.org # v5.9
    Fixes: 1a0a7853b901 ("mm: support async buffered reads in generic_file_buffered_read()")
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/mm/filemap.c b/mm/filemap.c
index d5e7c2029d16..3ebbe64a0106 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2347,10 +2347,15 @@ page_ok:
 
 page_not_up_to_date:
 		/* Get exclusive access to the page ... */
-		if (iocb->ki_flags & IOCB_WAITQ)
+		if (iocb->ki_flags & IOCB_WAITQ) {
+			if (written) {
+				put_page(page);
+				goto out;
+			}
 			error = lock_page_async(page, iocb->ki_waitq);
-		else
+		} else {
 			error = lock_page_killable(page);
+		}
 		if (unlikely(error))
 			goto readpage_error;
 
@@ -2393,10 +2398,15 @@ readpage:
 		}
 
 		if (!PageUptodate(page)) {
-			if (iocb->ki_flags & IOCB_WAITQ)
+			if (iocb->ki_flags & IOCB_WAITQ) {
+				if (written) {
+					put_page(page);
+					goto out;
+				}
 				error = lock_page_async(page, iocb->ki_waitq);
-			else
+			} else {
 				error = lock_page_killable(page);
+			}
 
 			if (unlikely(error))
 				goto readpage_error;
commit 1072460a1aabacf6ececda98acd3b5ecaad23fd2
Author: Cezary Rojewski <cezary.rojewski at intel.com>
Date:   Mon Nov 16 14:33:29 2020 +0100

    ASoC: Intel: catpt: Correct clock selection for dai trigger
    
    During stream start DSP firmware requires LPCS disabled as that moment in
    time is resource heavy. Currently high-clock is selected on start of
    second stream onwards while low-clock is re-selected before stream
    actually leaves RESUME state i.e. PAUSE_STREAM call. Fix this by always
    updating clock before RESUME_STREAM and directly after PAUSE_STREAM.
    
    Fixes: a126750fc865 ("ASoC: Intel: catpt: PCM operations")
    Signed-off-by: Cezary Rojewski <cezary.rojewski at intel.com>
    Link: https://lore.kernel.org/r/20201116133332.8530-3-cezary.rojewski@intel.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/intel/catpt/pcm.c b/sound/soc/intel/catpt/pcm.c
index 174a786cd776..2061978b6cb9 100644
--- a/sound/soc/intel/catpt/pcm.c
+++ b/sound/soc/intel/catpt/pcm.c
@@ -458,10 +458,6 @@ static int catpt_dai_prepare(struct snd_pcm_substream *substream,
 	if (ret)
 		return CATPT_IPC_ERROR(ret);
 
-	ret = catpt_dsp_update_lpclock(cdev);
-	if (ret)
-		return ret;
-
 	ret = catpt_dai_apply_usettings(dai, stream);
 	if (ret)
 		return ret;
@@ -500,6 +496,7 @@ static int catpt_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 	case SNDRV_PCM_TRIGGER_RESUME:
 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 	resume_stream:
+		catpt_dsp_update_lpclock(cdev);
 		ret = catpt_ipc_resume_stream(cdev, stream->info.stream_hw_id);
 		if (ret)
 			return CATPT_IPC_ERROR(ret);
@@ -507,11 +504,11 @@ static int catpt_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 
 	case SNDRV_PCM_TRIGGER_STOP:
 		stream->prepared = false;
-		catpt_dsp_update_lpclock(cdev);
 		fallthrough;
 	case SNDRV_PCM_TRIGGER_SUSPEND:
 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 		ret = catpt_ipc_pause_stream(cdev, stream->info.stream_hw_id);
+		catpt_dsp_update_lpclock(cdev);
 		if (ret)
 			return CATPT_IPC_ERROR(ret);
 		break;
commit aa9e3fa4992d83acb7311fc86d11d0d53e7ffb8e
Author: Cezary Rojewski <cezary.rojewski at intel.com>
Date:   Mon Nov 16 14:33:28 2020 +0100

    ASoC: Intel: catpt: Skip position update for unprepared streams
    
    Playing with very low period sizes may lead to timeouts when awaiting
    RESET_STREAM reply for offload streams. This is caused by NOTIFY_POSITION
    appearing in the middle of trigger(stop).
    
    Stream is unprepared during trigger(stop) where PAUSE_STREAM IPC gets
    invoked. However, all data that is already mixed in DSP firmware's mixer
    stream will still be played regardless of the pause. For offload streams,
    this means possibility for another NOTIFY_POSITION to process. Keep these
    notifications in check by only handling them when stream is in prepared
    state.
    
    Fixes: a126750fc865 ("ASoC: Intel: catpt: PCM operations")
    Signed-off-by: Cezary Rojewski <cezary.rojewski at intel.com>
    Link: https://lore.kernel.org/r/20201116133332.8530-2-cezary.rojewski@intel.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/intel/catpt/pcm.c b/sound/soc/intel/catpt/pcm.c
index f78018c857b8..174a786cd776 100644
--- a/sound/soc/intel/catpt/pcm.c
+++ b/sound/soc/intel/catpt/pcm.c
@@ -534,6 +534,8 @@ void catpt_stream_update_position(struct catpt_dev *cdev,
 
 	dsppos = bytes_to_frames(r, pos->stream_position);
 
+	if (!stream->prepared)
+		goto exit;
 	/* only offload is set_write_pos driven */
 	if (stream->template->type != CATPT_STRM_TYPE_RENDER)
 		goto exit;
commit ac9978fcad3c5abc43cdd225441ce9459c36e16b
Author: Zhihao Cheng <chengzhihao1 at huawei.com>
Date:   Mon Nov 16 22:18:36 2020 +0800

    spi: cadence-quadspi: Fix error return code in cqspi_probe
    
    Fix to return the error code from
    devm_reset_control_get_optional_exclusive() instaed of 0
    in cqspi_probe().
    
    Fixes: 31fb632b5d43ca ("spi: Move cadence-quadspi driver to drivers/spi/")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhihao Cheng <chengzhihao1 at huawei.com>
    Reviewed-by: Philipp Zabel <p.zabel at pengutronix.de>
    Link: https://lore.kernel.org/r/20201116141836.2970579-1-chengzhihao1@huawei.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c
index 40938cf3806d..ba7d40c2922f 100644
--- a/drivers/spi/spi-cadence-quadspi.c
+++ b/drivers/spi/spi-cadence-quadspi.c
@@ -1260,12 +1260,14 @@ static int cqspi_probe(struct platform_device *pdev)
 	/* Obtain QSPI reset control */
 	rstc = devm_reset_control_get_optional_exclusive(dev, "qspi");
 	if (IS_ERR(rstc)) {
+		ret = PTR_ERR(rstc);
 		dev_err(dev, "Cannot get QSPI reset.\n");
 		goto probe_reset_failed;
 	}
 
 	rstc_ocp = devm_reset_control_get_optional_exclusive(dev, "qspi-ocp");
 	if (IS_ERR(rstc_ocp)) {
+		ret = PTR_ERR(rstc_ocp);
 		dev_err(dev, "Cannot get QSPI OCP reset.\n");
 		goto probe_reset_failed;
 	}
commit bd6327fda2f3ded85b69b3c3125c99aaa51c7881
Author: Srinivasa Rao Mandadapu <srivasam at codeaurora.org>
Date:   Sun Nov 15 10:26:50 2020 +0530

    ASoC: qcom: lpass-platform: Fix memory leak
    
    lpass_pcm_data is not freed in error paths. Free it in
    error paths to avoid memory leak.
    
    Fixes: 022d00ee0b55 ("ASoC: lpass-platform: Fix broken pcm data usage")
    Signed-off-by: Pavel Machek <pavel at ucw.cz>
    Signed-off-by: V Sujith Kumar Reddy <vsujithk at codeaurora.org>
    Signed-off-by: Srinivasa Rao Mandadapu <srivasam at codeaurora.org>
    Link: https://lore.kernel.org/r/1605416210-14530-1-git-send-email-srivasam@codeaurora.org
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c
index 36d1512ffd1f..7a3fdf89968a 100644
--- a/sound/soc/qcom/lpass-platform.c
+++ b/sound/soc/qcom/lpass-platform.c
@@ -122,8 +122,10 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
 	else
 		dma_ch = 0;
 
-	if (dma_ch < 0)
+	if (dma_ch < 0) {
+		kfree(data);
 		return dma_ch;
+	}
 
 	if (cpu_dai->driver->id == LPASS_DP_RX) {
 		map = drvdata->hdmiif_map;
@@ -147,6 +149,7 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
 	ret = snd_pcm_hw_constraint_integer(runtime,
 			SNDRV_PCM_HW_PARAM_PERIODS);
 	if (ret < 0) {
+		kfree(data);
 		dev_err(soc_runtime->dev, "setting constraints failed: %d\n",
 			ret);
 		return -EINVAL;
commit 1bd7b0fc0165694897b7d2fb39751a07b98f6bf1
Author: Michael Sit Wei Hong <michael.wei.hong.sit at intel.com>
Date:   Mon Nov 16 14:19:01 2020 +0800

    ASoC: Intel: KMB: Fix S24_LE configuration
    
    S24_LE is 24 bit audio in 32 bit container configuration
    Fixing the configuration to match the data arrangement of
    this audio format.
    
    Fixes: c5477e966728 ("ASoC: Intel: Add KeemBay platform driver")
    
    Signed-off-by: Michael Sit Wei Hong <michael.wei.hong.sit at intel.com>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
    Link: https://lore.kernel.org/r/20201116061905.32431-2-michael.wei.hong.sit@intel.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/intel/keembay/kmb_platform.c b/sound/soc/intel/keembay/kmb_platform.c
index f54b710ee1c2..291a686568c2 100644
--- a/sound/soc/intel/keembay/kmb_platform.c
+++ b/sound/soc/intel/keembay/kmb_platform.c
@@ -487,9 +487,9 @@ static int kmb_dai_hw_params(struct snd_pcm_substream *substream,
 		kmb_i2s->xfer_resolution = 0x02;
 		break;
 	case SNDRV_PCM_FORMAT_S24_LE:
-		config->data_width = 24;
-		kmb_i2s->ccr = 0x08;
-		kmb_i2s->xfer_resolution = 0x04;
+		config->data_width = 32;
+		kmb_i2s->ccr = 0x14;
+		kmb_i2s->xfer_resolution = 0x05;
 		break;
 	case SNDRV_PCM_FORMAT_S32_LE:
 		config->data_width = 32;
commit 854c57f02bc718b0653bc467073b4541b8155a36
Author: Ashish Kalra <ashish.kalra at amd.com>
Date:   Tue Nov 10 22:42:05 2020 +0000

    KVM: SVM: Fix offset computation bug in __sev_dbg_decrypt().
    
    Fix offset computation in __sev_dbg_decrypt() to include the
    source paddr before it is rounded down to be aligned to 16 bytes
    as required by SEV API. This fixes incorrect guest memory dumps
    observed when using qemu monitor.
    
    Signed-off-by: Ashish Kalra <ashish.kalra at amd.com>
    Message-Id: <20201110224205.29444-1-Ashish.Kalra at amd.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
index c0b14106258a..566f4d18185b 100644
--- a/arch/x86/kvm/svm/sev.c
+++ b/arch/x86/kvm/svm/sev.c
@@ -642,8 +642,8 @@ static int __sev_dbg_decrypt(struct kvm *kvm, unsigned long src_paddr,
 	 * Its safe to read more than we are asked, caller should ensure that
 	 * destination has enough space.
 	 */
-	src_paddr = round_down(src_paddr, 16);
 	offset = src_paddr & 15;
+	src_paddr = round_down(src_paddr, 16);
 	sz = round_up(sz + offset, 16);
 
 	return __sev_issue_dbg_cmd(kvm, src_paddr, dst_paddr, sz, err, false);
commit 728321e53045d2668bf2b8627a8d61bc2c480d3b
Author: Alex Deucher <alexander.deucher at amd.com>
Date:   Fri Nov 13 02:21:19 2020 -0500

    drm/amd/display: Add missing pflip irq for dcn2.0
    
    If we have more than 4 displays we will run
    into dummy irq calls or flip timout issues.
    
    Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/gpu/drm/amd/display/dc/irq/dcn20/irq_service_dcn20.c b/drivers/gpu/drm/amd/display/dc/irq/dcn20/irq_service_dcn20.c
index 2a1fea501f8c..3f1e7a196a23 100644
--- a/drivers/gpu/drm/amd/display/dc/irq/dcn20/irq_service_dcn20.c
+++ b/drivers/gpu/drm/amd/display/dc/irq/dcn20/irq_service_dcn20.c
@@ -299,8 +299,8 @@ irq_source_info_dcn20[DAL_IRQ_SOURCES_NUMBER] = {
 	pflip_int_entry(1),
 	pflip_int_entry(2),
 	pflip_int_entry(3),
-	[DC_IRQ_SOURCE_PFLIP5] = dummy_irq_entry(),
-	[DC_IRQ_SOURCE_PFLIP6] = dummy_irq_entry(),
+	pflip_int_entry(4),
+	pflip_int_entry(5),
 	[DC_IRQ_SOURCE_PFLIP_UNDERLAY0] = dummy_irq_entry(),
 	gpio_pad_int_entry(0),
 	gpio_pad_int_entry(1),
commit 4fba15fbb8106e8db17f486d653484e64969eb87
Author: Aili Yao <yaoaili at kingsoft.com>
Date:   Tue Nov 10 00:33:34 2020 -0800

    ACPI, APEI, Fix error return value in apei_map_generic_address()
    
    From commit 6915564dc5a8 ("ACPI: OSL: Change the type of
    acpi_os_map_generic_address() return value"),
    acpi_os_map_generic_address() will return logical address or NULL
    for error, but for ACPI_ADR_SPACE_SYSTEM_IO case, it should be also
    return 0 as it's a normal case, but now it will return -ENXIO.
    
    So check it out for such case to avoid einj module initialization
    fail.
    
    Fixes: 6915564dc5a8 ("ACPI: OSL: Change the type of acpi_os_map_generic_address() return value")
    Cc: <stable at vger.kernel.org>
    Reviewed-by: James Morse <james.morse at arm.com>
    Tested-by: Tony Luck <tony.luck at intel.com>
    Signed-off-by: Aili Yao <yaoaili at kingsoft.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/apei/apei-base.c b/drivers/acpi/apei/apei-base.c
index 552fd9ffaca4..3294cc8dc073 100644
--- a/drivers/acpi/apei/apei-base.c
+++ b/drivers/acpi/apei/apei-base.c
@@ -633,6 +633,10 @@ int apei_map_generic_address(struct acpi_generic_address *reg)
 	if (rc)
 		return rc;
 
+	/* IO space doesn't need mapping */
+	if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO)
+		return 0;
+
 	if (!acpi_os_map_generic_address(reg))
 		return -ENXIO;
 
commit 857524564eae8aefc3006a3d35139bb69ca53210
Author: Xie He <xie.he.0141 at gmail.com>
Date:   Sat Nov 14 03:10:29 2020 -0800

    MAINTAINERS: Add Martin Schiller as a maintainer for the X.25 stack
    
    Martin Schiller is an active developer and reviewer for the X.25 code.
    His company is providing products based on the Linux X.25 stack.
    So he is a good candidate for maintainers of the X.25 code.
    
    The original maintainer of the X.25 network layer (Andrew Hendry) has
    not sent any email to the netdev mail list since 2013. So he is probably
    inactive now.
    
    Cc: Andrew Hendry <andrew.hendry at gmail.com>
    Signed-off-by: Xie He <xie.he.0141 at gmail.com>
    Acked-by: Martin Schiller <ms at dev.tdt.de>
    Link: https://lore.kernel.org/r/20201114111029.326972-1-xie.he.0141@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index 4a34b25ecc1f..e0144f396462 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9843,13 +9843,6 @@ S:	Maintained
 F:	arch/mips/lantiq
 F:	drivers/soc/lantiq
 
-LAPB module
-L:	linux-x25 at vger.kernel.org
-S:	Orphan
-F:	Documentation/networking/lapb-module.rst
-F:	include/*/lapb.h
-F:	net/lapb/
-
 LASI 53c700 driver for PARISC
 M:	"James E.J. Bottomley" <James.Bottomley at HansenPartnership.com>
 L:	linux-scsi at vger.kernel.org
@@ -18998,12 +18991,18 @@ L:	linux-kernel at vger.kernel.org
 S:	Maintained
 N:	axp[128]
 
-X.25 NETWORK LAYER
-M:	Andrew Hendry <andrew.hendry at gmail.com>
+X.25 STACK
+M:	Martin Schiller <ms at dev.tdt.de>
 L:	linux-x25 at vger.kernel.org
-S:	Odd Fixes
+S:	Maintained
+F:	Documentation/networking/lapb-module.rst
 F:	Documentation/networking/x25*
+F:	drivers/net/wan/hdlc_x25.c
+F:	drivers/net/wan/lapbether.c
+F:	include/*/lapb.h
 F:	include/net/x25*
+F:	include/uapi/linux/x25.h
+F:	net/lapb/
 F:	net/x25/
 
 X86 ARCHITECTURE (32-BIT AND 64-BIT)
commit d4d3c84d77e3dac68efecebdf488af8f4e156611
Merge: c887c9b9ca62 6cbf1e960fa5
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Mon Nov 16 13:18:22 2020 -0500

    Merge tag 'kvm-s390-master-5.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into kvm-master
    
    KVM: s390: Fixes for 5.10
    
    - do not reset the global diag318 data for per-cpu reset
    - do not mark memory as protected too early

commit 9d9e937b1c8be97b424e3e11938e183fcde905c0
Author: Georg Kohmann <geokohma at cisco.com>
Date:   Wed Nov 11 12:50:25 2020 +0100

    ipv6/netfilter: Discard first fragment not including all headers
    
    Packets are processed even though the first fragment don't include all
    headers through the upper layer header. This breaks TAHI IPv6 Core
    Conformance Test v6LC.1.3.6.
    
    Referring to RFC8200 SECTION 4.5: "If the first fragment does not include
    all headers through an Upper-Layer header, then that fragment should be
    discarded and an ICMP Parameter Problem, Code 3, message should be sent to
    the source of the fragment, with the Pointer field set to zero."
    
    The fragment needs to be validated the same way it is done in
    commit 2efdaaaf883a ("IPv6: reply ICMP error if the first fragment don't
    include all headers") for ipv6. Wrap the validation into a common function,
    ipv6_frag_thdr_truncated() to check for truncation in the upper layer
    header. This validation does not fullfill all aspects of RFC 8200,
    section 4.5, but is at the moment sufficient to pass mentioned TAHI test.
    
    In netfilter, utilize the fragment offset returned by find_prev_fhdr() to
    let ipv6_frag_thdr_truncated() start it's traverse from the fragment
    header.
    
    Return 0 to drop the fragment in the netfilter. This is the same behaviour
    as used on other protocol errors in this function, e.g. when
    nf_ct_frag6_queue() returns -EPROTO. The Fragment will later be picked up
    by ipv6_frag_rcv() in reassembly.c. ipv6_frag_rcv() will then send an
    appropriate ICMP Parameter Problem message back to the source.
    
    References commit 2efdaaaf883a ("IPv6: reply ICMP error if the first
    fragment don't include all headers")
    
    Signed-off-by: Georg Kohmann <geokohma at cisco.com>
    Acked-by: Pablo Neira Ayuso <pablo at netfilter.org>
    Link: https://lore.kernel.org/r/20201111115025.28879-1-geokohma@cisco.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index bd1f396cc9c7..637cc6dd12b7 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -1064,6 +1064,8 @@ int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
 
 bool ipv6_ext_hdr(u8 nexthdr);
 
+bool ipv6_frag_thdr_truncated(struct sk_buff *skb, int start, u8 *nexthdrp);
+
 enum {
 	IP6_FH_F_FRAG		= (1 << 0),
 	IP6_FH_F_AUTH		= (1 << 1),
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
index 054d287eb13d..b9cc0b330dbe 100644
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
@@ -440,6 +440,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)
 int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
 {
 	u16 savethdr = skb->transport_header;
+	u8 nexthdr = NEXTHDR_FRAGMENT;
 	int fhoff, nhoff, ret;
 	struct frag_hdr *fhdr;
 	struct frag_queue *fq;
@@ -455,6 +456,14 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
 	if (find_prev_fhdr(skb, &prevhdr, &nhoff, &fhoff) < 0)
 		return 0;
 
+	/* Discard the first fragment if it does not include all headers
+	 * RFC 8200, Section 4.5
+	 */
+	if (ipv6_frag_thdr_truncated(skb, fhoff, &nexthdr)) {
+		pr_debug("Drop incomplete fragment\n");
+		return 0;
+	}
+
 	if (!pskb_may_pull(skb, fhoff + sizeof(*fhdr)))
 		return -ENOMEM;
 
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index c8cf1bbad74a..e3869bac9c88 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -318,15 +318,43 @@ out_fail:
 	return -1;
 }
 
+/* Check if the upper layer header is truncated in the first fragment. */
+bool ipv6_frag_thdr_truncated(struct sk_buff *skb, int start, u8 *nexthdrp)
+{
+	u8 nexthdr = *nexthdrp;
+	__be16 frag_off;
+	int offset;
+
+	offset = ipv6_skip_exthdr(skb, start, &nexthdr, &frag_off);
+	if (offset < 0 || (frag_off & htons(IP6_OFFSET)))
+		return false;
+	switch (nexthdr) {
+	case NEXTHDR_TCP:
+		offset += sizeof(struct tcphdr);
+		break;
+	case NEXTHDR_UDP:
+		offset += sizeof(struct udphdr);
+		break;
+	case NEXTHDR_ICMP:
+		offset += sizeof(struct icmp6hdr);
+		break;
+	default:
+		offset += 1;
+	}
+	if (offset > skb->len)
+		return true;
+	return false;
+}
+EXPORT_SYMBOL(ipv6_frag_thdr_truncated);
+
 static int ipv6_frag_rcv(struct sk_buff *skb)
 {
 	struct frag_hdr *fhdr;
 	struct frag_queue *fq;
 	const struct ipv6hdr *hdr = ipv6_hdr(skb);
 	struct net *net = dev_net(skb_dst(skb)->dev);
-	__be16 frag_off;
-	int iif, offset;
 	u8 nexthdr;
+	int iif;
 
 	if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED)
 		goto fail_hdr;
@@ -362,24 +390,11 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
 	 * the source of the fragment, with the Pointer field set to zero.
 	 */
 	nexthdr = hdr->nexthdr;
-	offset = ipv6_skip_exthdr(skb, skb_transport_offset(skb), &nexthdr, &frag_off);
-	if (offset >= 0) {
-		/* Check some common protocols' header */
-		if (nexthdr == IPPROTO_TCP)
-			offset += sizeof(struct tcphdr);
-		else if (nexthdr == IPPROTO_UDP)
-			offset += sizeof(struct udphdr);
-		else if (nexthdr == IPPROTO_ICMPV6)
-			offset += sizeof(struct icmp6hdr);
-		else
-			offset += 1;
-
-		if (!(frag_off & htons(IP6_OFFSET)) && offset > skb->len) {
-			__IP6_INC_STATS(net, __in6_dev_get_safely(skb->dev),
-					IPSTATS_MIB_INHDRERRORS);
-			icmpv6_param_prob(skb, ICMPV6_HDR_INCOMP, 0);
-			return -1;
-		}
+	if (ipv6_frag_thdr_truncated(skb, skb_transport_offset(skb), &nexthdr)) {
+		__IP6_INC_STATS(net, __in6_dev_get_safely(skb->dev),
+				IPSTATS_MIB_INHDRERRORS);
+		icmpv6_param_prob(skb, ICMPV6_HDR_INCOMP, 0);
+		return -1;
 	}
 
 	iif = skb->dev ? skb->dev->ifindex : 0;
commit 9215f6bb4705ffe205885411394732bfc439dee0
Author: Stanimir Varbanov <stanimir.varbanov at linaro.org>
Date:   Sun Nov 1 13:35:52 2020 +0100

    media: venus: pm_helpers: Fix kernel module reload
    
    After initial kernel module load during kernel boot and removing
    the module and try to load it again an Unable to handle kernel
    paging request is observed:
    
    Unable to handle kernel paging request at virtual address ffffa44f7416eae0
     Mem abort info:
       ESR = 0x96000047
       EC = 0x25: DABT (current EL), IL = 32 bits
       SET = 0, FnV = 0
       EA = 0, S1PTW = 0
     Data abort info:
       ISV = 0, ISS = 0x00000047
       CM = 0, WnR = 1
     swapper pgtable: 4k pages, 48-bit VAs, pgdp=000000008147c000
     [ffffa44f7416eae0] pgd=000000017df9f003, p4d=000000017df9f003,
     pud=000000017df9e003, pmd=000000017df9b003, pte=0000000000000000
     Internal error: Oops: 96000047 [#1] PREEMPT SMP
     Modules linked in: venus_core(+) snd_soc_wsa881x regmap_sdw af_alg
      snd_soc_wcd934x soundwire_qcom gpio_wcd934x q6asm_dai q6routing
      q6adm q6afe_dai snd_soc_hdmi_codec q6afe q6asm q6dsp_common q6cor
      display_connector rmtfs_mem drm ip_tables x_tables ipv6
      [last unloaded: venus_core]
     CPU: 6 PID: 889 Comm: modprobe Tainted: G        W      5.10.0-rc1+ #8
     Hardware name: Thundercomm Dragonboard 845c (DT)
     pstate: 80400085 (Nzcv daIf +PAN -UAO -TCO BTYPE=--)
     pc : queued_spin_lock_slowpath+0x1dc/0x3c8
     lr : do_raw_spin_lock+0xc0/0x118
     sp : ffff8000142cb7b0
     x29: ffff8000142cb7b0 x28: 0000000000000013
     x27: ffffa44f72de5690 x26: 0000000000000003
     x25: ffff17c2d00f8080 x24: ffff17c2c0d78010
     x23: ffff17c2c0d4f700 x22: ffff17c2d00f8080
     x21: 0000000000000000 x20: ffffa44f74148000
     x19: ffff17c2c0d4f8f8 x18: 0000000000000000
     x17: 0000000000000000 x16: ffffa44f7342f158
     x15: 0000000000000040 x14: ffffa44f746e8320
     x13: 0000000000000228 x12: 0000000000000020
     x11: 0000000000000000 x10: 00000000001c0000
     x9 : 0000000000000000 x8 : ffff17c33d746ac0
     x7 : ffff17c2c109b000 x6 : ffffa44f7416eac0
     x5 : ffff17c33d746ac0 x4 : 0000000000000000
     x3 : ffff17c2c0d4f8f8 x2 : ffffa44f7416eae0
     x1 : ffffa44f7416eae0 x0 : ffff17c33d746ac8
     Call trace:
      queued_spin_lock_slowpath+0x1dc/0x3c8
      do_raw_spin_lock+0xc0/0x118
      _raw_spin_lock_irqsave+0x80/0x14c
      __pm_runtime_resume+0x38/0xb8
      device_link_add+0x3b8/0x5d0
      core_get_v4+0x268/0x2d8 [venus_core]
      venus_probe+0x108/0x458 [venus_core]
      platform_drv_probe+0x54/0xa8
      really_probe+0xe4/0x3b0
      driver_probe_device+0x58/0xb8
      device_driver_attach+0x74/0x80
      __driver_attach+0x58/0xe8
      bus_for_each_dev+0x70/0xc0
      driver_attach+0x24/0x30
      bus_add_driver+0x150/0x1f8
      driver_register+0x64/0x120
      __platform_driver_register+0x48/0x58
      qcom_venus_driver_init+0x20/0x1000 [venus_core]
      do_one_initcall+0x84/0x458
      do_init_module+0x58/0x208
      load_module+0x1ec0/0x26a8
      __do_sys_finit_module+0xb8/0xf8
      __arm64_sys_finit_module+0x20/0x30
      el0_svc_common.constprop.0+0x7c/0x1c0
      do_el0_svc+0x24/0x90
      el0_sync_handler+0x180/0x188
      el0_sync+0x174/0x180
     Code: 91002100 8b0200c2 f861d884 aa0203e1 (f8246828)
     ---[ end trace f1f687c15fd6b2ca ]---
     note: modprobe[889] exited with preempt_count 1
    
    After revisit the OPP part of the code I found that OPP pmdomain
    is detached with direct call to dev_pm_domain_detach instead of
    OPP wraper for detaching pmdomains with OPP table. Correct this
    by calling the OPP dev_pm_opp_detach_genpd.
    
    Fixes: 9a538b83612c ('media: venus: core: Add support for opp tables/perf voting')
    Signed-off-by: Stanimir Varbanov <stanimir.varbanov at linaro.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
index 57877eacecf0..a9538c2cc3c9 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -794,7 +794,7 @@ skip_pmdomains:
 	return 0;
 
 opp_dl_add_err:
-	dev_pm_domain_detach(core->opp_pmdomain, true);
+	dev_pm_opp_detach_genpd(core->opp_table);
 opp_attach_err:
 	if (core->pd_dl_venus) {
 		device_link_del(core->pd_dl_venus);
@@ -832,7 +832,7 @@ skip_pmdomains:
 	if (core->opp_dl_venus)
 		device_link_del(core->opp_dl_venus);
 
-	dev_pm_domain_detach(core->opp_pmdomain, true);
+	dev_pm_opp_detach_genpd(core->opp_table);
 }
 
 static int core_get_v4(struct device *dev)
commit a7a20f721e812a52a62a00de20dcd0779fbb587f
Author: Stanimir Varbanov <stanimir.varbanov at linaro.org>
Date:   Tue Oct 27 10:19:36 2020 +0100

    media: venus: venc: Fix setting of profile and level
    
    The profile and level in op_set_ctrl was recently changed but during
    v4l2_ctrl_handler_setup profile and level control values are mangled.
    
    Fixes: 435c53c3698f ("media: venus: venc: Use helper to set profile and level")
    Signed-off-by: Stanimir Varbanov <stanimir.varbanov at linaro.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index 7b79a33dc9d6..05c9fbd51f0c 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -243,8 +243,19 @@ struct venc_controls {
 
 	u32 header_mode;
 
-	u32 profile;
-	u32 level;
+	struct {
+		u32 h264;
+		u32 mpeg4;
+		u32 hevc;
+		u32 vp8;
+		u32 vp9;
+	} profile;
+	struct {
+		u32 h264;
+		u32 mpeg4;
+		u32 hevc;
+		u32 vp9;
+	} level;
 };
 
 struct venus_buffer {
diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
index f8b1484e7dcd..47246528ac7e 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -537,6 +537,7 @@ static int venc_set_properties(struct venus_inst *inst)
 	struct hfi_quantization quant;
 	struct hfi_quantization_range quant_range;
 	u32 ptype, rate_control, bitrate;
+	u32 profile, level;
 	int ret;
 
 	ret = venus_helper_set_work_mode(inst, VIDC_WORK_MODE_2);
@@ -684,7 +685,35 @@ static int venc_set_properties(struct venus_inst *inst)
 	if (ret)
 		return ret;
 
-	ret = venus_helper_set_profile_level(inst, ctr->profile, ctr->level);
+	switch (inst->hfi_codec) {
+	case HFI_VIDEO_CODEC_H264:
+		profile = ctr->profile.h264;
+		level = ctr->level.h264;
+		break;
+	case HFI_VIDEO_CODEC_MPEG4:
+		profile = ctr->profile.mpeg4;
+		level = ctr->level.mpeg4;
+		break;
+	case HFI_VIDEO_CODEC_VP8:
+		profile = ctr->profile.vp8;
+		level = 0;
+		break;
+	case HFI_VIDEO_CODEC_VP9:
+		profile = ctr->profile.vp9;
+		level = ctr->level.vp9;
+		break;
+	case HFI_VIDEO_CODEC_HEVC:
+		profile = ctr->profile.hevc;
+		level = ctr->level.hevc;
+		break;
+	case HFI_VIDEO_CODEC_MPEG2:
+	default:
+		profile = 0;
+		level = 0;
+		break;
+	}
+
+	ret = venus_helper_set_profile_level(inst, profile, level);
 	if (ret)
 		return ret;
 
diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c b/drivers/media/platform/qcom/venus/venc_ctrls.c
index 0708b3b89d0c..cf860e6446c0 100644
--- a/drivers/media/platform/qcom/venus/venc_ctrls.c
+++ b/drivers/media/platform/qcom/venus/venc_ctrls.c
@@ -103,15 +103,25 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
 		ctr->h264_entropy_mode = ctrl->val;
 		break;
 	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
+		ctr->profile.mpeg4 = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
+		ctr->profile.h264 = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
+		ctr->profile.hevc = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
-		ctr->profile = ctrl->val;
+		ctr->profile.vp8 = ctrl->val;
 		break;
 	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
+		ctr->level.mpeg4 = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
+		ctr->level.h264 = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
-		ctr->level = ctrl->val;
+		ctr->level.hevc = ctrl->val;
 		break;
 	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
 		ctr->h264_i_qp = ctrl->val;
commit 7953446d664783cdb040fa25de40a3b3e6d0f6f4
Merge: e2142ef266c8 da875fa5040b
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Nov 16 09:37:13 2020 -0800

    Merge branch 'fix-usage-counter-leak-by-adding-a-general-sync-ops'
    
    Zhang Qilong says:
    
    ====================
    Fix usage counter leak by adding a general sync ops
    
    In many case, we need to check return value of pm_runtime_get_sync,
    but it brings a trouble to the usage counter processing. Many callers
    forget to decrease the usage counter when it failed, which could
    resulted in reference leak. It has been discussed a lot[0][1]. So we
    add a function to deal with the usage counter for better coding and
    view. Then, we replace pm_runtime_resume_and_get with it in fec_main.c
    to avoid it.
    
    [0] https://lkml.org/lkml/2020/6/14/88
    [1] https://patchwork.ozlabs.org/project/linux-tegra/list/?series=178139
    ====================
    
    Link: https://lore.kernel.org/r/20201110092933.3342784-1-zhangqilong3@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit da875fa5040b0f951cb4bf7efbf59f6dcff44d3c
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Tue Nov 10 17:29:33 2020 +0800

    net: fec: Fix reference count leak in fec series ops
    
    pm_runtime_get_sync() will increment pm usage at first and it will
    resume the device later. If runtime of the device has error or
    device is in inaccessible state(or other error state), resume
    operation will fail. If we do not call put operation to decrease
    the reference, it will result in reference count leak. Moreover,
    this device cannot enter the idle state and always stay busy or other
    non-idle state later. So we fixed it by replacing it with
    pm_runtime_resume_and_get.
    
    Fixes: 8fff755e9f8d0 ("net: fec: Ensure clocks are enabled while using mdio bus")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index d7919555250d..04f24c66cf36 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1808,7 +1808,7 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
 	int ret = 0, frame_start, frame_addr, frame_op;
 	bool is_c45 = !!(regnum & MII_ADDR_C45);
 
-	ret = pm_runtime_get_sync(dev);
+	ret = pm_runtime_resume_and_get(dev);
 	if (ret < 0)
 		return ret;
 
@@ -1867,11 +1867,9 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
 	int ret, frame_start, frame_addr;
 	bool is_c45 = !!(regnum & MII_ADDR_C45);
 
-	ret = pm_runtime_get_sync(dev);
+	ret = pm_runtime_resume_and_get(dev);
 	if (ret < 0)
 		return ret;
-	else
-		ret = 0;
 
 	if (is_c45) {
 		frame_start = FEC_MMFR_ST_C45;
@@ -2275,7 +2273,7 @@ static void fec_enet_get_regs(struct net_device *ndev,
 	u32 i, off;
 	int ret;
 
-	ret = pm_runtime_get_sync(dev);
+	ret = pm_runtime_resume_and_get(dev);
 	if (ret < 0)
 		return;
 
@@ -2976,7 +2974,7 @@ fec_enet_open(struct net_device *ndev)
 	int ret;
 	bool reset_again;
 
-	ret = pm_runtime_get_sync(&fep->pdev->dev);
+	ret = pm_runtime_resume_and_get(&fep->pdev->dev);
 	if (ret < 0)
 		return ret;
 
@@ -3770,7 +3768,7 @@ fec_drv_remove(struct platform_device *pdev)
 	struct device_node *np = pdev->dev.of_node;
 	int ret;
 
-	ret = pm_runtime_get_sync(&pdev->dev);
+	ret = pm_runtime_resume_and_get(&pdev->dev);
 	if (ret < 0)
 		return ret;
 
commit dd8088d5a8969dc2b42f71d7bc01c25c61a78066
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Tue Nov 10 17:29:32 2020 +0800

    PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter
    
    In many case, we need to check return value of pm_runtime_get_sync, but
    it brings a trouble to the usage counter processing. Many callers forget
    to decrease the usage counter when it failed, which could resulted in
    reference leak. It has been discussed a lot[0][1]. So we add a function
    to deal with the usage counter for better coding.
    
    [0]https://lkml.org/lkml/2020/6/14/88
    [1]https://patchwork.ozlabs.org/project/linux-tegra/list/?series=178139
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Acked-by: Rafael J. Wysocki  <rafael.j.wysocki at intel.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index 4b708f4e8eed..b492ae00cc90 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -386,6 +386,27 @@ static inline int pm_runtime_get_sync(struct device *dev)
 	return __pm_runtime_resume(dev, RPM_GET_PUT);
 }
 
+/**
+ * pm_runtime_resume_and_get - Bump up usage counter of a device and resume it.
+ * @dev: Target device.
+ *
+ * Resume @dev synchronously and if that is successful, increment its runtime
+ * PM usage counter. Return 0 if the runtime PM usage counter of @dev has been
+ * incremented or a negative error code otherwise.
+ */
+static inline int pm_runtime_resume_and_get(struct device *dev)
+{
+	int ret;
+
+	ret = __pm_runtime_resume(dev, RPM_GET_PUT);
+	if (ret < 0) {
+		pm_runtime_put_noidle(dev);
+		return ret;
+	}
+
+	return 0;
+}
+
 /**
  * pm_runtime_put - Drop device usage counter and queue up "idle check" if 0.
  * @dev: Target device.
commit e773ca7da8beeca7f17fe4c9d1284a2b66839cc1
Author: Sugar Zhang <sugar.zhang at rock-chips.com>
Date:   Sat Nov 14 11:55:06 2020 +0800

    dmaengine: pl330: _prep_dma_memcpy: Fix wrong burst size
    
    Actually, burst size is equal to '1 << desc->rqcfg.brst_size'.
    we should use burst size, not desc->rqcfg.brst_size.
    
    dma memcpy performance on Rockchip RV1126
    @ 1512MHz A7, 1056MHz LPDDR3, 200MHz DMA:
    
    dmatest:
    
    /# echo dma0chan0 > /sys/module/dmatest/parameters/channel
    /# echo 4194304 > /sys/module/dmatest/parameters/test_buf_size
    /# echo 8 > /sys/module/dmatest/parameters/iterations
    /# echo y > /sys/module/dmatest/parameters/norandom
    /# echo y > /sys/module/dmatest/parameters/verbose
    /# echo 1 > /sys/module/dmatest/parameters/run
    
    dmatest: dma0chan0-copy0: result #1: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #2: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #3: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #4: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #5: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #6: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #7: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    dmatest: dma0chan0-copy0: result #8: 'test passed' with src_off=0x0 dst_off=0x0 len=0x400000
    
    Before:
    
      dmatest: dma0chan0-copy0: summary 8 tests, 0 failures 48 iops 200338 KB/s (0)
    
    After this patch:
    
      dmatest: dma0chan0-copy0: summary 8 tests, 0 failures 179 iops 734873 KB/s (0)
    
    After this patch and increase dma clk to 400MHz:
    
      dmatest: dma0chan0-copy0: summary 8 tests, 0 failures 259 iops 1062929 KB/s (0)
    
    Signed-off-by: Sugar Zhang <sugar.zhang at rock-chips.com>
    Link: https://lore.kernel.org/r/1605326106-55681-1-git-send-email-sugar.zhang@rock-chips.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index e9f0101d92fa..0f5c19370f6d 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -2799,7 +2799,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,
 	 * If burst size is smaller than bus width then make sure we only
 	 * transfer one at a time to avoid a burst stradling an MFIFO entry.
 	 */
-	if (desc->rqcfg.brst_size * 8 < pl330->pcfg.data_bus_width)
+	if (burst * 8 < pl330->pcfg.data_bus_width)
 		desc->rqcfg.brst_len = 1;
 
 	desc->bytes_requested = len;
commit 4e7d4f295dee1feed96b2b0a31d80d673b5465e8
Author: Lukas Bulwahn <lukas.bulwahn at gmail.com>
Date:   Fri Nov 13 09:12:48 2020 +0100

    dmaengine: ioatdma: remove unused function missed during dma_v2 removal
    
    Commit 7f832645d0e5 ("dmaengine: ioatdma: remove ioatdma v2 registration")
    missed to remove dca2_tag_map_valid() during its removal. Hence, since
    then, dca2_tag_map_valid() is unused and make CC=clang W=1 warns:
    
      drivers/dma/ioat/dca.c:44:19:
        warning: unused function 'dca2_tag_map_valid' [-Wunused-function]
    
    So, remove this unused function and get rid of a -Wused-function warning.
    
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn at gmail.com>
    Reviewed-by: Nathan Chancellor <natechancellor at gmail.com>
    Link: https://lore.kernel.org/r/20201113081248.26416-1-lukas.bulwahn@gmail.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/ioat/dca.c b/drivers/dma/ioat/dca.c
index 0be385587c4c..289c59ed74b9 100644
--- a/drivers/dma/ioat/dca.c
+++ b/drivers/dma/ioat/dca.c
@@ -40,16 +40,6 @@
 #define DCA2_TAG_MAP_BYTE3 0x82
 #define DCA2_TAG_MAP_BYTE4 0x82
 
-/* verify if tag map matches expected values */
-static inline int dca2_tag_map_valid(u8 *tag_map)
-{
-	return ((tag_map[0] == DCA2_TAG_MAP_BYTE0) &&
-		(tag_map[1] == DCA2_TAG_MAP_BYTE1) &&
-		(tag_map[2] == DCA2_TAG_MAP_BYTE2) &&
-		(tag_map[3] == DCA2_TAG_MAP_BYTE3) &&
-		(tag_map[4] == DCA2_TAG_MAP_BYTE4));
-}
-
 /*
  * "Legacy" DCA systems do not implement the DCA register set in the
  * I/OAT device.  Software needs direct support for their tag mappings.
commit 568beb27959b0515d325ea1c6cf211eed2d66740
Author: Ian Rogers <irogers at google.com>
Date:   Fri Nov 13 10:20:53 2020 -0800

    perf test: Avoid an msan warning in a copied stack.
    
    This fix is for a failure that occurred in the DWARF unwind perf test.
    
    Stack unwinders may probe memory when looking for frames.
    
    Memory sanitizer will poison and track uninitialized memory on the
    stack, and on the heap if the value is copied to the heap.
    
    This can lead to false memory sanitizer failures for the use of an
    uninitialized value.
    
    Avoid this problem by removing the poison on the copied stack.
    
    The full msan failure with track origins looks like:
    
    ==2168==WARNING: MemorySanitizer: use-of-uninitialized-value
        #0 0x559ceb10755b in handle_cfi elfutils/libdwfl/frame_unwind.c:648:8
        #1 0x559ceb105448 in __libdwfl_frame_unwind elfutils/libdwfl/frame_unwind.c:741:4
        #2 0x559ceb0ece90 in dwfl_thread_getframes elfutils/libdwfl/dwfl_frame.c:435:7
        #3 0x559ceb0ec6b7 in get_one_thread_frames_cb elfutils/libdwfl/dwfl_frame.c:379:10
        #4 0x559ceb0ec6b7 in get_one_thread_cb elfutils/libdwfl/dwfl_frame.c:308:17
        #5 0x559ceb0ec6b7 in dwfl_getthreads elfutils/libdwfl/dwfl_frame.c:283:17
        #6 0x559ceb0ec6b7 in getthread elfutils/libdwfl/dwfl_frame.c:354:14
        #7 0x559ceb0ec6b7 in dwfl_getthread_frames elfutils/libdwfl/dwfl_frame.c:388:10
        #8 0x559ceaff6ae6 in unwind__get_entries tools/perf/util/unwind-libdw.c:236:8
        #9 0x559ceabc9dbc in test_dwarf_unwind__thread tools/perf/tests/dwarf-unwind.c:111:8
        #10 0x559ceabca5cf in test_dwarf_unwind__compare tools/perf/tests/dwarf-unwind.c:138:26
        #11 0x7f812a6865b0 in bsearch (libc.so.6+0x4e5b0)
        #12 0x559ceabca871 in test_dwarf_unwind__krava_3 tools/perf/tests/dwarf-unwind.c:162:2
        #13 0x559ceabca926 in test_dwarf_unwind__krava_2 tools/perf/tests/dwarf-unwind.c:169:9
        #14 0x559ceabca946 in test_dwarf_unwind__krava_1 tools/perf/tests/dwarf-unwind.c:174:9
        #15 0x559ceabcae12 in test__dwarf_unwind tools/perf/tests/dwarf-unwind.c:211:8
        #16 0x559ceabbc4ab in run_test tools/perf/tests/builtin-test.c:418:9
        #17 0x559ceabbc4ab in test_and_print tools/perf/tests/builtin-test.c:448:9
        #18 0x559ceabbac70 in __cmd_test tools/perf/tests/builtin-test.c:669:4
        #19 0x559ceabbac70 in cmd_test tools/perf/tests/builtin-test.c:815:9
        #20 0x559cea960e30 in run_builtin tools/perf/perf.c:313:11
        #21 0x559cea95fbce in handle_internal_command tools/perf/perf.c:365:8
        #22 0x559cea95fbce in run_argv tools/perf/perf.c:409:2
        #23 0x559cea95fbce in main tools/perf/perf.c:539:3
    
      Uninitialized value was stored to memory at
        #0 0x559ceb106acf in __libdwfl_frame_reg_set elfutils/libdwfl/frame_unwind.c:77:22
        #1 0x559ceb106acf in handle_cfi elfutils/libdwfl/frame_unwind.c:627:13
        #2 0x559ceb105448 in __libdwfl_frame_unwind elfutils/libdwfl/frame_unwind.c:741:4
        #3 0x559ceb0ece90 in dwfl_thread_getframes elfutils/libdwfl/dwfl_frame.c:435:7
        #4 0x559ceb0ec6b7 in get_one_thread_frames_cb elfutils/libdwfl/dwfl_frame.c:379:10
        #5 0x559ceb0ec6b7 in get_one_thread_cb elfutils/libdwfl/dwfl_frame.c:308:17
        #6 0x559ceb0ec6b7 in dwfl_getthreads elfutils/libdwfl/dwfl_frame.c:283:17
        #7 0x559ceb0ec6b7 in getthread elfutils/libdwfl/dwfl_frame.c:354:14
        #8 0x559ceb0ec6b7 in dwfl_getthread_frames elfutils/libdwfl/dwfl_frame.c:388:10
        #9 0x559ceaff6ae6 in unwind__get_entries tools/perf/util/unwind-libdw.c:236:8
        #10 0x559ceabc9dbc in test_dwarf_unwind__thread tools/perf/tests/dwarf-unwind.c:111:8
        #11 0x559ceabca5cf in test_dwarf_unwind__compare tools/perf/tests/dwarf-unwind.c:138:26
        #12 0x7f812a6865b0 in bsearch (libc.so.6+0x4e5b0)
        #13 0x559ceabca871 in test_dwarf_unwind__krava_3 tools/perf/tests/dwarf-unwind.c:162:2
        #14 0x559ceabca926 in test_dwarf_unwind__krava_2 tools/perf/tests/dwarf-unwind.c:169:9
        #15 0x559ceabca946 in test_dwarf_unwind__krava_1 tools/perf/tests/dwarf-unwind.c:174:9
        #16 0x559ceabcae12 in test__dwarf_unwind tools/perf/tests/dwarf-unwind.c:211:8
        #17 0x559ceabbc4ab in run_test tools/perf/tests/builtin-test.c:418:9
        #18 0x559ceabbc4ab in test_and_print tools/perf/tests/builtin-test.c:448:9
        #19 0x559ceabbac70 in __cmd_test tools/perf/tests/builtin-test.c:669:4
        #20 0x559ceabbac70 in cmd_test tools/perf/tests/builtin-test.c:815:9
        #21 0x559cea960e30 in run_builtin tools/perf/perf.c:313:11
        #22 0x559cea95fbce in handle_internal_command tools/perf/perf.c:365:8
        #23 0x559cea95fbce in run_argv tools/perf/perf.c:409:2
        #24 0x559cea95fbce in main tools/perf/perf.c:539:3
    
      Uninitialized value was stored to memory at
        #0 0x559ceb106a54 in handle_cfi elfutils/libdwfl/frame_unwind.c:613:9
        #1 0x559ceb105448 in __libdwfl_frame_unwind elfutils/libdwfl/frame_unwind.c:741:4
        #2 0x559ceb0ece90 in dwfl_thread_getframes elfutils/libdwfl/dwfl_frame.c:435:7
        #3 0x559ceb0ec6b7 in get_one_thread_frames_cb elfutils/libdwfl/dwfl_frame.c:379:10
        #4 0x559ceb0ec6b7 in get_one_thread_cb elfutils/libdwfl/dwfl_frame.c:308:17
        #5 0x559ceb0ec6b7 in dwfl_getthreads elfutils/libdwfl/dwfl_frame.c:283:17
        #6 0x559ceb0ec6b7 in getthread elfutils/libdwfl/dwfl_frame.c:354:14
        #7 0x559ceb0ec6b7 in dwfl_getthread_frames elfutils/libdwfl/dwfl_frame.c:388:10
        #8 0x559ceaff6ae6 in unwind__get_entries tools/perf/util/unwind-libdw.c:236:8
        #9 0x559ceabc9dbc in test_dwarf_unwind__thread tools/perf/tests/dwarf-unwind.c:111:8
        #10 0x559ceabca5cf in test_dwarf_unwind__compare tools/perf/tests/dwarf-unwind.c:138:26
        #11 0x7f812a6865b0 in bsearch (libc.so.6+0x4e5b0)
        #12 0x559ceabca871 in test_dwarf_unwind__krava_3 tools/perf/tests/dwarf-unwind.c:162:2
        #13 0x559ceabca926 in test_dwarf_unwind__krava_2 tools/perf/tests/dwarf-unwind.c:169:9
        #14 0x559ceabca946 in test_dwarf_unwind__krava_1 tools/perf/tests/dwarf-unwind.c:174:9
        #15 0x559ceabcae12 in test__dwarf_unwind tools/perf/tests/dwarf-unwind.c:211:8
        #16 0x559ceabbc4ab in run_test tools/perf/tests/builtin-test.c:418:9
        #17 0x559ceabbc4ab in test_and_print tools/perf/tests/builtin-test.c:448:9
        #18 0x559ceabbac70 in __cmd_test tools/perf/tests/builtin-test.c:669:4
        #19 0x559ceabbac70 in cmd_test tools/perf/tests/builtin-test.c:815:9
        #20 0x559cea960e30 in run_builtin tools/perf/perf.c:313:11
        #21 0x559cea95fbce in handle_internal_command tools/perf/perf.c:365:8
        #22 0x559cea95fbce in run_argv tools/perf/perf.c:409:2
        #23 0x559cea95fbce in main tools/perf/perf.c:539:3
    
      Uninitialized value was stored to memory at
        #0 0x559ceaff8800 in memory_read tools/perf/util/unwind-libdw.c:156:10
        #1 0x559ceb10f053 in expr_eval elfutils/libdwfl/frame_unwind.c:501:13
        #2 0x559ceb1060cc in handle_cfi elfutils/libdwfl/frame_unwind.c:603:18
        #3 0x559ceb105448 in __libdwfl_frame_unwind elfutils/libdwfl/frame_unwind.c:741:4
        #4 0x559ceb0ece90 in dwfl_thread_getframes elfutils/libdwfl/dwfl_frame.c:435:7
        #5 0x559ceb0ec6b7 in get_one_thread_frames_cb elfutils/libdwfl/dwfl_frame.c:379:10
        #6 0x559ceb0ec6b7 in get_one_thread_cb elfutils/libdwfl/dwfl_frame.c:308:17
        #7 0x559ceb0ec6b7 in dwfl_getthreads elfutils/libdwfl/dwfl_frame.c:283:17
        #8 0x559ceb0ec6b7 in getthread elfutils/libdwfl/dwfl_frame.c:354:14
        #9 0x559ceb0ec6b7 in dwfl_getthread_frames elfutils/libdwfl/dwfl_frame.c:388:10
        #10 0x559ceaff6ae6 in unwind__get_entries tools/perf/util/unwind-libdw.c:236:8
        #11 0x559ceabc9dbc in test_dwarf_unwind__thread tools/perf/tests/dwarf-unwind.c:111:8
        #12 0x559ceabca5cf in test_dwarf_unwind__compare tools/perf/tests/dwarf-unwind.c:138:26
        #13 0x7f812a6865b0 in bsearch (libc.so.6+0x4e5b0)
        #14 0x559ceabca871 in test_dwarf_unwind__krava_3 tools/perf/tests/dwarf-unwind.c:162:2
        #15 0x559ceabca926 in test_dwarf_unwind__krava_2 tools/perf/tests/dwarf-unwind.c:169:9
        #16 0x559ceabca946 in test_dwarf_unwind__krava_1 tools/perf/tests/dwarf-unwind.c:174:9
        #17 0x559ceabcae12 in test__dwarf_unwind tools/perf/tests/dwarf-unwind.c:211:8
        #18 0x559ceabbc4ab in run_test tools/perf/tests/builtin-test.c:418:9
        #19 0x559ceabbc4ab in test_and_print tools/perf/tests/builtin-test.c:448:9
        #20 0x559ceabbac70 in __cmd_test tools/perf/tests/builtin-test.c:669:4
        #21 0x559ceabbac70 in cmd_test tools/perf/tests/builtin-test.c:815:9
        #22 0x559cea960e30 in run_builtin tools/perf/perf.c:313:11
        #23 0x559cea95fbce in handle_internal_command tools/perf/perf.c:365:8
        #24 0x559cea95fbce in run_argv tools/perf/perf.c:409:2
        #25 0x559cea95fbce in main tools/perf/perf.c:539:3
    
      Uninitialized value was stored to memory at
        #0 0x559cea9027d9 in __msan_memcpy llvm/llvm-project/compiler-rt/lib/msan/msan_interceptors.cpp:1558:3
        #1 0x559cea9d2185 in sample_ustack tools/perf/arch/x86/tests/dwarf-unwind.c:41:2
        #2 0x559cea9d202c in test__arch_unwind_sample tools/perf/arch/x86/tests/dwarf-unwind.c:72:9
        #3 0x559ceabc9cbd in test_dwarf_unwind__thread tools/perf/tests/dwarf-unwind.c:106:6
        #4 0x559ceabca5cf in test_dwarf_unwind__compare tools/perf/tests/dwarf-unwind.c:138:26
        #5 0x7f812a6865b0 in bsearch (libc.so.6+0x4e5b0)
        #6 0x559ceabca871 in test_dwarf_unwind__krava_3 tools/perf/tests/dwarf-unwind.c:162:2
        #7 0x559ceabca926 in test_dwarf_unwind__krava_2 tools/perf/tests/dwarf-unwind.c:169:9
        #8 0x559ceabca946 in test_dwarf_unwind__krava_1 tools/perf/tests/dwarf-unwind.c:174:9
        #9 0x559ceabcae12 in test__dwarf_unwind tools/perf/tests/dwarf-unwind.c:211:8
        #10 0x559ceabbc4ab in run_test tools/perf/tests/builtin-test.c:418:9
        #11 0x559ceabbc4ab in test_and_print tools/perf/tests/builtin-test.c:448:9
        #12 0x559ceabbac70 in __cmd_test tools/perf/tests/builtin-test.c:669:4
        #13 0x559ceabbac70 in cmd_test tools/perf/tests/builtin-test.c:815:9
        #14 0x559cea960e30 in run_builtin tools/perf/perf.c:313:11
        #15 0x559cea95fbce in handle_internal_command tools/perf/perf.c:365:8
        #16 0x559cea95fbce in run_argv tools/perf/perf.c:409:2
        #17 0x559cea95fbce in main tools/perf/perf.c:539:3
    
      Uninitialized value was created by an allocation of 'bf' in the stack frame of function 'perf_event__synthesize_mmap_events'
        #0 0x559ceafc5f60 in perf_event__synthesize_mmap_events tools/perf/util/synthetic-events.c:445
    
    SUMMARY: MemorySanitizer: use-of-uninitialized-value elfutils/libdwfl/frame_unwind.c:648:8 in handle_cfi
    Signed-off-by: Ian Rogers <irogers at google.com>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: clang-built-linux at googlegroups.com
    Cc: Jiri Olsa <jolsa at redhat.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Namhyung Kim <namhyung at kernel.org>
    Cc: Peter Zijlstra <peterz at infradead.org>
    Cc: Sandeep Dasgupta <sdasgup at google.com>
    Cc: Stephane Eranian <eranian at google.com>
    Link: http://lore.kernel.org/lkml/20201113182053.754625-1-irogers@google.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/arch/x86/tests/dwarf-unwind.c b/tools/perf/arch/x86/tests/dwarf-unwind.c
index 4e40402a4f81..478078fb0f22 100644
--- a/tools/perf/arch/x86/tests/dwarf-unwind.c
+++ b/tools/perf/arch/x86/tests/dwarf-unwind.c
@@ -38,6 +38,13 @@ static int sample_ustack(struct perf_sample *sample,
 	stack_size = stack_size > STACK_SIZE ? STACK_SIZE : stack_size;
 
 	memcpy(buf, (void *) sp, stack_size);
+#ifdef MEMORY_SANITIZER
+	/*
+	 * Copying the stack may copy msan poison, avoid false positives in the
+	 * unwinder by removing the poison here.
+	 */
+	__msan_unpoison(buf, stack_size);
+#endif
 	stack->data = (char *) buf;
 	stack->size = stack_size;
 	return 0;
commit 8326be9f1c0bb498baf134878a8deb8a952e0135
Author: Dave Jiang <dave.jiang at intel.com>
Date:   Wed Nov 11 15:23:46 2020 -0700

    dmaengine: idxd: fix mapping of portal size
    
    Portal size is 4k. Current code is mapping all 4 portals in a single chunk.
    Restrict the mapped portal size to a single portal to ensure that submission
    only goes to the intended portal address.
    
    Fixes: c52ca478233c ("dmaengine: idxd: add configuration component of driver")
    Signed-off-by: Dave Jiang <dave.jiang at intel.com>
    Link: https://lore.kernel.org/r/160513342642.510187.16450549281618747065.stgit@djiang5-desk3.ch.intel.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/idxd/device.c b/drivers/dma/idxd/device.c
index 506ac85c4a7f..663344987e3f 100644
--- a/drivers/dma/idxd/device.c
+++ b/drivers/dma/idxd/device.c
@@ -271,7 +271,7 @@ int idxd_wq_map_portal(struct idxd_wq *wq)
 	resource_size_t start;
 
 	start = pci_resource_start(pdev, IDXD_WQ_BAR);
-	start = start + wq->id * IDXD_PORTAL_SIZE;
+	start += idxd_get_wq_portal_full_offset(wq->id, IDXD_PORTAL_LIMITED);
 
 	wq->dportal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE);
 	if (!wq->dportal)
diff --git a/drivers/dma/idxd/registers.h b/drivers/dma/idxd/registers.h
index aef5a902829e..54390334c243 100644
--- a/drivers/dma/idxd/registers.h
+++ b/drivers/dma/idxd/registers.h
@@ -8,7 +8,7 @@
 
 #define IDXD_MMIO_BAR		0
 #define IDXD_WQ_BAR		2
-#define IDXD_PORTAL_SIZE	0x4000
+#define IDXD_PORTAL_SIZE	PAGE_SIZE
 
 /* MMIO Device BAR0 Registers */
 #define IDXD_VER_OFFSET			0x00
diff --git a/drivers/dma/idxd/submit.c b/drivers/dma/idxd/submit.c
index 156a1ee233aa..417048e3c42a 100644
--- a/drivers/dma/idxd/submit.c
+++ b/drivers/dma/idxd/submit.c
@@ -74,7 +74,7 @@ int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)
 	if (idxd->state != IDXD_DEV_ENABLED)
 		return -EIO;
 
-	portal = wq->dportal + idxd_get_wq_portal_offset(IDXD_PORTAL_UNLIMITED);
+	portal = wq->dportal;
 	/*
 	 * The wmb() flushes writes to coherent DMA data before possibly
 	 * triggering a DMA read. The wmb() is necessary even on UP because
commit 1c756cd429d8f3da33d31f2a970284b9d5260534
Author: Al Grant <al.grant at foss.arm.com>
Date:   Fri Nov 13 20:38:26 2020 +0000

    perf inject: Fix file corruption due to event deletion
    
    "perf inject" can create corrupt files when synthesizing sample events from AUX
    data. This happens when in the input file, the first event (for the AUX data)
    has a different sample_type from the second event (generally dummy).
    
    Specifically, they differ in the bits that indicate the standard fields
    appended to perf records in the mmap buffer. "perf inject" deletes the first
    event and moves up the second event to first position.
    
    The problem is with the synthetic PERF_RECORD_MMAP (etc.) events created
    by "perf record".
    
    Since these are synthetic versions of events which are normally produced
    by the kernel, they have to have the standard fields appended as
    described by sample_type.
    
    "perf record" fills these in with zeroes, including the IDENTIFIER
    field; perf readers interpret records with zero IDENTIFIER using the
    descriptor for the first event in the file.
    
    Since "perf inject" changes the first event, these synthetic records are
    then processed with the wrong value of sample_type, and the perf reader
    reads bad data, reports on incorrect length records etc.
    
    Mismatching sample_types are seen with "perf record -e cs_etm//", where the AUX
    event has TID|TIME|CPU|IDENTIFIER and the dummy event has TID|TIME|IDENTIFIER.
    
    Perhaps they could be the same, but it isn't normally a problem if they aren't
    - perf has no problems reading the file.
    
    The sample_types have to agree on the position of IDENTIFIER, because
    that's how perf finds the right event descriptor in the first place, but
    they don't normally have to agree on other fields, and perf doesn't
    check that they do.
    
    The problem is specific to the way "perf inject" reorganizes the events
    and the way synthetic MMAP events are recorded with a zero identifier. A
    simple solution is to stop "perf inject" deleting the tracing event.
    
    Committer testing
    
    Removed the now unused 'evsel' variable, update the comment about the
    evsel removal not being performed anymore, and apply the patch manually
    as it failed with this warning:
    
      warning: Patch sent with format=flowed; space at the end of lines might be lost.
    
    Testing it with:
    
      $ perf bench internals inject-build-id
      # Running 'internals/inject-build-id' benchmark:
        Average build-id injection took: 8.543 msec (+- 0.130 msec)
        Average time per event: 0.838 usec (+- 0.013 usec)
        Average memory usage: 12717 KB (+- 9 KB)
        Average build-id-all injection took: 5.710 msec (+- 0.058 msec)
        Average time per event: 0.560 usec (+- 0.006 usec)
        Average memory usage: 12079 KB (+- 7 KB)
      $
    
    Signed-off-by: Al Grant <al.grant at arm.com>
    Acked-by: Adrian Hunter <adrian.hunter at intel.com>
    Acked-by: Namhyung Kim <namhyung at kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: Jiri Olsa <jolsa at redhat.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Peter Zijlstra <peterz at infradead.org>
    LPU-Reference: b9cf5611-daae-2390-3439-6617f8f0a34b at foss.arm.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 452a75fe68e5..0462dc8db2e3 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -779,25 +779,15 @@ static int __cmd_inject(struct perf_inject *inject)
 			dsos__hit_all(session);
 		/*
 		 * The AUX areas have been removed and replaced with
-		 * synthesized hardware events, so clear the feature flag and
-		 * remove the evsel.
+		 * synthesized hardware events, so clear the feature flag.
 		 */
 		if (inject->itrace_synth_opts.set) {
-			struct evsel *evsel;
-
 			perf_header__clear_feat(&session->header,
 						HEADER_AUXTRACE);
 			if (inject->itrace_synth_opts.last_branch ||
 			    inject->itrace_synth_opts.add_last_branch)
 				perf_header__set_feat(&session->header,
 						      HEADER_BRANCH_STACK);
-			evsel = perf_evlist__id2evsel_strict(session->evlist,
-							     inject->aux_id);
-			if (evsel) {
-				pr_debug("Deleting %s\n", evsel__name(evsel));
-				evlist__remove(session->evlist, evsel);
-				evsel__delete(evsel);
-			}
 		}
 		session->header.data_offset = output_data_offset;
 		session->header.data_size = inject->bytes_written;
commit cc05af8e2e91339bee6181a1001384d519d59ec5
Merge: 39c8d39c04bb 33d0d843872c
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Nov 16 17:05:00 2020 +0100

    Merge tag 'imx-fixes-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into arm/fixes
    
    i.MX fixes for 5.10, round 4:
    
    - Fix MDIO over clocking on vf610-zii-dev-rev-b board to get switch
      device work reliably.
    - Fix imx50-evk IOMUX for the chip select 1 to use GPIO4_13 instead of
      the native CSPI_SSI function.
    - Fix voltage for 1.6GHz CPU operating point on i.MX8MM to match
      hardware datasheet.
    - Fix phy-mode for KSZ9031 PHY on imx6qdl-udoo board.
    
    * tag 'imx-fixes-5.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
      ARM: dts: imx50-evk: Fix the chip select 1 IOMUX
      arm64: dts: imx8mm: fix voltage for 1.6GHz CPU operating point
      ARM: dts: vf610-zii-dev-rev-b: Fix MDIO over clocking
      arm: dts: imx6qdl-udoo: fix rgmii phy-mode for ksz9031 phy
    
    Link: https://lore.kernel.org/r/20201116090702.GM5849@dragon
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 39c8d39c04bb821beaa81aeda4839475313727d7
Merge: b57d5437e374 7de8bfaa095f
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Nov 16 17:04:09 2020 +0100

    Merge tag 'renesas-fixes-for-v5.10-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel into arm/fixes
    
    Renesas fixes for v5.10
    
      - Add missing audio clock on RZ/G2H.
    
    * tag 'renesas-fixes-for-v5.10-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel:
      arm64: dts: renesas: r8a774e1: Add missing audio_clk_b
    
    Link: https://lore.kernel.org/r/20201113151229.3924165-1-geert+renesas@glider.be
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit cef397038167ac15d085914493d6c86385773709
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Wed Nov 11 17:52:58 2020 +0100

    arch: pgtable: define MAX_POSSIBLE_PHYSMEM_BITS where needed
    
    Stefan Agner reported a bug when using zsram on 32-bit Arm machines
    with RAM above the 4GB address boundary:
    
      Unable to handle kernel NULL pointer dereference at virtual address 00000000
      pgd = a27bd01c
      [00000000] *pgd=236a0003, *pmd=1ffa64003
      Internal error: Oops: 207 [#1] SMP ARM
      Modules linked in: mdio_bcm_unimac(+) brcmfmac cfg80211 brcmutil raspberrypi_hwmon hci_uart crc32_arm_ce bcm2711_thermal phy_generic genet
      CPU: 0 PID: 123 Comm: mkfs.ext4 Not tainted 5.9.6 #1
      Hardware name: BCM2711
      PC is at zs_map_object+0x94/0x338
      LR is at zram_bvec_rw.constprop.0+0x330/0xa64
      pc : [<c0602b38>]    lr : [<c0bda6a0>]    psr: 60000013
      sp : e376bbe0  ip : 00000000  fp : c1e2921c
      r10: 00000002  r9 : c1dda730  r8 : 00000000
      r7 : e8ff7a00  r6 : 00000000  r5 : 02f9ffa0  r4 : e3710000
      r3 : 000fdffe  r2 : c1e0ce80  r1 : ebf979a0  r0 : 00000000
      Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
      Control: 30c5383d  Table: 235c2a80  DAC: fffffffd
      Process mkfs.ext4 (pid: 123, stack limit = 0x495a22e6)
      Stack: (0xe376bbe0 to 0xe376c000)
    
    As it turns out, zsram needs to know the maximum memory size, which
    is defined in MAX_PHYSMEM_BITS when CONFIG_SPARSEMEM is set, or in
    MAX_POSSIBLE_PHYSMEM_BITS on the x86 architecture.
    
    The same problem will be hit on all 32-bit architectures that have a
    physical address space larger than 4GB and happen to not enable sparsemem
    and include asm/sparsemem.h from asm/pgtable.h.
    
    After the initial discussion, I suggested just always defining
    MAX_POSSIBLE_PHYSMEM_BITS whenever CONFIG_PHYS_ADDR_T_64BIT is
    set, or provoking a build error otherwise. This addresses all
    configurations that can currently have this runtime bug, but
    leaves all other configurations unchanged.
    
    I looked up the possible number of bits in source code and
    datasheets, here is what I found:
    
     - on ARC, CONFIG_ARC_HAS_PAE40 controls whether 32 or 40 bits are used
     - on ARM, CONFIG_LPAE enables 40 bit addressing, without it we never
       support more than 32 bits, even though supersections in theory allow
       up to 40 bits as well.
     - on MIPS, some MIPS32r1 or later chips support 36 bits, and MIPS32r5
       XPA supports up to 60 bits in theory, but 40 bits are more than
       anyone will ever ship
     - On PowerPC, there are three different implementations of 36 bit
       addressing, but 32-bit is used without CONFIG_PTE_64BIT
     - On RISC-V, the normal page table format can support 34 bit
       addressing. There is no highmem support on RISC-V, so anything
       above 2GB is unused, but it might be useful to eventually support
       CONFIG_ZRAM for high pages.
    
    Fixes: 61989a80fb3a ("staging: zsmalloc: zsmalloc memory allocation library")
    Fixes: 02390b87a945 ("mm/zsmalloc: Prepare to variable MAX_PHYSMEM_BITS")
    Acked-by: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
    Reviewed-by: Stefan Agner <stefan at agner.ch>
    Tested-by: Stefan Agner <stefan at agner.ch>
    Acked-by: Mike Rapoport <rppt at linux.ibm.com>
    Link: https://lore.kernel.org/linux-mm/bdfa44bf1c570b05d6c70898e2bbb0acf234ecdf.1604762181.git.stefan@agner.ch/
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
index f1ed17edb085..163641726a2b 100644
--- a/arch/arc/include/asm/pgtable.h
+++ b/arch/arc/include/asm/pgtable.h
@@ -134,8 +134,10 @@
 
 #ifdef CONFIG_ARC_HAS_PAE40
 #define PTE_BITS_NON_RWX_IN_PD1	(0xff00000000 | PAGE_MASK | _PAGE_CACHEABLE)
+#define MAX_POSSIBLE_PHYSMEM_BITS 40
 #else
 #define PTE_BITS_NON_RWX_IN_PD1	(PAGE_MASK | _PAGE_CACHEABLE)
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #endif
 
 /**************************************************************************
diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h
index 3502c2f746ca..baf7d0204eb5 100644
--- a/arch/arm/include/asm/pgtable-2level.h
+++ b/arch/arm/include/asm/pgtable-2level.h
@@ -75,6 +75,8 @@
 #define PTE_HWTABLE_OFF		(PTE_HWTABLE_PTRS * sizeof(pte_t))
 #define PTE_HWTABLE_SIZE	(PTRS_PER_PTE * sizeof(u32))
 
+#define MAX_POSSIBLE_PHYSMEM_BITS	32
+
 /*
  * PMD_SHIFT determines the size of the area a second-level page table can map
  * PGDIR_SHIFT determines what a third-level page table entry can map
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
index fbb6693c3352..2b85d175e999 100644
--- a/arch/arm/include/asm/pgtable-3level.h
+++ b/arch/arm/include/asm/pgtable-3level.h
@@ -25,6 +25,8 @@
 #define PTE_HWTABLE_OFF		(0)
 #define PTE_HWTABLE_SIZE	(PTRS_PER_PTE * sizeof(u64))
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 40
+
 /*
  * PGDIR_SHIFT determines the size a top-level page table entry can map.
  */
diff --git a/arch/mips/include/asm/pgtable-32.h b/arch/mips/include/asm/pgtable-32.h
index a950fc1ddb4d..6c0532d7b211 100644
--- a/arch/mips/include/asm/pgtable-32.h
+++ b/arch/mips/include/asm/pgtable-32.h
@@ -154,6 +154,7 @@ static inline void pmd_clear(pmd_t *pmdp)
 
 #if defined(CONFIG_XPA)
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 40
 #define pte_pfn(x)		(((unsigned long)((x).pte_high >> _PFN_SHIFT)) | (unsigned long)((x).pte_low << _PAGE_PRESENT_SHIFT))
 static inline pte_t
 pfn_pte(unsigned long pfn, pgprot_t prot)
@@ -169,6 +170,7 @@ pfn_pte(unsigned long pfn, pgprot_t prot)
 
 #elif defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 36
 #define pte_pfn(x)		((unsigned long)((x).pte_high >> 6))
 
 static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot)
@@ -183,6 +185,7 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot)
 
 #else
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #ifdef CONFIG_CPU_VR41XX
 #define pte_pfn(x)		((unsigned long)((x).pte >> (PAGE_SHIFT + 2)))
 #define pfn_pte(pfn, prot)	__pte(((pfn) << (PAGE_SHIFT + 2)) | pgprot_val(prot))
diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h
index 36443cda8dcf..1376be95e975 100644
--- a/arch/powerpc/include/asm/book3s/32/pgtable.h
+++ b/arch/powerpc/include/asm/book3s/32/pgtable.h
@@ -36,8 +36,10 @@ static inline bool pte_user(pte_t pte)
  */
 #ifdef CONFIG_PTE_64BIT
 #define PTE_RPN_MASK	(~((1ULL << PTE_RPN_SHIFT) - 1))
+#define MAX_POSSIBLE_PHYSMEM_BITS 36
 #else
 #define PTE_RPN_MASK	(~((1UL << PTE_RPN_SHIFT) - 1))
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #endif
 
 /*
diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h
index ee2243ba96cf..96522f7f0618 100644
--- a/arch/powerpc/include/asm/nohash/32/pgtable.h
+++ b/arch/powerpc/include/asm/nohash/32/pgtable.h
@@ -153,8 +153,10 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
  */
 #if defined(CONFIG_PPC32) && defined(CONFIG_PTE_64BIT)
 #define PTE_RPN_MASK	(~((1ULL << PTE_RPN_SHIFT) - 1))
+#define MAX_POSSIBLE_PHYSMEM_BITS 36
 #else
 #define PTE_RPN_MASK	(~((1UL << PTE_RPN_SHIFT) - 1))
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #endif
 
 /*
diff --git a/arch/riscv/include/asm/pgtable-32.h b/arch/riscv/include/asm/pgtable-32.h
index b0ab66e5fdb1..5b2e79e5bfa5 100644
--- a/arch/riscv/include/asm/pgtable-32.h
+++ b/arch/riscv/include/asm/pgtable-32.h
@@ -14,4 +14,6 @@
 #define PGDIR_SIZE      (_AC(1, UL) << PGDIR_SHIFT)
 #define PGDIR_MASK      (~(PGDIR_SIZE - 1))
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 34
+
 #endif /* _ASM_RISCV_PGTABLE_32_H */
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index 71125a4676c4..e237004d498d 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -1427,6 +1427,19 @@ typedef unsigned int pgtbl_mod_mask;
 
 #endif /* !__ASSEMBLY__ */
 
+#if !defined(MAX_POSSIBLE_PHYSMEM_BITS) && !defined(CONFIG_64BIT)
+#ifdef CONFIG_PHYS_ADDR_T_64BIT
+/*
+ * ZSMALLOC needs to know the highest PFN on 32-bit architectures
+ * with physical address space extension, but falls back to
+ * BITS_PER_LONG otherwise.
+ */
+#error Missing MAX_POSSIBLE_PHYSMEM_BITS definition
+#else
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
+#endif
+#endif
+
 #ifndef has_transparent_hugepage
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 #define has_transparent_hugepage() 1
commit e2142ef266c8a25e635ae4319254d7c01c84deb7
Merge: 849920c70339 a584e9bc1b7e
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Nov 16 07:34:30 2020 -0800

    Merge tag 'linux-can-fixes-for-5.10-20201115' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
    
    Marc Kleine-Budde says:
    
    ====================
    pull-request: can 2020-11-15
    
    Anant Thazhemadam contributed two patches for the AF_CAN that prevent potential
    access of uninitialized member in can_rcv() and canfd_rcv().
    
    The next patch is by Alejandro Concepcion Rodriguez and changes can_restart()
    to use the correct function to push a skb into the networking stack from
    process context.
    
    Zhang Qilong's patch fixes a memory leak in the error path of the ti_hecc's
    probe function.
    
    A patch by me fixes mcba_usb_start_xmit() function in the mcba_usb driver, to
    first fill the skb and then pass it to can_put_echo_skb().
    
    Colin Ian King's patch fixes a potential integer overflow on shift in the
    peak_usb driver.
    
    The next two patches target the flexcan driver, a patch by me adds the missing
    "req_bit" to the stop mode property comment (which was broken during net-next
    for v5.10). Zhang Qilong's patch fixes the failure handling of
    pm_runtime_get_sync().
    
    The next seven patches target the m_can driver including the tcan4x5x spi
    driver glue code. Enric Balletbo i Serra's patch for the tcan4x5x Kconfig fix
    the REGMAP_SPI dependency handling. A patch by me for the tcan4x5x driver's
    probe() function adds missing error handling to for devm_regmap_init(), and in
    tcan4x5x_can_remove() the order of deregistration is fixed. Wu Bo's patch for
    the m_can driver fixes the state change handling in
    m_can_handle_state_change(). Two patches by Dan Murphy first introduce
    m_can_class_free_dev() and then make use of it to fix the freeing of the can
    device. A patch by Faiz Abbas add a missing shutdown of the CAN controller in
    the m_can_stop() function.
    
    * tag 'linux-can-fixes-for-5.10-20201115' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
      can: m_can: m_can_stop(): set device to software init mode before closing
      can: m_can: Fix freeing of can device from peripherials
      can: m_can: m_can_class_free_dev(): introduce new function
      can: m_can: m_can_handle_state_change(): fix state change
      can: tcan4x5x: tcan4x5x_can_remove(): fix order of deregistration
      can: tcan4x5x: tcan4x5x_can_probe(): add missing error checking for devm_regmap_init()
      can: tcan4x5x: replace depends on REGMAP_SPI with depends on SPI
      can: flexcan: fix failure handling of pm_runtime_get_sync()
      can: flexcan: flexcan_setup_stop_mode(): add missing "req_bit" to stop mode property comment
      can: peak_usb: fix potential integer overflow on shift of a int
      can: mcba_usb: mcba_usb_start_xmit(): first fill skb, then pass to can_put_echo_skb()
      can: ti_hecc: Fix memleak in ti_hecc_probe
      can: dev: can_restart(): post buffer from the right context
      can: af_can: prevent potential access of uninitialized member in canfd_rcv()
      can: af_can: prevent potential access of uninitialized member in can_rcv()
    ====================
    
    Link: https://lore.kernel.org/r/20201115174131.2089251-1-mkl@pengutronix.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 6f117cb854a44a79898d844e6ae3fd23bd94e786
Author: Stefan Haberland <sth at linux.ibm.com>
Date:   Mon Nov 16 16:23:47 2020 +0100

    s390/dasd: fix null pointer dereference for ERP requests
    
    When requeueing all requests on the device request queue to the blocklayer
    we might get to an ERP (error recovery) request that is a copy of an
    original CQR.
    
    Those requests do not have blocklayer request information or a pointer to
    the dasd_queue set. When trying to access those data it will lead to a
    null pointer dereference in dasd_requeue_all_requests().
    
    Fix by checking if the request is an ERP request that can simply be
    ignored. The blocklayer request will be requeued by the original CQR that
    is on the device queue right behind the ERP request.
    
    Fixes: 9487cfd3430d ("s390/dasd: fix handling of internal requests")
    Cc: <stable at vger.kernel.org> #4.16
    Signed-off-by: Stefan Haberland <sth at linux.ibm.com>
    Reviewed-by: Jan Hoeppner <hoeppner at linux.ibm.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index eb17fea8075c..217a7b84abdf 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -2980,6 +2980,12 @@ static int _dasd_requeue_request(struct dasd_ccw_req *cqr)
 
 	if (!block)
 		return -EINVAL;
+	/*
+	 * If the request is an ERP request there is nothing to requeue.
+	 * This will be done with the remaining original request.
+	 */
+	if (cqr->refers)
+		return 0;
 	spin_lock_irq(&cqr->dq->lock);
 	req = (struct request *) cqr->callback_data;
 	blk_mq_requeue_request(req, false);
commit d78359b25f7c6759a23189145be8141b6fdfe385
Author: Kai Vehmanen <kai.vehmanen at linux.intel.com>
Date:   Mon Nov 16 16:19:55 2020 +0200

    ALSA: hda: Add Alderlake-S PCI ID and HDMI codec vid
    
    Add HD Audio PCI ID and HDMI codec vendor ID for Intel Alder Lake.
    
    Signed-off-by: Kai Vehmanen <kai.vehmanen at linux.intel.com>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
    Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski at linux.intel.com>
    Link: https://lore.kernel.org/r/20201116141955.2091240-1-kai.vehmanen@linux.intel.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index d539f52009a1..6852668f1bcb 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -2506,6 +2506,9 @@ static const struct pci_device_id azx_ids[] = {
 	/* DG1 */
 	{ PCI_DEVICE(0x8086, 0x490d),
 	  .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
+	/* Alderlake-S */
+	{ PCI_DEVICE(0x8086, 0x7ad0),
+	  .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
 	/* Elkhart Lake */
 	{ PCI_DEVICE(0x8086, 0x4b55),
 	  .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index ccd1df059654..b0068f8ca46d 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -4274,6 +4274,7 @@ HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI",	patch_i915_glk_hdmi),
 HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI",	patch_i915_icl_hdmi),
 HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI",	patch_i915_tgl_hdmi),
 HDA_CODEC_ENTRY(0x80862814, "DG1 HDMI",	patch_i915_tgl_hdmi),
+HDA_CODEC_ENTRY(0x80862815, "Alderlake HDMI",	patch_i915_tgl_hdmi),
 HDA_CODEC_ENTRY(0x80862816, "Rocketlake HDMI",	patch_i915_tgl_hdmi),
 HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI",	patch_i915_icl_hdmi),
 HDA_CODEC_ENTRY(0x8086281b, "Elkhartlake HDMI",	patch_i915_icl_hdmi),
commit 7dc7a8b04f3da8aa3c3be514e155e2fa094e976f
Author: Guenter Roeck <linux at roeck-us.net>
Date:   Tue Nov 10 15:52:01 2020 -0800

    ACPI: fan: Initialize performance state sysfs attribute
    
    The following warning is reported if lock debugging is enabled.
    
    DEBUG_LOCKS_WARN_ON(1)
    WARNING: CPU: 1 PID: 1 at kernel/locking/lockdep.c:4617 lockdep_init_map_waits+0x141/0x222
    ...
    Call Trace:
     __kernfs_create_file+0x7a/0xd8
     sysfs_add_file_mode_ns+0x135/0x189
     sysfs_create_file_ns+0x70/0xa0
     acpi_fan_probe+0x547/0x621
     platform_drv_probe+0x67/0x8b
     ...
    
    Dynamically allocated sysfs attributes need to be initialized to avoid
    the warning.
    
    Fixes: d19e470b6605 ("ACPI: fan: Expose fan performance state information")
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>
    Cc: 5.6+ <stable at vger.kernel.org> # 5.6+
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index 48354f82fba6..66c3983f0ccc 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -352,6 +352,7 @@ static int acpi_fan_get_fps(struct acpi_device *device)
 		struct acpi_fan_fps *fps = &fan->fps[i];
 
 		snprintf(fps->name, ACPI_FPS_NAME_LEN, "state%d", i);
+		sysfs_attr_init(&fps->dev_attr.attr);
 		fps->dev_attr.show = show_state;
 		fps->dev_attr.store = NULL;
 		fps->dev_attr.attr.name = fps->name;
commit 8986f223bd777a73119f5d593c15b4d630ff49bb
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Mon Nov 16 13:52:47 2020 +0100

    iommu/vt-d: Take CONFIG_PCI_ATS into account
    
    pci_dev::physfn is only available when CONFIG_PCI_ATS is set. The recent
    fix for the irqdomain rework missed that dependency which makes the build
    fail when CONFIG_PCI_ATS=n.
    
    Add the necessary #ifdeffery.
    
    Reported-by: Geert Uytterhoeven <geert at linux-m68k.org>
    Fixes: ff828729be44 ("iommu/vt-d: Cure VF irqdomain hickup")
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Cc: Joerg Roedel <joro at 8bytes.org>

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index b2e804473209..bc9f4cf72240 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -335,7 +335,9 @@ static void  dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
 
 static inline void vf_inherit_msi_domain(struct pci_dev *pdev)
 {
+#ifdef CONFIG_PCI_ATS
 	dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&pdev->physfn->dev));
+#endif
 }
 
 static int dmar_pci_bus_notifier(struct notifier_block *nb,
commit 75b49620267c700f0a07fec7f27f69852db70e46
Author: Cédric Le Goater <clg at kaod.org>
Date:   Thu Nov 5 14:47:13 2020 +0100

    KVM: PPC: Book3S HV: XIVE: Fix possible oops when accessing ESB page
    
    When accessing the ESB page of a source interrupt, the fault handler
    will retrieve the page address from the XIVE interrupt 'xive_irq_data'
    structure. If the associated KVM XIVE interrupt is not valid, that is
    not allocated at the HW level for some reason, the fault handler will
    dereference a NULL pointer leading to the oops below :
    
      WARNING: CPU: 40 PID: 59101 at arch/powerpc/kvm/book3s_xive_native.c:259 xive_native_esb_fault+0xe4/0x240 [kvm]
      CPU: 40 PID: 59101 Comm: qemu-system-ppc Kdump: loaded Tainted: G        W        --------- -  - 4.18.0-240.el8.ppc64le #1
      NIP:  c00800000e949fac LR: c00000000044b164 CTR: c00800000e949ec8
      REGS: c000001f69617840 TRAP: 0700   Tainted: G        W        --------- -  -  (4.18.0-240.el8.ppc64le)
      MSR:  9000000000029033 <SF,HV,EE,ME,IR,DR,RI,LE>  CR: 44044282  XER: 00000000
      CFAR: c00000000044b160 IRQMASK: 0
      GPR00: c00000000044b164 c000001f69617ac0 c00800000e96e000 c000001f69617c10
      GPR04: 05faa2b21e000080 0000000000000000 0000000000000005 ffffffffffffffff
      GPR08: 0000000000000000 0000000000000001 0000000000000000 0000000000000001
      GPR12: c00800000e949ec8 c000001ffffd3400 0000000000000000 0000000000000000
      GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
      GPR20: 0000000000000000 0000000000000000 c000001f5c065160 c000000001c76f90
      GPR24: c000001f06f20000 c000001f5c065100 0000000000000008 c000001f0eb98c78
      GPR28: c000001dcab40000 c000001dcab403d8 c000001f69617c10 0000000000000011
      NIP [c00800000e949fac] xive_native_esb_fault+0xe4/0x240 [kvm]
      LR [c00000000044b164] __do_fault+0x64/0x220
      Call Trace:
      [c000001f69617ac0] [0000000137a5dc20] 0x137a5dc20 (unreliable)
      [c000001f69617b50] [c00000000044b164] __do_fault+0x64/0x220
      [c000001f69617b90] [c000000000453838] do_fault+0x218/0x930
      [c000001f69617bf0] [c000000000456f50] __handle_mm_fault+0x350/0xdf0
      [c000001f69617cd0] [c000000000457b1c] handle_mm_fault+0x12c/0x310
      [c000001f69617d10] [c00000000007ef44] __do_page_fault+0x264/0xbb0
      [c000001f69617df0] [c00000000007f8c8] do_page_fault+0x38/0xd0
      [c000001f69617e30] [c00000000000a714] handle_page_fault+0x18/0x38
      Instruction dump:
      40c2fff0 7c2004ac 2fa90000 409e0118 73e90001 41820080 e8bd0008 7c2004ac
      7ca90074 39400000 915c0000 7929d182 <0b090000> 2fa50000 419e0080 e89e0018
      ---[ end trace 66c6ff034c53f64f ]---
      xive-kvm: xive_native_esb_fault: accessing invalid ESB page for source 8 !
    
    Fix that by checking the validity of the KVM XIVE interrupt structure.
    
    Fixes: 6520ca64cde7 ("KVM: PPC: Book3S HV: XIVE: Add a mapping for the source ESB pages")
    Cc: stable at vger.kernel.org # v5.2+
    Reported-by: Greg Kurz <groug at kaod.org>
    Signed-off-by: Cédric Le Goater <clg at kaod.org>
    Tested-by: Greg Kurz <groug at kaod.org>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201105134713.656160-1-clg@kaod.org

diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index d0c2db0e07fa..a59a94f02733 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -251,6 +251,13 @@ static vm_fault_t xive_native_esb_fault(struct vm_fault *vmf)
 	}
 
 	state = &sb->irq_state[src];
+
+	/* Some sanity checking */
+	if (!state->valid) {
+		pr_devel("%s: source %lx invalid !\n", __func__, irq);
+		return VM_FAULT_SIGBUS;
+	}
+
 	kvmppc_xive_select_irq(state, &hw_num, &xd);
 
 	arch_spin_lock(&sb->lock);
commit c39de538a06e76d89b7e598a71e16688009cd56c
Author: Dmitry Osipenko <digetx at gmail.com>
Date:   Wed Nov 4 16:21:26 2020 +0300

    cpuidle: tegra: Annotate tegra_pm_set_cpu_in_lp2() with RCU_NONIDLE
    
    Annotate tegra_pm_set[clear]_cpu_in_lp2() with RCU_NONIDLE in order to
    fix lockdep warning about suspicious RCU usage of a spinlock during late
    idling phase.
    
     WARNING: suspicious RCU usage
     ...
     include/trace/events/lock.h:13 suspicious rcu_dereference_check() usage!
     ...
      (dump_stack) from (lock_acquire)
      (lock_acquire) from (_raw_spin_lock)
      (_raw_spin_lock) from (tegra_pm_set_cpu_in_lp2)
      (tegra_pm_set_cpu_in_lp2) from (tegra_cpuidle_enter)
      (tegra_cpuidle_enter) from (cpuidle_enter_state)
      (cpuidle_enter_state) from (cpuidle_enter_state_coupled)
      (cpuidle_enter_state_coupled) from (cpuidle_enter)
      (cpuidle_enter) from (do_idle)
     ...
    
    Tested-by: Peter Geis <pgwipeout at gmail.com>
    Reported-by: Peter Geis <pgwipeout at gmail.com>
    Signed-off-by: Dmitry Osipenko <digetx at gmail.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c
index e8956706a291..191966dc8d02 100644
--- a/drivers/cpuidle/cpuidle-tegra.c
+++ b/drivers/cpuidle/cpuidle-tegra.c
@@ -189,7 +189,7 @@ static int tegra_cpuidle_state_enter(struct cpuidle_device *dev,
 	}
 
 	local_fiq_disable();
-	tegra_pm_set_cpu_in_lp2();
+	RCU_NONIDLE(tegra_pm_set_cpu_in_lp2());
 	cpu_pm_enter();
 
 	switch (index) {
@@ -207,7 +207,7 @@ static int tegra_cpuidle_state_enter(struct cpuidle_device *dev,
 	}
 
 	cpu_pm_exit();
-	tegra_pm_clear_cpu_in_lp2();
+	RCU_NONIDLE(tegra_pm_clear_cpu_in_lp2());
 	local_fiq_enable();
 
 	return err ?: index;
commit 3a860d165eb5f4d7cf0bf81ef6a5b5c5e1754422
Author: Max Filippov <jcmvbkbc at gmail.com>
Date:   Mon Nov 16 01:38:59 2020 -0800

    xtensa: disable preemption around cache alias management calls
    
    Although cache alias management calls set up and tear down TLB entries
    and fast_second_level_miss is able to restore TLB entry should it be
    evicted they absolutely cannot preempt each other because they use the
    same TLBTEMP area for different purposes.
    Disable preemption around all cache alias management calls to enforce
    that.
    
    Cc: stable at vger.kernel.org
    Signed-off-by: Max Filippov <jcmvbkbc at gmail.com>

diff --git a/arch/xtensa/mm/cache.c b/arch/xtensa/mm/cache.c
index 5835406b3cec..085b8c77b9d9 100644
--- a/arch/xtensa/mm/cache.c
+++ b/arch/xtensa/mm/cache.c
@@ -70,8 +70,10 @@ static inline void kmap_invalidate_coherent(struct page *page,
 			kvaddr = TLBTEMP_BASE_1 +
 				(page_to_phys(page) & DCACHE_ALIAS_MASK);
 
+			preempt_disable();
 			__invalidate_dcache_page_alias(kvaddr,
 						       page_to_phys(page));
+			preempt_enable();
 		}
 	}
 }
@@ -156,6 +158,7 @@ void flush_dcache_page(struct page *page)
 		if (!alias && !mapping)
 			return;
 
+		preempt_disable();
 		virt = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
 		__flush_invalidate_dcache_page_alias(virt, phys);
 
@@ -166,6 +169,7 @@ void flush_dcache_page(struct page *page)
 
 		if (mapping)
 			__invalidate_icache_page_alias(virt, phys);
+		preempt_enable();
 	}
 
 	/* There shouldn't be an entry in the cache for this page anymore. */
@@ -199,8 +203,10 @@ void local_flush_cache_page(struct vm_area_struct *vma, unsigned long address,
 	unsigned long phys = page_to_phys(pfn_to_page(pfn));
 	unsigned long virt = TLBTEMP_BASE_1 + (address & DCACHE_ALIAS_MASK);
 
+	preempt_disable();
 	__flush_invalidate_dcache_page_alias(virt, phys);
 	__invalidate_icache_page_alias(virt, phys);
+	preempt_enable();
 }
 EXPORT_SYMBOL(local_flush_cache_page);
 
@@ -227,11 +233,13 @@ update_mmu_cache(struct vm_area_struct * vma, unsigned long addr, pte_t *ptep)
 		unsigned long phys = page_to_phys(page);
 		unsigned long tmp;
 
+		preempt_disable();
 		tmp = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
 		__flush_invalidate_dcache_page_alias(tmp, phys);
 		tmp = TLBTEMP_BASE_1 + (addr & DCACHE_ALIAS_MASK);
 		__flush_invalidate_dcache_page_alias(tmp, phys);
 		__invalidate_icache_page_alias(tmp, phys);
+		preempt_enable();
 
 		clear_bit(PG_arch_1, &page->flags);
 	}
@@ -265,7 +273,9 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
 
 	if (alias) {
 		unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
+		preempt_disable();
 		__flush_invalidate_dcache_page_alias(t, phys);
+		preempt_enable();
 	}
 
 	/* Copy data */
@@ -280,9 +290,11 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
 	if (alias) {
 		unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
 
+		preempt_disable();
 		__flush_invalidate_dcache_range((unsigned long) dst, len);
 		if ((vma->vm_flags & VM_EXEC) != 0)
 			__invalidate_icache_page_alias(t, phys);
+		preempt_enable();
 
 	} else if ((vma->vm_flags & VM_EXEC) != 0) {
 		__flush_dcache_range((unsigned long)dst,len);
@@ -304,7 +316,9 @@ extern void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
 
 	if (alias) {
 		unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
+		preempt_disable();
 		__flush_invalidate_dcache_page_alias(t, phys);
+		preempt_enable();
 	}
 
 	memcpy(dst, src, len);
commit 481535c5b41d191b22775a6873de5ec0e1cdced1
Author: Max Filippov <jcmvbkbc at gmail.com>
Date:   Mon Nov 16 01:25:56 2020 -0800

    xtensa: fix TLBTEMP area placement
    
    fast_second_level_miss handler for the TLBTEMP area has an assumption
    that page table directory entry for the TLBTEMP address range is 0. For
    it to be true the TLBTEMP area must be aligned to 4MB boundary and not
    share its 4MB region with anything that may use a page table. This is
    not true currently: TLBTEMP shares space with vmalloc space which
    results in the following kinds of runtime errors when
    fast_second_level_miss loads page table directory entry for the vmalloc
    space instead of fixing up the TLBTEMP area:
    
     Unable to handle kernel paging request at virtual address c7ff0e00
      pc = d0009275, ra = 90009478
     Oops: sig: 9 [#1] PREEMPT
     CPU: 1 PID: 61 Comm: kworker/u9:2 Not tainted 5.10.0-rc3-next-20201110-00007-g1fe4962fa983-dirty #58
     Workqueue: xprtiod xs_stream_data_receive_workfn
     a00: 90009478 d11e1dc0 c7ff0e00 00000020 c7ff0000 00000001 7f8b8107 00000000
     a08: 900c5992 d11e1d90 d0cc88b8 5506e97c 00000000 5506e97c d06c8074 d11e1d90
     pc: d0009275, ps: 00060310, depc: 00000014, excvaddr: c7ff0e00
     lbeg: d0009275, lend: d0009287 lcount: 00000003, sar: 00000010
     Call Trace:
       xs_stream_data_receive_workfn+0x43c/0x770
       process_one_work+0x1a1/0x324
       worker_thread+0x1cc/0x3c0
       kthread+0x10d/0x124
       ret_from_kernel_thread+0xc/0x18
    
    Cc: stable at vger.kernel.org
    Signed-off-by: Max Filippov <jcmvbkbc at gmail.com>

diff --git a/Documentation/xtensa/mmu.rst b/Documentation/xtensa/mmu.rst
index e52a12960fdc..450573afa31a 100644
--- a/Documentation/xtensa/mmu.rst
+++ b/Documentation/xtensa/mmu.rst
@@ -82,7 +82,8 @@ Default MMUv2-compatible layout::
   +------------------+
   | VMALLOC area     |  VMALLOC_START            0xc0000000  128MB - 64KB
   +------------------+  VMALLOC_END
-  | Cache aliasing   |  TLBTEMP_BASE_1           0xc7ff0000  DCACHE_WAY_SIZE
+  +------------------+
+  | Cache aliasing   |  TLBTEMP_BASE_1           0xc8000000  DCACHE_WAY_SIZE
   | remap area 1     |
   +------------------+
   | Cache aliasing   |  TLBTEMP_BASE_2                       DCACHE_WAY_SIZE
@@ -124,7 +125,8 @@ Default MMUv2-compatible layout::
   +------------------+
   | VMALLOC area     |  VMALLOC_START            0xa0000000  128MB - 64KB
   +------------------+  VMALLOC_END
-  | Cache aliasing   |  TLBTEMP_BASE_1           0xa7ff0000  DCACHE_WAY_SIZE
+  +------------------+
+  | Cache aliasing   |  TLBTEMP_BASE_1           0xa8000000  DCACHE_WAY_SIZE
   | remap area 1     |
   +------------------+
   | Cache aliasing   |  TLBTEMP_BASE_2                       DCACHE_WAY_SIZE
@@ -167,7 +169,8 @@ Default MMUv2-compatible layout::
   +------------------+
   | VMALLOC area     |  VMALLOC_START            0x90000000  128MB - 64KB
   +------------------+  VMALLOC_END
-  | Cache aliasing   |  TLBTEMP_BASE_1           0x97ff0000  DCACHE_WAY_SIZE
+  +------------------+
+  | Cache aliasing   |  TLBTEMP_BASE_1           0x98000000  DCACHE_WAY_SIZE
   | remap area 1     |
   +------------------+
   | Cache aliasing   |  TLBTEMP_BASE_2                       DCACHE_WAY_SIZE
diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h
index fa054a1772e1..4dc04e6c01d7 100644
--- a/arch/xtensa/include/asm/pgtable.h
+++ b/arch/xtensa/include/asm/pgtable.h
@@ -69,7 +69,7 @@
  */
 #define VMALLOC_START		(XCHAL_KSEG_CACHED_VADDR - 0x10000000)
 #define VMALLOC_END		(VMALLOC_START + 0x07FEFFFF)
-#define TLBTEMP_BASE_1		(VMALLOC_END + 1)
+#define TLBTEMP_BASE_1		(VMALLOC_START + 0x08000000)
 #define TLBTEMP_BASE_2		(TLBTEMP_BASE_1 + DCACHE_WAY_SIZE)
 #if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE
 #define TLBTEMP_SIZE		(2 * DCACHE_WAY_SIZE)
commit 5f714771d01e0e0d410f06d4d192fb27b1ca0edd
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Thu Nov 12 21:03:01 2020 +0200

    pinctrl: baytrail: Avoid clearing debounce value when turning it off
    
    Baytrail pin control has a common register to set up debounce timeout.
    When a pin configuration requested debounce to be disabled, the rest
    of the pins may still want to have debounce enabled and thus rely on
    the common timeout value. Avoid clearing debounce value when turning
    it off for one pin while others may still use it.
    
    Fixes: 658b476c742f ("pinctrl: baytrail: Add debounce configuration")
    Depends-on: 04ff5a095d66 ("pinctrl: baytrail: Rectify debounce support")
    Depends-on: 827e1579e1d5 ("pinctrl: baytrail: Rectify debounce support (part 2)")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c
index d49aab3cfbaa..394a421a19d5 100644
--- a/drivers/pinctrl/intel/pinctrl-baytrail.c
+++ b/drivers/pinctrl/intel/pinctrl-baytrail.c
@@ -1049,7 +1049,6 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev,
 			break;
 		case PIN_CONFIG_INPUT_DEBOUNCE:
 			debounce = readl(db_reg);
-			debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 
 			if (arg)
 				conf |= BYT_DEBOUNCE_EN;
@@ -1058,24 +1057,31 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev,
 
 			switch (arg) {
 			case 375:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_375US;
 				break;
 			case 750:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_750US;
 				break;
 			case 1500:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_1500US;
 				break;
 			case 3000:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_3MS;
 				break;
 			case 6000:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_6MS;
 				break;
 			case 12000:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_12MS;
 				break;
 			case 24000:
+				debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
 				debounce |= BYT_DEBOUNCE_PULSE_24MS;
 				break;
 			default:
commit 03a61f11c00213394e3c7ac62ae416d034dc728f
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Wed Nov 11 14:06:05 2020 +0200

    pinctrl: merrifield: Set default bias in case no particular value given
    
    When GPIO library asks pin control to set the bias, it doesn't pass
    any value of it and argument is considered boolean (and this is true
    for ACPI GpioIo() / GpioInt() resources, by the way). Thus, individual
    drivers must behave well, when they got the resistance value of 1 Ohm,
    i.e. transforming it to sane default.
    
    In case of Intel Merrifield pin control hardware the 20 kOhm sounds plausible
    because it gives a good trade off between weakness and minimization of leakage
    current (will be only 50 uA with the above choice).
    
    Fixes: 4e80c8f50574 ("pinctrl: intel: Add Intel Merrifield pin controller support")
    Depends-on: 2956b5d94a76 ("pinctrl / gpio: Introduce .set_config() callback for GPIO chips")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/pinctrl/intel/pinctrl-merrifield.c b/drivers/pinctrl/intel/pinctrl-merrifield.c
index e4ff8da1b894..3ae141e0b421 100644
--- a/drivers/pinctrl/intel/pinctrl-merrifield.c
+++ b/drivers/pinctrl/intel/pinctrl-merrifield.c
@@ -745,6 +745,10 @@ static int mrfld_config_set_pin(struct mrfld_pinctrl *mp, unsigned int pin,
 		mask |= BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
 		bits |= BUFCFG_PU_EN;
 
+		/* Set default strength value in case none is given */
+		if (arg == 1)
+			arg = 20000;
+
 		switch (arg) {
 		case 50000:
 			bits |= BUFCFG_PUPD_VAL_50K << BUFCFG_PUPD_VAL_SHIFT;
@@ -765,6 +769,10 @@ static int mrfld_config_set_pin(struct mrfld_pinctrl *mp, unsigned int pin,
 		mask |= BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
 		bits |= BUFCFG_PD_EN;
 
+		/* Set default strength value in case none is given */
+		if (arg == 1)
+			arg = 20000;
+
 		switch (arg) {
 		case 50000:
 			bits |= BUFCFG_PUPD_VAL_50K << BUFCFG_PUPD_VAL_SHIFT;
commit cdd8fc2dd64e3f1b22a6636e242d0eff49c4ba22
Author: Evan Green <evgreen at chromium.org>
Date:   Wed Nov 11 15:17:28 2020 -0800

    pinctrl: jasperlake: Fix HOSTSW_OWN offset
    
    GPIOs that attempt to use interrupts get thwarted with a message like:
    "pin 161 cannot be used as IRQ" (for instance with SD_CD). This is because
    the HOSTSW_OWN offset is incorrect, so every GPIO looks like it's
    owned by ACPI.
    
    Fixes: e278dcb7048b1 ("pinctrl: intel: Add Intel Jasper Lake pin controller support")
    Cc: stable at vger.kernel.org
    Signed-off-by: Evan Green <evgreen at chromium.org>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

diff --git a/drivers/pinctrl/intel/pinctrl-jasperlake.c b/drivers/pinctrl/intel/pinctrl-jasperlake.c
index c5e204c8da9c..ec435b7ab392 100644
--- a/drivers/pinctrl/intel/pinctrl-jasperlake.c
+++ b/drivers/pinctrl/intel/pinctrl-jasperlake.c
@@ -16,7 +16,7 @@
 
 #define JSL_PAD_OWN	0x020
 #define JSL_PADCFGLOCK	0x080
-#define JSL_HOSTSW_OWN	0x0b0
+#define JSL_HOSTSW_OWN	0x0c0
 #define JSL_GPI_IS	0x100
 #define JSL_GPI_IE	0x120
 
commit 59024c936561090d766370e839a880dd42232c33
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Tue Nov 10 21:59:23 2020 +0200

    pinctrl: jasperlake: Unhide SPI group of pins
    
    If the group of pins is hidden in the pin list it affects
    the register offset calculation despite fixed GPIO base.
    Hence, the offsets of all pins after the hidden group
    are broken. Instead we have to unhide the group and use a flag
    to exclude it from GPIO number space.
    
    Fixes: e278dcb7048b ("pinctrl: intel: Add Intel Jasper Lake pin controller support")
    Reported-by: Divagar Mohandass <divagar.mohandass at intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/pinctrl/intel/pinctrl-jasperlake.c b/drivers/pinctrl/intel/pinctrl-jasperlake.c
index 9bd0e8e6310c..c5e204c8da9c 100644
--- a/drivers/pinctrl/intel/pinctrl-jasperlake.c
+++ b/drivers/pinctrl/intel/pinctrl-jasperlake.c
@@ -65,252 +65,263 @@ static const struct pinctrl_pin_desc jsl_pins[] = {
 	PINCTRL_PIN(17, "EMMC_CLK"),
 	PINCTRL_PIN(18, "EMMC_RESETB"),
 	PINCTRL_PIN(19, "A4WP_PRESENT"),
+	/* SPI */
+	PINCTRL_PIN(20, "SPI0_IO_2"),
+	PINCTRL_PIN(21, "SPI0_IO_3"),
+	PINCTRL_PIN(22, "SPI0_MOSI_IO_0"),
+	PINCTRL_PIN(23, "SPI0_MISO_IO_1"),
+	PINCTRL_PIN(24, "SPI0_TPM_CSB"),
+	PINCTRL_PIN(25, "SPI0_FLASH_0_CSB"),
+	PINCTRL_PIN(26, "SPI0_FLASH_1_CSB"),
+	PINCTRL_PIN(27, "SPI0_CLK"),
+	PINCTRL_PIN(28, "SPI0_CLK_LOOPBK"),
 	/* GPP_B */
-	PINCTRL_PIN(20, "CORE_VID_0"),
-	PINCTRL_PIN(21, "CORE_VID_1"),
-	PINCTRL_PIN(22, "VRALERTB"),
-	PINCTRL_PIN(23, "CPU_GP_2"),
-	PINCTRL_PIN(24, "CPU_GP_3"),
-	PINCTRL_PIN(25, "SRCCLKREQB_0"),
-	PINCTRL_PIN(26, "SRCCLKREQB_1"),
-	PINCTRL_PIN(27, "SRCCLKREQB_2"),
-	PINCTRL_PIN(28, "SRCCLKREQB_3"),
-	PINCTRL_PIN(29, "SRCCLKREQB_4"),
-	PINCTRL_PIN(30, "SRCCLKREQB_5"),
-	PINCTRL_PIN(31, "PMCALERTB"),
-	PINCTRL_PIN(32, "SLP_S0B"),
-	PINCTRL_PIN(33, "PLTRSTB"),
-	PINCTRL_PIN(34, "SPKR"),
-	PINCTRL_PIN(35, "GSPI0_CS0B"),
-	PINCTRL_PIN(36, "GSPI0_CLK"),
-	PINCTRL_PIN(37, "GSPI0_MISO"),
-	PINCTRL_PIN(38, "GSPI0_MOSI"),
-	PINCTRL_PIN(39, "GSPI1_CS0B"),
-	PINCTRL_PIN(40, "GSPI1_CLK"),
-	PINCTRL_PIN(41, "GSPI1_MISO"),
-	PINCTRL_PIN(42, "GSPI1_MOSI"),
-	PINCTRL_PIN(43, "DDSP_HPD_A"),
-	PINCTRL_PIN(44, "GSPI0_CLK_LOOPBK"),
-	PINCTRL_PIN(45, "GSPI1_CLK_LOOPBK"),
+	PINCTRL_PIN(29, "CORE_VID_0"),
+	PINCTRL_PIN(30, "CORE_VID_1"),
+	PINCTRL_PIN(31, "VRALERTB"),
+	PINCTRL_PIN(32, "CPU_GP_2"),
+	PINCTRL_PIN(33, "CPU_GP_3"),
+	PINCTRL_PIN(34, "SRCCLKREQB_0"),
+	PINCTRL_PIN(35, "SRCCLKREQB_1"),
+	PINCTRL_PIN(36, "SRCCLKREQB_2"),
+	PINCTRL_PIN(37, "SRCCLKREQB_3"),
+	PINCTRL_PIN(38, "SRCCLKREQB_4"),
+	PINCTRL_PIN(39, "SRCCLKREQB_5"),
+	PINCTRL_PIN(40, "PMCALERTB"),
+	PINCTRL_PIN(41, "SLP_S0B"),
+	PINCTRL_PIN(42, "PLTRSTB"),
+	PINCTRL_PIN(43, "SPKR"),
+	PINCTRL_PIN(44, "GSPI0_CS0B"),
+	PINCTRL_PIN(45, "GSPI0_CLK"),
+	PINCTRL_PIN(46, "GSPI0_MISO"),
+	PINCTRL_PIN(47, "GSPI0_MOSI"),
+	PINCTRL_PIN(48, "GSPI1_CS0B"),
+	PINCTRL_PIN(49, "GSPI1_CLK"),
+	PINCTRL_PIN(50, "GSPI1_MISO"),
+	PINCTRL_PIN(51, "GSPI1_MOSI"),
+	PINCTRL_PIN(52, "DDSP_HPD_A"),
+	PINCTRL_PIN(53, "GSPI0_CLK_LOOPBK"),
+	PINCTRL_PIN(54, "GSPI1_CLK_LOOPBK"),
 	/* GPP_A */
-	PINCTRL_PIN(46, "ESPI_IO_0"),
-	PINCTRL_PIN(47, "ESPI_IO_1"),
-	PINCTRL_PIN(48, "ESPI_IO_2"),
-	PINCTRL_PIN(49, "ESPI_IO_3"),
-	PINCTRL_PIN(50, "ESPI_CSB"),
-	PINCTRL_PIN(51, "ESPI_CLK"),
-	PINCTRL_PIN(52, "ESPI_RESETB"),
-	PINCTRL_PIN(53, "SMBCLK"),
-	PINCTRL_PIN(54, "SMBDATA"),
-	PINCTRL_PIN(55, "SMBALERTB"),
-	PINCTRL_PIN(56, "CPU_GP_0"),
-	PINCTRL_PIN(57, "CPU_GP_1"),
-	PINCTRL_PIN(58, "USB2_OCB_1"),
-	PINCTRL_PIN(59, "USB2_OCB_2"),
-	PINCTRL_PIN(60, "USB2_OCB_3"),
-	PINCTRL_PIN(61, "DDSP_HPD_A_TIME_SYNC_0"),
-	PINCTRL_PIN(62, "DDSP_HPD_B"),
-	PINCTRL_PIN(63, "DDSP_HPD_C"),
-	PINCTRL_PIN(64, "USB2_OCB_0"),
-	PINCTRL_PIN(65, "PCHHOTB"),
-	PINCTRL_PIN(66, "ESPI_CLK_LOOPBK"),
+	PINCTRL_PIN(55, "ESPI_IO_0"),
+	PINCTRL_PIN(56, "ESPI_IO_1"),
+	PINCTRL_PIN(57, "ESPI_IO_2"),
+	PINCTRL_PIN(58, "ESPI_IO_3"),
+	PINCTRL_PIN(59, "ESPI_CSB"),
+	PINCTRL_PIN(60, "ESPI_CLK"),
+	PINCTRL_PIN(61, "ESPI_RESETB"),
+	PINCTRL_PIN(62, "SMBCLK"),
+	PINCTRL_PIN(63, "SMBDATA"),
+	PINCTRL_PIN(64, "SMBALERTB"),
+	PINCTRL_PIN(65, "CPU_GP_0"),
+	PINCTRL_PIN(66, "CPU_GP_1"),
+	PINCTRL_PIN(67, "USB2_OCB_1"),
+	PINCTRL_PIN(68, "USB2_OCB_2"),
+	PINCTRL_PIN(69, "USB2_OCB_3"),
+	PINCTRL_PIN(70, "DDSP_HPD_A_TIME_SYNC_0"),
+	PINCTRL_PIN(71, "DDSP_HPD_B"),
+	PINCTRL_PIN(72, "DDSP_HPD_C"),
+	PINCTRL_PIN(73, "USB2_OCB_0"),
+	PINCTRL_PIN(74, "PCHHOTB"),
+	PINCTRL_PIN(75, "ESPI_CLK_LOOPBK"),
 	/* GPP_S */
-	PINCTRL_PIN(67, "SNDW1_CLK"),
-	PINCTRL_PIN(68, "SNDW1_DATA"),
-	PINCTRL_PIN(69, "SNDW2_CLK"),
-	PINCTRL_PIN(70, "SNDW2_DATA"),
-	PINCTRL_PIN(71, "SNDW1_CLK"),
-	PINCTRL_PIN(72, "SNDW1_DATA"),
-	PINCTRL_PIN(73, "SNDW4_CLK_DMIC_CLK_0"),
-	PINCTRL_PIN(74, "SNDW4_DATA_DMIC_DATA_0"),
+	PINCTRL_PIN(76, "SNDW1_CLK"),
+	PINCTRL_PIN(77, "SNDW1_DATA"),
+	PINCTRL_PIN(78, "SNDW2_CLK"),
+	PINCTRL_PIN(79, "SNDW2_DATA"),
+	PINCTRL_PIN(80, "SNDW1_CLK"),
+	PINCTRL_PIN(81, "SNDW1_DATA"),
+	PINCTRL_PIN(82, "SNDW4_CLK_DMIC_CLK_0"),
+	PINCTRL_PIN(83, "SNDW4_DATA_DMIC_DATA_0"),
 	/* GPP_R */
-	PINCTRL_PIN(75, "HDA_BCLK"),
-	PINCTRL_PIN(76, "HDA_SYNC"),
-	PINCTRL_PIN(77, "HDA_SDO"),
-	PINCTRL_PIN(78, "HDA_SDI_0"),
-	PINCTRL_PIN(79, "HDA_RSTB"),
-	PINCTRL_PIN(80, "HDA_SDI_1"),
-	PINCTRL_PIN(81, "I2S1_SFRM"),
-	PINCTRL_PIN(82, "I2S1_TXD"),
+	PINCTRL_PIN(84, "HDA_BCLK"),
+	PINCTRL_PIN(85, "HDA_SYNC"),
+	PINCTRL_PIN(86, "HDA_SDO"),
+	PINCTRL_PIN(87, "HDA_SDI_0"),
+	PINCTRL_PIN(88, "HDA_RSTB"),
+	PINCTRL_PIN(89, "HDA_SDI_1"),
+	PINCTRL_PIN(90, "I2S1_SFRM"),
+	PINCTRL_PIN(91, "I2S1_TXD"),
 	/* GPP_H */
-	PINCTRL_PIN(83, "GPPC_H_0"),
-	PINCTRL_PIN(84, "SD_PWR_EN_B"),
-	PINCTRL_PIN(85, "MODEM_CLKREQ"),
-	PINCTRL_PIN(86, "SX_EXIT_HOLDOFFB"),
-	PINCTRL_PIN(87, "I2C2_SDA"),
-	PINCTRL_PIN(88, "I2C2_SCL"),
-	PINCTRL_PIN(89, "I2C3_SDA"),
-	PINCTRL_PIN(90, "I2C3_SCL"),
-	PINCTRL_PIN(91, "I2C4_SDA"),
-	PINCTRL_PIN(92, "I2C4_SCL"),
-	PINCTRL_PIN(93, "CPU_VCCIO_PWR_GATEB"),
-	PINCTRL_PIN(94, "I2S2_SCLK"),
-	PINCTRL_PIN(95, "I2S2_SFRM"),
-	PINCTRL_PIN(96, "I2S2_TXD"),
-	PINCTRL_PIN(97, "I2S2_RXD"),
-	PINCTRL_PIN(98, "I2S1_SCLK"),
-	PINCTRL_PIN(99, "GPPC_H_16"),
-	PINCTRL_PIN(100, "GPPC_H_17"),
-	PINCTRL_PIN(101, "GPPC_H_18"),
-	PINCTRL_PIN(102, "GPPC_H_19"),
-	PINCTRL_PIN(103, "GPPC_H_20"),
-	PINCTRL_PIN(104, "GPPC_H_21"),
-	PINCTRL_PIN(105, "GPPC_H_22"),
-	PINCTRL_PIN(106, "GPPC_H_23"),
+	PINCTRL_PIN(92, "GPPC_H_0"),
+	PINCTRL_PIN(93, "SD_PWR_EN_B"),
+	PINCTRL_PIN(94, "MODEM_CLKREQ"),
+	PINCTRL_PIN(95, "SX_EXIT_HOLDOFFB"),
+	PINCTRL_PIN(96, "I2C2_SDA"),
+	PINCTRL_PIN(97, "I2C2_SCL"),
+	PINCTRL_PIN(98, "I2C3_SDA"),
+	PINCTRL_PIN(99, "I2C3_SCL"),
+	PINCTRL_PIN(100, "I2C4_SDA"),
+	PINCTRL_PIN(101, "I2C4_SCL"),
+	PINCTRL_PIN(102, "CPU_VCCIO_PWR_GATEB"),
+	PINCTRL_PIN(103, "I2S2_SCLK"),
+	PINCTRL_PIN(104, "I2S2_SFRM"),
+	PINCTRL_PIN(105, "I2S2_TXD"),
+	PINCTRL_PIN(106, "I2S2_RXD"),
+	PINCTRL_PIN(107, "I2S1_SCLK"),
+	PINCTRL_PIN(108, "GPPC_H_16"),
+	PINCTRL_PIN(109, "GPPC_H_17"),
+	PINCTRL_PIN(110, "GPPC_H_18"),
+	PINCTRL_PIN(111, "GPPC_H_19"),
+	PINCTRL_PIN(112, "GPPC_H_20"),
+	PINCTRL_PIN(113, "GPPC_H_21"),
+	PINCTRL_PIN(114, "GPPC_H_22"),
+	PINCTRL_PIN(115, "GPPC_H_23"),
 	/* GPP_D */
-	PINCTRL_PIN(107, "SPI1_CSB"),
-	PINCTRL_PIN(108, "SPI1_CLK"),
-	PINCTRL_PIN(109, "SPI1_MISO_IO_1"),
-	PINCTRL_PIN(110, "SPI1_MOSI_IO_0"),
-	PINCTRL_PIN(111, "ISH_I2C0_SDA"),
-	PINCTRL_PIN(112, "ISH_I2C0_SCL"),
-	PINCTRL_PIN(113, "ISH_I2C1_SDA"),
-	PINCTRL_PIN(114, "ISH_I2C1_SCL"),
-	PINCTRL_PIN(115, "ISH_SPI_CSB"),
-	PINCTRL_PIN(116, "ISH_SPI_CLK"),
-	PINCTRL_PIN(117, "ISH_SPI_MISO"),
-	PINCTRL_PIN(118, "ISH_SPI_MOSI"),
-	PINCTRL_PIN(119, "ISH_UART0_RXD"),
-	PINCTRL_PIN(120, "ISH_UART0_TXD"),
-	PINCTRL_PIN(121, "ISH_UART0_RTSB"),
-	PINCTRL_PIN(122, "ISH_UART0_CTSB"),
-	PINCTRL_PIN(123, "SPI1_IO_2"),
-	PINCTRL_PIN(124, "SPI1_IO_3"),
-	PINCTRL_PIN(125, "I2S_MCLK"),
-	PINCTRL_PIN(126, "CNV_MFUART2_RXD"),
-	PINCTRL_PIN(127, "CNV_MFUART2_TXD"),
-	PINCTRL_PIN(128, "CNV_PA_BLANKING"),
-	PINCTRL_PIN(129, "I2C5_SDA"),
-	PINCTRL_PIN(130, "I2C5_SCL"),
-	PINCTRL_PIN(131, "GSPI2_CLK_LOOPBK"),
-	PINCTRL_PIN(132, "SPI1_CLK_LOOPBK"),
+	PINCTRL_PIN(116, "SPI1_CSB"),
+	PINCTRL_PIN(117, "SPI1_CLK"),
+	PINCTRL_PIN(118, "SPI1_MISO_IO_1"),
+	PINCTRL_PIN(119, "SPI1_MOSI_IO_0"),
+	PINCTRL_PIN(120, "ISH_I2C0_SDA"),
+	PINCTRL_PIN(121, "ISH_I2C0_SCL"),
+	PINCTRL_PIN(122, "ISH_I2C1_SDA"),
+	PINCTRL_PIN(123, "ISH_I2C1_SCL"),
+	PINCTRL_PIN(124, "ISH_SPI_CSB"),
+	PINCTRL_PIN(125, "ISH_SPI_CLK"),
+	PINCTRL_PIN(126, "ISH_SPI_MISO"),
+	PINCTRL_PIN(127, "ISH_SPI_MOSI"),
+	PINCTRL_PIN(128, "ISH_UART0_RXD"),
+	PINCTRL_PIN(129, "ISH_UART0_TXD"),
+	PINCTRL_PIN(130, "ISH_UART0_RTSB"),
+	PINCTRL_PIN(131, "ISH_UART0_CTSB"),
+	PINCTRL_PIN(132, "SPI1_IO_2"),
+	PINCTRL_PIN(133, "SPI1_IO_3"),
+	PINCTRL_PIN(134, "I2S_MCLK"),
+	PINCTRL_PIN(135, "CNV_MFUART2_RXD"),
+	PINCTRL_PIN(136, "CNV_MFUART2_TXD"),
+	PINCTRL_PIN(137, "CNV_PA_BLANKING"),
+	PINCTRL_PIN(138, "I2C5_SDA"),
+	PINCTRL_PIN(139, "I2C5_SCL"),
+	PINCTRL_PIN(140, "GSPI2_CLK_LOOPBK"),
+	PINCTRL_PIN(141, "SPI1_CLK_LOOPBK"),
 	/* vGPIO */
-	PINCTRL_PIN(133, "CNV_BTEN"),
-	PINCTRL_PIN(134, "CNV_WCEN"),
-	PINCTRL_PIN(135, "CNV_BT_HOST_WAKEB"),
-	PINCTRL_PIN(136, "CNV_BT_IF_SELECT"),
-	PINCTRL_PIN(137, "vCNV_BT_UART_TXD"),
-	PINCTRL_PIN(138, "vCNV_BT_UART_RXD"),
-	PINCTRL_PIN(139, "vCNV_BT_UART_CTS_B"),
-	PINCTRL_PIN(140, "vCNV_BT_UART_RTS_B"),
-	PINCTRL_PIN(141, "vCNV_MFUART1_TXD"),
-	PINCTRL_PIN(142, "vCNV_MFUART1_RXD"),
-	PINCTRL_PIN(143, "vCNV_MFUART1_CTS_B"),
-	PINCTRL_PIN(144, "vCNV_MFUART1_RTS_B"),
-	PINCTRL_PIN(145, "vUART0_TXD"),
-	PINCTRL_PIN(146, "vUART0_RXD"),
-	PINCTRL_PIN(147, "vUART0_CTS_B"),
-	PINCTRL_PIN(148, "vUART0_RTS_B"),
-	PINCTRL_PIN(149, "vISH_UART0_TXD"),
-	PINCTRL_PIN(150, "vISH_UART0_RXD"),
-	PINCTRL_PIN(151, "vISH_UART0_CTS_B"),
-	PINCTRL_PIN(152, "vISH_UART0_RTS_B"),
-	PINCTRL_PIN(153, "vCNV_BT_I2S_BCLK"),
-	PINCTRL_PIN(154, "vCNV_BT_I2S_WS_SYNC"),
-	PINCTRL_PIN(155, "vCNV_BT_I2S_SDO"),
-	PINCTRL_PIN(156, "vCNV_BT_I2S_SDI"),
-	PINCTRL_PIN(157, "vI2S2_SCLK"),
-	PINCTRL_PIN(158, "vI2S2_SFRM"),
-	PINCTRL_PIN(159, "vI2S2_TXD"),
-	PINCTRL_PIN(160, "vI2S2_RXD"),
-	PINCTRL_PIN(161, "vSD3_CD_B"),
+	PINCTRL_PIN(142, "CNV_BTEN"),
+	PINCTRL_PIN(143, "CNV_WCEN"),
+	PINCTRL_PIN(144, "CNV_BT_HOST_WAKEB"),
+	PINCTRL_PIN(145, "CNV_BT_IF_SELECT"),
+	PINCTRL_PIN(146, "vCNV_BT_UART_TXD"),
+	PINCTRL_PIN(147, "vCNV_BT_UART_RXD"),
+	PINCTRL_PIN(148, "vCNV_BT_UART_CTS_B"),
+	PINCTRL_PIN(149, "vCNV_BT_UART_RTS_B"),
+	PINCTRL_PIN(150, "vCNV_MFUART1_TXD"),
+	PINCTRL_PIN(151, "vCNV_MFUART1_RXD"),
+	PINCTRL_PIN(152, "vCNV_MFUART1_CTS_B"),
+	PINCTRL_PIN(153, "vCNV_MFUART1_RTS_B"),
+	PINCTRL_PIN(154, "vUART0_TXD"),
+	PINCTRL_PIN(155, "vUART0_RXD"),
+	PINCTRL_PIN(156, "vUART0_CTS_B"),
+	PINCTRL_PIN(157, "vUART0_RTS_B"),
+	PINCTRL_PIN(158, "vISH_UART0_TXD"),
+	PINCTRL_PIN(159, "vISH_UART0_RXD"),
+	PINCTRL_PIN(160, "vISH_UART0_CTS_B"),
+	PINCTRL_PIN(161, "vISH_UART0_RTS_B"),
+	PINCTRL_PIN(162, "vCNV_BT_I2S_BCLK"),
+	PINCTRL_PIN(163, "vCNV_BT_I2S_WS_SYNC"),
+	PINCTRL_PIN(164, "vCNV_BT_I2S_SDO"),
+	PINCTRL_PIN(165, "vCNV_BT_I2S_SDI"),
+	PINCTRL_PIN(166, "vI2S2_SCLK"),
+	PINCTRL_PIN(167, "vI2S2_SFRM"),
+	PINCTRL_PIN(168, "vI2S2_TXD"),
+	PINCTRL_PIN(169, "vI2S2_RXD"),
+	PINCTRL_PIN(170, "vSD3_CD_B"),
 	/* GPP_C */
-	PINCTRL_PIN(162, "GPPC_C_0"),
-	PINCTRL_PIN(163, "GPPC_C_1"),
-	PINCTRL_PIN(164, "GPPC_C_2"),
-	PINCTRL_PIN(165, "GPPC_C_3"),
-	PINCTRL_PIN(166, "GPPC_C_4"),
-	PINCTRL_PIN(167, "GPPC_C_5"),
-	PINCTRL_PIN(168, "SUSWARNB_SUSPWRDNACK"),
-	PINCTRL_PIN(169, "SUSACKB"),
-	PINCTRL_PIN(170, "UART0_RXD"),
-	PINCTRL_PIN(171, "UART0_TXD"),
-	PINCTRL_PIN(172, "UART0_RTSB"),
-	PINCTRL_PIN(173, "UART0_CTSB"),
-	PINCTRL_PIN(174, "UART1_RXD"),
-	PINCTRL_PIN(175, "UART1_TXD"),
-	PINCTRL_PIN(176, "UART1_RTSB"),
-	PINCTRL_PIN(177, "UART1_CTSB"),
-	PINCTRL_PIN(178, "I2C0_SDA"),
-	PINCTRL_PIN(179, "I2C0_SCL"),
-	PINCTRL_PIN(180, "I2C1_SDA"),
-	PINCTRL_PIN(181, "I2C1_SCL"),
-	PINCTRL_PIN(182, "UART2_RXD"),
-	PINCTRL_PIN(183, "UART2_TXD"),
-	PINCTRL_PIN(184, "UART2_RTSB"),
-	PINCTRL_PIN(185, "UART2_CTSB"),
+	PINCTRL_PIN(171, "GPPC_C_0"),
+	PINCTRL_PIN(172, "GPPC_C_1"),
+	PINCTRL_PIN(173, "GPPC_C_2"),
+	PINCTRL_PIN(174, "GPPC_C_3"),
+	PINCTRL_PIN(175, "GPPC_C_4"),
+	PINCTRL_PIN(176, "GPPC_C_5"),
+	PINCTRL_PIN(177, "SUSWARNB_SUSPWRDNACK"),
+	PINCTRL_PIN(178, "SUSACKB"),
+	PINCTRL_PIN(179, "UART0_RXD"),
+	PINCTRL_PIN(180, "UART0_TXD"),
+	PINCTRL_PIN(181, "UART0_RTSB"),
+	PINCTRL_PIN(182, "UART0_CTSB"),
+	PINCTRL_PIN(183, "UART1_RXD"),
+	PINCTRL_PIN(184, "UART1_TXD"),
+	PINCTRL_PIN(185, "UART1_RTSB"),
+	PINCTRL_PIN(186, "UART1_CTSB"),
+	PINCTRL_PIN(187, "I2C0_SDA"),
+	PINCTRL_PIN(188, "I2C0_SCL"),
+	PINCTRL_PIN(189, "I2C1_SDA"),
+	PINCTRL_PIN(190, "I2C1_SCL"),
+	PINCTRL_PIN(191, "UART2_RXD"),
+	PINCTRL_PIN(192, "UART2_TXD"),
+	PINCTRL_PIN(193, "UART2_RTSB"),
+	PINCTRL_PIN(194, "UART2_CTSB"),
 	/* HVCMOS */
-	PINCTRL_PIN(186, "L_BKLTEN"),
-	PINCTRL_PIN(187, "L_BKLTCTL"),
-	PINCTRL_PIN(188, "L_VDDEN"),
-	PINCTRL_PIN(189, "SYS_PWROK"),
-	PINCTRL_PIN(190, "SYS_RESETB"),
-	PINCTRL_PIN(191, "MLK_RSTB"),
+	PINCTRL_PIN(195, "L_BKLTEN"),
+	PINCTRL_PIN(196, "L_BKLTCTL"),
+	PINCTRL_PIN(197, "L_VDDEN"),
+	PINCTRL_PIN(198, "SYS_PWROK"),
+	PINCTRL_PIN(199, "SYS_RESETB"),
+	PINCTRL_PIN(200, "MLK_RSTB"),
 	/* GPP_E */
-	PINCTRL_PIN(192, "ISH_GP_0"),
-	PINCTRL_PIN(193, "ISH_GP_1"),
-	PINCTRL_PIN(194, "IMGCLKOUT_1"),
-	PINCTRL_PIN(195, "ISH_GP_2"),
-	PINCTRL_PIN(196, "IMGCLKOUT_2"),
-	PINCTRL_PIN(197, "SATA_LEDB"),
-	PINCTRL_PIN(198, "IMGCLKOUT_3"),
-	PINCTRL_PIN(199, "ISH_GP_3"),
-	PINCTRL_PIN(200, "ISH_GP_4"),
-	PINCTRL_PIN(201, "ISH_GP_5"),
-	PINCTRL_PIN(202, "ISH_GP_6"),
-	PINCTRL_PIN(203, "ISH_GP_7"),
-	PINCTRL_PIN(204, "IMGCLKOUT_4"),
-	PINCTRL_PIN(205, "DDPA_CTRLCLK"),
-	PINCTRL_PIN(206, "DDPA_CTRLDATA"),
-	PINCTRL_PIN(207, "DDPB_CTRLCLK"),
-	PINCTRL_PIN(208, "DDPB_CTRLDATA"),
-	PINCTRL_PIN(209, "DDPC_CTRLCLK"),
-	PINCTRL_PIN(210, "DDPC_CTRLDATA"),
-	PINCTRL_PIN(211, "IMGCLKOUT_5"),
-	PINCTRL_PIN(212, "CNV_BRI_DT"),
-	PINCTRL_PIN(213, "CNV_BRI_RSP"),
-	PINCTRL_PIN(214, "CNV_RGI_DT"),
-	PINCTRL_PIN(215, "CNV_RGI_RSP"),
+	PINCTRL_PIN(201, "ISH_GP_0"),
+	PINCTRL_PIN(202, "ISH_GP_1"),
+	PINCTRL_PIN(203, "IMGCLKOUT_1"),
+	PINCTRL_PIN(204, "ISH_GP_2"),
+	PINCTRL_PIN(205, "IMGCLKOUT_2"),
+	PINCTRL_PIN(206, "SATA_LEDB"),
+	PINCTRL_PIN(207, "IMGCLKOUT_3"),
+	PINCTRL_PIN(208, "ISH_GP_3"),
+	PINCTRL_PIN(209, "ISH_GP_4"),
+	PINCTRL_PIN(210, "ISH_GP_5"),
+	PINCTRL_PIN(211, "ISH_GP_6"),
+	PINCTRL_PIN(212, "ISH_GP_7"),
+	PINCTRL_PIN(213, "IMGCLKOUT_4"),
+	PINCTRL_PIN(214, "DDPA_CTRLCLK"),
+	PINCTRL_PIN(215, "DDPA_CTRLDATA"),
+	PINCTRL_PIN(216, "DDPB_CTRLCLK"),
+	PINCTRL_PIN(217, "DDPB_CTRLDATA"),
+	PINCTRL_PIN(218, "DDPC_CTRLCLK"),
+	PINCTRL_PIN(219, "DDPC_CTRLDATA"),
+	PINCTRL_PIN(220, "IMGCLKOUT_5"),
+	PINCTRL_PIN(221, "CNV_BRI_DT"),
+	PINCTRL_PIN(222, "CNV_BRI_RSP"),
+	PINCTRL_PIN(223, "CNV_RGI_DT"),
+	PINCTRL_PIN(224, "CNV_RGI_RSP"),
 	/* GPP_G */
-	PINCTRL_PIN(216, "SD3_CMD"),
-	PINCTRL_PIN(217, "SD3_D0"),
-	PINCTRL_PIN(218, "SD3_D1"),
-	PINCTRL_PIN(219, "SD3_D2"),
-	PINCTRL_PIN(220, "SD3_D3"),
-	PINCTRL_PIN(221, "SD3_CDB"),
-	PINCTRL_PIN(222, "SD3_CLK"),
-	PINCTRL_PIN(223, "SD3_WP"),
+	PINCTRL_PIN(225, "SD3_CMD"),
+	PINCTRL_PIN(226, "SD3_D0"),
+	PINCTRL_PIN(227, "SD3_D1"),
+	PINCTRL_PIN(228, "SD3_D2"),
+	PINCTRL_PIN(229, "SD3_D3"),
+	PINCTRL_PIN(230, "SD3_CDB"),
+	PINCTRL_PIN(231, "SD3_CLK"),
+	PINCTRL_PIN(232, "SD3_WP"),
 };
 
 static const struct intel_padgroup jsl_community0_gpps[] = {
 	JSL_GPP(0, 0, 19, 320),				/* GPP_F */
-	JSL_GPP(1, 20, 45, 32),				/* GPP_B */
-	JSL_GPP(2, 46, 66, 64),				/* GPP_A */
-	JSL_GPP(3, 67, 74, 96),				/* GPP_S */
-	JSL_GPP(4, 75, 82, 128),			/* GPP_R */
+	JSL_GPP(1, 20, 28, INTEL_GPIO_BASE_NOMAP),	/* SPI */
+	JSL_GPP(2, 29, 54, 32),				/* GPP_B */
+	JSL_GPP(3, 55, 75, 64),				/* GPP_A */
+	JSL_GPP(4, 76, 83, 96),				/* GPP_S */
+	JSL_GPP(5, 84, 91, 128),			/* GPP_R */
 };
 
 static const struct intel_padgroup jsl_community1_gpps[] = {
-	JSL_GPP(0, 83, 106, 160),			/* GPP_H */
-	JSL_GPP(1, 107, 132, 192),			/* GPP_D */
-	JSL_GPP(2, 133, 161, 224),			/* vGPIO */
-	JSL_GPP(3, 162, 185, 256),			/* GPP_C */
+	JSL_GPP(0, 92, 115, 160),			/* GPP_H */
+	JSL_GPP(1, 116, 141, 192),			/* GPP_D */
+	JSL_GPP(2, 142, 170, 224),			/* vGPIO */
+	JSL_GPP(3, 171, 194, 256),			/* GPP_C */
 };
 
 static const struct intel_padgroup jsl_community4_gpps[] = {
-	JSL_GPP(0, 186, 191, INTEL_GPIO_BASE_NOMAP),	/* HVCMOS */
-	JSL_GPP(1, 192, 215, 288),			/* GPP_E */
+	JSL_GPP(0, 195, 200, INTEL_GPIO_BASE_NOMAP),	/* HVCMOS */
+	JSL_GPP(1, 201, 224, 288),			/* GPP_E */
 };
 
 static const struct intel_padgroup jsl_community5_gpps[] = {
-	JSL_GPP(0, 216, 223, INTEL_GPIO_BASE_ZERO),	/* GPP_G */
+	JSL_GPP(0, 225, 232, INTEL_GPIO_BASE_ZERO),	/* GPP_G */
 };
 
 static const struct intel_community jsl_communities[] = {
-	JSL_COMMUNITY(0, 0, 82, jsl_community0_gpps),
-	JSL_COMMUNITY(1, 83, 185, jsl_community1_gpps),
-	JSL_COMMUNITY(2, 186, 215, jsl_community4_gpps),
-	JSL_COMMUNITY(3, 216, 223, jsl_community5_gpps),
+	JSL_COMMUNITY(0, 0, 91, jsl_community0_gpps),
+	JSL_COMMUNITY(1, 92, 194, jsl_community1_gpps),
+	JSL_COMMUNITY(2, 195, 224, jsl_community4_gpps),
+	JSL_COMMUNITY(3, 225, 232, jsl_community5_gpps),
 };
 
 static const struct intel_pinctrl_soc_data jsl_soc_data = {
@@ -336,7 +347,6 @@ static struct platform_driver jsl_pinctrl_driver = {
 		.pm = &jsl_pinctrl_pm_ops,
 	},
 };
-
 module_platform_driver(jsl_pinctrl_driver);
 
 MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko at linux.intel.com>");
commit 7bab16a6075b7b94999666355ab532c3dabb94f9
Author: Jamie Iles <jamie at nuviainc.com>
Date:   Fri Nov 13 15:04:06 2020 +0000

    KVM: arm64: Correctly align nVHE percpu data
    
    The nVHE percpu data is partially linked but the nVHE linker script did
    not align the percpu section.  The PERCPU_INPUT macro would then align
    the data to a page boundary:
    
      #define PERCPU_INPUT(cacheline)                                       \
            __per_cpu_start = .;                                            \
            *(.data..percpu..first)                                         \
            . = ALIGN(PAGE_SIZE);                                           \
            *(.data..percpu..page_aligned)                                  \
            . = ALIGN(cacheline);                                           \
            *(.data..percpu..read_mostly)                                   \
            . = ALIGN(cacheline);                                           \
            *(.data..percpu)                                                \
            *(.data..percpu..shared_aligned)                                \
            PERCPU_DECRYPTED_SECTION                                        \
            __per_cpu_end = .;
    
    but then when the final vmlinux linking happens the hypervisor percpu
    data is included after page alignment and so the offsets potentially
    don't match.  On my build I saw that the .hyp.data..percpu section was
    at address 0x20 and then the percpu data would begin at 0x1000 (because
    of the page alignment in PERCPU_INPUT), but when linked into vmlinux,
    everything would be shifted down by 0x20 bytes.
    
    This manifests as one of the CPUs getting lost when running
    kvm-unit-tests or starting any VM and subsequent soft lockup on a Cortex
    A72 device.
    
    Fixes: 30c953911c43 ("kvm: arm64: Set up hyp percpu data for nVHE")
    Signed-off-by: Jamie Iles <jamie at nuviainc.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: David Brazdil <dbrazdil at google.com>
    Cc: David Brazdil <dbrazdil at google.com>
    Cc: Marc Zyngier <maz at kernel.org>
    Cc: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201113150406.14314-1-jamie@nuviainc.com

diff --git a/arch/arm64/kvm/hyp/nvhe/hyp.lds.S b/arch/arm64/kvm/hyp/nvhe/hyp.lds.S
index bb2d986ff696..a797abace13f 100644
--- a/arch/arm64/kvm/hyp/nvhe/hyp.lds.S
+++ b/arch/arm64/kvm/hyp/nvhe/hyp.lds.S
@@ -13,6 +13,11 @@
 
 SECTIONS {
 	HYP_SECTION(.text)
+	/*
+	 * .hyp..data..percpu needs to be page aligned to maintain the same
+	 * alignment for when linking into vmlinux.
+	 */
+	. = ALIGN(PAGE_SIZE);
 	HYP_SECTION_NAME(.data..percpu) : {
 		PERCPU_INPUT(L1_CACHE_BYTES)
 	}
commit df85429959b2a533cb969c75a5e3b588962f47f2
Merge: 99fba3205cd4 e7ae08d398e0
Author: Tony Lindgren <tony at atomide.com>
Date:   Mon Nov 16 11:18:56 2020 +0200

    Merge tag 'ti-sysc-fixes' into fixes

commit 24880a87042b3032a6ac04d79cb51892c5a7901d
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Sun Nov 15 20:06:53 2020 -0800

    usb: typec: qcom-pmic-typec: fix builtin build errors
    
    Fix build errors when CONFIG_TYPEC_QCOM_PMIC=y and
    CONFIG_USB_ROLE_SWITCH=m by limiting the former to =m when
    USB_ROLE_SWITCH also =m.
    
    powerpc64-linux-ld: drivers/usb/typec/qcom-pmic-typec.o: in function `.qcom_pmic_typec_remove':
    qcom-pmic-typec.c:(.text+0x28): undefined reference to `.usb_role_switch_set_role'
    powerpc64-linux-ld: qcom-pmic-typec.c:(.text+0x64): undefined reference to `.usb_role_switch_put'
    powerpc64-linux-ld: drivers/usb/typec/qcom-pmic-typec.o: in function `.qcom_pmic_typec_check_connection':
    qcom-pmic-typec.c:(.text+0x120): undefined reference to `.usb_role_switch_set_role'
    powerpc64-linux-ld: drivers/usb/typec/qcom-pmic-typec.o: in function `.qcom_pmic_typec_probe':
    qcom-pmic-typec.c:(.text+0x360): undefined reference to `.fwnode_usb_role_switch_get'
    powerpc64-linux-ld: qcom-pmic-typec.c:(.text+0x4e4): undefined reference to `.usb_role_switch_put'
    
    Fixes: 6c8cf3695176 ("usb: typec: Add QCOM PMIC typec detection driver")
    Cc: linux-usb at vger.kernel.org
    Cc: Wesley Cheng <wcheng at codeaurora.org>
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Link: https://lore.kernel.org/r/20201116040653.7943-1-rdunlap@infradead.org
    Reviewed-by: Heikki Krogerus <heikki.krogerus at linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/typec/Kconfig b/drivers/usb/typec/Kconfig
index 6c5908a37ee8..e7f120874c48 100644
--- a/drivers/usb/typec/Kconfig
+++ b/drivers/usb/typec/Kconfig
@@ -88,6 +88,7 @@ config TYPEC_STUSB160X
 config TYPEC_QCOM_PMIC
 	tristate "Qualcomm PMIC USB Type-C driver"
 	depends on ARCH_QCOM || COMPILE_TEST
+	depends on USB_ROLE_SWITCH || !USB_ROLE_SWITCH
 	help
 	  Driver for supporting role switch over the Qualcomm PMIC.  This will
 	  handle the USB Type-C role and orientation detection reported by the
commit af8f9e8611cd4fef8295c8ab7574d3d3812ca17e
Merge: 09162bc32c88 40252dd7cf7c
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Mon Nov 16 09:56:35 2020 +0100

    Merge tag 'usb-fixes-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb into usb-linus
    
    Peter writes:
    
    Two bugs for Cadence USB3 gadget driver
    - TD_SIZE entry at descriptor is error for multiple-trb use case
    - Possible use uninitialized variables
    
    * tag 'usb-fixes-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb:
      usb: cdns3: gadget: calculate TD_SIZE based on TD
      usb: cdns3: gadget: initialize link_trb as NULL

commit e5633b95dce915c2ade5ce1c90d295d555396c60
Author: Kai-Heng Feng <kai.heng.feng at canonical.com>
Date:   Sun Nov 15 23:38:42 2020 +0800

    ALSA: usb-audio: Use ALC1220-VB-DT mapping for ASUS ROG Strix TRX40 mobo
    
    ASUS ROG Strix also uses ALC1220-VB-DT, so adjust the mapping and add
    profile name to let userspace pick correct UCM profile.
    
    BugLink: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1031
    Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
    Link: https://lore.kernel.org/r/20201115153843.1109200-1-kai.heng.feng@canonical.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/usb/card.c b/sound/usb/card.c
index fa764b61fe9c..4457214a3ae6 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -379,6 +379,10 @@ static const struct usb_audio_device_name usb_audio_names[] = {
 
 	DEVICE_NAME(0x046d, 0x0990, "Logitech, Inc.", "QuickCam Pro 9000"),
 
+	/* ASUS ROG Strix */
+	PROFILE_NAME(0x0b05, 0x1917,
+		     "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
+
 	/* Dell WD15 Dock */
 	PROFILE_NAME(0x0bda, 0x4014, "Dell", "WD15 Dock", "Dell-WD15-Dock"),
 	/* Dell WD19 Dock */
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
index c369c81e74c4..a7212f16660e 100644
--- a/sound/usb/mixer_maps.c
+++ b/sound/usb/mixer_maps.c
@@ -561,7 +561,8 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
 	},
 	{	/* ASUS ROG Strix */
 		.id = USB_ID(0x0b05, 0x1917),
-		.map = asus_rog_map,
+		.map = trx40_mobo_map,
+		.connector_map = trx40_mobo_connector_map,
 	},
 	{	/* MSI TRX40 Creator */
 		.id = USB_ID(0x0db0, 0x0d64),
commit fb89b2544b645527b3a359176999a416e65f5ada
Author: Colin Ian King <colin.king at canonical.com>
Date:   Sat Nov 14 12:05:18 2020 +0000

    phy: mediatek: fix spelling mistake in Kconfig "veriosn" -> "version"
    
    There is a spelling mistake in the Kconfig. Fix it.
    
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Link: https://lore.kernel.org/r/20201114120518.416120-1-colin.king@canonical.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/mediatek/Kconfig b/drivers/phy/mediatek/Kconfig
index 50c5e9306e19..c8126bde9d7c 100644
--- a/drivers/phy/mediatek/Kconfig
+++ b/drivers/phy/mediatek/Kconfig
@@ -12,7 +12,7 @@ config PHY_MTK_TPHY
 	  it supports multiple usb2.0, usb3.0 ports, PCIe and
 	  SATA, and meanwhile supports two version T-PHY which have
 	  different banks layout, the T-PHY with shared banks between
-	  multi-ports is first version, otherwise is second veriosn,
+	  multi-ports is first version, otherwise is second version,
 	  so you can easily distinguish them by banks layout.
 
 config PHY_MTK_UFS
commit 14839107b51cc0db19579039b1f72cba7a0c8049
Author: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
Date:   Fri Nov 13 15:12:25 2020 +0000

    phy: qualcomm: Fix 28 nm Hi-Speed USB PHY OF dependency
    
    This Kconfig entry should declare a dependency on OF
    
    Fixes: 67b27dbeac4d ("phy: qualcomm: Add Synopsys 28nm Hi-Speed USB PHY driver")
    Signed-off-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
    Link: https://lore.kernel.org/r/20201113151225.1657600-3-bryan.odonoghue@linaro.org
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig
index 9129c4b8bb9b..7f6fcb8ec5ba 100644
--- a/drivers/phy/qualcomm/Kconfig
+++ b/drivers/phy/qualcomm/Kconfig
@@ -87,7 +87,7 @@ config PHY_QCOM_USB_HSIC
 
 config PHY_QCOM_USB_HS_28NM
 	tristate "Qualcomm 28nm High-Speed PHY"
-	depends on ARCH_QCOM || COMPILE_TEST
+	depends on OF && (ARCH_QCOM || COMPILE_TEST)
 	depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
 	select GENERIC_PHY
 	help
commit 44786a26a7485e12a1d2aaad2adfb3c82f6ad171
Author: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
Date:   Fri Nov 13 15:12:24 2020 +0000

    phy: qualcomm: usb: Fix SuperSpeed PHY OF dependency
    
    This Kconfig entry should declare a dependency on OF
    
    Fixes: 6076967a500c ("phy: qualcomm: usb: Add SuperSpeed PHY driver")
    Reported-by: kernel test robot <lkp at intel.com>
    Link: https://lkml.org/lkml/2020/11/13/414
    Signed-off-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
    Link: https://lore.kernel.org/r/20201113151225.1657600-2-bryan.odonoghue@linaro.org
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig
index 928db510b86c..9129c4b8bb9b 100644
--- a/drivers/phy/qualcomm/Kconfig
+++ b/drivers/phy/qualcomm/Kconfig
@@ -98,7 +98,7 @@ config PHY_QCOM_USB_HS_28NM
 
 config PHY_QCOM_USB_SS
 	tristate "Qualcomm USB Super-Speed PHY driver"
-	depends on ARCH_QCOM || COMPILE_TEST
+	depends on OF && (ARCH_QCOM || COMPILE_TEST)
 	depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
 	select GENERIC_PHY
 	help
commit 231655eb55b0f9899054dec9432482dbf986a9c5
Author: Geert Uytterhoeven <geert+renesas at glider.be>
Date:   Tue Nov 10 15:46:00 2020 +0100

    phy: intel: PHY_INTEL_KEEMBAY_EMMC should depend on ARCH_KEEMBAY
    
    The Intel Keem Bay eMMC PHY is only present on Intel Keem Bay SoCs.
    Hence add a dependency on ARCH_KEEMBAY, to prevent asking the user about
    this driver when configuring a kernel without Intel Keem Bay platform
    support.
    
    Fixes: 885c4f4d6cf448f6 ("phy: intel: Add Keem Bay eMMC PHY support")
    Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
    Link: https://lore.kernel.org/r/20201110144600.3279752-1-geert+renesas@glider.be
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/intel/Kconfig b/drivers/phy/intel/Kconfig
index 58ec695c92ec..62c24764654b 100644
--- a/drivers/phy/intel/Kconfig
+++ b/drivers/phy/intel/Kconfig
@@ -4,7 +4,7 @@
 #
 config PHY_INTEL_KEEMBAY_EMMC
 	tristate "Intel Keem Bay EMMC PHY driver"
-	depends on (OF && ARM64) || COMPILE_TEST
+	depends on ARCH_KEEMBAY || COMPILE_TEST
 	depends on HAS_IOMEM
 	select GENERIC_PHY
 	select REGMAP_MMIO
commit 40252dd7cf7cad81c784c695c36bc475b518f0ea
Author: Peter Chen <peter.chen at nxp.com>
Date:   Tue Nov 3 22:16:00 2020 +0800

    usb: cdns3: gadget: calculate TD_SIZE based on TD
    
    The TRB entry TD_SIZE is the packet number for the TD (request) but not the
    each TRB, so it only needs to be assigned for the first TRB during the TD,
    and the value of it is for TD too.
    
    Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
    Signed-off-by: Peter Chen <peter.chen at nxp.com>

diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
index 1ee6d3941dd4..365f30fb1159 100644
--- a/drivers/usb/cdns3/gadget.c
+++ b/drivers/usb/cdns3/gadget.c
@@ -1193,10 +1193,20 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
 
 	/* set incorrect Cycle Bit for first trb*/
 	control = priv_ep->pcs ? 0 : TRB_CYCLE;
+	trb->length = 0;
+	if (priv_dev->dev_ver >= DEV_VER_V2) {
+		u16 td_size;
+
+		td_size = DIV_ROUND_UP(request->length,
+				       priv_ep->endpoint.maxpacket);
+		if (priv_dev->gadget.speed == USB_SPEED_SUPER)
+			trb->length = TRB_TDL_SS_SIZE(td_size);
+		else
+			control |= TRB_TDL_HS_SIZE(td_size);
+	}
 
 	do {
 		u32 length;
-		u16 td_size = 0;
 
 		/* fill TRB */
 		control |= TRB_TYPE(TRB_NORMAL);
@@ -1208,20 +1218,12 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
 			length = request->length;
 		}
 
-		if (likely(priv_dev->dev_ver >= DEV_VER_V2))
-			td_size = DIV_ROUND_UP(length,
-					       priv_ep->endpoint.maxpacket);
-		else if (priv_ep->flags & EP_TDLCHK_EN)
+		if (priv_ep->flags & EP_TDLCHK_EN)
 			total_tdl += DIV_ROUND_UP(length,
 					       priv_ep->endpoint.maxpacket);
 
-		trb->length = cpu_to_le32(TRB_BURST_LEN(priv_ep->trb_burst_size) |
+		trb->length |= cpu_to_le32(TRB_BURST_LEN(priv_ep->trb_burst_size) |
 					TRB_LEN(length));
-		if (priv_dev->gadget.speed == USB_SPEED_SUPER)
-			trb->length |= cpu_to_le32(TRB_TDL_SS_SIZE(td_size));
-		else
-			control |= TRB_TDL_HS_SIZE(td_size);
-
 		pcs = priv_ep->pcs ? TRB_CYCLE : 0;
 
 		/*
commit 78e91588510919a0dc9bd48916e760c1ba5797d2
Author: Peter Chen <peter.chen at nxp.com>
Date:   Tue Nov 3 19:23:27 2020 +0800

    usb: cdns3: gadget: initialize link_trb as NULL
    
    There is an uninitialized variable "link_trb" usage at function cdns3_ep_run_transfer.
    Fixed it by initialize "link_trb" as NULL.
    
    Fixes: 4e218882eb5a ("usb: cdns3: gadget: improve the dump TRB operation at cdns3_ep_run_transfer")
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Peter Chen <peter.chen at nxp.com>

diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
index 66c1e6723eb1..1ee6d3941dd4 100644
--- a/drivers/usb/cdns3/gadget.c
+++ b/drivers/usb/cdns3/gadget.c
@@ -1114,7 +1114,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
 	struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 	struct cdns3_request *priv_req;
 	struct cdns3_trb *trb;
-	struct cdns3_trb *link_trb;
+	struct cdns3_trb *link_trb = NULL;
 	dma_addr_t trb_dma;
 	u32 togle_pcs = 1;
 	int sg_iter = 0;
commit 1254100030b3377e8302f9c75090ab191d73ee7c
Author: Rohith Surabattula <rohiths at microsoft.com>
Date:   Thu Oct 29 06:07:56 2020 +0000

    smb3: Handle error case during offload read path
    
    Mid callback needs to be called only when valid data is
    read into pages.
    
    These patches address a problem found during decryption offload:
          CIFS: VFS: trying to dequeue a deleted mid
    that could cause a refcount use after free:
          Workqueue: smb3decryptd smb2_decrypt_offload [cifs]
    
    Signed-off-by: Rohith Surabattula <rohiths at microsoft.com>
    Reviewed-by: Pavel Shilovsky <pshilov at microsoft.com>
    CC: Stable <stable at vger.kernel.org> #5.4+
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index b3b2abbb49b9..dab94f67c988 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -4559,7 +4559,25 @@ static void smb2_decrypt_offload(struct work_struct *work)
 				      dw->server->vals->read_rsp_size,
 				      dw->ppages, dw->npages, dw->len,
 				      true);
-		mid->callback(mid);
+		if (rc >= 0) {
+#ifdef CONFIG_CIFS_STATS2
+			mid->when_received = jiffies;
+#endif
+			mid->callback(mid);
+		} else {
+			spin_lock(&GlobalMid_Lock);
+			if (dw->server->tcpStatus == CifsNeedReconnect) {
+				mid->mid_state = MID_RETRY_NEEDED;
+				spin_unlock(&GlobalMid_Lock);
+				mid->callback(mid);
+			} else {
+				mid->mid_state = MID_REQUEST_SUBMITTED;
+				mid->mid_flags &= ~(MID_DELETED);
+				list_add_tail(&mid->qhead,
+					&dw->server->pending_mid_q);
+				spin_unlock(&GlobalMid_Lock);
+			}
+		}
 		cifs_mid_q_entry_release(mid);
 	}
 
commit ac873aa3dc21707c47db5db6608b38981c731afe
Author: Rohith Surabattula <rohiths at microsoft.com>
Date:   Thu Oct 29 05:03:10 2020 +0000

    smb3: Avoid Mid pending list corruption
    
    When reconnect happens Mid queue can be corrupted when both
    demultiplex and offload thread try to dequeue the MID from the
    pending list.
    
    These patches address a problem found during decryption offload:
             CIFS: VFS: trying to dequeue a deleted mid
    that could cause a refcount use after free:
             Workqueue: smb3decryptd smb2_decrypt_offload [cifs]
    
    Signed-off-by: Rohith Surabattula <rohiths at microsoft.com>
    Reviewed-by: Pavel Shilovsky <pshilov at microsoft.com>
    CC: Stable <stable at vger.kernel.org> #5.4+
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index efedec2b66c6..b3b2abbb49b9 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -264,7 +264,7 @@ smb2_revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
 }
 
 static struct mid_q_entry *
-smb2_find_mid(struct TCP_Server_Info *server, char *buf)
+__smb2_find_mid(struct TCP_Server_Info *server, char *buf, bool dequeue)
 {
 	struct mid_q_entry *mid;
 	struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
@@ -281,6 +281,10 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
 		    (mid->mid_state == MID_REQUEST_SUBMITTED) &&
 		    (mid->command == shdr->Command)) {
 			kref_get(&mid->refcount);
+			if (dequeue) {
+				list_del_init(&mid->qhead);
+				mid->mid_flags |= MID_DELETED;
+			}
 			spin_unlock(&GlobalMid_Lock);
 			return mid;
 		}
@@ -289,6 +293,18 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
 	return NULL;
 }
 
+static struct mid_q_entry *
+smb2_find_mid(struct TCP_Server_Info *server, char *buf)
+{
+	return __smb2_find_mid(server, buf, false);
+}
+
+static struct mid_q_entry *
+smb2_find_dequeue_mid(struct TCP_Server_Info *server, char *buf)
+{
+	return __smb2_find_mid(server, buf, true);
+}
+
 static void
 smb2_dump_detail(void *buf, struct TCP_Server_Info *server)
 {
@@ -4404,7 +4420,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 		cifs_dbg(FYI, "%s: server returned error %d\n",
 			 __func__, rdata->result);
 		/* normal error on read response */
-		dequeue_mid(mid, false);
+		if (is_offloaded)
+			mid->mid_state = MID_RESPONSE_RECEIVED;
+		else
+			dequeue_mid(mid, false);
 		return 0;
 	}
 
@@ -4428,7 +4447,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 		cifs_dbg(FYI, "%s: data offset (%u) beyond end of smallbuf\n",
 			 __func__, data_offset);
 		rdata->result = -EIO;
-		dequeue_mid(mid, rdata->result);
+		if (is_offloaded)
+			mid->mid_state = MID_RESPONSE_MALFORMED;
+		else
+			dequeue_mid(mid, rdata->result);
 		return 0;
 	}
 
@@ -4444,21 +4466,30 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 			cifs_dbg(FYI, "%s: data offset (%u) beyond 1st page of response\n",
 				 __func__, data_offset);
 			rdata->result = -EIO;
-			dequeue_mid(mid, rdata->result);
+			if (is_offloaded)
+				mid->mid_state = MID_RESPONSE_MALFORMED;
+			else
+				dequeue_mid(mid, rdata->result);
 			return 0;
 		}
 
 		if (data_len > page_data_size - pad_len) {
 			/* data_len is corrupt -- discard frame */
 			rdata->result = -EIO;
-			dequeue_mid(mid, rdata->result);
+			if (is_offloaded)
+				mid->mid_state = MID_RESPONSE_MALFORMED;
+			else
+				dequeue_mid(mid, rdata->result);
 			return 0;
 		}
 
 		rdata->result = init_read_bvec(pages, npages, page_data_size,
 					       cur_off, &bvec);
 		if (rdata->result != 0) {
-			dequeue_mid(mid, rdata->result);
+			if (is_offloaded)
+				mid->mid_state = MID_RESPONSE_MALFORMED;
+			else
+				dequeue_mid(mid, rdata->result);
 			return 0;
 		}
 
@@ -4473,7 +4504,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 		/* read response payload cannot be in both buf and pages */
 		WARN_ONCE(1, "buf can not contain only a part of read data");
 		rdata->result = -EIO;
-		dequeue_mid(mid, rdata->result);
+		if (is_offloaded)
+			mid->mid_state = MID_RESPONSE_MALFORMED;
+		else
+			dequeue_mid(mid, rdata->result);
 		return 0;
 	}
 
@@ -4484,7 +4518,10 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 	if (length < 0)
 		return length;
 
-	dequeue_mid(mid, false);
+	if (is_offloaded)
+		mid->mid_state = MID_RESPONSE_RECEIVED;
+	else
+		dequeue_mid(mid, false);
 	return length;
 }
 
@@ -4513,7 +4550,7 @@ static void smb2_decrypt_offload(struct work_struct *work)
 	}
 
 	dw->server->lstrp = jiffies;
-	mid = smb2_find_mid(dw->server, dw->buf);
+	mid = smb2_find_dequeue_mid(dw->server, dw->buf);
 	if (mid == NULL)
 		cifs_dbg(FYI, "mid not found\n");
 	else {
commit de9ac0a6e9efdffc8cde18781f48fb56ca4157b7
Author: Rohith Surabattula <rohiths at microsoft.com>
Date:   Wed Oct 28 13:42:21 2020 +0000

    smb3: Call cifs reconnect from demultiplex thread
    
    cifs_reconnect needs to be called only from demultiplex thread.
    skip cifs_reconnect in offload thread. So, cifs_reconnect will be
    called by demultiplex thread in subsequent request.
    
    These patches address a problem found during decryption offload:
         CIFS: VFS: trying to dequeue a deleted mid
    that can cause a refcount use after free:
    
    [ 1271.389453] Workqueue: smb3decryptd smb2_decrypt_offload [cifs]
    [ 1271.389456] RIP: 0010:refcount_warn_saturate+0xae/0xf0
    [ 1271.389457] Code: fa 1d 6a 01 01 e8 c7 44 b1 ff 0f 0b 5d c3 80 3d e7 1d 6a 01 00 75 91 48 c7 c7 d8 be 1d a2 c6 05 d7 1d 6a 01 01 e8 a7 44 b1 ff <0f> 0b 5d c3 80 3d c5 1d 6a 01 00 0f 85 6d ff ff ff 48 c7 c7 30 bf
    [ 1271.389458] RSP: 0018:ffffa4cdc1f87e30 EFLAGS: 00010286
    [ 1271.389458] RAX: 0000000000000000 RBX: ffff9974d2809f00 RCX: ffff9974df898cc8
    [ 1271.389459] RDX: 00000000ffffffd8 RSI: 0000000000000027 RDI: ffff9974df898cc0
    [ 1271.389460] RBP: ffffa4cdc1f87e30 R08: 0000000000000004 R09: 00000000000002c0
    [ 1271.389460] R10: 0000000000000000 R11: 0000000000000001 R12: ffff9974b7fdb5c0
    [ 1271.389461] R13: ffff9974d2809f00 R14: ffff9974ccea0a80 R15: ffff99748e60db80
    [ 1271.389462] FS:  0000000000000000(0000) GS:ffff9974df880000(0000) knlGS:0000000000000000
    [ 1271.389462] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 1271.389463] CR2: 000055c60f344fe4 CR3: 0000001031a3c002 CR4: 00000000003706e0
    [ 1271.389465] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 1271.389465] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [ 1271.389466] Call Trace:
    [ 1271.389483]  cifs_mid_q_entry_release+0xce/0x110 [cifs]
    [ 1271.389499]  smb2_decrypt_offload+0xa9/0x1c0 [cifs]
    [ 1271.389501]  process_one_work+0x1e8/0x3b0
    [ 1271.389503]  worker_thread+0x50/0x370
    [ 1271.389504]  kthread+0x12f/0x150
    [ 1271.389506]  ? process_one_work+0x3b0/0x3b0
    [ 1271.389507]  ? __kthread_bind_mask+0x70/0x70
    [ 1271.389509]  ret_from_fork+0x22/0x30
    
    Signed-off-by: Rohith Surabattula <rohiths at microsoft.com>
    Reviewed-by: Pavel Shilovsky <pshilov at microsoft.com>
    CC: Stable <stable at vger.kernel.org> #5.4+
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 504766cb6c19..efedec2b66c6 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -4356,7 +4356,8 @@ init_read_bvec(struct page **pages, unsigned int npages, unsigned int data_size,
 static int
 handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 		 char *buf, unsigned int buf_len, struct page **pages,
-		 unsigned int npages, unsigned int page_data_size)
+		 unsigned int npages, unsigned int page_data_size,
+		 bool is_offloaded)
 {
 	unsigned int data_offset;
 	unsigned int data_len;
@@ -4378,7 +4379,8 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
 
 	if (server->ops->is_session_expired &&
 	    server->ops->is_session_expired(buf)) {
-		cifs_reconnect(server);
+		if (!is_offloaded)
+			cifs_reconnect(server);
 		return -1;
 	}
 
@@ -4518,7 +4520,8 @@ static void smb2_decrypt_offload(struct work_struct *work)
 		mid->decrypted = true;
 		rc = handle_read_data(dw->server, mid, dw->buf,
 				      dw->server->vals->read_rsp_size,
-				      dw->ppages, dw->npages, dw->len);
+				      dw->ppages, dw->npages, dw->len,
+				      true);
 		mid->callback(mid);
 		cifs_mid_q_entry_release(mid);
 	}
@@ -4622,7 +4625,7 @@ non_offloaded_decrypt:
 		(*mid)->decrypted = true;
 		rc = handle_read_data(server, *mid, buf,
 				      server->vals->read_rsp_size,
-				      pages, npages, len);
+				      pages, npages, len, false);
 	}
 
 free_pages:
@@ -4765,7 +4768,7 @@ smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 	char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
 
 	return handle_read_data(server, mid, buf, server->pdu_size,
-				NULL, 0, 0);
+				NULL, 0, 0, false);
 }
 
 static int
commit 98128572084c3dd8067f48bb588aa3733d1355b5
Author: Namjae Jeon <namjae.jeon at samsung.com>
Date:   Mon Nov 9 17:35:33 2020 +0900

    cifs: fix a memleak with modefromsid
    
    kmemleak reported a memory leak allocated in query_info() when cifs is
    working with modefromsid.
    
      backtrace:
        [<00000000aeef6a1e>] slab_post_alloc_hook+0x58/0x510
        [<00000000b2f7a440>] __kmalloc+0x1a0/0x390
        [<000000006d470ebc>] query_info+0x5b5/0x700 [cifs]
        [<00000000bad76ce0>] SMB2_query_acl+0x2b/0x30 [cifs]
        [<000000001fa09606>] get_smb2_acl_by_path+0x2f3/0x720 [cifs]
        [<000000001b6ebab7>] get_smb2_acl+0x75/0x90 [cifs]
        [<00000000abf43904>] cifs_acl_to_fattr+0x13b/0x1d0 [cifs]
        [<00000000a5372ec3>] cifs_get_inode_info+0x4cd/0x9a0 [cifs]
        [<00000000388e0a04>] cifs_revalidate_dentry_attr+0x1cd/0x510 [cifs]
        [<0000000046b6b352>] cifs_getattr+0x8a/0x260 [cifs]
        [<000000007692c95e>] vfs_getattr_nosec+0xa1/0xc0
        [<00000000cbc7d742>] vfs_getattr+0x36/0x40
        [<00000000de8acf67>] vfs_statx_fd+0x4a/0x80
        [<00000000a58c6adb>] __do_sys_newfstat+0x31/0x70
        [<00000000300b3b4e>] __x64_sys_newfstat+0x16/0x20
        [<000000006d8e9c48>] do_syscall_64+0x37/0x80
    
    This patch add missing kfree for pntsd when mounting modefromsid option.
    
    Cc: Stable <stable at vger.kernel.org> # v5.4+
    Signed-off-by: Namjae Jeon <namjae.jeon at samsung.com>
    Reviewed-by: Aurelien Aptel <aaptel at suse.com>
    Signed-off-by: Steve French <stfrench at microsoft.com>

diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
index 23b21e943652..ef4784e72b1d 100644
--- a/fs/cifs/cifsacl.c
+++ b/fs/cifs/cifsacl.c
@@ -1266,6 +1266,7 @@ cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr,
 		cifs_dbg(VFS, "%s: error %d getting sec desc\n", __func__, rc);
 	} else if (mode_from_special_sid) {
 		rc = parse_sec_desc(cifs_sb, pntsd, acllen, fattr, true);
+		kfree(pntsd);
 	} else {
 		/* get approximated mode from ACL */
 		rc = parse_sec_desc(cifs_sb, pntsd, acllen, fattr, false);
commit 4bbf439b09c5ac3f8b3e9584fe080375d8d0ad2d
Author: Al Viro <viro at zeniv.linux.org.uk>
Date:   Thu Nov 12 14:40:37 2020 -0500

    fix return values of seq_read_iter()
    
    Unlike ->read(), ->read_iter() instances *must* return the amount
    of data they'd left in iterator.  For ->read() returning less than
    it has actually copied is a QoI issue; read(fd, unmapped_page - 5, 8)
    is allowed to fill all 5 bytes of destination and return 4; it's
    not nice to caller, but POSIX allows pretty much anything in such
    situation, up to and including a SIGSEGV.
    
    generic_file_splice_read() uses pipe-backed iterator as destination;
    there a short copy comes from pipe being full, not from running into
    an un{mapped,writable} page in the middle of destination as we
    have for iovec-backed iterators read(2) uses.  And there we rely
    upon the ->read_iter() reporting the actual amount it has left
    in destination.
    
    Conversion of a ->read() instance into ->read_iter() has to watch
    out for that.  If you really need an "all or nothing" kind of
    behaviour somewhere, you need to do iov_iter_revert() to prune
    the partial copy.
    
    In case of seq_read_iter() we can handle short copy just fine;
    the data is in m->buf and next call will fetch it from there.
    
    Fixes: d4d50710a8b4 (seq_file: add seq_read_iter)
    Tested-by: Nathan Chancellor <natechancellor at gmail.com>
    Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>

diff --git a/fs/seq_file.c b/fs/seq_file.c
index 3b20e21604e7..03a369ccd28c 100644
--- a/fs/seq_file.c
+++ b/fs/seq_file.c
@@ -168,12 +168,14 @@ EXPORT_SYMBOL(seq_read);
 ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter)
 {
 	struct seq_file *m = iocb->ki_filp->private_data;
-	size_t size = iov_iter_count(iter);
 	size_t copied = 0;
 	size_t n;
 	void *p;
 	int err = 0;
 
+	if (!iov_iter_count(iter))
+		return 0;
+
 	mutex_lock(&m->lock);
 
 	/*
@@ -206,36 +208,34 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter)
 		if (!m->buf)
 			goto Enomem;
 	}
-	/* if not empty - flush it first */
+	// something left in the buffer - copy it out first
 	if (m->count) {
-		n = min(m->count, size);
-		if (copy_to_iter(m->buf + m->from, n, iter) != n)
-			goto Efault;
+		n = copy_to_iter(m->buf + m->from, m->count, iter);
 		m->count -= n;
 		m->from += n;
-		size -= n;
 		copied += n;
-		if (!size)
+		if (m->count)	// hadn't managed to copy everything
 			goto Done;
 	}
-	/* we need at least one record in buffer */
+	// get a non-empty record in the buffer
 	m->from = 0;
 	p = m->op->start(m, &m->index);
 	while (1) {
 		err = PTR_ERR(p);
-		if (!p || IS_ERR(p))
+		if (!p || IS_ERR(p))	// EOF or an error
 			break;
 		err = m->op->show(m, p);
-		if (err < 0)
+		if (err < 0)		// hard error
 			break;
-		if (unlikely(err))
+		if (unlikely(err))	// ->show() says "skip it"
 			m->count = 0;
-		if (unlikely(!m->count)) {
+		if (unlikely(!m->count)) { // empty record
 			p = m->op->next(m, p, &m->index);
 			continue;
 		}
-		if (m->count < m->size)
+		if (!seq_has_overflowed(m)) // got it
 			goto Fill;
+		// need a bigger buffer
 		m->op->stop(m, p);
 		kvfree(m->buf);
 		m->count = 0;
@@ -244,11 +244,14 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter)
 			goto Enomem;
 		p = m->op->start(m, &m->index);
 	}
+	// EOF or an error
 	m->op->stop(m, p);
 	m->count = 0;
 	goto Done;
 Fill:
-	/* they want more? let's try to get some more */
+	// one non-empty record is in the buffer; if they want more,
+	// try to fit more in, but in any case we need to advance
+	// the iterator once for every record shown.
 	while (1) {
 		size_t offs = m->count;
 		loff_t pos = m->index;
@@ -259,30 +262,27 @@ Fill:
 					    m->op->next);
 			m->index++;
 		}
-		if (!p || IS_ERR(p)) {
-			err = PTR_ERR(p);
+		if (!p || IS_ERR(p))	// no next record for us
 			break;
-		}
-		if (m->count >= size)
+		if (m->count >= iov_iter_count(iter))
 			break;
 		err = m->op->show(m, p);
-		if (seq_has_overflowed(m) || err) {
+		if (err > 0) {		// ->show() says "skip it"
 			m->count = offs;
-			if (likely(err <= 0))
-				break;
+		} else if (err || seq_has_overflowed(m)) {
+			m->count = offs;
+			break;
 		}
 	}
 	m->op->stop(m, p);
-	n = min(m->count, size);
-	if (copy_to_iter(m->buf, n, iter) != n)
-		goto Efault;
+	n = copy_to_iter(m->buf, m->count, iter);
 	copied += n;
 	m->count -= n;
 	m->from = n;
 Done:
-	if (!copied)
-		copied = err;
-	else {
+	if (unlikely(!copied)) {
+		copied = m->count ? -EFAULT : err;
+	} else {
 		iocb->ki_pos += copied;
 		m->read_pos += copied;
 	}
@@ -291,9 +291,6 @@ Done:
 Enomem:
 	err = -ENOMEM;
 	goto Done;
-Efault:
-	err = -EFAULT;
-	goto Done;
 }
 EXPORT_SYMBOL(seq_read_iter);
 
commit 09162bc32c880a791c6c0668ce0745cf7958f576
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 16:44:31 2020 -0800

    Linux 5.10-rc4

diff --git a/Makefile b/Makefile
index 008aba5f1a20..e2c3f65c4721 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 10
 SUBLEVEL = 0
-EXTRAVERSION = -rc3
+EXTRAVERSION = -rc4
 NAME = Kleptomaniac Octopus
 
 # *DOCUMENTATION*
commit 575cba20c421ecb6b563ae352e4e0468e4ca8b3c
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Sat Nov 14 21:47:43 2020 +1000

    powerpc/64s: Fix KVM system reset handling when CONFIG_PPC_PSERIES=y
    
    pseries guest kernels have a FWNMI handler for SRESET and MCE NMIs,
    which is basically the same as the regular handlers for those
    interrupts.
    
    The system reset FWNMI handler did not have a KVM guest test in it,
    although it probably should have because the guest can itself run
    guests.
    
    Commit 4f50541f6703b ("powerpc/64s/exception: Move all interrupt
    handlers to new style code gen macros") convert the handler faithfully
    to avoid a KVM test with a "clever" trick to modify the IKVM_REAL
    setting to 0 when the fwnmi handler is to be generated (PPC_PSERIES=y).
    This worked when the KVM test was generated in the interrupt entry
    handlers, but a later patch moved the KVM test to the common handler,
    and the common handler macro is expanded below the fwnmi entry. This
    prevents the KVM test from being generated even for the 0x100 entry
    point as well.
    
    The result is NMI IPIs in the host kernel when a guest is running will
    use gest registers. This goes particularly badly when an HPT guest is
    running and the MMU is set to guest mode.
    
    Remove this trickery and just generate the test always.
    
    Fixes: 9600f261acaa ("powerpc/64s/exception: Move KVM test to common code")
    Cc: stable at vger.kernel.org # v5.7+
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/20201114114743.3306283-1-npiggin@gmail.com

diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index f7d748b88705..07d64883c0b5 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1000,8 +1000,6 @@ TRAMP_REAL_BEGIN(system_reset_idle_wake)
  * Vectors for the FWNMI option.  Share common code.
  */
 TRAMP_REAL_BEGIN(system_reset_fwnmi)
-	/* XXX: fwnmi guest could run a nested/PR guest, so why no test?  */
-	__IKVM_REAL(system_reset)=0
 	GEN_INT_ENTRY system_reset, virt=0
 
 #endif /* CONFIG_PPC_PSERIES */
commit efd838fec17bd8756da852a435800a7e6281bfbc
Author: Mike Christie <michael.christie at oracle.com>
Date:   Mon Nov 9 23:33:23 2020 -0600

    vhost scsi: Add support for LUN resets.
    
    In newer versions of virtio-scsi we just reset the timer when an a
    command times out, so TMFs are never sent for the cmd time out case.
    However, in older kernels and for the TMF inject cases, we can still get
    resets and we end up just failing immediately so the guest might see the
    device get offlined and IO errors.
    
    For the older kernel cases, we want the same end result as the
    modern virtio-scsi driver where we let the lower levels fire their error
    handling and handle the problem. And at the upper levels we want to
    wait. This patch ties the LUN reset handling into the LIO TMF code which
    will just wait for outstanding commands to complete like we are doing in
    the modern virtio-scsi case.
    
    Note: I did not handle the ABORT case to keep this simple. For ABORTs
    LIO just waits on the cmd like how it does for the RESET case. If
    an ABORT fails, the guest OS ends up escalating to LUN RESET, so in
    the end we get the same behavior where we wait on the outstanding
    cmds.
    
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Link: https://lore.kernel.org/r/1604986403-4931-6-git-send-email-michael.christie@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Stefan Hajnoczi <stefanha at redhat.com>

diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index ed7dc6b998f6..f22fce549862 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -139,6 +139,7 @@ struct vhost_scsi_tpg {
 	struct se_portal_group se_tpg;
 	/* Pointer back to vhost_scsi, protected by tv_tpg_mutex */
 	struct vhost_scsi *vhost_scsi;
+	struct list_head tmf_queue;
 };
 
 struct vhost_scsi_tport {
@@ -211,6 +212,20 @@ struct vhost_scsi {
 	int vs_events_nr; /* num of pending events, protected by vq->mutex */
 };
 
+struct vhost_scsi_tmf {
+	struct vhost_work vwork;
+	struct vhost_scsi_tpg *tpg;
+	struct vhost_scsi *vhost;
+	struct vhost_scsi_virtqueue *svq;
+	struct list_head queue_entry;
+
+	struct se_cmd se_cmd;
+	struct vhost_scsi_inflight *inflight;
+	struct iovec resp_iov;
+	int in_iovs;
+	int vq_desc;
+};
+
 /*
  * Context for processing request and control queue operations.
  */
@@ -344,14 +359,32 @@ static void vhost_scsi_release_cmd_res(struct se_cmd *se_cmd)
 	vhost_scsi_put_inflight(inflight);
 }
 
+static void vhost_scsi_release_tmf_res(struct vhost_scsi_tmf *tmf)
+{
+	struct vhost_scsi_tpg *tpg = tmf->tpg;
+	struct vhost_scsi_inflight *inflight = tmf->inflight;
+
+	mutex_lock(&tpg->tv_tpg_mutex);
+	list_add_tail(&tpg->tmf_queue, &tmf->queue_entry);
+	mutex_unlock(&tpg->tv_tpg_mutex);
+	vhost_scsi_put_inflight(inflight);
+}
+
 static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
 {
-	struct vhost_scsi_cmd *cmd = container_of(se_cmd,
+	if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) {
+		struct vhost_scsi_tmf *tmf = container_of(se_cmd,
+					struct vhost_scsi_tmf, se_cmd);
+
+		vhost_work_queue(&tmf->vhost->dev, &tmf->vwork);
+	} else {
+		struct vhost_scsi_cmd *cmd = container_of(se_cmd,
 					struct vhost_scsi_cmd, tvc_se_cmd);
-	struct vhost_scsi *vs = cmd->tvc_vhost;
+		struct vhost_scsi *vs = cmd->tvc_vhost;
 
-	llist_add(&cmd->tvc_completion_list, &vs->vs_completion_list);
-	vhost_work_queue(&vs->dev, &vs->vs_completion_work);
+		llist_add(&cmd->tvc_completion_list, &vs->vs_completion_list);
+		vhost_work_queue(&vs->dev, &vs->vs_completion_work);
+	}
 }
 
 static u32 vhost_scsi_sess_get_index(struct se_session *se_sess)
@@ -390,7 +423,10 @@ static int vhost_scsi_queue_status(struct se_cmd *se_cmd)
 
 static void vhost_scsi_queue_tm_rsp(struct se_cmd *se_cmd)
 {
-	return;
+	struct vhost_scsi_tmf *tmf = container_of(se_cmd, struct vhost_scsi_tmf,
+						  se_cmd);
+
+	transport_generic_free_cmd(&tmf->se_cmd, 0);
 }
 
 static void vhost_scsi_aborted_task(struct se_cmd *se_cmd)
@@ -1120,9 +1156,9 @@ out:
 }
 
 static void
-vhost_scsi_send_tmf_reject(struct vhost_scsi *vs,
-			   struct vhost_virtqueue *vq,
-			   struct vhost_scsi_ctx *vc)
+vhost_scsi_send_tmf_resp(struct vhost_scsi *vs, struct vhost_virtqueue *vq,
+			 int in_iovs, int vq_desc, struct iovec *resp_iov,
+			 int tmf_resp_code)
 {
 	struct virtio_scsi_ctrl_tmf_resp rsp;
 	struct iov_iter iov_iter;
@@ -1130,17 +1166,87 @@ vhost_scsi_send_tmf_reject(struct vhost_scsi *vs,
 
 	pr_debug("%s\n", __func__);
 	memset(&rsp, 0, sizeof(rsp));
-	rsp.response = VIRTIO_SCSI_S_FUNCTION_REJECTED;
+	rsp.response = tmf_resp_code;
 
-	iov_iter_init(&iov_iter, READ, &vq->iov[vc->out], vc->in, sizeof(rsp));
+	iov_iter_init(&iov_iter, READ, resp_iov, in_iovs, sizeof(rsp));
 
 	ret = copy_to_iter(&rsp, sizeof(rsp), &iov_iter);
 	if (likely(ret == sizeof(rsp)))
-		vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0);
+		vhost_add_used_and_signal(&vs->dev, vq, vq_desc, 0);
 	else
 		pr_err("Faulted on virtio_scsi_ctrl_tmf_resp\n");
 }
 
+static void vhost_scsi_tmf_resp_work(struct vhost_work *work)
+{
+	struct vhost_scsi_tmf *tmf = container_of(work, struct vhost_scsi_tmf,
+						  vwork);
+	int resp_code;
+
+	if (tmf->se_cmd.se_tmr_req->response == TMR_FUNCTION_COMPLETE)
+		resp_code = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
+	else
+		resp_code = VIRTIO_SCSI_S_FUNCTION_REJECTED;
+
+	vhost_scsi_send_tmf_resp(tmf->vhost, &tmf->svq->vq, tmf->in_iovs,
+				 tmf->vq_desc, &tmf->resp_iov, resp_code);
+	vhost_scsi_release_tmf_res(tmf);
+}
+
+static void
+vhost_scsi_handle_tmf(struct vhost_scsi *vs, struct vhost_scsi_tpg *tpg,
+		      struct vhost_virtqueue *vq,
+		      struct virtio_scsi_ctrl_tmf_req *vtmf,
+		      struct vhost_scsi_ctx *vc)
+{
+	struct vhost_scsi_virtqueue *svq = container_of(vq,
+					struct vhost_scsi_virtqueue, vq);
+	struct vhost_scsi_tmf *tmf;
+
+	if (vhost32_to_cpu(vq, vtmf->subtype) !=
+	    VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET)
+		goto send_reject;
+
+	if (!tpg->tpg_nexus || !tpg->tpg_nexus->tvn_se_sess) {
+		pr_err("Unable to locate active struct vhost_scsi_nexus for LUN RESET.\n");
+		goto send_reject;
+	}
+
+	mutex_lock(&tpg->tv_tpg_mutex);
+	if (list_empty(&tpg->tmf_queue)) {
+		pr_err("Missing reserve TMF. Could not handle LUN RESET.\n");
+		mutex_unlock(&tpg->tv_tpg_mutex);
+		goto send_reject;
+	}
+
+	tmf = list_first_entry(&tpg->tmf_queue, struct vhost_scsi_tmf,
+			       queue_entry);
+	list_del_init(&tmf->queue_entry);
+	mutex_unlock(&tpg->tv_tpg_mutex);
+
+	tmf->tpg = tpg;
+	tmf->vhost = vs;
+	tmf->svq = svq;
+	tmf->resp_iov = vq->iov[vc->out];
+	tmf->vq_desc = vc->head;
+	tmf->in_iovs = vc->in;
+	tmf->inflight = vhost_scsi_get_inflight(vq);
+
+	if (target_submit_tmr(&tmf->se_cmd, tpg->tpg_nexus->tvn_se_sess, NULL,
+			      vhost_buf_to_lun(vtmf->lun), NULL,
+			      TMR_LUN_RESET, GFP_KERNEL, 0,
+			      TARGET_SCF_ACK_KREF) < 0) {
+		vhost_scsi_release_tmf_res(tmf);
+		goto send_reject;
+	}
+
+	return;
+
+send_reject:
+	vhost_scsi_send_tmf_resp(vs, vq, vc->in, vc->head, &vq->iov[vc->out],
+				 VIRTIO_SCSI_S_FUNCTION_REJECTED);
+}
+
 static void
 vhost_scsi_send_an_resp(struct vhost_scsi *vs,
 			struct vhost_virtqueue *vq,
@@ -1166,6 +1272,7 @@ vhost_scsi_send_an_resp(struct vhost_scsi *vs,
 static void
 vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
 {
+	struct vhost_scsi_tpg *tpg;
 	union {
 		__virtio32 type;
 		struct virtio_scsi_ctrl_an_req an;
@@ -1247,12 +1354,12 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
 		vc.req += typ_size;
 		vc.req_size -= typ_size;
 
-		ret = vhost_scsi_get_req(vq, &vc, NULL);
+		ret = vhost_scsi_get_req(vq, &vc, &tpg);
 		if (ret)
 			goto err;
 
 		if (v_req.type == VIRTIO_SCSI_T_TMF)
-			vhost_scsi_send_tmf_reject(vs, vq, &vc);
+			vhost_scsi_handle_tmf(vs, tpg, vq, &v_req.tmf, &vc);
 		else
 			vhost_scsi_send_an_resp(vs, vq, &vc);
 err:
@@ -1913,11 +2020,19 @@ static int vhost_scsi_port_link(struct se_portal_group *se_tpg,
 {
 	struct vhost_scsi_tpg *tpg = container_of(se_tpg,
 				struct vhost_scsi_tpg, se_tpg);
+	struct vhost_scsi_tmf *tmf;
+
+	tmf = kzalloc(sizeof(*tmf), GFP_KERNEL);
+	if (!tmf)
+		return -ENOMEM;
+	INIT_LIST_HEAD(&tmf->queue_entry);
+	vhost_work_init(&tmf->vwork, vhost_scsi_tmf_resp_work);
 
 	mutex_lock(&vhost_scsi_mutex);
 
 	mutex_lock(&tpg->tv_tpg_mutex);
 	tpg->tv_tpg_port_count++;
+	list_add_tail(&tmf->queue_entry, &tpg->tmf_queue);
 	mutex_unlock(&tpg->tv_tpg_mutex);
 
 	vhost_scsi_hotplug(tpg, lun);
@@ -1932,11 +2047,16 @@ static void vhost_scsi_port_unlink(struct se_portal_group *se_tpg,
 {
 	struct vhost_scsi_tpg *tpg = container_of(se_tpg,
 				struct vhost_scsi_tpg, se_tpg);
+	struct vhost_scsi_tmf *tmf;
 
 	mutex_lock(&vhost_scsi_mutex);
 
 	mutex_lock(&tpg->tv_tpg_mutex);
 	tpg->tv_tpg_port_count--;
+	tmf = list_first_entry(&tpg->tmf_queue, struct vhost_scsi_tmf,
+			       queue_entry);
+	list_del(&tmf->queue_entry);
+	kfree(tmf);
 	mutex_unlock(&tpg->tv_tpg_mutex);
 
 	vhost_scsi_hotunplug(tpg, lun);
@@ -2197,6 +2317,7 @@ vhost_scsi_make_tpg(struct se_wwn *wwn, const char *name)
 	}
 	mutex_init(&tpg->tv_tpg_mutex);
 	INIT_LIST_HEAD(&tpg->tv_tpg_list);
+	INIT_LIST_HEAD(&tpg->tmf_queue);
 	tpg->tport = tport;
 	tpg->tport_tpgt = tpgt;
 
commit 18f1becb6948cd411fd01968a0a54af63732e73c
Author: Mike Christie <michael.christie at oracle.com>
Date:   Mon Nov 9 23:33:22 2020 -0600

    vhost scsi: add lun parser helper
    
    Move code to parse lun from req's lun_buf to helper, so tmf code
    can use it in the next patch.
    
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Reviewed-by: Paolo Bonzini <pbonzini at redhat.com>
    Acked-by: Jason Wang <jasowang at redhat.com>
    Link: https://lore.kernel.org/r/1604986403-4931-5-git-send-email-michael.christie@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Stefan Hajnoczi <stefanha at redhat.com>

diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index 5d8850f5aef1..ed7dc6b998f6 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -898,6 +898,11 @@ vhost_scsi_get_req(struct vhost_virtqueue *vq, struct vhost_scsi_ctx *vc,
 	return ret;
 }
 
+static u16 vhost_buf_to_lun(u8 *lun_buf)
+{
+	return ((lun_buf[2] << 8) | lun_buf[3]) & 0x3FFF;
+}
+
 static void
 vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
 {
@@ -1036,12 +1041,12 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
 			tag = vhost64_to_cpu(vq, v_req_pi.tag);
 			task_attr = v_req_pi.task_attr;
 			cdb = &v_req_pi.cdb[0];
-			lun = ((v_req_pi.lun[2] << 8) | v_req_pi.lun[3]) & 0x3FFF;
+			lun = vhost_buf_to_lun(v_req_pi.lun);
 		} else {
 			tag = vhost64_to_cpu(vq, v_req.tag);
 			task_attr = v_req.task_attr;
 			cdb = &v_req.cdb[0];
-			lun = ((v_req.lun[2] << 8) | v_req.lun[3]) & 0x3FFF;
+			lun = vhost_buf_to_lun(v_req.lun);
 		}
 		/*
 		 * Check that the received CDB size does not exceeded our
commit 47a3565e8bb14ec48a75b48daf57aa830e2691f8
Author: Mike Christie <michael.christie at oracle.com>
Date:   Mon Nov 9 23:33:21 2020 -0600

    vhost scsi: fix cmd completion race
    
    We might not do the final se_cmd put from vhost_scsi_complete_cmd_work.
    When the last put happens a little later then we could race where
    vhost_scsi_complete_cmd_work does vhost_signal, the guest runs and sends
    more IO, and vhost_scsi_handle_vq runs but does not find any free cmds.
    
    This patch has us delay completing the cmd until the last lio core ref
    is dropped. We then know that once we signal to the guest that the cmd
    is completed that if it queues a new command it will find a free cmd.
    
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Reviewed-by: Maurizio Lombardi <mlombard at redhat.com>
    Link: https://lore.kernel.org/r/1604986403-4931-4-git-send-email-michael.christie@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Stefan Hajnoczi <stefanha at redhat.com>

diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index e31339be7dd7..5d8850f5aef1 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -322,7 +322,7 @@ static u32 vhost_scsi_tpg_get_inst_index(struct se_portal_group *se_tpg)
 	return 1;
 }
 
-static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
+static void vhost_scsi_release_cmd_res(struct se_cmd *se_cmd)
 {
 	struct vhost_scsi_cmd *tv_cmd = container_of(se_cmd,
 				struct vhost_scsi_cmd, tvc_se_cmd);
@@ -344,6 +344,16 @@ static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
 	vhost_scsi_put_inflight(inflight);
 }
 
+static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
+{
+	struct vhost_scsi_cmd *cmd = container_of(se_cmd,
+					struct vhost_scsi_cmd, tvc_se_cmd);
+	struct vhost_scsi *vs = cmd->tvc_vhost;
+
+	llist_add(&cmd->tvc_completion_list, &vs->vs_completion_list);
+	vhost_work_queue(&vs->dev, &vs->vs_completion_work);
+}
+
 static u32 vhost_scsi_sess_get_index(struct se_session *se_sess)
 {
 	return 0;
@@ -366,28 +376,15 @@ static int vhost_scsi_get_cmd_state(struct se_cmd *se_cmd)
 	return 0;
 }
 
-static void vhost_scsi_complete_cmd(struct vhost_scsi_cmd *cmd)
-{
-	struct vhost_scsi *vs = cmd->tvc_vhost;
-
-	llist_add(&cmd->tvc_completion_list, &vs->vs_completion_list);
-
-	vhost_work_queue(&vs->dev, &vs->vs_completion_work);
-}
-
 static int vhost_scsi_queue_data_in(struct se_cmd *se_cmd)
 {
-	struct vhost_scsi_cmd *cmd = container_of(se_cmd,
-				struct vhost_scsi_cmd, tvc_se_cmd);
-	vhost_scsi_complete_cmd(cmd);
+	transport_generic_free_cmd(se_cmd, 0);
 	return 0;
 }
 
 static int vhost_scsi_queue_status(struct se_cmd *se_cmd)
 {
-	struct vhost_scsi_cmd *cmd = container_of(se_cmd,
-				struct vhost_scsi_cmd, tvc_se_cmd);
-	vhost_scsi_complete_cmd(cmd);
+	transport_generic_free_cmd(se_cmd, 0);
 	return 0;
 }
 
@@ -433,15 +430,6 @@ vhost_scsi_allocate_evt(struct vhost_scsi *vs,
 	return evt;
 }
 
-static void vhost_scsi_free_cmd(struct vhost_scsi_cmd *cmd)
-{
-	struct se_cmd *se_cmd = &cmd->tvc_se_cmd;
-
-	/* TODO locking against target/backend threads? */
-	transport_generic_free_cmd(se_cmd, 0);
-
-}
-
 static int vhost_scsi_check_stop_free(struct se_cmd *se_cmd)
 {
 	return target_put_sess_cmd(se_cmd);
@@ -560,7 +548,7 @@ static void vhost_scsi_complete_cmd_work(struct vhost_work *work)
 		} else
 			pr_err("Faulted on virtio_scsi_cmd_resp\n");
 
-		vhost_scsi_free_cmd(cmd);
+		vhost_scsi_release_cmd_res(se_cmd);
 	}
 
 	vq = -1;
@@ -1091,7 +1079,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
 						      &prot_iter, exp_data_len,
 						      &data_iter))) {
 				vq_err(vq, "Failed to map iov to sgl\n");
-				vhost_scsi_release_cmd(&cmd->tvc_se_cmd);
+				vhost_scsi_release_cmd_res(&cmd->tvc_se_cmd);
 				goto err;
 			}
 		}
commit 25b98b64e28423b0769313dcaf96423836b1f93d
Author: Mike Christie <michael.christie at oracle.com>
Date:   Mon Nov 9 23:33:20 2020 -0600

    vhost scsi: alloc cmds per vq instead of session
    
    We currently are limited to 256 cmds per session. This leads to problems
    where if the user has increased virtqueue_size to more than 2 or
    cmd_per_lun to more than 256 vhost_scsi_get_tag can fail and the guest
    will get IO errors.
    
    This patch moves the cmd allocation to per vq so we can easily match
    whatever the user has specified for num_queues and
    virtqueue_size/cmd_per_lun. It also makes it easier to control how much
    memory we preallocate. For cases, where perf is not as important and
    we can use the current defaults (1 vq and 128 cmds per vq) memory use
    from preallocate cmds is cut in half. For cases, where we are willing
    to use more memory for higher perf, cmd mem use will now increase as
    the num queues and queue depth increases.
    
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Link: https://lore.kernel.org/r/1604986403-4931-3-git-send-email-michael.christie@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Reviewed-by: Maurizio Lombardi <mlombard at redhat.com>
    Acked-by: Stefan Hajnoczi <stefanha at redhat.com>

diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index b22adf03f584..e31339be7dd7 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -52,7 +52,6 @@
 #define VHOST_SCSI_VERSION  "v0.1"
 #define VHOST_SCSI_NAMELEN 256
 #define VHOST_SCSI_MAX_CDB_SIZE 32
-#define VHOST_SCSI_DEFAULT_TAGS 256
 #define VHOST_SCSI_PREALLOC_SGLS 2048
 #define VHOST_SCSI_PREALLOC_UPAGES 2048
 #define VHOST_SCSI_PREALLOC_PROT_SGLS 2048
@@ -189,6 +188,9 @@ struct vhost_scsi_virtqueue {
 	 * Writers must also take dev mutex and flush under it.
 	 */
 	int inflight_idx;
+	struct vhost_scsi_cmd *scsi_cmds;
+	struct sbitmap scsi_tags;
+	int max_cmds;
 };
 
 struct vhost_scsi {
@@ -324,7 +326,9 @@ static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
 {
 	struct vhost_scsi_cmd *tv_cmd = container_of(se_cmd,
 				struct vhost_scsi_cmd, tvc_se_cmd);
-	struct se_session *se_sess = tv_cmd->tvc_nexus->tvn_se_sess;
+	struct vhost_scsi_virtqueue *svq = container_of(tv_cmd->tvc_vq,
+				struct vhost_scsi_virtqueue, vq);
+	struct vhost_scsi_inflight *inflight = tv_cmd->inflight;
 	int i;
 
 	if (tv_cmd->tvc_sgl_count) {
@@ -336,8 +340,8 @@ static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
 			put_page(sg_page(&tv_cmd->tvc_prot_sgl[i]));
 	}
 
-	vhost_scsi_put_inflight(tv_cmd->inflight);
-	target_free_tag(se_sess, se_cmd);
+	sbitmap_clear_bit(&svq->scsi_tags, se_cmd->map_tag);
+	vhost_scsi_put_inflight(inflight);
 }
 
 static u32 vhost_scsi_sess_get_index(struct se_session *se_sess)
@@ -566,31 +570,31 @@ static void vhost_scsi_complete_cmd_work(struct vhost_work *work)
 }
 
 static struct vhost_scsi_cmd *
-vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg,
+vhost_scsi_get_cmd(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg,
 		   unsigned char *cdb, u64 scsi_tag, u16 lun, u8 task_attr,
 		   u32 exp_data_len, int data_direction)
 {
+	struct vhost_scsi_virtqueue *svq = container_of(vq,
+					struct vhost_scsi_virtqueue, vq);
 	struct vhost_scsi_cmd *cmd;
 	struct vhost_scsi_nexus *tv_nexus;
-	struct se_session *se_sess;
 	struct scatterlist *sg, *prot_sg;
 	struct page **pages;
-	int tag, cpu;
+	int tag;
 
 	tv_nexus = tpg->tpg_nexus;
 	if (!tv_nexus) {
 		pr_err("Unable to locate active struct vhost_scsi_nexus\n");
 		return ERR_PTR(-EIO);
 	}
-	se_sess = tv_nexus->tvn_se_sess;
 
-	tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu);
+	tag = sbitmap_get(&svq->scsi_tags, 0, false);
 	if (tag < 0) {
 		pr_err("Unable to obtain tag for vhost_scsi_cmd\n");
 		return ERR_PTR(-ENOMEM);
 	}
 
-	cmd = &((struct vhost_scsi_cmd *)se_sess->sess_cmd_map)[tag];
+	cmd = &svq->scsi_cmds[tag];
 	sg = cmd->tvc_sgl;
 	prot_sg = cmd->tvc_prot_sgl;
 	pages = cmd->tvc_upages;
@@ -599,7 +603,6 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg,
 	cmd->tvc_prot_sgl = prot_sg;
 	cmd->tvc_upages = pages;
 	cmd->tvc_se_cmd.map_tag = tag;
-	cmd->tvc_se_cmd.map_cpu = cpu;
 	cmd->tvc_tag = scsi_tag;
 	cmd->tvc_lun = lun;
 	cmd->tvc_task_attr = task_attr;
@@ -1065,11 +1068,11 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
 				scsi_command_size(cdb), VHOST_SCSI_MAX_CDB_SIZE);
 				goto err;
 		}
-		cmd = vhost_scsi_get_tag(vq, tpg, cdb, tag, lun, task_attr,
+		cmd = vhost_scsi_get_cmd(vq, tpg, cdb, tag, lun, task_attr,
 					 exp_data_len + prot_bytes,
 					 data_direction);
 		if (IS_ERR(cmd)) {
-			vq_err(vq, "vhost_scsi_get_tag failed %ld\n",
+			vq_err(vq, "vhost_scsi_get_cmd failed %ld\n",
 			       PTR_ERR(cmd));
 			goto err;
 		}
@@ -1373,6 +1376,83 @@ static void vhost_scsi_flush(struct vhost_scsi *vs)
 		wait_for_completion(&old_inflight[i]->comp);
 }
 
+static void vhost_scsi_destroy_vq_cmds(struct vhost_virtqueue *vq)
+{
+	struct vhost_scsi_virtqueue *svq = container_of(vq,
+					struct vhost_scsi_virtqueue, vq);
+	struct vhost_scsi_cmd *tv_cmd;
+	unsigned int i;
+
+	if (!svq->scsi_cmds)
+		return;
+
+	for (i = 0; i < svq->max_cmds; i++) {
+		tv_cmd = &svq->scsi_cmds[i];
+
+		kfree(tv_cmd->tvc_sgl);
+		kfree(tv_cmd->tvc_prot_sgl);
+		kfree(tv_cmd->tvc_upages);
+	}
+
+	sbitmap_free(&svq->scsi_tags);
+	kfree(svq->scsi_cmds);
+	svq->scsi_cmds = NULL;
+}
+
+static int vhost_scsi_setup_vq_cmds(struct vhost_virtqueue *vq, int max_cmds)
+{
+	struct vhost_scsi_virtqueue *svq = container_of(vq,
+					struct vhost_scsi_virtqueue, vq);
+	struct vhost_scsi_cmd *tv_cmd;
+	unsigned int i;
+
+	if (svq->scsi_cmds)
+		return 0;
+
+	if (sbitmap_init_node(&svq->scsi_tags, max_cmds, -1, GFP_KERNEL,
+			      NUMA_NO_NODE))
+		return -ENOMEM;
+	svq->max_cmds = max_cmds;
+
+	svq->scsi_cmds = kcalloc(max_cmds, sizeof(*tv_cmd), GFP_KERNEL);
+	if (!svq->scsi_cmds) {
+		sbitmap_free(&svq->scsi_tags);
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_cmds; i++) {
+		tv_cmd = &svq->scsi_cmds[i];
+
+		tv_cmd->tvc_sgl = kcalloc(VHOST_SCSI_PREALLOC_SGLS,
+					  sizeof(struct scatterlist),
+					  GFP_KERNEL);
+		if (!tv_cmd->tvc_sgl) {
+			pr_err("Unable to allocate tv_cmd->tvc_sgl\n");
+			goto out;
+		}
+
+		tv_cmd->tvc_upages = kcalloc(VHOST_SCSI_PREALLOC_UPAGES,
+					     sizeof(struct page *),
+					     GFP_KERNEL);
+		if (!tv_cmd->tvc_upages) {
+			pr_err("Unable to allocate tv_cmd->tvc_upages\n");
+			goto out;
+		}
+
+		tv_cmd->tvc_prot_sgl = kcalloc(VHOST_SCSI_PREALLOC_PROT_SGLS,
+					       sizeof(struct scatterlist),
+					       GFP_KERNEL);
+		if (!tv_cmd->tvc_prot_sgl) {
+			pr_err("Unable to allocate tv_cmd->tvc_prot_sgl\n");
+			goto out;
+		}
+	}
+	return 0;
+out:
+	vhost_scsi_destroy_vq_cmds(vq);
+	return -ENOMEM;
+}
+
 /*
  * Called from vhost_scsi_ioctl() context to walk the list of available
  * vhost_scsi_tpg with an active struct vhost_scsi_nexus
@@ -1427,10 +1507,9 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs,
 
 		if (!strcmp(tv_tport->tport_name, t->vhost_wwpn)) {
 			if (vs->vs_tpg && vs->vs_tpg[tpg->tport_tpgt]) {
-				kfree(vs_tpg);
 				mutex_unlock(&tpg->tv_tpg_mutex);
 				ret = -EEXIST;
-				goto out;
+				goto undepend;
 			}
 			/*
 			 * In order to ensure individual vhost-scsi configfs
@@ -1442,9 +1521,8 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs,
 			ret = target_depend_item(&se_tpg->tpg_group.cg_item);
 			if (ret) {
 				pr_warn("target_depend_item() failed: %d\n", ret);
-				kfree(vs_tpg);
 				mutex_unlock(&tpg->tv_tpg_mutex);
-				goto out;
+				goto undepend;
 			}
 			tpg->tv_tpg_vhost_count++;
 			tpg->vhost_scsi = vs;
@@ -1457,6 +1535,16 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs,
 	if (match) {
 		memcpy(vs->vs_vhost_wwpn, t->vhost_wwpn,
 		       sizeof(vs->vs_vhost_wwpn));
+
+		for (i = VHOST_SCSI_VQ_IO; i < VHOST_SCSI_MAX_VQ; i++) {
+			vq = &vs->vqs[i].vq;
+			if (!vhost_vq_is_setup(vq))
+				continue;
+
+			if (vhost_scsi_setup_vq_cmds(vq, vq->num))
+				goto destroy_vq_cmds;
+		}
+
 		for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) {
 			vq = &vs->vqs[i].vq;
 			mutex_lock(&vq->mutex);
@@ -1476,7 +1564,22 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs,
 	vhost_scsi_flush(vs);
 	kfree(vs->vs_tpg);
 	vs->vs_tpg = vs_tpg;
+	goto out;
 
+destroy_vq_cmds:
+	for (i--; i >= VHOST_SCSI_VQ_IO; i--) {
+		if (!vhost_vq_get_backend(&vs->vqs[i].vq))
+			vhost_scsi_destroy_vq_cmds(&vs->vqs[i].vq);
+	}
+undepend:
+	for (i = 0; i < VHOST_SCSI_MAX_TARGET; i++) {
+		tpg = vs_tpg[i];
+		if (tpg) {
+			tpg->tv_tpg_vhost_count--;
+			target_undepend_item(&tpg->se_tpg.tpg_group.cg_item);
+		}
+	}
+	kfree(vs_tpg);
 out:
 	mutex_unlock(&vs->dev.mutex);
 	mutex_unlock(&vhost_scsi_mutex);
@@ -1549,6 +1652,12 @@ vhost_scsi_clear_endpoint(struct vhost_scsi *vs,
 			mutex_lock(&vq->mutex);
 			vhost_vq_set_backend(vq, NULL);
 			mutex_unlock(&vq->mutex);
+			/*
+			 * Make sure cmds are not running before tearing them
+			 * down.
+			 */
+			vhost_scsi_flush(vs);
+			vhost_scsi_destroy_vq_cmds(vq);
 		}
 	}
 	/*
@@ -1842,23 +1951,6 @@ static void vhost_scsi_port_unlink(struct se_portal_group *se_tpg,
 	mutex_unlock(&vhost_scsi_mutex);
 }
 
-static void vhost_scsi_free_cmd_map_res(struct se_session *se_sess)
-{
-	struct vhost_scsi_cmd *tv_cmd;
-	unsigned int i;
-
-	if (!se_sess->sess_cmd_map)
-		return;
-
-	for (i = 0; i < VHOST_SCSI_DEFAULT_TAGS; i++) {
-		tv_cmd = &((struct vhost_scsi_cmd *)se_sess->sess_cmd_map)[i];
-
-		kfree(tv_cmd->tvc_sgl);
-		kfree(tv_cmd->tvc_prot_sgl);
-		kfree(tv_cmd->tvc_upages);
-	}
-}
-
 static ssize_t vhost_scsi_tpg_attrib_fabric_prot_type_store(
 		struct config_item *item, const char *page, size_t count)
 {
@@ -1898,45 +1990,6 @@ static struct configfs_attribute *vhost_scsi_tpg_attrib_attrs[] = {
 	NULL,
 };
 
-static int vhost_scsi_nexus_cb(struct se_portal_group *se_tpg,
-			       struct se_session *se_sess, void *p)
-{
-	struct vhost_scsi_cmd *tv_cmd;
-	unsigned int i;
-
-	for (i = 0; i < VHOST_SCSI_DEFAULT_TAGS; i++) {
-		tv_cmd = &((struct vhost_scsi_cmd *)se_sess->sess_cmd_map)[i];
-
-		tv_cmd->tvc_sgl = kcalloc(VHOST_SCSI_PREALLOC_SGLS,
-					  sizeof(struct scatterlist),
-					  GFP_KERNEL);
-		if (!tv_cmd->tvc_sgl) {
-			pr_err("Unable to allocate tv_cmd->tvc_sgl\n");
-			goto out;
-		}
-
-		tv_cmd->tvc_upages = kcalloc(VHOST_SCSI_PREALLOC_UPAGES,
-					     sizeof(struct page *),
-					     GFP_KERNEL);
-		if (!tv_cmd->tvc_upages) {
-			pr_err("Unable to allocate tv_cmd->tvc_upages\n");
-			goto out;
-		}
-
-		tv_cmd->tvc_prot_sgl = kcalloc(VHOST_SCSI_PREALLOC_PROT_SGLS,
-					       sizeof(struct scatterlist),
-					       GFP_KERNEL);
-		if (!tv_cmd->tvc_prot_sgl) {
-			pr_err("Unable to allocate tv_cmd->tvc_prot_sgl\n");
-			goto out;
-		}
-	}
-	return 0;
-out:
-	vhost_scsi_free_cmd_map_res(se_sess);
-	return -ENOMEM;
-}
-
 static int vhost_scsi_make_nexus(struct vhost_scsi_tpg *tpg,
 				const char *name)
 {
@@ -1960,12 +2013,9 @@ static int vhost_scsi_make_nexus(struct vhost_scsi_tpg *tpg,
 	 * struct se_node_acl for the vhost_scsi struct se_portal_group with
 	 * the SCSI Initiator port name of the passed configfs group 'name'.
 	 */
-	tv_nexus->tvn_se_sess = target_setup_session(&tpg->se_tpg,
-					VHOST_SCSI_DEFAULT_TAGS,
-					sizeof(struct vhost_scsi_cmd),
+	tv_nexus->tvn_se_sess = target_setup_session(&tpg->se_tpg, 0, 0,
 					TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS,
-					(unsigned char *)name, tv_nexus,
-					vhost_scsi_nexus_cb);
+					(unsigned char *)name, tv_nexus, NULL);
 	if (IS_ERR(tv_nexus->tvn_se_sess)) {
 		mutex_unlock(&tpg->tv_tpg_mutex);
 		kfree(tv_nexus);
@@ -2015,7 +2065,6 @@ static int vhost_scsi_drop_nexus(struct vhost_scsi_tpg *tpg)
 		" %s Initiator Port: %s\n", vhost_scsi_dump_proto_id(tpg->tport),
 		tv_nexus->tvn_se_sess->se_node_acl->initiatorname);
 
-	vhost_scsi_free_cmd_map_res(se_sess);
 	/*
 	 * Release the SCSI I_T Nexus to the emulated vhost Target Port
 	 */
commit 6bcf34224ac1e94103797fd68b9836061762f2b2
Author: Mike Christie <michael.christie at oracle.com>
Date:   Mon Nov 9 23:33:19 2020 -0600

    vhost: add helper to check if a vq has been setup
    
    This adds a helper check if a vq has been setup. The next patches
    will use this when we move the vhost scsi cmd preallocation from per
    session to per vq. In the per vq case, we only want to allocate cmds
    for vqs that have actually been setup and not for all the possible
    vqs.
    
    Signed-off-by: Mike Christie <michael.christie at oracle.com>
    Link: https://lore.kernel.org/r/1604986403-4931-2-git-send-email-michael.christie@oracle.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Jason Wang <jasowang at redhat.com>
    Acked-by: Stefan Hajnoczi <stefanha at redhat.com>

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 5c835a292783..a262e12c6dc2 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -304,6 +304,12 @@ static void vhost_vring_call_reset(struct vhost_vring_call *call_ctx)
 	memset(&call_ctx->producer, 0x0, sizeof(struct irq_bypass_producer));
 }
 
+bool vhost_vq_is_setup(struct vhost_virtqueue *vq)
+{
+	return vq->avail && vq->desc && vq->used && vhost_vq_access_ok(vq);
+}
+EXPORT_SYMBOL_GPL(vhost_vq_is_setup);
+
 static void vhost_vq_reset(struct vhost_dev *dev,
 			   struct vhost_virtqueue *vq)
 {
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index e016cd3fa02f..b063324c7669 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -190,6 +190,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *,
 		      struct vhost_log *log, unsigned int *log_num);
 void vhost_discard_vq_desc(struct vhost_virtqueue *, int n);
 
+bool vhost_vq_is_setup(struct vhost_virtqueue *vq);
 int vhost_vq_init_access(struct vhost_virtqueue *);
 int vhost_add_used(struct vhost_virtqueue *, unsigned int head, int len);
 int vhost_add_used_n(struct vhost_virtqueue *, struct vring_used_elem *heads,
commit a312db697cb05dfa781848afe8585a1e1f2a5a99
Author: Laurent Vivier <lvivier at redhat.com>
Date:   Fri Nov 13 16:57:06 2020 +0100

    vdpasim: fix "mac_pton" undefined error
    
       ERROR: modpost: "mac_pton" [drivers/vdpa/vdpa_sim/vdpa_sim.ko] undefined!
    
    mac_pton() is defined in lib/net_utils.c and is not built if NET is not set.
    
    Select GENERIC_NET_UTILS as vdpasim doesn't depend on NET.
    
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Laurent Vivier <lvivier at redhat.com>
    Link: https://lore.kernel.org/r/20201113155706.599434-1-lvivier@redhat.com
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Acked-by: Randy Dunlap <rdunlap at infradead.org> # build-tested

diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig
index d7d32b656102..358f6048dd3c 100644
--- a/drivers/vdpa/Kconfig
+++ b/drivers/vdpa/Kconfig
@@ -13,6 +13,7 @@ config VDPA_SIM
 	depends on RUNTIME_TESTING_MENU && HAS_DMA
 	select DMA_OPS
 	select VHOST_RING
+	select GENERIC_NET_UTILS
 	default n
 	help
 	  vDPA networking device simulator which loop TX traffic back
commit a6af8718b98e1cd37a9ea9a02269c79577fc9138
Merge: 9cfd9c45994b 8f598d15ee65
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 13:07:36 2020 -0800

    Merge tag 'drm-fixes-2020-11-16' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm fixes from Dave Airlie:
     "Nouveau fixes:
    
       - atomic modesetting regression fix
    
       - ttm pre-nv50 fix
    
       - connector NULL ptr deref fix"
    
    * tag 'drm-fixes-2020-11-16' of git://anongit.freedesktop.org/drm/drm:
      drm/nouveau/kms/nv50-: Use atomic encoder callbacks everywhere
      drm/nouveau/ttm: avoid using nouveau_drm.ttm.type_vram prior to nv50
      drm/nouveau/kms: Fix NULL pointer dereference in nouveau_connector_detect_depth

commit 8f598d15ee6577a56d6617d9e4151591db34d8fa
Merge: 41f3ed2cac86 5c6fb4b28b16
Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Nov 16 06:36:23 2020 +1000

    Merge branch 'linux-5.10' of git://github.com/skeggsb/linux into drm-fixes
    
    - atomic modesetting regression fix
    - ttm pre-nv50 fix
    - connector NULL ptr deref fix
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    From: Ben Skeggs <skeggsb at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/CACAvsv5D9p78MNN0OxVeRZxN8LDqcadJEGUEFCgWJQ6+_rjPuw@mail.gmail.com

commit 9cfd9c45994b409c7103efc2f265e0af7634cf75
Merge: 281b3ec3a75b 092561f06702
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 10:15:17 2020 -0800

    Merge tag 'char-misc-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
    
    Pull char/misc driver fixes from Greg KH:
     "Here are some small char/misc/whatever driver fixes for 5.10-rc4.
    
      Nothing huge, lots of small fixes for reported issues:
    
       - habanalabs driver fixes
    
       - speakup driver fixes
    
       - uio driver fixes
    
       - virtio driver fix
    
       - other tiny driver fixes
    
      Full details are in the shortlog.
    
      All of these have been in linux-next for a full week with no reported
      issues"
    
    * tag 'char-misc-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
      uio: Fix use-after-free in uio_unregister_device()
      firmware: xilinx: fix out-of-bounds access
      nitro_enclaves: Fixup type and simplify logic of the poll mask setup
      speakup ttyio: Do not schedule() in ttyio_in_nowait
      speakup: Fix clearing selection in safe context
      speakup: Fix var_id_t values and thus keymap
      virtio: virtio_console: fix DMA memory allocation for rproc serial
      habanalabs/gaudi: mask WDT error in QMAN
      habanalabs/gaudi: move coresight mmu config
      habanalabs: fix kernel pointer type
      mei: protect mei_cl_mtu from null dereference

commit 281b3ec3a75bfa14b2bf53501c4596415b3309e2
Merge: 0062442ecfef 6d853c9e4104
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 10:02:41 2020 -0800

    Merge tag 'usb-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
    
    Pull USB and Thunderbolt fixes from Greg KH:
     "Here are some small Thunderbolt and USB driver fixes for 5.10-rc4 to
      solve some reported issues.
    
      Nothing huge in here, just small things:
    
       - thunderbolt memory leaks fixed and new device ids added
    
       - revert of problem patch for the musb driver
    
       - new quirks added for USB devices
    
       - typec power supply fixes to resolve much reported problems about
         charging notifications not working anymore
    
      All except the cdc-acm driver quirk addition have been in linux-next
      with no reported issues (the quirk patch was applied on Friday, and is
      self-contained)"
    
    * tag 'usb-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
      usb: cdc-acm: Add DISABLE_ECHO for Renesas USB Download mode
      MAINTAINERS: add usb raw gadget entry
      usb: typec: ucsi: Report power supply changes
      xhci: hisilicon: fix refercence leak in xhci_histb_probe
      Revert "usb: musb: convert to devm_platform_ioremap_resource_byname"
      thunderbolt: Add support for Intel Tiger Lake-H
      thunderbolt: Only configure USB4 wake for lane 0 adapters
      thunderbolt: Add uaccess dependency to debugfs interface
      thunderbolt: Fix memory leak if ida_simple_get() fails in enumerate_services()
      thunderbolt: Add the missed ida_simple_remove() in ring_request_msix()

commit 0062442ecfef0d82cd69e3e600d5006357f8d8e4
Merge: 326fd6db6112 c887c9b9ca62
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 09:57:58 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
    
    Pull kvm fixes from Paolo Bonzini:
     "Fixes for ARM and x86, the latter especially for old processors
      without two-dimensional paging (EPT/NPT)"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
      kvm: mmu: fix is_tdp_mmu_check when the TDP MMU is not in use
      KVM: SVM: Update cr3_lm_rsvd_bits for AMD SEV guests
      KVM: x86: Introduce cr3_lm_rsvd_bits in kvm_vcpu_arch
      KVM: x86: clflushopt should be treated as a no-op by emulation
      KVM: arm64: Handle SCXTNUM_ELx traps
      KVM: arm64: Unify trap handlers injecting an UNDEF
      KVM: arm64: Allow setting of ID_AA64PFR0_EL1.CSV2 from userspace

commit 326fd6db6112534738b5229da538bf426d78c851
Merge: 64b609d6a60c ff828729be44
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 09:49:56 2020 -0800

    Merge tag 'x86-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull x86 fixes from Thomas Gleixner:
     "A small set of fixes for x86:
    
       - Cure the fallout from the MSI irqdomain overhaul which missed that
         the Intel IOMMU does not register virtual function devices and
         therefore never reaches the point where the MSI interrupt domain is
         assigned. This made the VF devices use the non-remapped MSI domain
         which is trapped by the IOMMU/remap unit
    
       - Remove an extra space in the SGI_UV architecture type procfs output
         for UV5
    
       - Remove a unused function which was missed when removing the UV BAU
         TLB shootdown handler"
    
    * tag 'x86-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      iommu/vt-d: Cure VF irqdomain hickup
      x86/platform/uv: Fix copied UV5 output archtype
      x86/platform/uv: Drop last traces of uv_flush_tlb_others

commit 64b609d6a60c8a54ff9c43819803e6a7861e7ed1
Merge: d0a37fd57fba 1a8cfa24e21c
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 09:46:36 2020 -0800

    Merge tag 'perf-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull perf fixes from Thomas Gleixner:
     "A set of fixes for perf:
    
        - A set of commits which reduce the stack usage of various perf
          event handling functions which allocated large data structs on
          stack causing stack overflows in the worst case
    
        - Use the proper mechanism for detecting soft interrupts in the
          recursion protection
    
        - Make the resursion protection simpler and more robust
    
        - Simplify the scheduling of event groups to make the code more
          robust and prepare for fixing the issues vs. scheduling of
          exclusive event groups
    
        - Prevent event multiplexing and rotation for exclusive event groups
    
        - Correct the perf event attribute exclusive semantics to take
          pinned events, e.g. the PMU watchdog, into account
    
        - Make the anythread filtering conditional for Intel's generic PMU
          counters as it is not longer guaranteed to be supported on newer
          CPUs. Check the corresponding CPUID leaf to make sure
    
        - Fixup a duplicate initialization in an array which was probably
          caused by the usual 'copy & paste - forgot to edit' mishap"
    
    * tag 'perf-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      perf/x86/intel/uncore: Fix Add BW copypasta
      perf/x86/intel: Make anythread filter support conditional
      perf: Tweak perf_event_attr::exclusive semantics
      perf: Fix event multiplexing for exclusive groups
      perf: Simplify group_sched_in()
      perf: Simplify group_sched_out()
      perf/x86: Make dummy_iregs static
      perf/arch: Remove perf_sample_data::regs_user_copy
      perf: Optimize get_recursion_context()
      perf: Fix get_recursion_context()
      perf/x86: Reduce stack usage for x86_pmu::drain_pebs()
      perf: Reduce stack usage of perf_output_begin()

commit d0a37fd57fbae32adffb56ae9852d551376b7c9b
Merge: 259c2fbef8f0 8d4d9c7b4333
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 09:39:35 2020 -0800

    Merge tag 'sched-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull scheduler fixes from Thomas Gleixner:
     "A set of scheduler fixes:
    
       - Address a load balancer regression by making the load balancer use
         the same logic as the wakeup path to spread tasks in the LLC domain
    
       - Prefer the CPU on which a task run last over the local CPU in the
         fast wakeup path for asymmetric CPU capacity systems to align with
         the symmetric case. This ensures more locality and prevents massive
         migration overhead on those asymetric systems
    
       - Fix a memory corruption bug in the scheduler debug code caused by
         handing a modified buffer pointer to kfree()"
    
    * tag 'sched-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      sched/debug: Fix memory corruption caused by multiple small reads of flags
      sched/fair: Prefer prev cpu in asymmetric wakeup path
      sched/fair: Ensure tasks spreading in LLC during LB

commit a584e9bc1b7e88f24f8504886eafbe6c73d8a97c
Author: Faiz Abbas <faiz_abbas at ti.com>
Date:   Tue Aug 25 11:24:42 2020 +0530

    can: m_can: m_can_stop(): set device to software init mode before closing
    
    There might be some requests pending in the buffer when the interface close
    sequence occurs. In some devices, these pending requests might lead to the
    module not shutting down properly when m_can_clk_stop() is called.
    
    Therefore, move the device to init state before potentially powering it down.
    
    Fixes: e0d1f4816f2a ("can: m_can: add Bosch M_CAN controller support")
    Signed-off-by: Faiz Abbas <faiz_abbas at ti.com>
    Acked-by: Dan Murphy <dmurphy at ti.com>
    Link: https://lore.kernel.org/r/20200825055442.16994-1-faiz_abbas@ti.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 645101d19989..e7264043f79a 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1414,6 +1414,9 @@ static void m_can_stop(struct net_device *dev)
 	/* disable all interrupts */
 	m_can_disable_all_interrupts(cdev);
 
+	/* Set init mode to disengage from the network */
+	m_can_config_endisable(cdev, true);
+
 	/* set the state as STOPPED */
 	cdev->can.state = CAN_STATE_STOPPED;
 }
commit 85816aba460ceebed0047381395615891df68c8f
Author: Dan Murphy <dmurphy at ti.com>
Date:   Thu Feb 27 12:38:29 2020 -0600

    can: m_can: Fix freeing of can device from peripherials
    
    Fix leaking netdev device from peripherial devices. The call to allocate the
    netdev device is made from and managed by the peripherial.
    
    Fixes: f524f829b75a ("can: m_can: Create a m_can platform framework")
    Reported-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Signed-off-by: Dan Murphy <dmurphy at ti.com>
    Link: http://lore.kernel.org/r/20200227183829.21854-2-dmurphy@ti.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index f2c87b76e569..645101d19989 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1856,7 +1856,6 @@ pm_runtime_fail:
 	if (ret) {
 		if (m_can_dev->pm_clock_support)
 			pm_runtime_disable(m_can_dev->dev);
-		free_candev(m_can_dev->net);
 	}
 
 	return ret;
@@ -1914,8 +1913,6 @@ void m_can_class_unregister(struct m_can_classdev *m_can_dev)
 	unregister_candev(m_can_dev->net);
 
 	m_can_clk_stop(m_can_dev);
-
-	free_candev(m_can_dev->net);
 }
 EXPORT_SYMBOL_GPL(m_can_class_unregister);
 
diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
index e6d0cb9ee02f..161cb9be018c 100644
--- a/drivers/net/can/m_can/m_can_platform.c
+++ b/drivers/net/can/m_can/m_can_platform.c
@@ -67,32 +67,36 @@ static int m_can_plat_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
-	if (!priv)
-		return -ENOMEM;
+	if (!priv) {
+		ret = -ENOMEM;
+		goto probe_fail;
+	}
 
 	mcan_class->device_data = priv;
 
-	m_can_class_get_clocks(mcan_class);
+	ret = m_can_class_get_clocks(mcan_class);
+	if (ret)
+		goto probe_fail;
 
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "m_can");
 	addr = devm_ioremap_resource(&pdev->dev, res);
 	irq = platform_get_irq_byname(pdev, "int0");
 	if (IS_ERR(addr) || irq < 0) {
 		ret = -EINVAL;
-		goto failed_ret;
+		goto probe_fail;
 	}
 
 	/* message ram could be shared */
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
 	if (!res) {
 		ret = -ENODEV;
-		goto failed_ret;
+		goto probe_fail;
 	}
 
 	mram_addr = devm_ioremap(&pdev->dev, res->start, resource_size(res));
 	if (!mram_addr) {
 		ret = -ENOMEM;
-		goto failed_ret;
+		goto probe_fail;
 	}
 
 	priv->base = addr;
@@ -111,9 +115,10 @@ static int m_can_plat_probe(struct platform_device *pdev)
 
 	m_can_init_ram(mcan_class);
 
-	ret = m_can_class_register(mcan_class);
+	return m_can_class_register(mcan_class);
 
-failed_ret:
+probe_fail:
+	m_can_class_free_dev(mcan_class->net);
 	return ret;
 }
 
@@ -134,6 +139,8 @@ static int m_can_plat_remove(struct platform_device *pdev)
 
 	m_can_class_unregister(mcan_class);
 
+	m_can_class_free_dev(mcan_class->net);
+
 	platform_set_drvdata(pdev, NULL);
 
 	return 0;
diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index 4fdb7121403a..e5d7d85e0b6d 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -440,14 +440,18 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 		return -ENOMEM;
 
 	priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL);
-	if (!priv)
-		return -ENOMEM;
+	if (!priv) {
+		ret = -ENOMEM;
+		goto out_m_can_class_free_dev;
+	}
 
 	priv->power = devm_regulator_get_optional(&spi->dev, "vsup");
-	if (PTR_ERR(priv->power) == -EPROBE_DEFER)
-		return -EPROBE_DEFER;
-	else
+	if (PTR_ERR(priv->power) == -EPROBE_DEFER) {
+		ret = -EPROBE_DEFER;
+		goto out_m_can_class_free_dev;
+	} else {
 		priv->power = NULL;
+	}
 
 	mcan_class->device_data = priv;
 
@@ -460,8 +464,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 	}
 
 	/* Sanity check */
-	if (freq < 20000000 || freq > TCAN4X5X_EXT_CLK_DEF)
-		return -ERANGE;
+	if (freq < 20000000 || freq > TCAN4X5X_EXT_CLK_DEF) {
+		ret = -ERANGE;
+		goto out_m_can_class_free_dev;
+	}
 
 	priv->reg_offset = TCAN4X5X_MCAN_OFFSET;
 	priv->mram_start = TCAN4X5X_MRAM_START;
@@ -518,8 +524,10 @@ out_clk:
 		clk_disable_unprepare(mcan_class->cclk);
 		clk_disable_unprepare(mcan_class->hclk);
 	}
-
+ out_m_can_class_free_dev:
+	m_can_class_free_dev(mcan_class->net);
 	dev_err(&spi->dev, "Probe failed, err=%d\n", ret);
+
 	return ret;
 }
 
@@ -531,6 +539,8 @@ static int tcan4x5x_can_remove(struct spi_device *spi)
 
 	tcan4x5x_power_enable(priv->power, 0);
 
+	m_can_class_free_dev(priv->mcan_dev->net);
+
 	return 0;
 }
 
commit a8c22f5b0c689a29f45ef4a110d09fd391debcbc
Author: Dan Murphy <dmurphy at ti.com>
Date:   Thu Feb 27 12:38:29 2020 -0600

    can: m_can: m_can_class_free_dev(): introduce new function
    
    This patch creates a common function that peripherials can call to free the
    netdev device when failures occur.
    
    Fixes: f524f829b75a ("can: m_can: Create a m_can platform framework")
    Reported-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Signed-off-by: Dan Murphy <dmurphy at ti.com>
    Link: http://lore.kernel.org/r/20200227183829.21854-2-dmurphy@ti.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 63887e23d89c..f2c87b76e569 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1812,6 +1812,12 @@ out:
 }
 EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
 
+void m_can_class_free_dev(struct net_device *net)
+{
+	free_candev(net);
+}
+EXPORT_SYMBOL_GPL(m_can_class_free_dev);
+
 int m_can_class_register(struct m_can_classdev *m_can_dev)
 {
 	int ret;
diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
index 49f42b50627a..b2699a7c9997 100644
--- a/drivers/net/can/m_can/m_can.h
+++ b/drivers/net/can/m_can/m_can.h
@@ -99,6 +99,7 @@ struct m_can_classdev {
 };
 
 struct m_can_classdev *m_can_class_allocate_dev(struct device *dev);
+void m_can_class_free_dev(struct net_device *net);
 int m_can_class_register(struct m_can_classdev *cdev);
 void m_can_class_unregister(struct m_can_classdev *cdev);
 int m_can_class_get_clocks(struct m_can_classdev *cdev);
commit 259c2fbef8f09cec8ac3d67820ca6778242beeaa
Merge: a50cf15906d4 d61fc96a3760
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 09:25:43 2020 -0800

    Merge tag 'locking-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull locking fixes from Thomas Gleixner:
     "Two fixes for the locking subsystem:
    
       - Prevent an unconditional interrupt enable in a futex helper
         function which can be called from contexts which expect interrupts
         to stay disabled across the call
    
       - Don't modify lockdep chain keys in the validation process as that
         causes chain inconsistency"
    
    * tag 'locking-urgent-2020-11-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      lockdep: Avoid to modify chain keys in validate_chain()
      futex: Don't enable IRQs unconditionally in put_pi_state()

commit cd0d83eab2e0c26fe87a10debfedbb23901853c1
Author: Wu Bo <wubo.oduw at gmail.com>
Date:   Wed Jan 29 10:23:30 2020 +0800

    can: m_can: m_can_handle_state_change(): fix state change
    
    m_can_handle_state_change() is called with the new_state as an argument.
    
    In the switch statements for CAN_STATE_ERROR_ACTIVE, the comment and the
    following code indicate that a CAN_STATE_ERROR_WARNING is handled.
    
    This patch fixes this problem by changing the case to CAN_STATE_ERROR_WARNING.
    
    Signed-off-by: Wu Bo <wubo.oduw at gmail.com>
    Link: http://lore.kernel.org/r/20200129022330.21248-2-wubo.oduw@gmail.com
    Cc: Dan Murphy <dmurphy at ti.com>
    Fixes: e0d1f4816f2a ("can: m_can: add Bosch M_CAN controller support")
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 02c5795b7393..63887e23d89c 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -665,7 +665,7 @@ static int m_can_handle_state_change(struct net_device *dev,
 	unsigned int ecr;
 
 	switch (new_state) {
-	case CAN_STATE_ERROR_ACTIVE:
+	case CAN_STATE_ERROR_WARNING:
 		/* error warning state */
 		cdev->can.can_stats.error_warning++;
 		cdev->can.state = CAN_STATE_ERROR_WARNING;
@@ -694,7 +694,7 @@ static int m_can_handle_state_change(struct net_device *dev,
 	__m_can_get_berr_counter(dev, &bec);
 
 	switch (new_state) {
-	case CAN_STATE_ERROR_ACTIVE:
+	case CAN_STATE_ERROR_WARNING:
 		/* error warning state */
 		cf->can_id |= CAN_ERR_CRTL;
 		cf->data[1] = (bec.txerr > bec.rxerr) ?
commit c81d0b6ca665477c761f227807010762630b089f
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Mon Aug 10 22:23:49 2020 +0200

    can: tcan4x5x: tcan4x5x_can_remove(): fix order of deregistration
    
    Change the order in tcan4x5x_can_remove() to be the exact inverse of
    tcan4x5x_can_probe(). First m_can_class_unregister(), then power down the
    device.
    
    Fixes: 5443c226ba91 ("can: tcan4x5x: Add tcan4x5x driver to the kernel")
    Cc: Dan Murphy <dmurphy at ti.com>
    Link: http://lore.kernel.org/r/20201019154233.1262589-10-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index f058bd9104e9..4fdb7121403a 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -527,10 +527,10 @@ static int tcan4x5x_can_remove(struct spi_device *spi)
 {
 	struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
 
-	tcan4x5x_power_enable(priv->power, 0);
-
 	m_can_class_unregister(priv->mcan_dev);
 
+	tcan4x5x_power_enable(priv->power, 0);
+
 	return 0;
 }
 
commit 1ff203badbbf1738027c8395d5b40b0d462b6e4d
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Fri Jan 3 11:30:34 2020 +0100

    can: tcan4x5x: tcan4x5x_can_probe(): add missing error checking for devm_regmap_init()
    
    This patch adds the missing error checking when initializing the regmap
    interface fails.
    
    Fixes: 5443c226ba91 ("can: tcan4x5x: Add tcan4x5x driver to the kernel")
    Cc: Dan Murphy <dmurphy at ti.com>
    Link: http://lore.kernel.org/r/20201019154233.1262589-7-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index eacd428e07e9..f058bd9104e9 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -487,6 +487,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 
 	priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus,
 					&spi->dev, &tcan4x5x_regmap);
+	if (IS_ERR(priv->regmap)) {
+		ret = PTR_ERR(priv->regmap);
+		goto out_clk;
+	}
 
 	ret = tcan4x5x_power_enable(priv->power, 1);
 	if (ret)
commit 3fcce133f0d9a50d3a23f8e2bc950197b4e03900
Author: Enric Balletbo i Serra <enric.balletbo at collabora.com>
Date:   Mon Apr 13 16:10:13 2020 +0200

    can: tcan4x5x: replace depends on REGMAP_SPI with depends on SPI
    
    regmap is a library function that gets selected by drivers that need it. No
    driver modules should depend on it. Instead depends on SPI and select
    REGMAP_SPI. Depending on REGMAP_SPI makes this driver only build if another
    driver already selected REGMAP_SPI, as the symbol can't be selected through the
    menu kernel configuration.
    
    Signed-off-by: Enric Balletbo i Serra <enric.balletbo at collabora.com>
    Link: http://lore.kernel.org/r/20200413141013.506613-1-enric.balletbo@collabora.com
    Reviewed-by: Dan Murphy <dmurphy at ti.com>
    Fixes: 5443c226ba91 ("can: tcan4x5x: Add tcan4x5x driver to the kernel")
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/m_can/Kconfig b/drivers/net/can/m_can/Kconfig
index 48be627c85c2..5f9f8192dd0b 100644
--- a/drivers/net/can/m_can/Kconfig
+++ b/drivers/net/can/m_can/Kconfig
@@ -16,7 +16,8 @@ config CAN_M_CAN_PLATFORM
 
 config CAN_M_CAN_TCAN4X5X
 	depends on CAN_M_CAN
-	depends on REGMAP_SPI
+	depends on SPI
+	select REGMAP_SPI
 	tristate "TCAN4X5X M_CAN device"
 	help
 	  Say Y here if you want support for Texas Instruments TCAN4x5x
commit b7ee5bc3e1006433601a058a6a7c24c5272635f4
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Sun Nov 8 16:30:00 2020 +0800

    can: flexcan: fix failure handling of pm_runtime_get_sync()
    
    pm_runtime_get_sync() will increment pm usage at first and it will resume the
    device later. If runtime of the device has error or device is in inaccessible
    state(or other error state), resume operation will fail. If we do not call put
    operation to decrease the reference, it will result in reference leak in the
    two functions flexcan_get_berr_counter() and flexcan_open().
    
    Moreover, this device cannot enter the idle state and always stay busy or other
    non-idle state later. So we should fix it through adding
    pm_runtime_put_noidle().
    
    Fixes: ca10989632d88 ("can: flexcan: implement can Runtime PM")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201108083000.2599705-1-zhangqilong3@huawei.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 4e8fdb6064bd..d6a9cf0e9b60 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -728,8 +728,10 @@ static int flexcan_get_berr_counter(const struct net_device *dev,
 	int err;
 
 	err = pm_runtime_get_sync(priv->dev);
-	if (err < 0)
+	if (err < 0) {
+		pm_runtime_put_noidle(priv->dev);
 		return err;
+	}
 
 	err = __flexcan_get_berr_counter(dev, bec);
 
@@ -1654,8 +1656,10 @@ static int flexcan_open(struct net_device *dev)
 	}
 
 	err = pm_runtime_get_sync(priv->dev);
-	if (err < 0)
+	if (err < 0) {
+		pm_runtime_put_noidle(priv->dev);
 		return err;
+	}
 
 	err = open_candev(dev);
 	if (err)
commit 499aa923c56769274f81e60414b8de4912864b8d
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Oct 14 13:41:36 2020 +0200

    can: flexcan: flexcan_setup_stop_mode(): add missing "req_bit" to stop mode property comment
    
    In the patch
    
        d9b081e3fc4b ("can: flexcan: remove ack_grp and ack_bit handling from driver")
    
    the unused ack_grp and ack_bit were removed from the driver. However in the
    comment, the "req_bit" was accidentally removed, too.
    
    This patch adds back the "req_bit" bit.
    
    Fixes: d9b081e3fc4b ("can: flexcan: remove ack_grp and ack_bit handling from driver")
    Reported-by: Joakim Zhang <qiangqing.zhang at nxp.com>
    Link: http://lore.kernel.org/r/20201014114810.2911135-1-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 881799bd9c5e..4e8fdb6064bd 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -1852,7 +1852,7 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
 		return -EINVAL;
 
 	/* stop mode property format is:
-	 * <&gpr req_gpr>.
+	 * <&gpr req_gpr req_bit>.
 	 */
 	ret = of_property_read_u32_array(np, "fsl,stop-mode", out_val,
 					 ARRAY_SIZE(out_val));
commit 8a68cc0d690c9e5730d676b764c6f059343b842c
Author: Colin Ian King <colin.king at canonical.com>
Date:   Thu Nov 5 11:24:27 2020 +0000

    can: peak_usb: fix potential integer overflow on shift of a int
    
    The left shift of int 32 bit integer constant 1 is evaluated using 32 bit
    arithmetic and then assigned to a signed 64 bit variable. In the case where
    time_ref->adapter->ts_used_bits is 32 or more this can lead to an oveflow.
    Avoid this by shifting using the BIT_ULL macro instead.
    
    Fixes: bb4785551f64 ("can: usb: PEAK-System Technik USB adapters driver core")
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Link: https://lore.kernel.org/r/20201105112427.40688-1-colin.king@canonical.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
index c2764799f9ef..204ccb27d6d9 100644
--- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c
+++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
@@ -156,7 +156,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
 		if (time_ref->ts_dev_1 < time_ref->ts_dev_2) {
 			/* case when event time (tsw) wraps */
 			if (ts < time_ref->ts_dev_1)
-				delta_ts = 1 << time_ref->adapter->ts_used_bits;
+				delta_ts = BIT_ULL(time_ref->adapter->ts_used_bits);
 
 		/* Otherwise, sync time counter (ts_dev_2) has wrapped:
 		 * handle case when event time (tsn) hasn't.
@@ -168,7 +168,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
 		 *              tsn            ts
 		 */
 		} else if (time_ref->ts_dev_1 < ts) {
-			delta_ts = -(1 << time_ref->adapter->ts_used_bits);
+			delta_ts = -BIT_ULL(time_ref->adapter->ts_used_bits);
 		}
 
 		/* add delay between last sync and event timestamps */
commit 81c9c8e0adef3285336b942f93287c554c89e6c6
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Aug 28 21:16:55 2019 +0200

    can: mcba_usb: mcba_usb_start_xmit(): first fill skb, then pass to can_put_echo_skb()
    
    The driver has to first fill the skb with data and then handle it to
    can_put_echo_skb(). This patch moves the can_put_echo_skb() down, right before
    sending the skb out via USB.
    
    Fixes: 51f3baad7de9 ("can: mcba_usb: Add support for Microchip CAN BUS Analyzer")
    Cc: Remigiusz Kołłątaj <remigiusz.kollataj at mobica.com>
    Link: https://lore.kernel.org/r/20201111221204.1639007-1-mkl@pengutronix.de
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/usb/mcba_usb.c b/drivers/net/can/usb/mcba_usb.c
index 5857b37dcd96..e97f2e0da6b0 100644
--- a/drivers/net/can/usb/mcba_usb.c
+++ b/drivers/net/can/usb/mcba_usb.c
@@ -326,8 +326,6 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
 	if (!ctx)
 		return NETDEV_TX_BUSY;
 
-	can_put_echo_skb(skb, priv->netdev, ctx->ndx);
-
 	if (cf->can_id & CAN_EFF_FLAG) {
 		/* SIDH    | SIDL                 | EIDH   | EIDL
 		 * 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0
@@ -357,6 +355,8 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
 	if (cf->can_id & CAN_RTR_FLAG)
 		usb_msg.dlc |= MCBA_DLC_RTR_MASK;
 
+	can_put_echo_skb(skb, priv->netdev, ctx->ndx);
+
 	err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx);
 	if (err)
 		goto xmit_failed;
commit 7968c7c79d3be8987feb8021f0c46e6866831408
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Sat Nov 14 19:17:08 2020 +0800

    can: ti_hecc: Fix memleak in ti_hecc_probe
    
    In the error handling, we should goto the probe_exit_candev
    to free ndev to prevent memory leak.
    
    Fixes: dabf54dd1c63 ("can: ti_hecc: Convert TI HECC driver to DT only driver")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201114111708.3465543-1-zhangqilong3@huawei.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c
index 9913f5458279..2c22f40e12bd 100644
--- a/drivers/net/can/ti_hecc.c
+++ b/drivers/net/can/ti_hecc.c
@@ -881,7 +881,8 @@ static int ti_hecc_probe(struct platform_device *pdev)
 	priv->base = devm_platform_ioremap_resource_byname(pdev, "hecc");
 	if (IS_ERR(priv->base)) {
 		dev_err(&pdev->dev, "hecc ioremap failed\n");
-		return PTR_ERR(priv->base);
+		err = PTR_ERR(priv->base);
+		goto probe_exit_candev;
 	}
 
 	/* handle hecc-ram memory */
@@ -889,20 +890,22 @@ static int ti_hecc_probe(struct platform_device *pdev)
 							       "hecc-ram");
 	if (IS_ERR(priv->hecc_ram)) {
 		dev_err(&pdev->dev, "hecc-ram ioremap failed\n");
-		return PTR_ERR(priv->hecc_ram);
+		err = PTR_ERR(priv->hecc_ram);
+		goto probe_exit_candev;
 	}
 
 	/* handle mbx memory */
 	priv->mbx = devm_platform_ioremap_resource_byname(pdev, "mbx");
 	if (IS_ERR(priv->mbx)) {
 		dev_err(&pdev->dev, "mbx ioremap failed\n");
-		return PTR_ERR(priv->mbx);
+		err = PTR_ERR(priv->mbx);
+		goto probe_exit_candev;
 	}
 
 	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 	if (!irq) {
 		dev_err(&pdev->dev, "No irq resource\n");
-		goto probe_exit;
+		goto probe_exit_candev;
 	}
 
 	priv->ndev = ndev;
@@ -966,7 +969,7 @@ probe_exit_release_clk:
 	clk_put(priv->clk);
 probe_exit_candev:
 	free_candev(ndev);
-probe_exit:
+
 	return err;
 }
 
commit a1e654070a60d5d4f7cce59c38f4ca790bb79121
Author: Alejandro Concepcion Rodriguez <alejandro at acoro.eu>
Date:   Thu Nov 5 21:51:47 2020 +0000

    can: dev: can_restart(): post buffer from the right context
    
    netif_rx() is meant to be called from interrupt contexts. can_restart() may be
    called by can_restart_work(), which is called from a worqueue, so it may run in
    process context. Use netif_rx_ni() instead.
    
    Fixes: 39549eef3587 ("can: CAN Network device driver and Netlink interface")
    Co-developed-by: Loris Fauster <loris.fauster at ttcontrol.com>
    Signed-off-by: Loris Fauster <loris.fauster at ttcontrol.com>
    Signed-off-by: Alejandro Concepcion Rodriguez <alejandro at acoro.eu>
    Link: https://lore.kernel.org/r/4e84162b-fb31-3a73-fa9a-9438b4bd5234@acoro.eu
    [mkl: use netif_rx_ni() instead of netif_rx_any_context()]
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
index 6dee4f8f2024..81e39d7507d8 100644
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -592,7 +592,7 @@ static void can_restart(struct net_device *dev)
 
 	cf->can_id |= CAN_ERR_RESTARTED;
 
-	netif_rx(skb);
+	netif_rx_ni(skb);
 
 	stats->rx_packets++;
 	stats->rx_bytes += cf->can_dlc;
commit 9aa9379d8f868e91719333a7f063ccccc0579acc
Author: Anant Thazhemadam <anant.thazhemadam at gmail.com>
Date:   Wed Nov 4 03:09:06 2020 +0530

    can: af_can: prevent potential access of uninitialized member in canfd_rcv()
    
    In canfd_rcv(), cfd->len is uninitialized when skb->len = 0, and this
    uninitialized cfd->len is accessed nonetheless by pr_warn_once().
    
    Fix this uninitialized variable access by checking cfd->len's validity
    condition (cfd->len > CANFD_MAX_DLEN) separately after the skb->len's
    condition is checked, and appropriately modify the log messages that
    are generated as well.
    In case either of the required conditions fail, the skb is freed and
    NET_RX_DROP is returned, same as before.
    
    Fixes: d4689846881d ("can: af_can: canfd_rcv(): replace WARN_ONCE by pr_warn_once")
    Reported-by: syzbot+9bcb0c9409066696d3aa at syzkaller.appspotmail.com
    Tested-by: Anant Thazhemadam <anant.thazhemadam at gmail.com>
    Signed-off-by: Anant Thazhemadam <anant.thazhemadam at gmail.com>
    Link: https://lore.kernel.org/r/20201103213906.24219-3-anant.thazhemadam@gmail.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/net/can/af_can.c b/net/can/af_can.c
index e8d4e3ef5322..5d124c155904 100644
--- a/net/can/af_can.c
+++ b/net/can/af_can.c
@@ -703,16 +703,25 @@ static int canfd_rcv(struct sk_buff *skb, struct net_device *dev,
 {
 	struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
 
-	if (unlikely(dev->type != ARPHRD_CAN || skb->len != CANFD_MTU ||
-		     cfd->len > CANFD_MAX_DLEN)) {
-		pr_warn_once("PF_CAN: dropped non conform CAN FD skbuf: dev type %d, len %d, datalen %d\n",
+	if (unlikely(dev->type != ARPHRD_CAN || skb->len != CANFD_MTU)) {
+		pr_warn_once("PF_CAN: dropped non conform CAN FD skbuff: dev type %d, len %d\n",
+			     dev->type, skb->len);
+		goto free_skb;
+	}
+
+	/* This check is made separately since cfd->len would be uninitialized if skb->len = 0. */
+	if (unlikely(cfd->len > CANFD_MAX_DLEN)) {
+		pr_warn_once("PF_CAN: dropped non conform CAN FD skbuff: dev type %d, len %d, datalen %d\n",
 			     dev->type, skb->len, cfd->len);
-		kfree_skb(skb);
-		return NET_RX_DROP;
+		goto free_skb;
 	}
 
 	can_receive(skb, dev);
 	return NET_RX_SUCCESS;
+
+free_skb:
+	kfree_skb(skb);
+	return NET_RX_DROP;
 }
 
 /* af_can protocol functions */
commit c8c958a58fc67f353289986850a0edf553435702
Author: Anant Thazhemadam <anant.thazhemadam at gmail.com>
Date:   Wed Nov 4 03:09:05 2020 +0530

    can: af_can: prevent potential access of uninitialized member in can_rcv()
    
    In can_rcv(), cfd->len is uninitialized when skb->len = 0, and this
    uninitialized cfd->len is accessed nonetheless by pr_warn_once().
    
    Fix this uninitialized variable access by checking cfd->len's validity
    condition (cfd->len > CAN_MAX_DLEN) separately after the skb->len's
    condition is checked, and appropriately modify the log messages that
    are generated as well.
    In case either of the required conditions fail, the skb is freed and
    NET_RX_DROP is returned, same as before.
    
    Fixes: 8cb68751c115 ("can: af_can: can_rcv(): replace WARN_ONCE by pr_warn_once")
    Reported-by: syzbot+9bcb0c9409066696d3aa at syzkaller.appspotmail.com
    Tested-by: Anant Thazhemadam <anant.thazhemadam at gmail.com>
    Signed-off-by: Anant Thazhemadam <anant.thazhemadam at gmail.com>
    Link: https://lore.kernel.org/r/20201103213906.24219-2-anant.thazhemadam@gmail.com
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>

diff --git a/net/can/af_can.c b/net/can/af_can.c
index 6373ab9c5507..e8d4e3ef5322 100644
--- a/net/can/af_can.c
+++ b/net/can/af_can.c
@@ -677,16 +677,25 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
 {
 	struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
 
-	if (unlikely(dev->type != ARPHRD_CAN || skb->len != CAN_MTU ||
-		     cfd->len > CAN_MAX_DLEN)) {
-		pr_warn_once("PF_CAN: dropped non conform CAN skbuf: dev type %d, len %d, datalen %d\n",
+	if (unlikely(dev->type != ARPHRD_CAN || skb->len != CAN_MTU)) {
+		pr_warn_once("PF_CAN: dropped non conform CAN skbuff: dev type %d, len %d\n",
+			     dev->type, skb->len);
+		goto free_skb;
+	}
+
+	/* This check is made separately since cfd->len would be uninitialized if skb->len = 0. */
+	if (unlikely(cfd->len > CAN_MAX_DLEN)) {
+		pr_warn_once("PF_CAN: dropped non conform CAN skbuff: dev type %d, len %d, datalen %d\n",
 			     dev->type, skb->len, cfd->len);
-		kfree_skb(skb);
-		return NET_RX_DROP;
+		goto free_skb;
 	}
 
 	can_receive(skb, dev);
 	return NET_RX_SUCCESS;
+
+free_skb:
+	kfree_skb(skb);
+	return NET_RX_DROP;
 }
 
 static int canfd_rcv(struct sk_buff *skb, struct net_device *dev,
commit a50cf15906d4d0ad1d6bb32e9eeeb282899a8180
Merge: e28c0d7c92c8 61cf93d3e14a
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sun Nov 15 08:57:19 2020 -0800

    Merge branch 'for-5.10-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu
    
    Pull percpu fix and cleanup from Dennis Zhou:
     "A fix for a Wshadow warning in the asm-generic percpu macros came in
      and then I tacked on the removal of flexible array initializers in the
      percpu allocator"
    
    * 'for-5.10-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu:
      percpu: convert flexible array initializers to use struct_size()
      asm-generic: percpu: avoid Wshadow warning

commit c887c9b9ca62c051d339b1c7b796edf2724029ed
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Sun Nov 15 08:55:43 2020 -0500

    kvm: mmu: fix is_tdp_mmu_check when the TDP MMU is not in use
    
    In some cases where shadow paging is in use, the root page will
    be either mmu->pae_root or vcpu->arch.mmu->lm_root.  Then it will
    not have an associated struct kvm_mmu_page, because it is allocated
    with alloc_page instead of kvm_mmu_alloc_page.
    
    Just return false quickly from is_tdp_mmu_root if the TDP MMU is
    not in use, which also includes the case where shadow paging is
    enabled.
    
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
index 27e381c9da6c..ff28a5c6abd6 100644
--- a/arch/x86/kvm/mmu/tdp_mmu.c
+++ b/arch/x86/kvm/mmu/tdp_mmu.c
@@ -49,7 +49,14 @@ bool is_tdp_mmu_root(struct kvm *kvm, hpa_t hpa)
 {
 	struct kvm_mmu_page *sp;
 
+	if (!kvm->arch.tdp_mmu_enabled)
+		return false;
+	if (WARN_ON(!VALID_PAGE(hpa)))
+		return false;
+
 	sp = to_shadow_page(hpa);
+	if (WARN_ON(!sp))
+		return false;
 
 	return sp->tdp_mmu_page && sp->root_count;
 }
commit 14a2e551faea53d45bc11629a9dac88f88950ca7
Author: Taehee Yoo <ap420073 at gmail.com>
Date:   Sun Nov 15 10:30:04 2020 +0000

    batman-adv: set .owner to THIS_MODULE
    
    If THIS_MODULE is not set, the module would be removed while debugfs is
    being used.
    It eventually makes kernel panic.
    
    Fixes: c6c8fea29769 ("net: Add batman-adv meshing protocol")
    Signed-off-by: Taehee Yoo <ap420073 at gmail.com>
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
    Signed-off-by: Simon Wunderlich <sw at simonwunderlich.de>

diff --git a/net/batman-adv/log.c b/net/batman-adv/log.c
index a67b2b091447..c0ca5fbe5b08 100644
--- a/net/batman-adv/log.c
+++ b/net/batman-adv/log.c
@@ -180,6 +180,7 @@ static const struct file_operations batadv_log_fops = {
 	.read           = batadv_log_read,
 	.poll           = batadv_log_poll,
 	.llseek         = no_llseek,
+	.owner          = THIS_MODULE,
 };
 
 /**
commit 849920c703392957f94023f77ec89ca6cf119d43
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Fri Nov 13 19:16:22 2020 +0800

    devlink: Add missing genlmsg_cancel() in devlink_nl_sb_port_pool_fill()
    
    If sb_occ_port_pool_get() failed in devlink_nl_sb_port_pool_fill(),
    msg should be canceled by genlmsg_cancel().
    
    Fixes: df38dafd2559 ("devlink: implement shared buffer occupancy monitoring interface")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Link: https://lore.kernel.org/r/20201113111622.11040-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/devlink.c b/net/core/devlink.c
index ab4b1368904f..4b0211590aac 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -1448,7 +1448,7 @@ static int devlink_nl_sb_port_pool_fill(struct sk_buff *msg,
 		err = ops->sb_occ_port_pool_get(devlink_port, devlink_sb->index,
 						pool_index, &cur, &max);
 		if (err && err != -EOPNOTSUPP)
-			return err;
+			goto sb_occ_get_failure;
 		if (!err) {
 			if (nla_put_u32(msg, DEVLINK_ATTR_SB_OCC_CUR, cur))
 				goto nla_put_failure;
@@ -1461,8 +1461,10 @@ static int devlink_nl_sb_port_pool_fill(struct sk_buff *msg,
 	return 0;
 
 nla_put_failure:
+	err = -EMSGSIZE;
+sb_occ_get_failure:
 	genlmsg_cancel(msg, hdr);
-	return -EMSGSIZE;
+	return err;
 }
 
 static int devlink_nl_cmd_sb_port_pool_get_doit(struct sk_buff *skb,
commit 56311a315da7ebc668dbcc2f1c99689cc10796c4
Author: Jisheng Zhang <Jisheng.Zhang at synaptics.com>
Date:   Fri Nov 13 09:09:02 2020 +0800

    net: stmmac: dwmac_lib: enlarge dma reset timeout
    
    If the phy enables power saving technology, the dwmac's software reset
    needs more time to complete, enlarge dma reset timeout to 200000us.
    
    Signed-off-by: Jisheng Zhang <Jisheng.Zhang at synaptics.com>
    Link: https://lore.kernel.org/r/20201113090902.5c7aab1a@xhacker.debian
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c
index cb87d31a99df..57a53a600aa5 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c
@@ -23,7 +23,7 @@ int dwmac_dma_reset(void __iomem *ioaddr)
 
 	return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
 				 !(value & DMA_BUS_MODE_SFT_RESET),
-				 10000, 100000);
+				 10000, 200000);
 }
 
 /* CSR1 enables the transmit DMA to check for new descriptor */
commit 796a2665ca3e91ebaba7222f76fd9a035714e2d8
Author: Sven Van Asbroeck <thesven73 at gmail.com>
Date:   Thu Nov 12 15:47:41 2020 -0500

    lan743x: prevent entire kernel HANG on open, for some platforms
    
    On arm imx6, when opening the chip's netdev, the whole Linux
    kernel intermittently hangs/freezes.
    
    This is caused by a bug in the driver code which tests if pcie
    interrupts are working correctly, using the software interrupt:
    
    1. open: enable the software interrupt
    2. open: tell the chip to assert the software interrupt
    3. open: wait for flag
    4. ISR: acknowledge s/w interrupt, set flag
    5. open: notice flag, disable the s/w interrupt, continue
    
    Unfortunately the ISR only acknowledges the s/w interrupt, but
    does not disable it. This will re-trigger the ISR in a tight
    loop.
    
    On some (lucky) platforms, open proceeds to disable the s/w
    interrupt even while the ISR is 'spinning'. On arm imx6,
    the spinning ISR does not allow open to proceed, resulting
    in a hung Linux kernel.
    
    Fix minimally by disabling the s/w interrupt in the ISR, which
    will prevent it from spinning. This won't break anything because
    the s/w interrupt is used as a one-shot interrupt.
    
    Note that this is a minimal fix, overlooking many possible
    cleanups, e.g.:
    - lan743x_intr_software_isr() is completely redundant and reads
      INT_STS twice for no apparent reason
    - disabling the s/w interrupt in lan743x_intr_test_isr() is now
      redundant, but harmless
    - waiting on software_isr_flag can be converted from a sleeping
      poll loop to wait_event_timeout()
    
    Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver")
    Tested-by: Sven Van Asbroeck <thesven73 at gmail.com> # arm imx6 lan7430
    Signed-off-by: Sven Van Asbroeck <thesven73 at gmail.com>
    Link: https://lore.kernel.org/r/20201112204741.12375-1-TheSven73@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 18c053b860ab..b319c22c211c 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -148,7 +148,8 @@ static void lan743x_intr_software_isr(void *context)
 
 	int_sts = lan743x_csr_read(adapter, INT_STS);
 	if (int_sts & INT_BIT_SW_GP_) {
-		lan743x_csr_write(adapter, INT_STS, INT_BIT_SW_GP_);
+		/* disable the interrupt to prevent repeated re-triggering */
+		lan743x_csr_write(adapter, INT_EN_CLR, INT_BIT_SW_GP_);
 		intr->software_isr_flag = 1;
 	}
 }
commit e35df62e04cc6fc4b9d90d054732f138349ff9b1
Author: Sven Van Asbroeck <thesven73 at gmail.com>
Date:   Thu Nov 12 13:59:49 2020 -0500

    lan743x: fix issue causing intermittent kernel log warnings
    
    When running this chip on arm imx6, we intermittently observe
    the following kernel warning in the log, especially when the
    system is under high load:
    
    [   50.119484] ------------[ cut here ]------------
    [   50.124377] WARNING: CPU: 0 PID: 303 at kernel/softirq.c:169 __local_bh_enable_ip+0x100/0x184
    [   50.132925] IRQs not enabled as expected
    [   50.159250] CPU: 0 PID: 303 Comm: rngd Not tainted 5.7.8 #1
    [   50.164837] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
    [   50.171395] [<c0111a38>] (unwind_backtrace) from [<c010be28>] (show_stack+0x10/0x14)
    [   50.179162] [<c010be28>] (show_stack) from [<c05b9dec>] (dump_stack+0xac/0xd8)
    [   50.186408] [<c05b9dec>] (dump_stack) from [<c0122e40>] (__warn+0xd0/0x10c)
    [   50.193391] [<c0122e40>] (__warn) from [<c0123238>] (warn_slowpath_fmt+0x98/0xc4)
    [   50.200892] [<c0123238>] (warn_slowpath_fmt) from [<c012b010>] (__local_bh_enable_ip+0x100/0x184)
    [   50.209860] [<c012b010>] (__local_bh_enable_ip) from [<bf09ecbc>] (destroy_conntrack+0x48/0xd8 [nf_conntrack])
    [   50.220038] [<bf09ecbc>] (destroy_conntrack [nf_conntrack]) from [<c0ac9b58>] (nf_conntrack_destroy+0x94/0x168)
    [   50.230160] [<c0ac9b58>] (nf_conntrack_destroy) from [<c0a4aaa0>] (skb_release_head_state+0xa0/0xd0)
    [   50.239314] [<c0a4aaa0>] (skb_release_head_state) from [<c0a4aadc>] (skb_release_all+0xc/0x24)
    [   50.247946] [<c0a4aadc>] (skb_release_all) from [<c0a4b4cc>] (consume_skb+0x74/0x17c)
    [   50.255796] [<c0a4b4cc>] (consume_skb) from [<c081a2dc>] (lan743x_tx_release_desc+0x120/0x124)
    [   50.264428] [<c081a2dc>] (lan743x_tx_release_desc) from [<c081a98c>] (lan743x_tx_napi_poll+0x5c/0x18c)
    [   50.273755] [<c081a98c>] (lan743x_tx_napi_poll) from [<c0a6b050>] (net_rx_action+0x118/0x4a4)
    [   50.282306] [<c0a6b050>] (net_rx_action) from [<c0101364>] (__do_softirq+0x13c/0x53c)
    [   50.290157] [<c0101364>] (__do_softirq) from [<c012b29c>] (irq_exit+0x150/0x17c)
    [   50.297575] [<c012b29c>] (irq_exit) from [<c0196a08>] (__handle_domain_irq+0x60/0xb0)
    [   50.305423] [<c0196a08>] (__handle_domain_irq) from [<c05d44fc>] (gic_handle_irq+0x4c/0x90)
    [   50.313790] [<c05d44fc>] (gic_handle_irq) from [<c0100ed4>] (__irq_usr+0x54/0x80)
    [   50.321287] Exception stack(0xecd99fb0 to 0xecd99ff8)
    [   50.326355] 9fa0:                                     1cf1aa74 00000001 00000001 00000000
    [   50.334547] 9fc0: 00000001 00000000 00000000 00000000 00000000 00000000 00004097 b6d17d14
    [   50.342738] 9fe0: 00000001 b6d17c60 00000000 b6e71f94 800b0010 ffffffff
    [   50.349364] irq event stamp: 2525027
    [   50.352955] hardirqs last  enabled at (2525026): [<c0a6afec>] net_rx_action+0xb4/0x4a4
    [   50.360892] hardirqs last disabled at (2525027): [<c0d6d2fc>] _raw_spin_lock_irqsave+0x1c/0x50
    [   50.369517] softirqs last  enabled at (2524660): [<c01015b4>] __do_softirq+0x38c/0x53c
    [   50.377446] softirqs last disabled at (2524693): [<c012b29c>] irq_exit+0x150/0x17c
    [   50.385027] ---[ end trace c0b571db4bc8087d ]---
    
    The driver is calling dev_kfree_skb() from code inside a spinlock,
    where h/w interrupts are disabled. This is forbidden, as documented
    in include/linux/netdevice.h. The correct function to use
    dev_kfree_skb_irq(), or dev_kfree_skb_any().
    
    Fix by using the correct dev_kfree_skb_xxx() functions:
    
    in lan743x_tx_release_desc():
      called by lan743x_tx_release_completed_descriptors()
        called by in lan743x_tx_napi_poll()
        which holds a spinlock
      called by lan743x_tx_release_all_descriptors()
        called by lan743x_tx_close()
        which can-sleep
    conclusion: use dev_kfree_skb_any()
    
    in lan743x_tx_xmit_frame():
      which holds a spinlock
    conclusion: use dev_kfree_skb_irq()
    
    in lan743x_tx_close():
      which can-sleep
    conclusion: use dev_kfree_skb()
    
    in lan743x_rx_release_ring_element():
      called by lan743x_rx_close()
        which can-sleep
      called by lan743x_rx_open()
        which can-sleep
    conclusion: use dev_kfree_skb()
    
    Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver")
    Signed-off-by: Sven Van Asbroeck <thesven73 at gmail.com>
    Link: https://lore.kernel.org/r/20201112185949.11315-1-TheSven73@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index e2c99d909247..18c053b860ab 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -1307,13 +1307,13 @@ clean_up_data_descriptor:
 		goto clear_active;
 
 	if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) {
-		dev_kfree_skb(buffer_info->skb);
+		dev_kfree_skb_any(buffer_info->skb);
 		goto clear_skb;
 	}
 
 	if (cleanup) {
 		lan743x_ptp_unrequest_tx_timestamp(tx->adapter);
-		dev_kfree_skb(buffer_info->skb);
+		dev_kfree_skb_any(buffer_info->skb);
 	} else {
 		ignore_sync = (buffer_info->flags &
 			       TX_BUFFER_INFO_FLAG_IGNORE_SYNC) != 0;
@@ -1623,7 +1623,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
 	if (required_number_of_descriptors >
 		lan743x_tx_get_avail_desc(tx)) {
 		if (required_number_of_descriptors > (tx->ring_size - 1)) {
-			dev_kfree_skb(skb);
+			dev_kfree_skb_irq(skb);
 		} else {
 			/* save to overflow buffer */
 			tx->overflow_skb = skb;
@@ -1656,7 +1656,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
 				   start_frame_length,
 				   do_timestamp,
 				   skb->ip_summed == CHECKSUM_PARTIAL)) {
-		dev_kfree_skb(skb);
+		dev_kfree_skb_irq(skb);
 		goto unlock;
 	}
 
@@ -1675,7 +1675,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
 			 * frame assembler clean up was performed inside
 			 *	lan743x_tx_frame_add_fragment
 			 */
-			dev_kfree_skb(skb);
+			dev_kfree_skb_irq(skb);
 			goto unlock;
 		}
 	}
commit e28c0d7c92c89016c12a677616668957351e7542
Merge: 31908a604ced f5785283dd64
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 14 12:35:11 2020 -0800

    Merge branch 'akpm' (patches from Andrew)
    
    Merge fixes from Andrew Morton:
     "14 patches.
    
      Subsystems affected by this patch series: mm (migration, vmscan, slub,
      gup, memcg, hugetlbfs), mailmap, kbuild, reboot, watchdog, panic, and
      ocfs2"
    
    * emailed patches from Andrew Morton <akpm at linux-foundation.org>:
      ocfs2: initialize ip_next_orphan
      panic: don't dump stack twice on warn
      hugetlbfs: fix anon huge page migration race
      mm: memcontrol: fix missing wakeup polling thread
      kernel/watchdog: fix watchdog_allowed_mask not used warning
      reboot: fix overflow parsing reboot cpu number
      Revert "kernel/reboot.c: convert simple_strtoul to kstrtoint"
      compiler.h: fix barrier_data() on clang
      mm/gup: use unpin_user_pages() in __gup_longterm_locked()
      mm/slub: fix panic in slab_alloc_node()
      mailmap: fix entry for Dmitry Baryshkov/Eremin-Solenikov
      mm/vmscan: fix NR_ISOLATED_FILE corruption on 64-bit
      mm/compaction: stop isolation if too many pages are isolated and we have pages to migrate
      mm/compaction: count pages and stop correctly during page isolation

commit 31908a604ced3c047022c2cc9f178d3287f06dfe
Merge: 7e908b7461ec c277ca155d2f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 14 12:30:18 2020 -0800

    Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
    
    Pull clk fixes from Stephen Boyd:
     "Two small clk driver fixes:
    
       - Make to_clk_regmap() inline to avoid compiler annoyance
    
       - Fix critical clks on i.MX imx8m SoCs"
    
    * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
      clk: imx8m: fix bus critical clk registration
      clk: define to_clk_regmap() as inline function

commit 7e908b7461ec395293335852485a183c16765303
Merge: 0c0451112b62 60268b0e8258
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 14 12:25:39 2020 -0800

    Merge tag 'hwmon-for-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
    
    Pull hwmon fixes from Guenter Roeck:
    
     - Fix potential bufer overflow in pmbus/max20730 driver
    
     - Fix locking issue in pmbus core
    
     - Fix regression causing timeouts in applesmc driver
    
     - Fix RPM calculation in pwm-fan driver
    
     - Restrict counter visibility in amd_energy driver
    
    * tag 'hwmon-for-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
      hwmon: (amd_energy) modify the visibility of the counters
      hwmon: (applesmc) Re-work SMC comms
      hwmon: (pwm-fan) Fix RPM calculation
      hwmon: (pmbus) Add mutex locking for sysfs reads
      hwmon: (pmbus/max20730) use scnprintf() instead of snprintf()

commit 0c0451112b629946c93ed2102b7ae47d4d1dc0bc
Merge: 30636a59f4c1 2e6f11a797a2
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 14 12:19:21 2020 -0800

    Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
    
    Pull SCSI fixes from James Bottomley:
     "Three small fixes, all in the embedded ufs driver subsystem"
    
    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
      scsi: ufshcd: Fix missing destroy_workqueue()
      scsi: ufs: Try to save power mode change and UIC cmd completion timeout
      scsi: ufs: Fix unbalanced scsi_block_reqs_cnt caused by ufshcd_hold()

commit 1ba86d4366e023d96df3dbe415eea7f1dc08c303
Author: Paul Moore <paul at paul-moore.com>
Date:   Fri Nov 13 16:30:40 2020 -0500

    netlabel: fix an uninitialized warning in netlbl_unlabel_staticlist()
    
    Static checking revealed that a previous fix to
    netlbl_unlabel_staticlist() leaves a stack variable uninitialized,
    this patches fixes that.
    
    Fixes: 866358ec331f ("netlabel: fix our progress tracking in netlbl_unlabel_staticlist()")
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Paul Moore <paul at paul-moore.com>
    Reviewed-by: James Morris <jamorris at linux.microsoft.com>
    Link: https://lore.kernel.org/r/160530304068.15651.18355773009751195447.stgit@sifl
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c
index fc55c9116da0..ccb491642811 100644
--- a/net/netlabel/netlabel_unlabeled.c
+++ b/net/netlabel/netlabel_unlabeled.c
@@ -1167,7 +1167,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
 	u32 skip_bkt = cb->args[0];
 	u32 skip_chain = cb->args[1];
 	u32 skip_addr4 = cb->args[2];
-	u32 iter_bkt, iter_chain, iter_addr4 = 0, iter_addr6 = 0;
+	u32 iter_bkt, iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0;
 	struct netlbl_unlhsh_iface *iface;
 	struct list_head *iter_list;
 	struct netlbl_af4list *addr4;
commit 30636a59f4c1a40720156079cabcad60351949f2
Merge: 4aea779d3512 c350f8bea271
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 14 12:04:02 2020 -0800

    Merge tag 'selinux-pr-20201113' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux
    
    Pull selinux fix from Paul Moore:
     "One small SELinux patch to make sure we return an error code when an
      allocation fails. It passes all of our tests, but given the nature of
      the patch that isn't surprising"
    
    * tag 'selinux-pr-20201113' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux:
      selinux: Fix error return code in sel_ib_pkey_sid_slow()

commit 057a10fa1f73d745c8e69aa54ab147715f5630ae
Author: Xin Long <lucien.xin at gmail.com>
Date:   Sat Nov 14 13:22:53 2020 +0800

    sctp: change to hold/put transport for proto_unreach_timer
    
    A call trace was found in Hangbin's Codenomicon testing with debug kernel:
    
      [ 2615.981988] ODEBUG: free active (active state 0) object type: timer_list hint: sctp_generate_proto_unreach_event+0x0/0x3a0 [sctp]
      [ 2615.995050] WARNING: CPU: 17 PID: 0 at lib/debugobjects.c:328 debug_print_object+0x199/0x2b0
      [ 2616.095934] RIP: 0010:debug_print_object+0x199/0x2b0
      [ 2616.191533] Call Trace:
      [ 2616.194265]  <IRQ>
      [ 2616.202068]  debug_check_no_obj_freed+0x25e/0x3f0
      [ 2616.207336]  slab_free_freelist_hook+0xeb/0x140
      [ 2616.220971]  kfree+0xd6/0x2c0
      [ 2616.224293]  rcu_do_batch+0x3bd/0xc70
      [ 2616.243096]  rcu_core+0x8b9/0xd00
      [ 2616.256065]  __do_softirq+0x23d/0xacd
      [ 2616.260166]  irq_exit+0x236/0x2a0
      [ 2616.263879]  smp_apic_timer_interrupt+0x18d/0x620
      [ 2616.269138]  apic_timer_interrupt+0xf/0x20
      [ 2616.273711]  </IRQ>
    
    This is because it holds asoc when transport->proto_unreach_timer starts
    and puts asoc when the timer stops, and without holding transport the
    transport could be freed when the timer is still running.
    
    So fix it by holding/putting transport instead for proto_unreach_timer
    in transport, just like other timers in transport.
    
    v1->v2:
      - Also use sctp_transport_put() for the "out_unlock:" path in
        sctp_generate_proto_unreach_event(), as Marcelo noticed.
    
    Fixes: 50b5d6ad6382 ("sctp: Fix a race between ICMP protocol unreachable and connect()")
    Reported-by: Hangbin Liu <liuhangbin at gmail.com>
    Signed-off-by: Xin Long <lucien.xin at gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner at gmail.com>
    Link: https://lore.kernel.org/r/102788809b554958b13b95d33440f5448113b8d6.1605331373.git.lucien.xin@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/sctp/input.c b/net/sctp/input.c
index 55d4fc6f371d..d508f6f3dd08 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -449,7 +449,7 @@ void sctp_icmp_proto_unreachable(struct sock *sk,
 		else {
 			if (!mod_timer(&t->proto_unreach_timer,
 						jiffies + (HZ/20)))
-				sctp_association_hold(asoc);
+				sctp_transport_hold(t);
 		}
 	} else {
 		struct net *net = sock_net(sk);
@@ -458,7 +458,7 @@ void sctp_icmp_proto_unreachable(struct sock *sk,
 			 "encountered!\n", __func__);
 
 		if (del_timer(&t->proto_unreach_timer))
-			sctp_association_put(asoc);
+			sctp_transport_put(t);
 
 		sctp_do_sm(net, SCTP_EVENT_T_OTHER,
 			   SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
index 813d30767204..0948f14ce221 100644
--- a/net/sctp/sm_sideeffect.c
+++ b/net/sctp/sm_sideeffect.c
@@ -419,7 +419,7 @@ void sctp_generate_proto_unreach_event(struct timer_list *t)
 		/* Try again later.  */
 		if (!mod_timer(&transport->proto_unreach_timer,
 				jiffies + (HZ/20)))
-			sctp_association_hold(asoc);
+			sctp_transport_hold(transport);
 		goto out_unlock;
 	}
 
@@ -435,7 +435,7 @@ void sctp_generate_proto_unreach_event(struct timer_list *t)
 
 out_unlock:
 	bh_unlock_sock(sk);
-	sctp_association_put(asoc);
+	sctp_transport_put(transport);
 }
 
  /* Handle the timeout of the RE-CONFIG timer. */
diff --git a/net/sctp/transport.c b/net/sctp/transport.c
index 806af58f4375..60fcf31cdcfb 100644
--- a/net/sctp/transport.c
+++ b/net/sctp/transport.c
@@ -133,7 +133,7 @@ void sctp_transport_free(struct sctp_transport *transport)
 
 	/* Delete the ICMP proto unreachable timer if it's active. */
 	if (del_timer(&transport->proto_unreach_timer))
-		sctp_association_put(transport->asoc);
+		sctp_transport_put(transport);
 
 	sctp_transport_put(transport);
 }
commit 4aea779d35120d5062647d288817678decb28c10
Merge: 3ad216ee73ab 9a5085b3fad5
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Sat Nov 14 11:56:59 2020 -0800

    Merge tag 'for-linus-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
    
    Pull uml fix from Richard Weinberger:
     "Call PMD destructor in __pmd_free_tlb()"
    
    * tag 'for-linus-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml:
      um: Call pgtable_pmd_page_dtor() in __pmd_free_tlb()

commit 3ad216ee73abc554ed8f13f4f8b70845a7bef6da
Author: David Howells <dhowells at redhat.com>
Date:   Sat Nov 14 17:27:57 2020 +0000

    afs: Fix afs_write_end() when called with copied == 0 [ver #3]
    
    When afs_write_end() is called with copied == 0, it tries to set the
    dirty region, but there's no way to actually encode a 0-length region in
    the encoding in page->private.
    
    "0,0", for example, indicates a 1-byte region at offset 0.  The maths
    miscalculates this and sets it incorrectly.
    
    Fix it to just do nothing but unlock and put the page in this case.  We
    don't actually need to mark the page dirty as nothing presumably
    changed.
    
    Fixes: 65dd2d6072d3 ("afs: Alter dirty range encoding in page->private")
    Signed-off-by: David Howells <dhowells at redhat.com>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/afs/write.c b/fs/afs/write.c
index 50371207f327..c9195fc67fd8 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -169,11 +169,14 @@ int afs_write_end(struct file *file, struct address_space *mapping,
 	unsigned int f, from = pos & (PAGE_SIZE - 1);
 	unsigned int t, to = from + copied;
 	loff_t i_size, maybe_i_size;
-	int ret;
+	int ret = 0;
 
 	_enter("{%llx:%llu},{%lx}",
 	       vnode->fid.vid, vnode->fid.vnode, page->index);
 
+	if (copied == 0)
+		goto out;
+
 	maybe_i_size = pos + copied;
 
 	i_size = i_size_read(&vnode->vfs_inode);
commit 65b422d9b61ba12c08150784e8012fa1892ad03e
Author: Stefano Garzarella <sgarzare at redhat.com>
Date:   Thu Nov 12 14:38:37 2020 +0100

    vsock: forward all packets to the host when no H2G is registered
    
    Before commit c0cfa2d8a788 ("vsock: add multi-transports support"),
    if a G2H transport was loaded (e.g. virtio transport), every packets
    was forwarded to the host, regardless of the destination CID.
    The H2G transports implemented until then (vhost-vsock, VMCI) always
    responded with an error, if the destination CID was not
    VMADDR_CID_HOST.
    
    From that commit, we are using the remote CID to decide which
    transport to use, so packets with remote CID > VMADDR_CID_HOST(2)
    are sent only through H2G transport. If no H2G is available, packets
    are discarded directly in the guest.
    
    Some use cases (e.g. Nitro Enclaves [1]) rely on the old behaviour
    to implement sibling VMs communication, so we restore the old
    behavior when no H2G is registered.
    It will be up to the host to discard packets if the destination is
    not the right one. As it was already implemented before adding
    multi-transport support.
    
    Tested with nested QEMU/KVM by me and Nitro Enclaves by Andra.
    
    [1] Documentation/virt/ne_overview.rst
    
    Cc: Jorgen Hansen <jhansen at vmware.com>
    Cc: Dexuan Cui <decui at microsoft.com>
    Fixes: c0cfa2d8a788 ("vsock: add multi-transports support")
    Reported-by: Andra Paraschiv <andraprs at amazon.com>
    Tested-by: Andra Paraschiv <andraprs at amazon.com>
    Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
    Link: https://lore.kernel.org/r/20201112133837.34183-1-sgarzare@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index b4d7b8aba003..d10916ab4526 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -438,7 +438,7 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
 	case SOCK_STREAM:
 		if (vsock_use_local_transport(remote_cid))
 			new_transport = transport_local;
-		else if (remote_cid <= VMADDR_CID_HOST)
+		else if (remote_cid <= VMADDR_CID_HOST || !transport_h2g)
 			new_transport = transport_g2h;
 		else
 			new_transport = transport_h2g;
commit 92307069a96c07d9b6e74b96b79390e7cd7d2111
Author: Tobias Waldekranz <tobias at waldekranz.com>
Date:   Thu Nov 12 12:43:35 2020 +0100

    net: dsa: mv88e6xxx: Avoid VTU corruption on 6097
    
    As soon as you add the second port to a VLAN, all other port
    membership configuration is overwritten with zeroes. The HW interprets
    this as all ports being "unmodified members" of the VLAN.
    
    In the simple case when all ports belong to the same VLAN, switching
    will still work. But using multiple VLANs or trying to set multiple
    ports as tagged members will not work.
    
    On the 6352, doing a VTU GetNext op, followed by an STU GetNext op
    will leave you with both the member- and state- data in the VTU/STU
    data registers. But on the 6097 (which uses the same implementation),
    the STU GetNext will override the information gathered from the VTU
    GetNext.
    
    Separate the two stages, parsing the result of the VTU GetNext before
    doing the STU GetNext.
    
    We opt to update the existing implementation for all applicable chips,
    as opposed to creating a separate callback for 6097, because although
    the previous implementation did work for (at least) 6352, the
    datasheet does not mention the masking behavior.
    
    Fixes: ef6fcea37f01 ("net: dsa: mv88e6xxx: get STU entry on VTU GetNext")
    Signed-off-by: Tobias Waldekranz <tobias at waldekranz.com>
    Link: https://lore.kernel.org/r/20201112114335.27371-1-tobias@waldekranz.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/dsa/mv88e6xxx/global1_vtu.c b/drivers/net/dsa/mv88e6xxx/global1_vtu.c
index 48390b7b18ad..1048509a849b 100644
--- a/drivers/net/dsa/mv88e6xxx/global1_vtu.c
+++ b/drivers/net/dsa/mv88e6xxx/global1_vtu.c
@@ -125,11 +125,9 @@ static int mv88e6xxx_g1_vtu_vid_write(struct mv88e6xxx_chip *chip,
  * Offset 0x08: VTU/STU Data Register 2
  * Offset 0x09: VTU/STU Data Register 3
  */
-
-static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
-				      struct mv88e6xxx_vtu_entry *entry)
+static int mv88e6185_g1_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
+					  u16 *regs)
 {
-	u16 regs[3];
 	int i;
 
 	/* Read all 3 VTU/STU Data registers */
@@ -142,12 +140,45 @@ static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
 			return err;
 	}
 
-	/* Extract MemberTag and PortState data */
+	return 0;
+}
+
+static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
+				      struct mv88e6xxx_vtu_entry *entry)
+{
+	u16 regs[3];
+	int err;
+	int i;
+
+	err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
+	if (err)
+		return err;
+
+	/* Extract MemberTag data */
 	for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
 		unsigned int member_offset = (i % 4) * 4;
-		unsigned int state_offset = member_offset + 2;
 
 		entry->member[i] = (regs[i / 4] >> member_offset) & 0x3;
+	}
+
+	return 0;
+}
+
+static int mv88e6185_g1_stu_data_read(struct mv88e6xxx_chip *chip,
+				      struct mv88e6xxx_vtu_entry *entry)
+{
+	u16 regs[3];
+	int err;
+	int i;
+
+	err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
+	if (err)
+		return err;
+
+	/* Extract PortState data */
+	for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
+		unsigned int state_offset = (i % 4) * 4 + 2;
+
 		entry->state[i] = (regs[i / 4] >> state_offset) & 0x3;
 	}
 
@@ -349,6 +380,10 @@ int mv88e6185_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
 		if (err)
 			return err;
 
+		err = mv88e6185_g1_stu_data_read(chip, entry);
+		if (err)
+			return err;
+
 		/* VTU DBNum[3:0] are located in VTU Operation 3:0
 		 * VTU DBNum[7:4] are located in VTU Operation 11:8
 		 */
@@ -374,16 +409,20 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
 		return err;
 
 	if (entry->valid) {
-		/* Fetch (and mask) VLAN PortState data from the STU */
-		err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
+		err = mv88e6185_g1_vtu_data_read(chip, entry);
 		if (err)
 			return err;
 
-		err = mv88e6185_g1_vtu_data_read(chip, entry);
+		err = mv88e6xxx_g1_vtu_fid_read(chip, entry);
 		if (err)
 			return err;
 
-		err = mv88e6xxx_g1_vtu_fid_read(chip, entry);
+		/* Fetch VLAN PortState data from the STU */
+		err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
+		if (err)
+			return err;
+
+		err = mv88e6185_g1_stu_data_read(chip, entry);
 		if (err)
 			return err;
 	}
commit f5785283dd64867a711ca1fb1f5bb172f252ecdf
Author: Wengang Wang <wen.gang.wang at oracle.com>
Date:   Fri Nov 13 22:52:23 2020 -0800

    ocfs2: initialize ip_next_orphan
    
    Though problem if found on a lower 4.1.12 kernel, I think upstream has
    same issue.
    
    In one node in the cluster, there is the following callback trace:
    
       # cat /proc/21473/stack
       __ocfs2_cluster_lock.isra.36+0x336/0x9e0 [ocfs2]
       ocfs2_inode_lock_full_nested+0x121/0x520 [ocfs2]
       ocfs2_evict_inode+0x152/0x820 [ocfs2]
       evict+0xae/0x1a0
       iput+0x1c6/0x230
       ocfs2_orphan_filldir+0x5d/0x100 [ocfs2]
       ocfs2_dir_foreach_blk+0x490/0x4f0 [ocfs2]
       ocfs2_dir_foreach+0x29/0x30 [ocfs2]
       ocfs2_recover_orphans+0x1b6/0x9a0 [ocfs2]
       ocfs2_complete_recovery+0x1de/0x5c0 [ocfs2]
       process_one_work+0x169/0x4a0
       worker_thread+0x5b/0x560
       kthread+0xcb/0xf0
       ret_from_fork+0x61/0x90
    
    The above stack is not reasonable, the final iput shouldn't happen in
    ocfs2_orphan_filldir() function.  Looking at the code,
    
      2067         /* Skip inodes which are already added to recover list, since dio may
      2068          * happen concurrently with unlink/rename */
      2069         if (OCFS2_I(iter)->ip_next_orphan) {
      2070                 iput(iter);
      2071                 return 0;
      2072         }
      2073
    
    The logic thinks the inode is already in recover list on seeing
    ip_next_orphan is non-NULL, so it skip this inode after dropping a
    reference which incremented in ocfs2_iget().
    
    While, if the inode is already in recover list, it should have another
    reference and the iput() at line 2070 should not be the final iput
    (dropping the last reference).  So I don't think the inode is really in
    the recover list (no vmcore to confirm).
    
    Note that ocfs2_queue_orphans(), though not shown up in the call back
    trace, is holding cluster lock on the orphan directory when looking up
    for unlinked inodes.  The on disk inode eviction could involve a lot of
    IOs which may need long time to finish.  That means this node could hold
    the cluster lock for very long time, that can lead to the lock requests
    (from other nodes) to the orhpan directory hang for long time.
    
    Looking at more on ip_next_orphan, I found it's not initialized when
    allocating a new ocfs2_inode_info structure.
    
    This causes te reflink operations from some nodes hang for very long
    time waiting for the cluster lock on the orphan directory.
    
    Fix: initialize ip_next_orphan as NULL.
    
    Signed-off-by: Wengang Wang <wen.gang.wang at oracle.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Joseph Qi <joseph.qi at linux.alibaba.com>
    Cc: Mark Fasheh <mark at fasheh.com>
    Cc: Joel Becker <jlbec at evilplan.org>
    Cc: Junxiao Bi <junxiao.bi at oracle.com>
    Cc: Changwei Ge <gechangwei at live.cn>
    Cc: Gang He <ghe at suse.com>
    Cc: Jun Piao <piaojun at huawei.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201109171746.27884-1-wen.gang.wang@oracle.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 1d91dd1e8711..2febc76e9de7 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1713,6 +1713,7 @@ static void ocfs2_inode_init_once(void *data)
 
 	oi->ip_blkno = 0ULL;
 	oi->ip_clusters = 0;
+	oi->ip_next_orphan = NULL;
 
 	ocfs2_resv_init_once(&oi->ip_la_data_resv);
 
commit 2f31ad64a9cce8b2409d2d4563482adfb8664082
Author: Christophe Leroy <christophe.leroy at csgroup.eu>
Date:   Fri Nov 13 22:52:20 2020 -0800

    panic: don't dump stack twice on warn
    
    Before commit 3f388f28639f ("panic: dump registers on panic_on_warn"),
    __warn() was calling show_regs() when regs was not NULL, and show_stack()
    otherwise.
    
    After that commit, show_stack() is called regardless of whether
    show_regs() has been called or not, leading to duplicated Call Trace:
    
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 1 at arch/powerpc/mm/nohash/8xx.c:186 mmu_mark_initmem_nx+0x24/0x94
      CPU: 0 PID: 1 Comm: swapper Not tainted 5.10.0-rc2-s3k-dev-01375-gf46ec0d3ecbd-dirty #4092
      NIP:  c00128b4 LR: c0010228 CTR: 00000000
      REGS: c9023e40 TRAP: 0700   Not tainted  (5.10.0-rc2-s3k-dev-01375-gf46ec0d3ecbd-dirty)
      MSR:  00029032 <EE,ME,IR,DR,RI>  CR: 24000424  XER: 00000000
    
      GPR00: c0010228 c9023ef8 c2100000 0074c000 ffffffff 00000000 c2151000 c07b3880
      GPR08: ff000900 0074c000 c8000000 c33b53a8 24000822 00000000 c0003a20 00000000
      GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
      GPR24: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000
      NIP [c00128b4] mmu_mark_initmem_nx+0x24/0x94
      LR [c0010228] free_initmem+0x20/0x58
      Call Trace:
        free_initmem+0x20/0x58
        kernel_init+0x1c/0x114
        ret_from_kernel_thread+0x14/0x1c
      Instruction dump:
      7d291850 7d234b78 4e800020 9421ffe0 7c0802a6 bfc10018 3fe0c060 3bff0000
      3fff4080 3bffffff 90010024 57ff0010 <0fe00000> 392001cd 7c3e0b78 953e0008
      CPU: 0 PID: 1 Comm: swapper Not tainted 5.10.0-rc2-s3k-dev-01375-gf46ec0d3ecbd-dirty #4092
      Call Trace:
        __warn+0x8c/0xd8 (unreliable)
        report_bug+0x11c/0x154
        program_check_exception+0x1dc/0x6e0
        ret_from_except_full+0x0/0x4
      --- interrupt: 700 at mmu_mark_initmem_nx+0x24/0x94
          LR = free_initmem+0x20/0x58
        free_initmem+0x20/0x58
        kernel_init+0x1c/0x114
        ret_from_kernel_thread+0x14/0x1c
      ---[ end trace 31702cd2a9570752 ]---
    
    Only call show_stack() when regs is NULL.
    
    Fixes: 3f388f28639f ("panic: dump registers on panic_on_warn")
    Signed-off-by: Christophe Leroy <christophe.leroy at csgroup.eu>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Alexey Kardashevskiy <aik at ozlabs.ru>
    Cc: Kefeng Wang <wangkefeng.wang at huawei.com>
    Link: https://lkml.kernel.org/r/e8c055458b080707f1bc1a98ff8bea79d0cec445.1604748361.git.christophe.leroy@csgroup.eu
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/kernel/panic.c b/kernel/panic.c
index 396142ee43fd..332736a72a58 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -605,7 +605,8 @@ void __warn(const char *file, int line, void *caller, unsigned taint,
 		panic("panic_on_warn set ...\n");
 	}
 
-	dump_stack();
+	if (!regs)
+		dump_stack();
 
 	print_irqtrace_events(current);
 
commit 336bf30eb76580b579dc711ded5d599d905c0217
Author: Mike Kravetz <mike.kravetz at oracle.com>
Date:   Fri Nov 13 22:52:16 2020 -0800

    hugetlbfs: fix anon huge page migration race
    
    Qian Cai reported the following BUG in [1]
    
      LTP: starting move_pages12
      BUG: unable to handle page fault for address: ffffffffffffffe0
      ...
      RIP: 0010:anon_vma_interval_tree_iter_first+0xa2/0x170 avc_start_pgoff at mm/interval_tree.c:63
      Call Trace:
        rmap_walk_anon+0x141/0xa30 rmap_walk_anon at mm/rmap.c:1864
        try_to_unmap+0x209/0x2d0 try_to_unmap at mm/rmap.c:1763
        migrate_pages+0x1005/0x1fb0
        move_pages_and_store_status.isra.47+0xd7/0x1a0
        __x64_sys_move_pages+0xa5c/0x1100
        do_syscall_64+0x5f/0x310
        entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Hugh Dickins diagnosed this as a migration bug caused by code introduced
    to use i_mmap_rwsem for pmd sharing synchronization.  Specifically, the
    routine unmap_and_move_huge_page() is always passing the TTU_RMAP_LOCKED
    flag to try_to_unmap() while holding i_mmap_rwsem.  This is wrong for
    anon pages as the anon_vma_lock should be held in this case.  Further
    analysis suggested that i_mmap_rwsem was not required to he held at all
    when calling try_to_unmap for anon pages as an anon page could never be
    part of a shared pmd mapping.
    
    Discussion also revealed that the hack in hugetlb_page_mapping_lock_write
    to drop page lock and acquire i_mmap_rwsem is wrong.  There is no way to
    keep mapping valid while dropping page lock.
    
    This patch does the following:
    
     - Do not take i_mmap_rwsem and set TTU_RMAP_LOCKED for anon pages when
       calling try_to_unmap.
    
     - Remove the hacky code in hugetlb_page_mapping_lock_write. The routine
       will now simply do a 'trylock' while still holding the page lock. If
       the trylock fails, it will return NULL. This could impact the
       callers:
    
        - migration calling code will receive -EAGAIN and retry up to the
          hard coded limit (10).
    
        - memory error code will treat the page as BUSY. This will force
          killing (SIGKILL) instead of SIGBUS any mapping tasks.
    
       Do note that this change in behavior only happens when there is a
       race. None of the standard kernel testing suites actually hit this
       race, but it is possible.
    
    [1] https://lore.kernel.org/lkml/20200708012044.GC992@lca.pw/
    [2] https://lore.kernel.org/linux-mm/alpine.LSU.2.11.2010071833100.2214@eggly.anvils/
    
    Fixes: c0d0381ade79 ("hugetlbfs: use i_mmap_rwsem for more pmd sharing synchronization")
    Reported-by: Qian Cai <cai at lca.pw>
    Suggested-by: Hugh Dickins <hughd at google.com>
    Signed-off-by: Mike Kravetz <mike.kravetz at oracle.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Acked-by: Naoya Horiguchi <naoya.horiguchi at nec.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201105195058.78401-1-mike.kravetz@oracle.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 5a620f690911..37f15c3c24dc 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1567,104 +1567,24 @@ int PageHeadHuge(struct page *page_head)
 	return page_head[1].compound_dtor == HUGETLB_PAGE_DTOR;
 }
 
-/*
- * Find address_space associated with hugetlbfs page.
- * Upon entry page is locked and page 'was' mapped although mapped state
- * could change.  If necessary, use anon_vma to find vma and associated
- * address space.  The returned mapping may be stale, but it can not be
- * invalid as page lock (which is held) is required to destroy mapping.
- */
-static struct address_space *_get_hugetlb_page_mapping(struct page *hpage)
-{
-	struct anon_vma *anon_vma;
-	pgoff_t pgoff_start, pgoff_end;
-	struct anon_vma_chain *avc;
-	struct address_space *mapping = page_mapping(hpage);
-
-	/* Simple file based mapping */
-	if (mapping)
-		return mapping;
-
-	/*
-	 * Even anonymous hugetlbfs mappings are associated with an
-	 * underlying hugetlbfs file (see hugetlb_file_setup in mmap
-	 * code).  Find a vma associated with the anonymous vma, and
-	 * use the file pointer to get address_space.
-	 */
-	anon_vma = page_lock_anon_vma_read(hpage);
-	if (!anon_vma)
-		return mapping;  /* NULL */
-
-	/* Use first found vma */
-	pgoff_start = page_to_pgoff(hpage);
-	pgoff_end = pgoff_start + pages_per_huge_page(page_hstate(hpage)) - 1;
-	anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root,
-					pgoff_start, pgoff_end) {
-		struct vm_area_struct *vma = avc->vma;
-
-		mapping = vma->vm_file->f_mapping;
-		break;
-	}
-
-	anon_vma_unlock_read(anon_vma);
-	return mapping;
-}
-
 /*
  * Find and lock address space (mapping) in write mode.
  *
- * Upon entry, the page is locked which allows us to find the mapping
- * even in the case of an anon page.  However, locking order dictates
- * the i_mmap_rwsem be acquired BEFORE the page lock.  This is hugetlbfs
- * specific.  So, we first try to lock the sema while still holding the
- * page lock.  If this works, great!  If not, then we need to drop the
- * page lock and then acquire i_mmap_rwsem and reacquire page lock.  Of
- * course, need to revalidate state along the way.
+ * Upon entry, the page is locked which means that page_mapping() is
+ * stable.  Due to locking order, we can only trylock_write.  If we can
+ * not get the lock, simply return NULL to caller.
  */
 struct address_space *hugetlb_page_mapping_lock_write(struct page *hpage)
 {
-	struct address_space *mapping, *mapping2;
+	struct address_space *mapping = page_mapping(hpage);
 
-	mapping = _get_hugetlb_page_mapping(hpage);
-retry:
 	if (!mapping)
 		return mapping;
 
-	/*
-	 * If no contention, take lock and return
-	 */
 	if (i_mmap_trylock_write(mapping))
 		return mapping;
 
-	/*
-	 * Must drop page lock and wait on mapping sema.
-	 * Note:  Once page lock is dropped, mapping could become invalid.
-	 * As a hack, increase map count until we lock page again.
-	 */
-	atomic_inc(&hpage->_mapcount);
-	unlock_page(hpage);
-	i_mmap_lock_write(mapping);
-	lock_page(hpage);
-	atomic_add_negative(-1, &hpage->_mapcount);
-
-	/* verify page is still mapped */
-	if (!page_mapped(hpage)) {
-		i_mmap_unlock_write(mapping);
-		return NULL;
-	}
-
-	/*
-	 * Get address space again and verify it is the same one
-	 * we locked.  If not, drop lock and retry.
-	 */
-	mapping2 = _get_hugetlb_page_mapping(hpage);
-	if (mapping2 != mapping) {
-		i_mmap_unlock_write(mapping);
-		mapping = mapping2;
-		goto retry;
-	}
-
-	return mapping;
+	return NULL;
 }
 
 pgoff_t __basepage_index(struct page *page)
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index c0bb186bba62..5d880d4eb9a2 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1057,27 +1057,25 @@ static bool hwpoison_user_mappings(struct page *p, unsigned long pfn,
 	if (!PageHuge(hpage)) {
 		unmap_success = try_to_unmap(hpage, ttu);
 	} else {
-		/*
-		 * For hugetlb pages, try_to_unmap could potentially call
-		 * huge_pmd_unshare.  Because of this, take semaphore in
-		 * write mode here and set TTU_RMAP_LOCKED to indicate we
-		 * have taken the lock at this higer level.
-		 *
-		 * Note that the call to hugetlb_page_mapping_lock_write
-		 * is necessary even if mapping is already set.  It handles
-		 * ugliness of potentially having to drop page lock to obtain
-		 * i_mmap_rwsem.
-		 */
-		mapping = hugetlb_page_mapping_lock_write(hpage);
-
-		if (mapping) {
-			unmap_success = try_to_unmap(hpage,
+		if (!PageAnon(hpage)) {
+			/*
+			 * For hugetlb pages in shared mappings, try_to_unmap
+			 * could potentially call huge_pmd_unshare.  Because of
+			 * this, take semaphore in write mode here and set
+			 * TTU_RMAP_LOCKED to indicate we have taken the lock
+			 * at this higer level.
+			 */
+			mapping = hugetlb_page_mapping_lock_write(hpage);
+			if (mapping) {
+				unmap_success = try_to_unmap(hpage,
 						     ttu|TTU_RMAP_LOCKED);
-			i_mmap_unlock_write(mapping);
+				i_mmap_unlock_write(mapping);
+			} else {
+				pr_info("Memory failure: %#lx: could not lock mapping for mapped huge page\n", pfn);
+				unmap_success = false;
+			}
 		} else {
-			pr_info("Memory failure: %#lx: could not find mapping for mapped huge page\n",
-				pfn);
-			unmap_success = false;
+			unmap_success = try_to_unmap(hpage, ttu);
 		}
 	}
 	if (!unmap_success)
diff --git a/mm/migrate.c b/mm/migrate.c
index 5ca5842df5db..5795cb82e27c 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1328,34 +1328,38 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
 		goto put_anon;
 
 	if (page_mapped(hpage)) {
-		/*
-		 * try_to_unmap could potentially call huge_pmd_unshare.
-		 * Because of this, take semaphore in write mode here and
-		 * set TTU_RMAP_LOCKED to let lower levels know we have
-		 * taken the lock.
-		 */
-		mapping = hugetlb_page_mapping_lock_write(hpage);
-		if (unlikely(!mapping))
-			goto unlock_put_anon;
+		bool mapping_locked = false;
+		enum ttu_flags ttu = TTU_MIGRATION|TTU_IGNORE_MLOCK|
+					TTU_IGNORE_ACCESS;
+
+		if (!PageAnon(hpage)) {
+			/*
+			 * In shared mappings, try_to_unmap could potentially
+			 * call huge_pmd_unshare.  Because of this, take
+			 * semaphore in write mode here and set TTU_RMAP_LOCKED
+			 * to let lower levels know we have taken the lock.
+			 */
+			mapping = hugetlb_page_mapping_lock_write(hpage);
+			if (unlikely(!mapping))
+				goto unlock_put_anon;
+
+			mapping_locked = true;
+			ttu |= TTU_RMAP_LOCKED;
+		}
 
-		try_to_unmap(hpage,
-			TTU_MIGRATION|TTU_IGNORE_MLOCK|TTU_IGNORE_ACCESS|
-			TTU_RMAP_LOCKED);
+		try_to_unmap(hpage, ttu);
 		page_was_mapped = 1;
-		/*
-		 * Leave mapping locked until after subsequent call to
-		 * remove_migration_ptes()
-		 */
+
+		if (mapping_locked)
+			i_mmap_unlock_write(mapping);
 	}
 
 	if (!page_mapped(hpage))
 		rc = move_to_new_page(new_hpage, hpage, mode);
 
-	if (page_was_mapped) {
+	if (page_was_mapped)
 		remove_migration_ptes(hpage,
-			rc == MIGRATEPAGE_SUCCESS ? new_hpage : hpage, true);
-		i_mmap_unlock_write(mapping);
-	}
+			rc == MIGRATEPAGE_SUCCESS ? new_hpage : hpage, false);
 
 unlock_put_anon:
 	unlock_page(new_hpage);
diff --git a/mm/rmap.c b/mm/rmap.c
index 1b84945d655c..31b29321adfe 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1413,9 +1413,6 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 		/*
 		 * If sharing is possible, start and end will be adjusted
 		 * accordingly.
-		 *
-		 * If called for a huge page, caller must hold i_mmap_rwsem
-		 * in write mode as it is possible to call huge_pmd_unshare.
 		 */
 		adjust_range_if_pmd_sharing_possible(vma, &range.start,
 						     &range.end);
@@ -1462,7 +1459,7 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 		subpage = page - page_to_pfn(page) + pte_pfn(*pvmw.pte);
 		address = pvmw.address;
 
-		if (PageHuge(page)) {
+		if (PageHuge(page) && !PageAnon(page)) {
 			/*
 			 * To call huge_pmd_unshare, i_mmap_rwsem must be
 			 * held in write mode.  Caller needs to explicitly
commit 8b21ca0218d29cc6bb7028125c7e5a10dfb4730c
Author: Muchun Song <songmuchun at bytedance.com>
Date:   Fri Nov 13 22:52:13 2020 -0800

    mm: memcontrol: fix missing wakeup polling thread
    
    When we poll the swap.events, we can miss being woken up when the swap
    event occurs.  Because we didn't notify.
    
    Fixes: f3a53a3a1e5b ("mm, memcontrol: implement memory.swap.events")
    Signed-off-by: Muchun Song <songmuchun at bytedance.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Shakeel Butt <shakeelb at google.com>
    Acked-by: Johannes Weiner <hannes at cmpxchg.org>
    Cc: Roman Gushchin <guro at fb.com>
    Cc: Michal Hocko <mhocko at suse.com>
    Cc: Yafang Shao <laoar.shao at gmail.com>
    Cc: Chris Down <chris at chrisdown.name>
    Cc: Tejun Heo <tj at kernel.org>
    Link: https://lkml.kernel.org/r/20201105161936.98312-1-songmuchun@bytedance.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index e391e3c56de5..a80c59af2c60 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -900,12 +900,19 @@ static inline void count_memcg_event_mm(struct mm_struct *mm,
 static inline void memcg_memory_event(struct mem_cgroup *memcg,
 				      enum memcg_memory_event event)
 {
+	bool swap_event = event == MEMCG_SWAP_HIGH || event == MEMCG_SWAP_MAX ||
+			  event == MEMCG_SWAP_FAIL;
+
 	atomic_long_inc(&memcg->memory_events_local[event]);
-	cgroup_file_notify(&memcg->events_local_file);
+	if (!swap_event)
+		cgroup_file_notify(&memcg->events_local_file);
 
 	do {
 		atomic_long_inc(&memcg->memory_events[event]);
-		cgroup_file_notify(&memcg->events_file);
+		if (swap_event)
+			cgroup_file_notify(&memcg->swap_events_file);
+		else
+			cgroup_file_notify(&memcg->events_file);
 
 		if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
 			break;
commit e7e046155af04cdca5e1157f28b07e1651eb317b
Author: Santosh Sivaraj <santosh at fossix.org>
Date:   Fri Nov 13 22:52:10 2020 -0800

    kernel/watchdog: fix watchdog_allowed_mask not used warning
    
    Define watchdog_allowed_mask only when SOFTLOCKUP_DETECTOR is enabled.
    
    Fixes: 7feeb9cd4f5b ("watchdog/sysctl: Clean up sysctl variable name space")
    Signed-off-by: Santosh Sivaraj <santosh at fossix.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Petr Mladek <pmladek at suse.com>
    Cc: Thomas Gleixner <tglx at linutronix.de>
    Link: https://lkml.kernel.org/r/20201106015025.1281561-1-santosh@fossix.org
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 5abb5b22ad13..71109065bd8e 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -44,8 +44,6 @@ int __read_mostly soft_watchdog_user_enabled = 1;
 int __read_mostly watchdog_thresh = 10;
 static int __read_mostly nmi_watchdog_available;
 
-static struct cpumask watchdog_allowed_mask __read_mostly;
-
 struct cpumask watchdog_cpumask __read_mostly;
 unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
 
@@ -162,6 +160,8 @@ static void lockup_detector_update_enable(void)
 int __read_mostly sysctl_softlockup_all_cpu_backtrace;
 #endif
 
+static struct cpumask watchdog_allowed_mask __read_mostly;
+
 /* Global variables, exported for sysctl */
 unsigned int __read_mostly softlockup_panic =
 			CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE;
commit df5b0ab3e08a156701b537809914b339b0daa526
Author: Matteo Croce <mcroce at microsoft.com>
Date:   Fri Nov 13 22:52:07 2020 -0800

    reboot: fix overflow parsing reboot cpu number
    
    Limit the CPU number to num_possible_cpus(), because setting it to a
    value lower than INT_MAX but higher than NR_CPUS produces the following
    error on reboot and shutdown:
    
        BUG: unable to handle page fault for address: ffffffff90ab1bb0
        #PF: supervisor read access in kernel mode
        #PF: error_code(0x0000) - not-present page
        PGD 1c09067 P4D 1c09067 PUD 1c0a063 PMD 0
        Oops: 0000 [#1] SMP
        CPU: 1 PID: 1 Comm: systemd-shutdow Not tainted 5.9.0-rc8-kvm #110
        Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
        RIP: 0010:migrate_to_reboot_cpu+0xe/0x60
        Code: ea ea 00 48 89 fa 48 c7 c7 30 57 f1 81 e9 fa ef ff ff 66 2e 0f 1f 84 00 00 00 00 00 53 8b 1d d5 ea ea 00 e8 14 33 fe ff 89 da <48> 0f a3 15 ea fc bd 00 48 89 d0 73 29 89 c2 c1 e8 06 65 48 8b 3c
        RSP: 0018:ffffc90000013e08 EFLAGS: 00010246
        RAX: ffff88801f0a0000 RBX: 0000000077359400 RCX: 0000000000000000
        RDX: 0000000077359400 RSI: 0000000000000002 RDI: ffffffff81c199e0
        RBP: ffffffff81c1e3c0 R08: ffff88801f41f000 R09: ffffffff81c1e348
        R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
        R13: 00007f32bedf8830 R14: 00000000fee1dead R15: 0000000000000000
        FS:  00007f32bedf8980(0000) GS:ffff88801f480000(0000) knlGS:0000000000000000
        CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
        CR2: ffffffff90ab1bb0 CR3: 000000001d057000 CR4: 00000000000006a0
        DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
        DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
        Call Trace:
          __do_sys_reboot.cold+0x34/0x5b
          do_syscall_64+0x2d/0x40
    
    Fixes: 1b3a5d02ee07 ("reboot: move arch/x86 reboot= handling to generic kernel")
    Signed-off-by: Matteo Croce <mcroce at microsoft.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Arnd Bergmann <arnd at arndb.de>
    Cc: Fabian Frederick <fabf at skynet.be>
    Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
    Cc: Guenter Roeck <linux at roeck-us.net>
    Cc: Kees Cook <keescook at chromium.org>
    Cc: Mike Rapoport <rppt at kernel.org>
    Cc: Pavel Tatashin <pasha.tatashin at soleen.com>
    Cc: Petr Mladek <pmladek at suse.com>
    Cc: Robin Holt <robinmholt at gmail.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201103214025.116799-3-mcroce@linux.microsoft.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/kernel/reboot.c b/kernel/reboot.c
index 8fbba433725e..af6f23d8bea1 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -558,6 +558,13 @@ static int __init reboot_setup(char *str)
 				reboot_cpu = simple_strtoul(str+3, NULL, 0);
 			else
 				*mode = REBOOT_SOFT;
+			if (reboot_cpu >= num_possible_cpus()) {
+				pr_err("Ignoring the CPU number in reboot= option. "
+				       "CPU %d exceeds possible cpu number %d\n",
+				       reboot_cpu, num_possible_cpus());
+				reboot_cpu = 0;
+				break;
+			}
 			break;
 
 		case 'g':
commit 8b92c4ff4423aa9900cf838d3294fcade4dbda35
Author: Matteo Croce <mcroce at microsoft.com>
Date:   Fri Nov 13 22:52:02 2020 -0800

    Revert "kernel/reboot.c: convert simple_strtoul to kstrtoint"
    
    Patch series "fix parsing of reboot= cmdline", v3.
    
    The parsing of the reboot= cmdline has two major errors:
    
     - a missing bound check can crash the system on reboot
    
     - parsing of the cpu number only works if specified last
    
    Fix both.
    
    This patch (of 2):
    
    This reverts commit 616feab753972b97.
    
    kstrtoint() and simple_strtoul() have a subtle difference which makes
    them non interchangeable: if a non digit character is found amid the
    parsing, the former will return an error, while the latter will just
    stop parsing, e.g.  simple_strtoul("123xyx") = 123.
    
    The kernel cmdline reboot= argument allows to specify the CPU used for
    rebooting, with the syntax `s####` among the other flags, e.g.
    "reboot=warm,s31,force", so if this flag is not the last given, it's
    silently ignored as well as the subsequent ones.
    
    Fixes: 616feab75397 ("kernel/reboot.c: convert simple_strtoul to kstrtoint")
    Signed-off-by: Matteo Croce <mcroce at microsoft.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: Guenter Roeck <linux at roeck-us.net>
    Cc: Petr Mladek <pmladek at suse.com>
    Cc: Arnd Bergmann <arnd at arndb.de>
    Cc: Mike Rapoport <rppt at kernel.org>
    Cc: Kees Cook <keescook at chromium.org>
    Cc: Pavel Tatashin <pasha.tatashin at soleen.com>
    Cc: Robin Holt <robinmholt at gmail.com>
    Cc: Fabian Frederick <fabf at skynet.be>
    Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201103214025.116799-2-mcroce@linux.microsoft.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/kernel/reboot.c b/kernel/reboot.c
index e7b78d5ae1ab..8fbba433725e 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -551,22 +551,15 @@ static int __init reboot_setup(char *str)
 			break;
 
 		case 's':
-		{
-			int rc;
-
-			if (isdigit(*(str+1))) {
-				rc = kstrtoint(str+1, 0, &reboot_cpu);
-				if (rc)
-					return rc;
-			} else if (str[1] == 'm' && str[2] == 'p' &&
-				   isdigit(*(str+3))) {
-				rc = kstrtoint(str+3, 0, &reboot_cpu);
-				if (rc)
-					return rc;
-			} else
+			if (isdigit(*(str+1)))
+				reboot_cpu = simple_strtoul(str+1, NULL, 0);
+			else if (str[1] == 'm' && str[2] == 'p' &&
+							isdigit(*(str+3)))
+				reboot_cpu = simple_strtoul(str+3, NULL, 0);
+			else
 				*mode = REBOOT_SOFT;
 			break;
-		}
+
 		case 'g':
 			*mode = REBOOT_GPIO;
 			break;
commit 3347acc6fcd4ee71ad18a9ff9d9dac176b517329
Author: Arvind Sankar <nivedita at alum.mit.edu>
Date:   Fri Nov 13 22:51:59 2020 -0800

    compiler.h: fix barrier_data() on clang
    
    Commit 815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h
    mutually exclusive") neglected to copy barrier_data() from
    compiler-gcc.h into compiler-clang.h.
    
    The definition in compiler-gcc.h was really to work around clang's more
    aggressive optimization, so this broke barrier_data() on clang, and
    consequently memzero_explicit() as well.
    
    For example, this results in at least the memzero_explicit() call in
    lib/crypto/sha256.c:sha256_transform() being optimized away by clang.
    
    Fix this by moving the definition of barrier_data() into compiler.h.
    
    Also move the gcc/clang definition of barrier() into compiler.h,
    __memory_barrier() is icc-specific (and barrier() is already defined
    using it in compiler-intel.h) and doesn't belong in compiler.h.
    
    [rdunlap at infradead.org: fix ALPHA builds when SMP is not enabled]
    
    Link: https://lkml.kernel.org/r/20201101231835.4589-1-rdunlap@infradead.org
    Fixes: 815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h mutually exclusive")
    Signed-off-by: Arvind Sankar <nivedita at alum.mit.edu>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Tested-by: Nick Desaulniers <ndesaulniers at google.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Reviewed-by: Kees Cook <keescook at chromium.org>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201014212631.207844-1-nivedita@alum.mit.edu
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h
index 798027bb89be..640f09479bdf 100644
--- a/include/asm-generic/barrier.h
+++ b/include/asm-generic/barrier.h
@@ -13,6 +13,7 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/compiler.h>
 #include <asm/rwonce.h>
 
 #ifndef nop
diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
index 230604e7f057..dd7233c48bf3 100644
--- a/include/linux/compiler-clang.h
+++ b/include/linux/compiler-clang.h
@@ -60,12 +60,6 @@
 #define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
 #endif
 
-/* The following are for compatibility with GCC, from compiler-gcc.h,
- * and may be redefined here because they should not be shared with other
- * compilers, like ICC.
- */
-#define barrier() __asm__ __volatile__("" : : : "memory")
-
 #if __has_feature(shadow_call_stack)
 # define __noscs	__attribute__((__no_sanitize__("shadow-call-stack")))
 #endif
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 5deb37024574..74c6c0486eed 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -15,25 +15,6 @@
 # error Sorry, your version of GCC is too old - please use 4.9 or newer.
 #endif
 
-/* Optimization barrier */
-
-/* The "volatile" is due to gcc bugs */
-#define barrier() __asm__ __volatile__("": : :"memory")
-/*
- * This version is i.e. to prevent dead stores elimination on @ptr
- * where gcc and llvm may behave differently when otherwise using
- * normal barrier(): while gcc behavior gets along with a normal
- * barrier(), llvm needs an explicit input variable to be assumed
- * clobbered. The issue is as follows: while the inline asm might
- * access any memory it wants, the compiler could have fit all of
- * @ptr into memory registers instead, and since @ptr never escaped
- * from that, it proved that the inline asm wasn't touching any of
- * it. This version works well with both compilers, i.e. we're telling
- * the compiler that the inline asm absolutely may see the contents
- * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
- */
-#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
-
 /*
  * This macro obfuscates arithmetic on a variable address so that gcc
  * shouldn't recognize the original var, and make assumptions about it.
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index e512f5505dad..b8fe0c23cfff 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -80,11 +80,25 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
 
 /* Optimization barrier */
 #ifndef barrier
-# define barrier() __memory_barrier()
+/* The "volatile" is due to gcc bugs */
+# define barrier() __asm__ __volatile__("": : :"memory")
 #endif
 
 #ifndef barrier_data
-# define barrier_data(ptr) barrier()
+/*
+ * This version is i.e. to prevent dead stores elimination on @ptr
+ * where gcc and llvm may behave differently when otherwise using
+ * normal barrier(): while gcc behavior gets along with a normal
+ * barrier(), llvm needs an explicit input variable to be assumed
+ * clobbered. The issue is as follows: while the inline asm might
+ * access any memory it wants, the compiler could have fit all of
+ * @ptr into memory registers instead, and since @ptr never escaped
+ * from that, it proved that the inline asm wasn't touching any of
+ * it. This version works well with both compilers, i.e. we're telling
+ * the compiler that the inline asm absolutely may see the contents
+ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
+ */
+# define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
 #endif
 
 /* workaround for GCC PR82365 if needed */
commit 96e1fac162cc0086c50b2b14062112adb2ba640e
Author: Jason Gunthorpe <jgg at nvidia.com>
Date:   Fri Nov 13 22:51:56 2020 -0800

    mm/gup: use unpin_user_pages() in __gup_longterm_locked()
    
    When FOLL_PIN is passed to __get_user_pages() the page list must be put
    back using unpin_user_pages() otherwise the page pin reference persists
    in a corrupted state.
    
    There are two places in the unwind of __gup_longterm_locked() that put
    the pages back without checking.  Normally on error this function would
    return the partial page list making this the caller's responsibility,
    but in these two cases the caller is not allowed to see these pages at
    all.
    
    Fixes: 3faa52c03f44 ("mm/gup: track FOLL_PIN pages")
    Reported-by: Ira Weiny <ira.weiny at intel.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Ira Weiny <ira.weiny at intel.com>
    Reviewed-by: John Hubbard <jhubbard at nvidia.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
    Cc: Dan Williams <dan.j.williams at intel.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/0-v2-3ae7d9d162e2+2a7-gup_cma_fix_jgg@nvidia.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/gup.c b/mm/gup.c
index 102877ed77a4..98eb8e6d2609 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -1647,8 +1647,11 @@ check_again:
 		/*
 		 * drop the above get_user_pages reference.
 		 */
-		for (i = 0; i < nr_pages; i++)
-			put_page(pages[i]);
+		if (gup_flags & FOLL_PIN)
+			unpin_user_pages(pages, nr_pages);
+		else
+			for (i = 0; i < nr_pages; i++)
+				put_page(pages[i]);
 
 		if (migrate_pages(&cma_page_list, alloc_migration_target, NULL,
 			(unsigned long)&mtc, MIGRATE_SYNC, MR_CONTIG_RANGE)) {
@@ -1728,8 +1731,11 @@ static long __gup_longterm_locked(struct mm_struct *mm,
 			goto out;
 
 		if (check_dax_vmas(vmas_tmp, rc)) {
-			for (i = 0; i < rc; i++)
-				put_page(pages[i]);
+			if (gup_flags & FOLL_PIN)
+				unpin_user_pages(pages, rc);
+			else
+				for (i = 0; i < rc; i++)
+					put_page(pages[i]);
 			rc = -EOPNOTSUPP;
 			goto out;
 		}
commit 22e4663e916321b72972c69ca0c6b962f529bd78
Author: Laurent Dufour <ldufour at linux.ibm.com>
Date:   Fri Nov 13 22:51:53 2020 -0800

    mm/slub: fix panic in slab_alloc_node()
    
    While doing memory hot-unplug operation on a PowerPC VM running 1024 CPUs
    with 11TB of ram, I hit the following panic:
    
        BUG: Kernel NULL pointer dereference on read at 0x00000007
        Faulting instruction address: 0xc000000000456048
        Oops: Kernel access of bad area, sig: 11 [#2]
        LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS= 2048 NUMA pSeries
        Modules linked in: rpadlpar_io rpaphp
        CPU: 160 PID: 1 Comm: systemd Tainted: G      D           5.9.0 #1
        NIP:  c000000000456048 LR: c000000000455fd4 CTR: c00000000047b350
        REGS: c00006028d1b77a0 TRAP: 0300   Tainted: G      D            (5.9.0)
        MSR:  8000000000009033 <SF,EE,ME,IR,DR,RI,LE>  CR: 24004228  XER: 00000000
        CFAR: c00000000000f1b0 DAR: 0000000000000007 DSISR: 40000000 IRQMASK: 0
        GPR00: c000000000455fd4 c00006028d1b7a30 c000000001bec800 0000000000000000
        GPR04: 0000000000000dc0 0000000000000000 00000000000374ef c00007c53df99320
        GPR08: 000007c53c980000 0000000000000000 000007c53c980000 0000000000000000
        GPR12: 0000000000004400 c00000001e8e4400 0000000000000000 0000000000000f6a
        GPR16: 0000000000000000 c000000001c25930 c000000001d62528 00000000000000c1
        GPR20: c000000001d62538 c00006be469e9000 0000000fffffffe0 c0000000003c0ff8
        GPR24: 0000000000000018 0000000000000000 0000000000000dc0 0000000000000000
        GPR28: c00007c513755700 c000000001c236a4 c00007bc4001f800 0000000000000001
        NIP [c000000000456048] __kmalloc_node+0x108/0x790
        LR [c000000000455fd4] __kmalloc_node+0x94/0x790
        Call Trace:
          kvmalloc_node+0x58/0x110
          mem_cgroup_css_online+0x10c/0x270
          online_css+0x48/0xd0
          cgroup_apply_control_enable+0x2c4/0x470
          cgroup_mkdir+0x408/0x5f0
          kernfs_iop_mkdir+0x90/0x100
          vfs_mkdir+0x138/0x250
          do_mkdirat+0x154/0x1c0
          system_call_exception+0xf8/0x200
          system_call_common+0xf0/0x27c
        Instruction dump:
        e93e0000 e90d0030 39290008 7cc9402a e94d0030 e93e0000 7ce95214 7f89502a
        2fbc0000 419e0018 41920230 e9270010 <89290007> 7f994800 419e0220 7ee6bb78
    
    This pointing to the following code:
    
        mm/slub.c:2851
                if (unlikely(!object || !node_match(page, node))) {
        c000000000456038:       00 00 bc 2f     cmpdi   cr7,r28,0
        c00000000045603c:       18 00 9e 41     beq     cr7,c000000000456054 <__kmalloc_node+0x114>
        node_match():
        mm/slub.c:2491
                if (node != NUMA_NO_NODE && page_to_nid(page) != node)
        c000000000456040:       30 02 92 41     beq     cr4,c000000000456270 <__kmalloc_node+0x330>
        page_to_nid():
        include/linux/mm.h:1294
        c000000000456044:       10 00 27 e9     ld      r9,16(r7)
        c000000000456048:       07 00 29 89     lbz     r9,7(r9)    <<<< r9 = NULL
        node_match():
        mm/slub.c:2491
        c00000000045604c:       00 48 99 7f     cmpw    cr7,r25,r9
        c000000000456050:       20 02 9e 41     beq     cr7,c000000000456270 <__kmalloc_node+0x330>
    
    The panic occurred in slab_alloc_node() when checking for the page's node:
    
            object = c->freelist;
            page = c->page;
            if (unlikely(!object || !node_match(page, node))) {
                    object = __slab_alloc(s, gfpflags, node, addr, c);
                    stat(s, ALLOC_SLOWPATH);
    
    The issue is that object is not NULL while page is NULL which is odd but
    may happen if the cache flush happened after loading object but before
    loading page.  Thus checking for the page pointer is required too.
    
    The cache flush is done through an inter processor interrupt when a
    piece of memory is off-lined.  That interrupt is triggered when a memory
    hot-unplug operation is initiated and offline_pages() is calling the
    slub's MEM_GOING_OFFLINE callback slab_mem_going_offline_callback()
    which is calling flush_cpu_slab().  If that interrupt is caught between
    the reading of c->freelist and the reading of c->page, this could lead
    to such a situation.  That situation is expected and the later call to
    this_cpu_cmpxchg_double() will detect the change to c->freelist and redo
    the whole operation.
    
    In commit 6159d0f5c03e ("mm/slub.c: page is always non-NULL in
    node_match()") check on the page pointer has been removed assuming that
    page is always valid when it is called.  It happens that this is not
    true in that particular case, so check for page before calling
    node_match() here.
    
    Fixes: 6159d0f5c03e ("mm/slub.c: page is always non-NULL in node_match()")
    Signed-off-by: Laurent Dufour <ldufour at linux.ibm.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Acked-by: Vlastimil Babka <vbabka at suse.cz>
    Acked-by: Christoph Lameter <cl at linux.com>
    Cc: Wei Yang <richard.weiyang at gmail.com>
    Cc: Pekka Enberg <penberg at kernel.org>
    Cc: David Rientjes <rientjes at google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim at lge.com>
    Cc: Nathan Lynch <nathanl at linux.ibm.com>
    Cc: Scott Cheloha <cheloha at linux.ibm.com>
    Cc: Michal Hocko <mhocko at suse.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201027190406.33283-1-ldufour@linux.ibm.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/slub.c b/mm/slub.c
index b30be2385d1c..34dcc09e2ec9 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2852,7 +2852,7 @@ redo:
 
 	object = c->freelist;
 	page = c->page;
-	if (unlikely(!object || !node_match(page, node))) {
+	if (unlikely(!object || !page || !node_match(page, node))) {
 		object = __slab_alloc(s, gfpflags, node, addr, c);
 	} else {
 		void *next_object = get_freepointer_safe(s, object);
commit 044747e971ace469064e68a0e8b3666011f0f3bd
Author: Dmitry Baryshkov <dbaryshkov at gmail.com>
Date:   Fri Nov 13 22:51:49 2020 -0800

    mailmap: fix entry for Dmitry Baryshkov/Eremin-Solenikov
    
    Change back surname to new (old) one.  Dmitry Baryshkov -> Dmitry
    Eremin-Solenikov -> Dmitry Baryshkov.  Map several odd entries to main
    identity.
    
    Signed-off-by: Dmitry Baryshkov <dbaryshkov at gmail.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Link: https://lkml.kernel.org/r/20201103005158.1181426-1-dmitry.baryshkov@linaro.org
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/.mailmap b/.mailmap
index 1e14566a3d56..505b3d771964 100644
--- a/.mailmap
+++ b/.mailmap
@@ -82,7 +82,10 @@ Dengcheng Zhu <dzhu at wavecomp.com> <dengcheng.zhu at gmail.com>
 Dengcheng Zhu <dzhu at wavecomp.com> <dengcheng.zhu at imgtec.com>
 Dengcheng Zhu <dzhu at wavecomp.com> <dengcheng.zhu at mips.com>
 <dev.kurt at vandijck-laurijssen.be> <kurt.van.dijck at eia.be>
-Dmitry Eremin-Solenikov <dbaryshkov at gmail.com>
+Dmitry Baryshkov <dbaryshkov at gmail.com>
+Dmitry Baryshkov <dbaryshkov at gmail.com> <[dbaryshkov at gmail.com]>
+Dmitry Baryshkov <dbaryshkov at gmail.com> <dmitry_baryshkov at mentor.com>
+Dmitry Baryshkov <dbaryshkov at gmail.com> <dmitry_eremin at mentor.com>
 Dmitry Safonov <0x7f454c46 at gmail.com> <dima at arista.com>
 Dmitry Safonov <0x7f454c46 at gmail.com> <d.safonov at partner.samsung.com>
 Dmitry Safonov <0x7f454c46 at gmail.com> <dsafonov at virtuozzo.com>
commit 2da9f6305f306ffbbb44790675799328fb73119d
Author: Nicholas Piggin <npiggin at gmail.com>
Date:   Fri Nov 13 22:51:46 2020 -0800

    mm/vmscan: fix NR_ISOLATED_FILE corruption on 64-bit
    
    Previously the negated unsigned long would be cast back to signed long
    which would have the correct negative value.  After commit 730ec8c01a2b
    ("mm/vmscan.c: change prototype for shrink_page_list"), the large
    unsigned int converts to a large positive signed long.
    
    Symptoms include CMA allocations hanging forever holding the cma_mutex
    due to alloc_contig_range->...->isolate_migratepages_block waiting
    forever in "while (unlikely(too_many_isolated(pgdat)))".
    
    [akpm at linux-foundation.org: fix -stat.nr_lazyfree_fail as well, per Michal]
    
    Fixes: 730ec8c01a2b ("mm/vmscan.c: change prototype for shrink_page_list")
    Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Acked-by: Michal Hocko <mhocko at suse.com>
    Cc: Vaneet Narang <v.narang at samsung.com>
    Cc: Maninder Singh <maninder1.s at samsung.com>
    Cc: Amit Sahrawat <a.sahrawat at samsung.com>
    Cc: Mel Gorman <mgorman at suse.de>
    Cc: Vlastimil Babka <vbabka at suse.cz>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201029032320.1448441-1-npiggin@gmail.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 1b8f0e059767..7b4e31eac2cf 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1516,7 +1516,8 @@ unsigned int reclaim_clean_pages_from_list(struct zone *zone,
 	nr_reclaimed = shrink_page_list(&clean_pages, zone->zone_pgdat, &sc,
 			TTU_IGNORE_ACCESS, &stat, true);
 	list_splice(&clean_pages, page_list);
-	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE, -nr_reclaimed);
+	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE,
+			    -(long)nr_reclaimed);
 	/*
 	 * Since lazyfree pages are isolated from file LRU from the beginning,
 	 * they will rotate back to anonymous LRU in the end if it failed to
@@ -1526,7 +1527,7 @@ unsigned int reclaim_clean_pages_from_list(struct zone *zone,
 	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_ANON,
 			    stat.nr_lazyfree_fail);
 	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE,
-			    -stat.nr_lazyfree_fail);
+			    -(long)stat.nr_lazyfree_fail);
 	return nr_reclaimed;
 }
 
commit d20bdd571ee5c9966191568527ecdb1bd4b52368
Author: Zi Yan <ziy at nvidia.com>
Date:   Fri Nov 13 22:51:43 2020 -0800

    mm/compaction: stop isolation if too many pages are isolated and we have pages to migrate
    
    In isolate_migratepages_block, if we have too many isolated pages and
    nr_migratepages is not zero, we should try to migrate what we have
    without wasting time on isolating.
    
    In theory it's possible that multiple parallel compactions will cause
    too_many_isolated() to become true even if each has isolated less than
    COMPACT_CLUSTER_MAX, and loop forever in the while loop.  Bailing
    immediately prevents that.
    
    [vbabka at suse.cz: changelog addition]
    
    Fixes: 1da2f328fa64 (“mm,thp,compaction,cma: allow THP migration for CMA allocations”)
    Suggested-by: Vlastimil Babka <vbabka at suse.cz>
    Signed-off-by: Zi Yan <ziy at nvidia.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Cc: <stable at vger.kernel.org>
    Cc: Mel Gorman <mgorman at techsingularity.net>
    Cc: Michal Hocko <mhocko at kernel.org>
    Cc: Rik van Riel <riel at surriel.com>
    Cc: Yang Shi <shy828301 at gmail.com>
    Link: https://lkml.kernel.org/r/20201030183809.3616803-2-zi.yan@sent.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/compaction.c b/mm/compaction.c
index d549a4521edf..13cb7a961b31 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -817,6 +817,10 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
 	 * delay for some time until fewer pages are isolated
 	 */
 	while (unlikely(too_many_isolated(pgdat))) {
+		/* stop isolation if there are still pages not migrated */
+		if (cc->nr_migratepages)
+			return 0;
+
 		/* async migration should just abort */
 		if (cc->mode == MIGRATE_ASYNC)
 			return 0;
commit 38935861d85a4d9a353d1dd5a156c97700e2765d
Author: Zi Yan <ziy at nvidia.com>
Date:   Fri Nov 13 22:51:40 2020 -0800

    mm/compaction: count pages and stop correctly during page isolation
    
    In isolate_migratepages_block, when cc->alloc_contig is true, we are
    able to isolate compound pages.  But nr_migratepages and nr_isolated did
    not count compound pages correctly, causing us to isolate more pages
    than we thought.
    
    So count compound pages as the number of base pages they contain.
    Otherwise, we might be trapped in too_many_isolated while loop, since
    the actual isolated pages can go up to COMPACT_CLUSTER_MAX*512=16384,
    where COMPACT_CLUSTER_MAX is 32, since we stop isolation after
    cc->nr_migratepages reaches to COMPACT_CLUSTER_MAX.
    
    In addition, after we fix the issue above, cc->nr_migratepages could
    never be equal to COMPACT_CLUSTER_MAX if compound pages are isolated,
    thus page isolation could not stop as we intended.  Change the isolation
    stop condition to '>='.
    
    The issue can be triggered as follows:
    
    In a system with 16GB memory and an 8GB CMA region reserved by
    hugetlb_cma, if we first allocate 10GB THPs and mlock them (so some THPs
    are allocated in the CMA region and mlocked), reserving 6 1GB hugetlb
    pages via /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages will
    get stuck (looping in too_many_isolated function) until we kill either
    task.  With the patch applied, oom will kill the application with 10GB
    THPs and let hugetlb page reservation finish.
    
    [ziy at nvidia.com: v3]
    
    Link: https://lkml.kernel.org/r/20201030183809.3616803-1-zi.yan@sent.com
    Fixes: 1da2f328fa64 ("cmm,thp,compaction,cma: allow THP migration for CMA allocations")
    Signed-off-by: Zi Yan <ziy at nvidia.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Reviewed-by: Yang Shi <shy828301 at gmail.com>
    Acked-by: Vlastimil Babka <vbabka at suse.cz>
    Cc: Rik van Riel <riel at surriel.com>
    Cc: Michal Hocko <mhocko at kernel.org>
    Cc: Mel Gorman <mgorman at techsingularity.net>
    Cc: <stable at vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201029200435.3386066-1-zi.yan@sent.com
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/mm/compaction.c b/mm/compaction.c
index 6e0ee5641788..d549a4521edf 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1012,8 +1012,8 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
 
 isolate_success:
 		list_add(&page->lru, &cc->migratepages);
-		cc->nr_migratepages++;
-		nr_isolated++;
+		cc->nr_migratepages += compound_nr(page);
+		nr_isolated += compound_nr(page);
 
 		/*
 		 * Avoid isolating too much unless this block is being
@@ -1021,7 +1021,7 @@ isolate_success:
 		 * or a lock is contended. For contention, isolate quickly to
 		 * potentially remove one source of contention.
 		 */
-		if (cc->nr_migratepages == COMPACT_CLUSTER_MAX &&
+		if (cc->nr_migratepages >= COMPACT_CLUSTER_MAX &&
 		    !cc->rescan && !cc->contended) {
 			++low_pfn;
 			break;
@@ -1132,7 +1132,7 @@ isolate_migratepages_range(struct compact_control *cc, unsigned long start_pfn,
 		if (!pfn)
 			break;
 
-		if (cc->nr_migratepages == COMPACT_CLUSTER_MAX)
+		if (cc->nr_migratepages >= COMPACT_CLUSTER_MAX)
 			break;
 	}
 
commit 37344718bd7032639a02053e06b51697f90154ce
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Thu Nov 12 19:23:59 2020 +0800

    net: phy: smsc: add missed clk_disable_unprepare in smsc_phy_probe()
    
    Add the missing clk_disable_unprepare() before return from
    smsc_phy_probe() in the error handling case.
    
    Fixes: bedd8d78aba3 ("net: phy: smsc: LAN8710/20: add phy refclk in support")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Link: https://lore.kernel.org/r/1605180239-1792-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
index ec97669be5c2..0fc39ac5ca88 100644
--- a/drivers/net/phy/smsc.c
+++ b/drivers/net/phy/smsc.c
@@ -291,8 +291,10 @@ static int smsc_phy_probe(struct phy_device *phydev)
 		return ret;
 
 	ret = clk_set_rate(priv->refclk, 50 * 1000 * 1000);
-	if (ret)
+	if (ret) {
+		clk_disable_unprepare(priv->refclk);
 		return ret;
+	}
 
 	return 0;
 }
commit b7131ee0bac5e5df73e4098e77bbddb3a31d06ff
Author: Christoph Hellwig <hch at lst.de>
Date:   Sat Nov 14 19:12:46 2020 +0100

    blk-cgroup: fix a hd_struct leak in blkcg_fill_root_iostats
    
    disk_get_part needs to be paired with a disk_put_part.
    
    Cc: stable at vger.kernel.org
    Fixes: ef45fe470e1 ("blk-cgroup: show global disk stats in root cgroup io.stat")
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index c68bdf58c9a6..54fbe1e80cc4 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -849,6 +849,7 @@ static void blkcg_fill_root_iostats(void)
 			blkg_iostat_set(&blkg->iostat.cur, &tmp);
 			u64_stats_update_end(&blkg->iostat.sync);
 		}
+		disk_put_part(part);
 	}
 }
 
commit e5b1032a656e9aa4c7a4df77cb9156a2a651a5f9
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Tue Nov 10 14:38:35 2020 +0100

    iio: accel: kxcjk1013: Add support for KIOX010A ACPI DSM for setting tablet-mode
    
    Some 360 degree hinges (yoga) style 2-in-1 devices use 2 KXCJ91008-s
    to allow the OS to determine the angle between the display and the base
    of the device, so that the OS can determine if the 2-in-1 is in laptop
    or in tablet-mode.
    
    On Windows both accelerometers are read by a special HingeAngleService
    process; and this process calls a DSM (Device Specific Method) on the
    ACPI KIOX010A device node for the sensor in the display, to let the
    embedded-controller (EC) know about the mode so that it can disable the
    kbd and touchpad to avoid spurious input while folded into tablet-mode.
    
    This notifying of the EC is problematic because sometimes the EC comes up
    thinking that device is in tablet-mode and the kbd and touchpad do not
    work. This happens for example on Irbis NB111 devices after a suspend /
    resume cycle (after a complete battery drain / hard reset without having
    booted Windows at least once). Other 2-in-1s which are likely affected
    too are e.g. the Teclast F5 and F6 series.
    
    The kxcjk-1013 driver may seem like a strange place to deal with this,
    but since it is *the* driver for the ACPI KIOX010A device, it is also
    the driver which has access to the ACPI handle needed by the DSM.
    
    Add support for calling the DSM and on probe unconditionally tell the
    EC that the device is laptop mode, fixing the kbd and touchpad sometimes
    not working.
    
    Fixes: 7f6232e69539 ("iio: accel: kxcjk1013: Add KIOX010A ACPI Hardware-ID")
    Reported-and-tested-by: russianneuromancer <russianneuromancer at ya.ru>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Cc: <Stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201110133835.129080-3-hdegoede@redhat.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index abeb0d254046..560a3373ff20 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -129,6 +129,7 @@ enum kx_chipset {
 enum kx_acpi_type {
 	ACPI_GENERIC,
 	ACPI_SMO8500,
+	ACPI_KIOX010A,
 };
 
 struct kxcjk1013_data {
@@ -275,6 +276,32 @@ static const struct {
 			      {19163, 1, 0},
 			      {38326, 0, 1} };
 
+#ifdef CONFIG_ACPI
+enum kiox010a_fn_index {
+	KIOX010A_SET_LAPTOP_MODE = 1,
+	KIOX010A_SET_TABLET_MODE = 2,
+};
+
+static int kiox010a_dsm(struct device *dev, int fn_index)
+{
+	acpi_handle handle = ACPI_HANDLE(dev);
+	guid_t kiox010a_dsm_guid;
+	union acpi_object *obj;
+
+	if (!handle)
+		return -ENODEV;
+
+	guid_parse("1f339696-d475-4e26-8cad-2e9f8e6d7a91", &kiox010a_dsm_guid);
+
+	obj = acpi_evaluate_dsm(handle, &kiox010a_dsm_guid, 1, fn_index, NULL);
+	if (!obj)
+		return -EIO;
+
+	ACPI_FREE(obj);
+	return 0;
+}
+#endif
+
 static int kxcjk1013_set_mode(struct kxcjk1013_data *data,
 			      enum kxcjk1013_mode mode)
 {
@@ -352,6 +379,13 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
 {
 	int ret;
 
+#ifdef CONFIG_ACPI
+	if (data->acpi_type == ACPI_KIOX010A) {
+		/* Make sure the kbd and touchpad on 2-in-1s using 2 KXCJ91008-s work */
+		kiox010a_dsm(&data->client->dev, KIOX010A_SET_LAPTOP_MODE);
+	}
+#endif
+
 	ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_WHO_AM_I);
 	if (ret < 0) {
 		dev_err(&data->client->dev, "Error reading who_am_i\n");
@@ -1262,6 +1296,8 @@ static const char *kxcjk1013_match_acpi_device(struct device *dev,
 
 	if (strcmp(id->id, "SMO8500") == 0)
 		*acpi_type = ACPI_SMO8500;
+	else if (strcmp(id->id, "KIOX010A") == 0)
+		*acpi_type = ACPI_KIOX010A;
 
 	*chipset = (enum kx_chipset)id->driver_data;
 
commit 11e94f28c3de35d5ad1ac6a242a5b30f4378991a
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Tue Nov 10 14:38:34 2020 +0100

    iio: accel: kxcjk1013: Replace is_smo8500_device with an acpi_type enum
    
    Replace the boolean is_smo8500_device variable with an acpi_type enum.
    
    For now this can be either ACPI_GENERIC or ACPI_SMO8500, this is a
    preparation patch for adding special handling for the KIOX010A ACPI HID,
    which will add a ACPI_KIOX010A acpi_type to the introduced enum.
    
    For stable as needed as precursor for next patch.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Fixes: 7f6232e69539 ("iio: accel: kxcjk1013: Add KIOX010A ACPI Hardware-ID")
    Cc: <Stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201110133835.129080-2-hdegoede@redhat.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index beb38d9d607d..abeb0d254046 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -126,6 +126,11 @@ enum kx_chipset {
 	KX_MAX_CHIPS /* this must be last */
 };
 
+enum kx_acpi_type {
+	ACPI_GENERIC,
+	ACPI_SMO8500,
+};
+
 struct kxcjk1013_data {
 	struct i2c_client *client;
 	struct iio_trigger *dready_trig;
@@ -143,7 +148,7 @@ struct kxcjk1013_data {
 	bool motion_trigger_on;
 	int64_t timestamp;
 	enum kx_chipset chipset;
-	bool is_smo8500_device;
+	enum kx_acpi_type acpi_type;
 };
 
 enum kxcjk1013_axis {
@@ -1247,7 +1252,7 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
 
 static const char *kxcjk1013_match_acpi_device(struct device *dev,
 					       enum kx_chipset *chipset,
-					       bool *is_smo8500_device)
+					       enum kx_acpi_type *acpi_type)
 {
 	const struct acpi_device_id *id;
 
@@ -1256,7 +1261,7 @@ static const char *kxcjk1013_match_acpi_device(struct device *dev,
 		return NULL;
 
 	if (strcmp(id->id, "SMO8500") == 0)
-		*is_smo8500_device = true;
+		*acpi_type = ACPI_SMO8500;
 
 	*chipset = (enum kx_chipset)id->driver_data;
 
@@ -1299,7 +1304,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
 	} else if (ACPI_HANDLE(&client->dev)) {
 		name = kxcjk1013_match_acpi_device(&client->dev,
 						   &data->chipset,
-						   &data->is_smo8500_device);
+						   &data->acpi_type);
 	} else
 		return -ENODEV;
 
@@ -1316,7 +1321,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
 	indio_dev->modes = INDIO_DIRECT_MODE;
 	indio_dev->info = &kxcjk1013_info;
 
-	if (client->irq > 0 && !data->is_smo8500_device) {
+	if (client->irq > 0 && data->acpi_type != ACPI_SMO8500) {
 		ret = devm_request_threaded_irq(&client->dev, client->irq,
 						kxcjk1013_data_rdy_trig_poll,
 						kxcjk1013_event_handler,
commit 944d1444d53f5a213457e5096db370cfd06923d4
Author: Jens Axboe <axboe at kernel.dk>
Date:   Fri Nov 13 16:48:44 2020 -0700

    io_uring: handle -EOPNOTSUPP on path resolution
    
    Any attempt to do path resolution on /proc/self from an async worker will
    yield -EOPNOTSUPP. We can safely do that resolution from the task itself,
    and without blocking, so retry it from there.
    
    Ideally io_uring would know this upfront and not have to go through the
    worker thread to find out, but that doesn't currently seem feasible.
    
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index c77584de68d7..f05978a74ce1 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -478,6 +478,7 @@ struct io_sr_msg {
 struct io_open {
 	struct file			*file;
 	int				dfd;
+	bool				ignore_nonblock;
 	struct filename			*filename;
 	struct open_how			how;
 	unsigned long			nofile;
@@ -3796,6 +3797,7 @@ static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe
 		return ret;
 	}
 	req->open.nofile = rlimit(RLIMIT_NOFILE);
+	req->open.ignore_nonblock = false;
 	req->flags |= REQ_F_NEED_CLEANUP;
 	return 0;
 }
@@ -3839,7 +3841,7 @@ static int io_openat2(struct io_kiocb *req, bool force_nonblock)
 	struct file *file;
 	int ret;
 
-	if (force_nonblock)
+	if (force_nonblock && !req->open.ignore_nonblock)
 		return -EAGAIN;
 
 	ret = build_open_flags(&req->open.how, &op);
@@ -3854,6 +3856,21 @@ static int io_openat2(struct io_kiocb *req, bool force_nonblock)
 	if (IS_ERR(file)) {
 		put_unused_fd(ret);
 		ret = PTR_ERR(file);
+		/*
+		 * A work-around to ensure that /proc/self works that way
+		 * that it should - if we get -EOPNOTSUPP back, then assume
+		 * that proc_self_get_link() failed us because we're in async
+		 * context. We should be safe to retry this from the task
+		 * itself with force_nonblock == false set, as it should not
+		 * block on lookup. Would be nice to know this upfront and
+		 * avoid the async dance, but doesn't seem feasible.
+		 */
+		if (ret == -EOPNOTSUPP && io_wq_current_is_worker()) {
+			req->open.ignore_nonblock = true;
+			refcount_inc(&req->refs);
+			io_req_task_queue(req);
+			return 0;
+		}
 	} else {
 		fsnotify_open(file);
 		fd_install(ret, file);
commit f782e2c300a717233b64697affda3ea7aac00b2b
Author: Dmitrii Banshchikov <me at ubique.spb.ru>
Date:   Fri Nov 13 17:17:56 2020 +0000

    bpf: Relax return code check for subprograms
    
    Currently verifier enforces return code checks for subprograms in the
    same manner as it does for program entry points. This prevents returning
    arbitrary scalar values from subprograms. Scalar type of returned values
    is checked by btf_prepare_func_args() and hence it should be safe to
    allow only scalars for now. Relax return code checks for subprograms and
    allow any correct scalar values.
    
    Fixes: 51c39bb1d5d10 (bpf: Introduce function-by-function verification)
    Signed-off-by: Dmitrii Banshchikov <me at ubique.spb.ru>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201113171756.90594-1-me@ubique.spb.ru

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 6204ec705d80..1388bf733071 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -7786,9 +7786,11 @@ static int check_return_code(struct bpf_verifier_env *env)
 	struct tnum range = tnum_range(0, 1);
 	enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
 	int err;
+	const bool is_subprog = env->cur_state->frame[0]->subprogno;
 
 	/* LSM and struct_ops func-ptr's return type could be "void" */
-	if ((prog_type == BPF_PROG_TYPE_STRUCT_OPS ||
+	if (!is_subprog &&
+	    (prog_type == BPF_PROG_TYPE_STRUCT_OPS ||
 	     prog_type == BPF_PROG_TYPE_LSM) &&
 	    !prog->aux->attach_func_proto->type)
 		return 0;
@@ -7808,6 +7810,16 @@ static int check_return_code(struct bpf_verifier_env *env)
 		return -EACCES;
 	}
 
+	reg = cur_regs(env) + BPF_REG_0;
+	if (is_subprog) {
+		if (reg->type != SCALAR_VALUE) {
+			verbose(env, "At subprogram exit the register R0 is not a scalar value (%s)\n",
+				reg_type_str[reg->type]);
+			return -EINVAL;
+		}
+		return 0;
+	}
+
 	switch (prog_type) {
 	case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
 		if (env->prog->expected_attach_type == BPF_CGROUP_UDP4_RECVMSG ||
@@ -7861,7 +7873,6 @@ static int check_return_code(struct bpf_verifier_env *env)
 		return 0;
 	}
 
-	reg = cur_regs(env) + BPF_REG_0;
 	if (reg->type != SCALAR_VALUE) {
 		verbose(env, "At program exit the register R0 is not a known value (%s)\n",
 			reg_type_str[reg->type]);
diff --git a/tools/testing/selftests/bpf/prog_tests/test_global_funcs.c b/tools/testing/selftests/bpf/prog_tests/test_global_funcs.c
index 193002b14d7f..32e4348b714b 100644
--- a/tools/testing/selftests/bpf/prog_tests/test_global_funcs.c
+++ b/tools/testing/selftests/bpf/prog_tests/test_global_funcs.c
@@ -60,6 +60,7 @@ void test_test_global_funcs(void)
 		{ "test_global_func5.o" , "expected pointer to ctx, but got PTR" },
 		{ "test_global_func6.o" , "modified ctx ptr R2" },
 		{ "test_global_func7.o" , "foo() doesn't return scalar" },
+		{ "test_global_func8.o" },
 	};
 	libbpf_print_fn_t old_print_fn = NULL;
 	int err, i, duration = 0;
diff --git a/tools/testing/selftests/bpf/progs/test_global_func8.c b/tools/testing/selftests/bpf/progs/test_global_func8.c
new file mode 100644
index 000000000000..d55a6544b1ab
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_global_func8.c
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (c) 2020 Facebook */
+#include <stddef.h>
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+__noinline int foo(struct __sk_buff *skb)
+{
+	return bpf_get_prandom_u32();
+}
+
+SEC("cgroup_skb/ingress")
+int test_cls(struct __sk_buff *skb)
+{
+	if (!foo(skb))
+		return 0;
+
+	return 1;
+}
commit 8168d23fbcee4f9f6c5a1ce8650417f09aef70eb
Author: Keith Busch <kbusch at kernel.org>
Date:   Fri Nov 13 10:45:45 2020 -0800

    nvme: fix memory leak freeing command effects
    
    xa_destroy() frees only internal data. The caller is responsible for
    freeing the exteranl objects referenced by an xarray.
    
    Fixes: 1cf7a12e09aa4 ("nvme: use an xarray to lookup the Commands Supported and Effects log")
    Signed-off-by: Keith Busch <kbusch at kernel.org>
    Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 2f96675cc0cf..9a270e49df17 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -4373,6 +4373,19 @@ void nvme_uninit_ctrl(struct nvme_ctrl *ctrl)
 }
 EXPORT_SYMBOL_GPL(nvme_uninit_ctrl);
 
+static void nvme_free_cels(struct nvme_ctrl *ctrl)
+{
+	struct nvme_effects_log	*cel;
+	unsigned long i;
+
+	xa_for_each (&ctrl->cels, i, cel) {
+		xa_erase(&ctrl->cels, i);
+		kfree(cel);
+	}
+
+	xa_destroy(&ctrl->cels);
+}
+
 static void nvme_free_ctrl(struct device *dev)
 {
 	struct nvme_ctrl *ctrl =
@@ -4382,8 +4395,7 @@ static void nvme_free_ctrl(struct device *dev)
 	if (!subsys || ctrl->instance != subsys->instance)
 		ida_simple_remove(&nvme_instance_ida, ctrl->instance);
 
-	xa_destroy(&ctrl->cels);
-
+	nvme_free_cels(ctrl);
 	nvme_mpath_uninit(ctrl);
 	__free_page(ctrl->discard_page);
 
commit f6224b8681326856937420e1db18564a934bf32b
Author: Keith Busch <kbusch at kernel.org>
Date:   Fri Nov 13 10:28:30 2020 -0800

    nvme: directly cache command effects log
    
    Remove the struct used for tracking known command effects logs in a
    list. This is now saved in an xarray that doesn't use these elements.
    Instead, store the log directly instead of the wrapper struct.
    
    Signed-off-by: Keith Busch <kbusch at kernel.org>
    Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 9b01afcb7777..2f96675cc0cf 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2929,7 +2929,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi,
 static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
 				struct nvme_effects_log **log)
 {
-	struct nvme_cel *cel = xa_load(&ctrl->cels, csi);
+	struct nvme_effects_log	*cel = xa_load(&ctrl->cels, csi);
 	int ret;
 
 	if (cel)
@@ -2940,16 +2940,15 @@ static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
 		return -ENOMEM;
 
 	ret = nvme_get_log(ctrl, 0x00, NVME_LOG_CMD_EFFECTS, 0, csi,
-			&cel->log, sizeof(cel->log), 0);
+			cel, sizeof(*cel), 0);
 	if (ret) {
 		kfree(cel);
 		return ret;
 	}
 
-	cel->csi = csi;
-	xa_store(&ctrl->cels, cel->csi, cel, GFP_KERNEL);
+	xa_store(&ctrl->cels, csi, cel, GFP_KERNEL);
 out:
-	*log = &cel->log;
+	*log = cel;
 	return 0;
 }
 
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index bc330bf0d3bd..567f7ad18a91 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -226,12 +226,6 @@ struct nvme_fault_inject {
 #endif
 };
 
-struct nvme_cel {
-	struct list_head	entry;
-	struct nvme_effects_log	log;
-	u8			csi;
-};
-
 struct nvme_ctrl {
 	bool comp_seen;
 	enum nvme_ctrl_state state;
commit 0f0d2c876c96d4908a9ef40959a44bec21bdd6cf
Author: Minwoo Im <minwoo.im.dev at gmail.com>
Date:   Thu Nov 5 23:28:47 2020 +0900

    nvme: free sq/cq dbbuf pointers when dbbuf set fails
    
    If Doorbell Buffer Config command fails even 'dev->dbbuf_dbs != NULL'
    which means OACS indicates that NVME_CTRL_OACS_DBBUF_SUPP is set,
    nvme_dbbuf_update_and_check_event() will check event even it's not been
    successfully set.
    
    This patch fixes mismatch among dbbuf for sq/cqs in case that dbbuf
    command fails.
    
    Signed-off-by: Minwoo Im <minwoo.im.dev at gmail.com>
    Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 0578ff253c47..3be352403839 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -292,9 +292,21 @@ static void nvme_dbbuf_init(struct nvme_dev *dev,
 	nvmeq->dbbuf_cq_ei = &dev->dbbuf_eis[cq_idx(qid, dev->db_stride)];
 }
 
+static void nvme_dbbuf_free(struct nvme_queue *nvmeq)
+{
+	if (!nvmeq->qid)
+		return;
+
+	nvmeq->dbbuf_sq_db = NULL;
+	nvmeq->dbbuf_cq_db = NULL;
+	nvmeq->dbbuf_sq_ei = NULL;
+	nvmeq->dbbuf_cq_ei = NULL;
+}
+
 static void nvme_dbbuf_set(struct nvme_dev *dev)
 {
 	struct nvme_command c;
+	unsigned int i;
 
 	if (!dev->dbbuf_dbs)
 		return;
@@ -308,6 +320,9 @@ static void nvme_dbbuf_set(struct nvme_dev *dev)
 		dev_warn(dev->ctrl.device, "unable to set dbbuf\n");
 		/* Free memory and continue on */
 		nvme_dbbuf_dma_free(dev);
+
+		for (i = 1; i <= dev->online_queues; i++)
+			nvme_dbbuf_free(&dev->queues[i]);
 	}
 }
 
commit 5c6fb4b28b165887c42c66731c90eaca818b04c6
Author: Lyude Paul <lyude at redhat.com>
Date:   Fri Nov 13 19:14:10 2020 -0500

    drm/nouveau/kms/nv50-: Use atomic encoder callbacks everywhere
    
    It turns out that I forgot to go through and make sure that I converted all
    encoder callbacks to use atomic_enable/atomic_disable(), so let's go and
    actually do that.
    
    Signed-off-by: Lyude Paul <lyude at redhat.com>
    Cc: Kirill A. Shutemov <kirill at shutemov.name>
    Fixes: 09838c4efe9a ("drm/nouveau/kms: Search for encoders' connectors properly")
    Signed-off-by: Ben Skeggs <bskeggs at redhat.com>

diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index b111fe24a06b..36d6b6093d16 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -455,7 +455,7 @@ nv50_outp_get_old_connector(struct nouveau_encoder *outp,
  * DAC
  *****************************************************************************/
 static void
-nv50_dac_disable(struct drm_encoder *encoder)
+nv50_dac_disable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
 	struct nv50_core *core = nv50_disp(encoder->dev)->core;
@@ -467,7 +467,7 @@ nv50_dac_disable(struct drm_encoder *encoder)
 }
 
 static void
-nv50_dac_enable(struct drm_encoder *encoder)
+nv50_dac_enable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
 	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
@@ -525,8 +525,8 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
 static const struct drm_encoder_helper_funcs
 nv50_dac_help = {
 	.atomic_check = nv50_outp_atomic_check,
-	.enable = nv50_dac_enable,
-	.disable = nv50_dac_disable,
+	.atomic_enable = nv50_dac_enable,
+	.atomic_disable = nv50_dac_disable,
 	.detect = nv50_dac_detect
 };
 
@@ -1055,7 +1055,7 @@ nv50_dp_bpc_to_depth(unsigned int bpc)
 }
 
 static void
-nv50_msto_enable(struct drm_encoder *encoder)
+nv50_msto_enable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nv50_head *head = nv50_head(encoder->crtc);
 	struct nv50_head_atom *armh = nv50_head_atom(head->base.base.state);
@@ -1101,7 +1101,7 @@ nv50_msto_enable(struct drm_encoder *encoder)
 }
 
 static void
-nv50_msto_disable(struct drm_encoder *encoder)
+nv50_msto_disable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nv50_msto *msto = nv50_msto(encoder);
 	struct nv50_mstc *mstc = msto->mstc;
@@ -1118,8 +1118,8 @@ nv50_msto_disable(struct drm_encoder *encoder)
 
 static const struct drm_encoder_helper_funcs
 nv50_msto_help = {
-	.disable = nv50_msto_disable,
-	.enable = nv50_msto_enable,
+	.atomic_disable = nv50_msto_disable,
+	.atomic_enable = nv50_msto_enable,
 	.atomic_check = nv50_msto_atomic_check,
 };
 
@@ -1645,8 +1645,7 @@ nv50_sor_disable(struct drm_encoder *encoder,
 }
 
 static void
-nv50_sor_enable(struct drm_encoder *encoder,
-		struct drm_atomic_state *state)
+nv50_sor_enable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
 	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
@@ -1873,7 +1872,7 @@ nv50_pior_atomic_check(struct drm_encoder *encoder,
 }
 
 static void
-nv50_pior_disable(struct drm_encoder *encoder)
+nv50_pior_disable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
 	struct nv50_core *core = nv50_disp(encoder->dev)->core;
@@ -1885,7 +1884,7 @@ nv50_pior_disable(struct drm_encoder *encoder)
 }
 
 static void
-nv50_pior_enable(struct drm_encoder *encoder)
+nv50_pior_enable(struct drm_encoder *encoder, struct drm_atomic_state *state)
 {
 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
 	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
@@ -1921,14 +1920,14 @@ nv50_pior_enable(struct drm_encoder *encoder)
 	}
 
 	core->func->pior->ctrl(core, nv_encoder->or, ctrl, asyh);
-	nv_encoder->crtc = encoder->crtc;
+	nv_encoder->crtc = &nv_crtc->base;
 }
 
 static const struct drm_encoder_helper_funcs
 nv50_pior_help = {
 	.atomic_check = nv50_pior_atomic_check,
-	.enable = nv50_pior_enable,
-	.disable = nv50_pior_disable,
+	.atomic_enable = nv50_pior_enable,
+	.atomic_disable = nv50_pior_disable,
 };
 
 static void
commit 6c27ffabeb19ebf7dd6d4ccc29f1e57d1ef445d8
Author: Ben Skeggs <bskeggs at redhat.com>
Date:   Sat Nov 14 13:50:44 2020 +1000

    drm/nouveau/ttm: avoid using nouveau_drm.ttm.type_vram prior to nv50
    
    Pre-NV50 chipsets don't currently use the MMU subsystem that later
    chipsets use, and type_vram is negative here, leading to an OOB memory
    access.
    
    This was previously guarded by a chipset check, restore that.
    
    Reported-by: Thomas Zimmermann <tzimmermann at suse.de>
    Fixes: 5839172f0980 ("drm/nouveau: explicitly specify caching to use")
    Signed-off-by: Ben Skeggs <bskeggs at redhat.com>

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 2ee75646ad6f..56b335a55966 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -350,14 +350,13 @@ set_placement_list(struct nouveau_drm *drm, struct ttm_place *pl, unsigned *n,
 
 	if (domain & NOUVEAU_GEM_DOMAIN_VRAM) {
 		struct nvif_mmu *mmu = &drm->client.mmu;
-		const u8 type = mmu->type[drm->ttm.type_vram].type;
 
 		pl[*n].mem_type = TTM_PL_VRAM;
 		pl[*n].flags = flags & ~TTM_PL_FLAG_CACHED;
 
 		/* Some BARs do not support being ioremapped WC */
 		if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA &&
-		    type & NVIF_MEM_UNCACHED)
+		    mmu->type[drm->ttm.type_vram].type & NVIF_MEM_UNCACHED)
 			pl[*n].flags &= ~TTM_PL_FLAG_WC;
 
 		(*n)++;
commit 630f512280604eecae0ddc2b3f8402f7931c56fd
Author: Alexander Kapshuk <alexander.kapshuk at gmail.com>
Date:   Tue Oct 13 15:47:25 2020 +0300

    drm/nouveau/kms: Fix NULL pointer dereference in nouveau_connector_detect_depth
    
    This oops manifests itself on the following hardware:
    01:00.0 VGA compatible controller: NVIDIA Corporation G98M [GeForce G 103M] (rev a1)
    
    Oct 09 14:17:46 lp-sasha kernel: BUG: kernel NULL pointer dereference, address: 0000000000000000
    Oct 09 14:17:46 lp-sasha kernel: #PF: supervisor read access in kernel mode
    Oct 09 14:17:46 lp-sasha kernel: #PF: error_code(0x0000) - not-present page
    Oct 09 14:17:46 lp-sasha kernel: PGD 0 P4D 0
    Oct 09 14:17:46 lp-sasha kernel: Oops: 0000 [#1] SMP PTI
    Oct 09 14:17:46 lp-sasha kernel: CPU: 1 PID: 191 Comm: systemd-udevd Not tainted 5.9.0-rc8-next-20201009 #38
    Oct 09 14:17:46 lp-sasha kernel: Hardware name: Hewlett-Packard Compaq Presario CQ61 Notebook PC/306A, BIOS F.03 03/23/2009
    Oct 09 14:17:46 lp-sasha kernel: RIP: 0010:nouveau_connector_detect_depth+0x71/0xc0 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel: Code: 0a 00 00 48 8b 49 48 c7 87 b8 00 00 00 06 00 00 00 80 b9 4d 0a 00 00 00 75 1e 83 fa 41 75 05 48 85 c0 75 29 8b 81 10 0d 00 00 <39> 06 7c 25 f6 81 14 0d 00 00 02 75 b7 c3 80 b9 0c 0d 00 00 00 75
    Oct 09 14:17:46 lp-sasha kernel: RSP: 0018:ffffc9000028f8c0 EFLAGS: 00010297
    Oct 09 14:17:46 lp-sasha kernel: RAX: 0000000000014c08 RBX: ffff8880369d4000 RCX: ffff8880369d3000
    Oct 09 14:17:46 lp-sasha kernel: RDX: 0000000000000040 RSI: 0000000000000000 RDI: ffff8880369d4000
    Oct 09 14:17:46 lp-sasha kernel: RBP: ffff88800601cc00 R08: ffff8880051da298 R09: ffffffff8226201a
    Oct 09 14:17:46 lp-sasha kernel: R10: ffff88800469aa80 R11: ffff888004c84ff8 R12: 0000000000000000
    Oct 09 14:17:46 lp-sasha kernel: R13: ffff8880051da000 R14: 0000000000002000 R15: 0000000000000003
    Oct 09 14:17:46 lp-sasha kernel: FS:  00007fd0192b3440(0000) GS:ffff8880bc900000(0000) knlGS:0000000000000000
    Oct 09 14:17:46 lp-sasha kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    Oct 09 14:17:46 lp-sasha kernel: CR2: 0000000000000000 CR3: 0000000004976000 CR4: 00000000000006e0
    Oct 09 14:17:46 lp-sasha kernel: Call Trace:
    Oct 09 14:17:46 lp-sasha kernel:  nouveau_connector_get_modes+0x1e6/0x240 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  ? kfree+0xb9/0x240
    Oct 09 14:17:46 lp-sasha kernel:  ? drm_connector_list_iter_next+0x7c/0xa0
    Oct 09 14:17:46 lp-sasha kernel:  drm_helper_probe_single_connector_modes+0x1ba/0x7c0
    Oct 09 14:17:46 lp-sasha kernel:  drm_client_modeset_probe+0x27e/0x1360
    Oct 09 14:17:46 lp-sasha kernel:  ? nvif_object_sclass_put+0xc/0x20 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  ? nouveau_cli_init+0x3cc/0x440 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  ? ktime_get_mono_fast_ns+0x49/0xa0
    Oct 09 14:17:46 lp-sasha kernel:  ? nouveau_drm_open+0x4e/0x180 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  __drm_fb_helper_initial_config_and_unlock+0x3f/0x4a0
    Oct 09 14:17:46 lp-sasha kernel:  ? drm_file_alloc+0x18f/0x260
    Oct 09 14:17:46 lp-sasha kernel:  ? mutex_lock+0x9/0x40
    Oct 09 14:17:46 lp-sasha kernel:  ? drm_client_init+0x110/0x160
    Oct 09 14:17:46 lp-sasha kernel:  nouveau_fbcon_init+0x14d/0x1c0 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  nouveau_drm_device_init+0x1c0/0x880 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  nouveau_drm_probe+0x11a/0x1e0 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel:  pci_device_probe+0xcd/0x140
    Oct 09 14:17:46 lp-sasha kernel:  really_probe+0xd8/0x400
    Oct 09 14:17:46 lp-sasha kernel:  driver_probe_device+0x4a/0xa0
    Oct 09 14:17:46 lp-sasha kernel:  device_driver_attach+0x9c/0xc0
    Oct 09 14:17:46 lp-sasha kernel:  __driver_attach+0x6f/0x100
    Oct 09 14:17:46 lp-sasha kernel:  ? device_driver_attach+0xc0/0xc0
    Oct 09 14:17:46 lp-sasha kernel:  bus_for_each_dev+0x75/0xc0
    Oct 09 14:17:46 lp-sasha kernel:  bus_add_driver+0x106/0x1c0
    Oct 09 14:17:46 lp-sasha kernel:  driver_register+0x86/0xe0
    Oct 09 14:17:46 lp-sasha kernel:  ? 0xffffffffa044e000
    Oct 09 14:17:46 lp-sasha kernel:  do_one_initcall+0x48/0x1e0
    Oct 09 14:17:46 lp-sasha kernel:  ? _cond_resched+0x11/0x60
    Oct 09 14:17:46 lp-sasha kernel:  ? kmem_cache_alloc_trace+0x19c/0x1e0
    Oct 09 14:17:46 lp-sasha kernel:  do_init_module+0x57/0x220
    Oct 09 14:17:46 lp-sasha kernel:  __do_sys_finit_module+0xa0/0xe0
    Oct 09 14:17:46 lp-sasha kernel:  do_syscall_64+0x33/0x40
    Oct 09 14:17:46 lp-sasha kernel:  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    Oct 09 14:17:46 lp-sasha kernel: RIP: 0033:0x7fd01a060d5d
    Oct 09 14:17:46 lp-sasha kernel: Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d e3 70 0c 00 f7 d8 64 89 01 48
    Oct 09 14:17:46 lp-sasha kernel: RSP: 002b:00007ffc8ad38a98 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
    Oct 09 14:17:46 lp-sasha kernel: RAX: ffffffffffffffda RBX: 0000563f6e7fd530 RCX: 00007fd01a060d5d
    Oct 09 14:17:46 lp-sasha kernel: RDX: 0000000000000000 RSI: 00007fd01a19f95d RDI: 000000000000000f
    Oct 09 14:17:46 lp-sasha kernel: RBP: 0000000000020000 R08: 0000000000000000 R09: 0000000000000007
    Oct 09 14:17:46 lp-sasha kernel: R10: 000000000000000f R11: 0000000000000246 R12: 00007fd01a19f95d
    Oct 09 14:17:46 lp-sasha kernel: R13: 0000000000000000 R14: 0000563f6e7fbc10 R15: 0000563f6e7fd530
    Oct 09 14:17:46 lp-sasha kernel: Modules linked in: nouveau(+) ttm xt_string xt_mark xt_LOG vgem v4l2_dv_timings uvcvideo ulpi udf ts_kmp ts_fsm ts_bm snd_aloop sil164 qat_dh895xccvf nf_nat_sip nf_nat_irc nf_nat_ftp nf_nat nf_log_ipv6 nf_log_ipv4 nf_log_common ltc2990 lcd intel_qat input_leds i2c_mux gspca_main videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_common videodev mc drivetemp cuse fuse crc_itu_t coretemp ch7006 ath5k ath algif_hash
    Oct 09 14:17:46 lp-sasha kernel: CR2: 0000000000000000
    Oct 09 14:17:46 lp-sasha kernel: ---[ end trace 0ddafe218ad30017 ]---
    Oct 09 14:17:46 lp-sasha kernel: RIP: 0010:nouveau_connector_detect_depth+0x71/0xc0 [nouveau]
    Oct 09 14:17:46 lp-sasha kernel: Code: 0a 00 00 48 8b 49 48 c7 87 b8 00 00 00 06 00 00 00 80 b9 4d 0a 00 00 00 75 1e 83 fa 41 75 05 48 85 c0 75 29 8b 81 10 0d 00 00 <39> 06 7c 25 f6 81 14 0d 00 00 02 75 b7 c3 80 b9 0c 0d 00 00 00 75
    Oct 09 14:17:46 lp-sasha kernel: RSP: 0018:ffffc9000028f8c0 EFLAGS: 00010297
    Oct 09 14:17:46 lp-sasha kernel: RAX: 0000000000014c08 RBX: ffff8880369d4000 RCX: ffff8880369d3000
    Oct 09 14:17:46 lp-sasha kernel: RDX: 0000000000000040 RSI: 0000000000000000 RDI: ffff8880369d4000
    Oct 09 14:17:46 lp-sasha kernel: RBP: ffff88800601cc00 R08: ffff8880051da298 R09: ffffffff8226201a
    Oct 09 14:17:46 lp-sasha kernel: R10: ffff88800469aa80 R11: ffff888004c84ff8 R12: 0000000000000000
    Oct 09 14:17:46 lp-sasha kernel: R13: ffff8880051da000 R14: 0000000000002000 R15: 0000000000000003
    Oct 09 14:17:46 lp-sasha kernel: FS:  00007fd0192b3440(0000) GS:ffff8880bc900000(0000) knlGS:0000000000000000
    Oct 09 14:17:46 lp-sasha kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    Oct 09 14:17:46 lp-sasha kernel: CR2: 0000000000000000 CR3: 0000000004976000 CR4: 00000000000006e0
    
    The disassembly:
    Code: 0a 00 00 48 8b 49 48 c7 87 b8 00 00 00 06 00 00 00 80 b9 4d 0a 00 00 00 75 1e 83 fa 41 75 05 48 85 c0 75 29 8b 81 10 0d 00 00 <39> 06 7c 25 f6 81 14 0d 00 00 02 75 b7 c3 80 b9 0c 0d 00 00 00 75
    All code
    ========
       0:   0a 00                   or     (%rax),%al
       2:   00 48 8b                add    %cl,-0x75(%rax)
       5:   49                      rex.WB
       6:   48 c7 87 b8 00 00 00    movq   $0x6,0xb8(%rdi)
       d:   06 00 00 00
      11:   80 b9 4d 0a 00 00 00    cmpb   $0x0,0xa4d(%rcx)
      18:   75 1e                   jne    0x38
      1a:   83 fa 41                cmp    $0x41,%edx
      1d:   75 05                   jne    0x24
      1f:   48 85 c0                test   %rax,%rax
      22:   75 29                   jne    0x4d
      24:   8b 81 10 0d 00 00       mov    0xd10(%rcx),%eax
      2a:*  39 06                   cmp    %eax,(%rsi)              <-- trapping instruction
      2c:   7c 25                   jl     0x53
      2e:   f6 81 14 0d 00 00 02    testb  $0x2,0xd14(%rcx)
      35:   75 b7                   jne    0xffffffffffffffee
      37:   c3                      retq
      38:   80 b9 0c 0d 00 00 00    cmpb   $0x0,0xd0c(%rcx)
      3f:   75                      .byte 0x75
    
    Code starting with the faulting instruction
    ===========================================
       0:   39 06                   cmp    %eax,(%rsi)
       2:   7c 25                   jl     0x29
       4:   f6 81 14 0d 00 00 02    testb  $0x2,0xd14(%rcx)
       b:   75 b7                   jne    0xffffffffffffffc4
       d:   c3                      retq
       e:   80 b9 0c 0d 00 00 00    cmpb   $0x0,0xd0c(%rcx)
      15:   75                      .byte 0x75
    
    objdump -SF --disassemble=nouveau_connector_detect_depth
    [...]
            if (nv_connector->edid &&
       c85e1:       83 fa 41                cmp    $0x41,%edx
       c85e4:       75 05                   jne    c85eb <nouveau_connector_detect_depth+0x6b> (File Offset: 0xc866b)
       c85e6:       48 85 c0                test   %rax,%rax
       c85e9:       75 29                   jne    c8614 <nouveau_connector_detect_depth+0x94> (File Offset: 0xc8694)
                nv_connector->type == DCB_CONNECTOR_LVDS_SPWG)
                    duallink = ((u8 *)nv_connector->edid)[121] == 2;
            else
                    duallink = mode->clock >= bios->fp.duallink_transition_clk;
    
            if ((!duallink && (bios->fp.strapless_is_24bit & 1)) ||
       c85eb:       8b 81 10 0d 00 00       mov    0xd10(%rcx),%eax
       c85f1:       39 06                   cmp    %eax,(%rsi)
       c85f3:       7c 25                   jl     c861a <nouveau_connector_detect_depth+0x9a> (File Offset: 0xc869a)
                ( duallink && (bios->fp.strapless_is_24bit & 2)))
       c85f5:       f6 81 14 0d 00 00 02    testb  $0x2,0xd14(%rcx)
       c85fc:       75 b7                   jne    c85b5 <nouveau_connector_detect_depth+0x35> (File Offset: 0xc8635)
                    connector->display_info.bpc = 8;
    [...]
    
    % scripts/faddr2line /lib/modules/5.9.0-rc8-next-20201009/kernel/drivers/gpu/drm/nouveau/nouveau.ko nouveau_connector_detect_depth+0x71/0xc0
    nouveau_connector_detect_depth+0x71/0xc0:
    nouveau_connector_detect_depth at /home/sasha/linux-next/drivers/gpu/drm/nouveau/nouveau_connector.c:891
    
    It is actually line 889. See the disassembly below.
    889                     duallink = mode->clock >= bios->fp.duallink_transition_clk;
    
    The NULL pointer being dereferenced is mode.
    
    Git bisect has identified the following commit as bad:
    f28e32d3906e drm/nouveau/kms: Don't change EDID when it hasn't actually changed
    
    Here is the chain of events that causes the oops.
    On entry to nouveau_connector_detect_lvds, edid is set to NULL.  The call
    to nouveau_connector_detect sets nv_connector->edid to valid memory,
    with status set to connector_status_connected and the flow of execution
    branching to the out label.
    
    The subsequent call to nouveau_connector_set_edid erronously clears
    nv_connector->edid, via the local edid pointer which remains set to NULL.
    
    Fix this by setting edid to the value of the just acquired
    nv_connector->edid and executing the body of nouveau_connector_set_edid
    only if nv_connector->edid and edid point to different memory addresses
    thus preventing nv_connector->edid from being turned into a dangling
    pointer.
    
    Fixes: f28e32d3906e ("drm/nouveau/kms: Don't change EDID when it hasn't actually changed")
    Signed-off-by: Alexander Kapshuk <alexander.kapshuk at gmail.com>
    Reviewed-by: Lyude Paul <lyude at redhat.com>
    Signed-off-by: Ben Skeggs <bskeggs at redhat.com>

diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 6f21f36719fc..8b4b3688c7ae 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -532,11 +532,13 @@ static void
 nouveau_connector_set_edid(struct nouveau_connector *nv_connector,
 			   struct edid *edid)
 {
-	struct edid *old_edid = nv_connector->edid;
+	if (nv_connector->edid != edid) {
+		struct edid *old_edid = nv_connector->edid;
 
-	drm_connector_update_edid_property(&nv_connector->base, edid);
-	kfree(old_edid);
-	nv_connector->edid = edid;
+		drm_connector_update_edid_property(&nv_connector->base, edid);
+		kfree(old_edid);
+		nv_connector->edid = edid;
+	}
 }
 
 static enum drm_connector_status
@@ -669,8 +671,10 @@ nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
 	/* Try retrieving EDID via DDC */
 	if (!drm->vbios.fp_no_ddc) {
 		status = nouveau_connector_detect(connector, force);
-		if (status == connector_status_connected)
+		if (status == connector_status_connected) {
+			edid = nv_connector->edid;
 			goto out;
+		}
 	}
 
 	/* On some laptops (Sony, i'm looking at you) there appears to
commit ceb736e1d45c253f5e86b185ca9b497cdd43063f
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Thu Nov 12 16:09:50 2020 +0800

    ipv6: Fix error path to cancel the meseage
    
    genlmsg_cancel() needs to be called in the error path of
    inet6_fill_ifmcaddr and inet6_fill_ifacaddr to cancel
    the message.
    
    Fixes: 6ecf4c37eb3e ("ipv6: enable IFA_TARGET_NETNSID for RTM_GETADDR")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201112080950.1476302-1-zhangqilong3@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 01146b66d666..8b6eb384bac7 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -5022,8 +5022,10 @@ static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca,
 		return -EMSGSIZE;
 
 	if (args->netnsid >= 0 &&
-	    nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid))
+	    nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) {
+		nlmsg_cancel(skb, nlh);
 		return -EMSGSIZE;
+	}
 
 	put_ifaddrmsg(nlh, 128, IFA_F_PERMANENT, scope, ifindex);
 	if (nla_put_in6_addr(skb, IFA_MULTICAST, &ifmca->mca_addr) < 0 ||
@@ -5054,8 +5056,10 @@ static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
 		return -EMSGSIZE;
 
 	if (args->netnsid >= 0 &&
-	    nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid))
+	    nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) {
+		nlmsg_cancel(skb, nlh);
 		return -EMSGSIZE;
+	}
 
 	put_ifaddrmsg(nlh, 128, IFA_F_PERMANENT, scope, ifindex);
 	if (nla_put_in6_addr(skb, IFA_ANYCAST, &ifaca->aca_addr) < 0 ||
commit 9c2e14b48119b39446031d29d994044ae958d8fc
Author: Yi-Hung Wei <yihung.wei at gmail.com>
Date:   Tue Nov 10 16:16:40 2020 -0800

    ip_tunnels: Set tunnel option flag when tunnel metadata is present
    
    Currently, we may set the tunnel option flag when the size of metadata
    is zero.  For example, we set TUNNEL_GENEVE_OPT in the receive function
    no matter the geneve option is present or not.  As this may result in
    issues on the tunnel flags consumers, this patch fixes the issue.
    
    Related discussion:
    * https://lore.kernel.org/netdev/1604448694-19351-1-git-send-email-yihung.wei@gmail.com/T/#u
    
    Fixes: 256c87c17c53 ("net: check tunnel option type in tunnel flags")
    Signed-off-by: Yi-Hung Wei <yihung.wei at gmail.com>
    Link: https://lore.kernel.org/r/1605053800-74072-1-git-send-email-yihung.wei@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index d07008a818df..1426bfc009bc 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -224,8 +224,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
 	if (ip_tunnel_collect_metadata() || gs->collect_md) {
 		__be16 flags;
 
-		flags = TUNNEL_KEY | TUNNEL_GENEVE_OPT |
-			(gnvh->oam ? TUNNEL_OAM : 0) |
+		flags = TUNNEL_KEY | (gnvh->oam ? TUNNEL_OAM : 0) |
 			(gnvh->critical ? TUNNEL_CRIT_OPT : 0);
 
 		tun_dst = udp_tun_rx_dst(skb, geneve_get_sk_family(gs), flags,
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index 02ccd32542d0..61620677b034 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -478,9 +478,11 @@ static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
 					   const void *from, int len,
 					   __be16 flags)
 {
-	memcpy(ip_tunnel_info_opts(info), from, len);
 	info->options_len = len;
-	info->key.tun_flags |= flags;
+	if (len > 0) {
+		memcpy(ip_tunnel_info_opts(info), from, len);
+		info->key.tun_flags |= flags;
+	}
 }
 
 static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate)
@@ -526,7 +528,6 @@ static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
 					   __be16 flags)
 {
 	info->options_len = 0;
-	info->key.tun_flags |= flags;
 }
 
 #endif /* CONFIG_INET */
commit f01c30de86f1047e9bae1b1b1417b0ce8dcd15b1
Merge: d9315f5634c9 9b8523423b23
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 16:07:53 2020 -0800

    Merge tag 'vfs-5.10-fixes-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
    
    Pull fs freeze fix and cleanups from Darrick Wong:
     "A single vfs fix for 5.10, along with two subsequent cleanups.
    
      A very long time ago, a hack was added to the vfs fs freeze protection
      code to work around lockdep complaints about XFS, which would try to
      run a transaction (which requires intwrite protection) to finalize an
      xfs freeze (by which time the vfs had already taken intwrite).
    
      Fast forward a few years, and XFS fixed the recursive intwrite problem
      on its own, and the hack became unnecessary. Fast forward almost a
      decade, and latent bugs in the code converting this hack from freeze
      flags to freeze locks combine with lockdep bugs to make this reproduce
      frequently enough to notice page faults racing with freeze.
    
      Since the hack is unnecessary and causes thread race errors, just get
      rid of it completely. Making this kind of vfs change midway through a
      cycle makes me nervous, but a large enough number of the usual
      VFS/ext4/XFS/btrfs suspects have said this looks good and solves a
      real problem vector.
    
      And once that removal is done, __sb_start_write is now simple enough
      that it becomes possible to refactor the function into smaller,
      simpler static inline helpers in linux/fs.h. The cleanup is
      straightforward.
    
      Summary:
    
       - Finally remove the "convert to trylock" weirdness in the fs freezer
         code. It was necessary 10 years ago to deal with nested
         transactions in XFS, but we've long since removed that; and now
         this is causing subtle race conditions when lockdep goes offline
         and sb_start_* aren't prepared to retry a trylock failure.
    
       - Minor cleanups of the sb_start_* fs freeze helpers"
    
    * tag 'vfs-5.10-fixes-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
      vfs: move __sb_{start,end}_write* to fs.h
      vfs: separate __sb_start_write into blocking and non-blocking helpers
      vfs: remove lockdep bogosity in __sb_start_write

commit d9315f5634c94500b91039895f40051a7ac79e28
Merge: b5dea9c0ab62 2bd3fa793aaa
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 16:01:44 2020 -0800

    Merge tag 'xfs-5.10-fixes-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
    
    Pull xfs fixes from Darrick Wong:
    
     - Fix a fairly serious problem where the reverse mapping btree key
       comparison functions were silently ignoring parts of the keyspace
       when doing comparisons
    
     - Fix a thinko in the online refcount scrubber
    
     - Fix a missing unlock in the pnfs code
    
    * tag 'xfs-5.10-fixes-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
      xfs: fix a missing unlock on error in xfs_fs_map_blocks
      xfs: fix brainos in the refcount scrubber's rmap fragment processor
      xfs: fix rmap key and record comparison functions
      xfs: set the unwritten bit in rmap lookup flags in xchk_bmap_get_rmapextents
      xfs: fix flags argument to rmap lookup when converting shared file rmaps

commit 8d4c3e76e3be11a64df95ddee52e99092d42fc19
Author: Jens Axboe <axboe at kernel.dk>
Date:   Fri Nov 13 16:47:52 2020 -0700

    proc: don't allow async path resolution of /proc/self components
    
    If this is attempted by a kthread, then return -EOPNOTSUPP as we don't
    currently support that. Once we can get task_pid_ptr() doing the right
    thing, then this can go away again.
    
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/proc/self.c b/fs/proc/self.c
index 72cd69bcaf4a..cc71ce3466dc 100644
--- a/fs/proc/self.c
+++ b/fs/proc/self.c
@@ -16,6 +16,13 @@ static const char *proc_self_get_link(struct dentry *dentry,
 	pid_t tgid = task_tgid_nr_ns(current, ns);
 	char *name;
 
+	/*
+	 * Not currently supported. Once we can inherit all of struct pid,
+	 * we can allow this.
+	 */
+	if (current->flags & PF_KTHREAD)
+		return ERR_PTR(-EOPNOTSUPP);
+
 	if (!tgid)
 		return ERR_PTR(-ENOENT);
 	/* max length of unsigned int in decimal + NULL term */
commit 81e329e93b860b31c216b40eb5e1373db0ffe0ba
Author: Wang Qing <wangqing at vivo.com>
Date:   Thu Nov 12 18:45:41 2020 +0200

    net: ethernet: ti: am65-cpts: update ret when ptp_clock is ERROR
    
    We always have to update the value of ret, otherwise the
     error value may be the previous one.
    
    Fixes: f6bd59526ca5 ("net: ethernet: ti: introduce am654 common platform time sync driver")
    Signed-off-by: Wang Qing <wangqing at vivo.com>
    [grygorii.strashko at ti.com: fix build warn, subj add fixes tag]
    Signed-off-by: Grygorii Strashko <grygorii.strashko at ti.com>
    Acked-by: Richard Cochran <richardcochran at gmail.com>
    Link: https://lore.kernel.org/r/20201112164541.3223-1-grygorii.strashko@ti.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ti/am65-cpts.c b/drivers/net/ethernet/ti/am65-cpts.c
index 75056c14b161..5dc60ecabe56 100644
--- a/drivers/net/ethernet/ti/am65-cpts.c
+++ b/drivers/net/ethernet/ti/am65-cpts.c
@@ -1001,8 +1001,7 @@ struct am65_cpts *am65_cpts_create(struct device *dev, void __iomem *regs,
 	if (IS_ERR_OR_NULL(cpts->ptp_clock)) {
 		dev_err(dev, "Failed to register ptp clk %ld\n",
 			PTR_ERR(cpts->ptp_clock));
-		if (!cpts->ptp_clock)
-			ret = -ENODEV;
+		ret = cpts->ptp_clock ? PTR_ERR(cpts->ptp_clock) : -ENODEV;
 		goto refclk_disable;
 	}
 	cpts->phc_index = ptp_clock_index(cpts->ptp_clock);
commit 8c07205aea36ccebe9fc5f97287a8bc416cea197
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Fri Nov 13 19:32:36 2020 +0800

    net: marvell: prestera: fix error return code in prestera_pci_probe()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 4c2703dfd7fa ("net: marvell: prestera: Add PCI interface support")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Reviewed-by: Vadym Kochan <vadym.kochan at plvision.eu>
    Acked-by: Vadym Kochan <vadym.kochan at plvision.eu>
    Link: https://lore.kernel.org/r/20201113113236.71678-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
index 1b97adae542e..be5677623455 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
@@ -676,7 +676,8 @@ static int prestera_pci_probe(struct pci_dev *pdev,
 	if (err)
 		return err;
 
-	if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(30))) {
+	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(30));
+	if (err) {
 		dev_err(&pdev->dev, "fail to set DMA mask\n");
 		goto err_dma_mask;
 	}
@@ -702,8 +703,10 @@ static int prestera_pci_probe(struct pci_dev *pdev,
 	dev_info(fw->dev.dev, "Prestera FW is ready\n");
 
 	fw->wq = alloc_workqueue("prestera_fw_wq", WQ_HIGHPRI, 1);
-	if (!fw->wq)
+	if (!fw->wq) {
+		err = -ENOMEM;
 		goto err_wq_alloc;
+	}
 
 	INIT_WORK(&fw->evt_work, prestera_fw_evt_work_fn);
 
commit b5dea9c0ab62a11bb52e6fa91c7d7e26d6ae8ec1
Merge: 1b1e9262ca64 c01a21b77722
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 15:09:52 2020 -0800

    Merge tag 'block-5.10-2020-11-13' of git://git.kernel.dk/linux-block
    
    Pull block fixes from Jens Axboe:
     "A few small fixes:
    
       - NVMe pull request from Christoph:
            - don't clear the read-only bit on a revalidate (Sagi Grimberg)
    
       - nbd error case refcount leak (Christoph)
    
       - loop/generic uevent fix (Christoph, Petr)"
    
    * tag 'block-5.10-2020-11-13' of git://git.kernel.dk/linux-block:
      loop: Fix occasional uevent drop
      block: add a return value to set_capacity_revalidate_and_notify
      nbd: fix a block_device refcount leak in nbd_release
      nvme: fix incorrect behavior when BLKROSET is called by the user

commit aa6306a8481e0223f3783d24045daea80897238e
Author: Steen Hegelund <steen.hegelund at microchip.com>
Date:   Fri Nov 13 10:11:16 2020 +0100

    net: phy: mscc: remove non-MACSec compatible phy
    
    Selecting VSC8575 as a MACSec PHY was not correct
    
    The relevant datasheet can be found here:
      - VSC8575: https://www.microchip.com/wwwproducts/en/VSC8575
    
    History:
    v1 -> v2:
       - Corrected the sha in the "Fixes:" tag
    
    Fixes: 1bbe0ecc2a1a ("net: phy: mscc: macsec initialization")
    Signed-off-by: Steen Hegelund <steen.hegelund at microchip.com>
    Reviewed-by: Antoine Tenart <atenart at kernel.org>
    Link: https://lore.kernel.org/r/20201113091116.1102450-1-steen.hegelund@microchip.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/phy/mscc/mscc_macsec.c b/drivers/net/phy/mscc/mscc_macsec.c
index 6cf9b798b710..10be266e48e8 100644
--- a/drivers/net/phy/mscc/mscc_macsec.c
+++ b/drivers/net/phy/mscc/mscc_macsec.c
@@ -981,7 +981,6 @@ int vsc8584_macsec_init(struct phy_device *phydev)
 
 	switch (phydev->phy_id & phydev->drv->phy_id_mask) {
 	case PHY_ID_VSC856X:
-	case PHY_ID_VSC8575:
 	case PHY_ID_VSC8582:
 	case PHY_ID_VSC8584:
 		INIT_LIST_HEAD(&vsc8531->macsec_flows);
commit 1b1e9262ca644b5b7f1d12b2f8c2edfff420c5f3
Merge: 9e6a39eae450 88ec3211e463
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 15:05:19 2020 -0800

    Merge tag 'io_uring-5.10-2020-11-13' of git://git.kernel.dk/linux-block
    
    Pull io_uring fix from Jens Axboe:
     "A single fix in here, for a missed rounding case at setup time, which
      caused an otherwise legitimate setup case to return -EINVAL if used
      with unaligned ring size values"
    
    * tag 'io_uring-5.10-2020-11-13' of git://git.kernel.dk/linux-block:
      io_uring: round-up cq size before comparing with rounded sq size

commit 8cf8821e15cd553339a5b48ee555a0439c2b2742
Author: Jeff Dike <jdike at akamai.com>
Date:   Thu Nov 12 20:58:15 2020 -0500

    net: Exempt multicast addresses from five-second neighbor lifetime
    
    Commit 58956317c8de ("neighbor: Improve garbage collection")
    guarantees neighbour table entries a five-second lifetime.  Processes
    which make heavy use of multicast can fill the neighour table with
    multicast addresses in five seconds.  At that point, neighbour entries
    can't be GC-ed because they aren't five seconds old yet, the kernel
    log starts to fill up with "neighbor table overflow!" messages, and
    sends start to fail.
    
    This patch allows multicast addresses to be thrown out before they've
    lived out their five seconds.  This makes room for non-multicast
    addresses and makes messages to all addresses more reliable in these
    circumstances.
    
    Fixes: 58956317c8de ("neighbor: Improve garbage collection")
    Signed-off-by: Jeff Dike <jdike at akamai.com>
    Reviewed-by: David Ahern <dsahern at kernel.org>
    Link: https://lore.kernel.org/r/20201113015815.31397-1-jdike@akamai.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 81ee17594c32..22ced1381ede 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -204,6 +204,7 @@ struct neigh_table {
 	int			(*pconstructor)(struct pneigh_entry *);
 	void			(*pdestructor)(struct pneigh_entry *);
 	void			(*proxy_redo)(struct sk_buff *skb);
+	int			(*is_multicast)(const void *pkey);
 	bool			(*allow_add)(const struct net_device *dev,
 					     struct netlink_ext_ack *extack);
 	char			*id;
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 8e39e28b0a8d..9500d28a43b0 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -235,6 +235,8 @@ static int neigh_forced_gc(struct neigh_table *tbl)
 
 			write_lock(&n->lock);
 			if ((n->nud_state == NUD_FAILED) ||
+			    (tbl->is_multicast &&
+			     tbl->is_multicast(n->primary_key)) ||
 			    time_after(tref, n->updated))
 				remove = true;
 			write_unlock(&n->lock);
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index 687971d83b4e..922dd73e5740 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -125,6 +125,7 @@ static int arp_constructor(struct neighbour *neigh);
 static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb);
 static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb);
 static void parp_redo(struct sk_buff *skb);
+static int arp_is_multicast(const void *pkey);
 
 static const struct neigh_ops arp_generic_ops = {
 	.family =		AF_INET,
@@ -156,6 +157,7 @@ struct neigh_table arp_tbl = {
 	.key_eq		= arp_key_eq,
 	.constructor	= arp_constructor,
 	.proxy_redo	= parp_redo,
+	.is_multicast	= arp_is_multicast,
 	.id		= "arp_cache",
 	.parms		= {
 		.tbl			= &arp_tbl,
@@ -928,6 +930,10 @@ static void parp_redo(struct sk_buff *skb)
 	arp_process(dev_net(skb->dev), NULL, skb);
 }
 
+static int arp_is_multicast(const void *pkey)
+{
+	return ipv4_is_multicast(*((__be32 *)pkey));
+}
 
 /*
  *	Receive an arp request from the device layer.
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 27f29b957ee7..76717478f173 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -81,6 +81,7 @@ static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
 static int pndisc_constructor(struct pneigh_entry *n);
 static void pndisc_destructor(struct pneigh_entry *n);
 static void pndisc_redo(struct sk_buff *skb);
+static int ndisc_is_multicast(const void *pkey);
 
 static const struct neigh_ops ndisc_generic_ops = {
 	.family =		AF_INET6,
@@ -115,6 +116,7 @@ struct neigh_table nd_tbl = {
 	.pconstructor =	pndisc_constructor,
 	.pdestructor =	pndisc_destructor,
 	.proxy_redo =	pndisc_redo,
+	.is_multicast =	ndisc_is_multicast,
 	.allow_add  =   ndisc_allow_add,
 	.id =		"ndisc_cache",
 	.parms = {
@@ -1706,6 +1708,11 @@ static void pndisc_redo(struct sk_buff *skb)
 	kfree_skb(skb);
 }
 
+static int ndisc_is_multicast(const void *pkey)
+{
+	return ipv6_addr_is_multicast((struct in6_addr *)pkey);
+}
+
 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
 {
 	struct inet6_dev *idev = __in6_dev_get(skb->dev);
commit 2b5668733050fca85f0ab458c5b91732f9496a38
Author: Grygorii Strashko <grygorii.strashko at ti.com>
Date:   Thu Nov 12 13:15:46 2020 +0200

    net: ethernet: ti: cpsw: fix cpts irq after suspend
    
    Depending on the SoC/platform the CPSW can completely lose context after a
    suspend/resume cycle, including CPSW wrapper (WR) which will cause reset of
    WR_C0_MISC_EN register, so CPTS IRQ will became disabled.
    
    Fix it by moving CPTS IRQ enabling in cpsw_ndo_open() where CPTS is
    actually started.
    
    Fixes: 84ea9c0a95d7 ("net: ethernet: ti: cpsw: enable cpts irq")
    Reported-by: Tony Lindgren <tony at atomide.com>
    Signed-off-by: Grygorii Strashko <grygorii.strashko at ti.com>
    Tested-by: Tony Lindgren <tony at atomide.com>
    Link: https://lore.kernel.org/r/20201112111546.20343-1-grygorii.strashko@ti.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 9fd1f77190ad..fa2d1025cbb2 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -838,9 +838,12 @@ static int cpsw_ndo_open(struct net_device *ndev)
 		if (ret < 0)
 			goto err_cleanup;
 
-		if (cpts_register(cpsw->cpts))
-			dev_err(priv->dev, "error registering cpts device\n");
-
+		if (cpsw->cpts) {
+			if (cpts_register(cpsw->cpts))
+				dev_err(priv->dev, "error registering cpts device\n");
+			else
+				writel(0x10, &cpsw->wr_regs->misc_en);
+		}
 	}
 
 	cpsw_restore(priv);
@@ -1716,7 +1719,6 @@ static int cpsw_probe(struct platform_device *pdev)
 
 	/* Enable misc CPTS evnt_pend IRQ */
 	cpts_set_irqpoll(cpsw->cpts, false);
-	writel(0x10, &cpsw->wr_regs->misc_en);
 
 skip_cpts:
 	cpsw_notice(priv, probe,
diff --git a/drivers/net/ethernet/ti/cpsw_new.c b/drivers/net/ethernet/ti/cpsw_new.c
index f779d2e1b5c5..2f5e0ad23ad7 100644
--- a/drivers/net/ethernet/ti/cpsw_new.c
+++ b/drivers/net/ethernet/ti/cpsw_new.c
@@ -873,8 +873,12 @@ static int cpsw_ndo_open(struct net_device *ndev)
 		if (ret < 0)
 			goto err_cleanup;
 
-		if (cpts_register(cpsw->cpts))
-			dev_err(priv->dev, "error registering cpts device\n");
+		if (cpsw->cpts) {
+			if (cpts_register(cpsw->cpts))
+				dev_err(priv->dev, "error registering cpts device\n");
+			else
+				writel(0x10, &cpsw->wr_regs->misc_en);
+		}
 
 		napi_enable(&cpsw->napi_rx);
 		napi_enable(&cpsw->napi_tx);
@@ -2006,7 +2010,6 @@ static int cpsw_probe(struct platform_device *pdev)
 
 	/* Enable misc CPTS evnt_pend IRQ */
 	cpts_set_irqpoll(cpsw->cpts, false);
-	writel(0x10, &cpsw->wr_regs->misc_en);
 
 skip_cpts:
 	ret = cpsw_register_notifiers(cpsw);
commit 9f16a66733c90b5f33f624b0b0e36a345b0aaf93
Author: Ming Lei <ming.lei at redhat.com>
Date:   Fri Nov 13 21:44:48 2020 +0800

    block: mark flush request as IDLE when it is really finished
    
    For avoiding use-after-free on flush request, we call its .end_io() from
    both timeout code path and __blk_mq_end_request().
    
    When flush request's ref doesn't drop to zero, it is still used, we
    can't mark it as IDLE, so fix it by marking IDLE when its refcount drops
    to zero really.
    
    Fixes: 65ff5cd04551 ("blk-mq: mark flush request as IDLE in flush_end_io()")
    Signed-off-by: Ming Lei <ming.lei at redhat.com>
    Cc: Yi Zhang <yi.zhang at redhat.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/block/blk-flush.c b/block/blk-flush.c
index e32958f0b687..fd5cee9f1a3b 100644
--- a/block/blk-flush.c
+++ b/block/blk-flush.c
@@ -225,13 +225,18 @@ static void flush_end_io(struct request *flush_rq, blk_status_t error)
 	/* release the tag's ownership to the req cloned from */
 	spin_lock_irqsave(&fq->mq_flush_lock, flags);
 
-	WRITE_ONCE(flush_rq->state, MQ_RQ_IDLE);
 	if (!refcount_dec_and_test(&flush_rq->ref)) {
 		fq->rq_status = error;
 		spin_unlock_irqrestore(&fq->mq_flush_lock, flags);
 		return;
 	}
 
+	/*
+	 * Flush request has to be marked as IDLE when it is really ended
+	 * because its .end_io() is called from timeout code path too for
+	 * avoiding use-after-free.
+	 */
+	WRITE_ONCE(flush_rq->state, MQ_RQ_IDLE);
 	if (fq->rq_status != BLK_STS_OK)
 		error = fq->rq_status;
 
commit 1a49a97df657c63a4e8ffcd1ea9b6ed95581789b
Author: Daniel Xu <dxu at dxuuu.xyz>
Date:   Thu Nov 12 17:55:06 2020 -0800

    btrfs: tree-checker: add missing return after error in root_item
    
    There's a missing return statement after an error is found in the
    root_item, this can cause further problems when a crafted image triggers
    the error.
    
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=210181
    Fixes: 259ee7754b67 ("btrfs: tree-checker: Add ROOT_ITEM check")
    CC: stable at vger.kernel.org # 5.4+
    Reviewed-by: Qu Wenruo <wqu at suse.com>
    Signed-off-by: Daniel Xu <dxu at dxuuu.xyz>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
index 8784b74f5232..6cefabd27209 100644
--- a/fs/btrfs/tree-checker.c
+++ b/fs/btrfs/tree-checker.c
@@ -1068,6 +1068,7 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,
 			    "invalid root item size, have %u expect %zu or %u",
 			    btrfs_item_size_nr(leaf, slot), sizeof(ri),
 			    btrfs_legacy_root_item_size());
+		return -EUCLEAN;
 	}
 
 	/*
commit 6f23277a49e68f8a9355385c846939ad0b1261e7
Author: Qu Wenruo <wqu at suse.com>
Date:   Wed Nov 11 19:38:18 2020 +0800

    btrfs: qgroup: don't commit transaction when we already hold the handle
    
    [BUG]
    When running the following script, btrfs will trigger an ASSERT():
    
      #/bin/bash
      mkfs.btrfs -f $dev
      mount $dev $mnt
      xfs_io -f -c "pwrite 0 1G" $mnt/file
      sync
      btrfs quota enable $mnt
      btrfs quota rescan -w $mnt
    
      # Manually set the limit below current usage
      btrfs qgroup limit 512M $mnt $mnt
    
      # Crash happens
      touch $mnt/file
    
    The dmesg looks like this:
    
      assertion failed: refcount_read(&trans->use_count) == 1, in fs/btrfs/transaction.c:2022
      ------------[ cut here ]------------
      kernel BUG at fs/btrfs/ctree.h:3230!
      invalid opcode: 0000 [#1] SMP PTI
      RIP: 0010:assertfail.constprop.0+0x18/0x1a [btrfs]
       btrfs_commit_transaction.cold+0x11/0x5d [btrfs]
       try_flush_qgroup+0x67/0x100 [btrfs]
       __btrfs_qgroup_reserve_meta+0x3a/0x60 [btrfs]
       btrfs_delayed_update_inode+0xaa/0x350 [btrfs]
       btrfs_update_inode+0x9d/0x110 [btrfs]
       btrfs_dirty_inode+0x5d/0xd0 [btrfs]
       touch_atime+0xb5/0x100
       iterate_dir+0xf1/0x1b0
       __x64_sys_getdents64+0x78/0x110
       do_syscall_64+0x33/0x80
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
      RIP: 0033:0x7fb5afe588db
    
    [CAUSE]
    In try_flush_qgroup(), we assume we don't hold a transaction handle at
    all.  This is true for data reservation and mostly true for metadata.
    Since data space reservation always happens before we start a
    transaction, and for most metadata operation we reserve space in
    start_transaction().
    
    But there is an exception, btrfs_delayed_inode_reserve_metadata().
    It holds a transaction handle, while still trying to reserve extra
    metadata space.
    
    When we hit EDQUOT inside btrfs_delayed_inode_reserve_metadata(), we
    will join current transaction and commit, while we still have
    transaction handle from qgroup code.
    
    [FIX]
    Let's check current->journal before we join the transaction.
    
    If current->journal is unset or BTRFS_SEND_TRANS_STUB, it means
    we are not holding a transaction, thus are able to join and then commit
    transaction.
    
    If current->journal is a valid transaction handle, we avoid committing
    transaction and just end it
    
    This is less effective than committing current transaction, as it won't
    free metadata reserved space, but we may still free some data space
    before new data writes.
    
    Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=1178634
    Fixes: c53e9653605d ("btrfs: qgroup: try to flush qgroup space when we get -EDQUOT")
    Reviewed-by: Filipe Manana <fdmanana at suse.com>
    Signed-off-by: Qu Wenruo <wqu at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 77c54749f432..4621b8043021 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -3512,6 +3512,7 @@ static int try_flush_qgroup(struct btrfs_root *root)
 {
 	struct btrfs_trans_handle *trans;
 	int ret;
+	bool can_commit = true;
 
 	/*
 	 * We don't want to run flush again and again, so if there is a running
@@ -3523,6 +3524,20 @@ static int try_flush_qgroup(struct btrfs_root *root)
 		return 0;
 	}
 
+	/*
+	 * If current process holds a transaction, we shouldn't flush, as we
+	 * assume all space reservation happens before a transaction handle is
+	 * held.
+	 *
+	 * But there are cases like btrfs_delayed_item_reserve_metadata() where
+	 * we try to reserve space with one transction handle already held.
+	 * In that case we can't commit transaction, but at least try to end it
+	 * and hope the started data writes can free some space.
+	 */
+	if (current->journal_info &&
+	    current->journal_info != BTRFS_SEND_TRANS_STUB)
+		can_commit = false;
+
 	ret = btrfs_start_delalloc_snapshot(root);
 	if (ret < 0)
 		goto out;
@@ -3534,7 +3549,10 @@ static int try_flush_qgroup(struct btrfs_root *root)
 		goto out;
 	}
 
-	ret = btrfs_commit_transaction(trans);
+	if (can_commit)
+		ret = btrfs_commit_transaction(trans);
+	else
+		ret = btrfs_end_transaction(trans);
 out:
 	clear_bit(BTRFS_ROOT_QGROUP_FLUSHING, &root->state);
 	wake_up(&root->qgroup_flush_wait);
commit c334730988ee07908ba4eb816ce78d3fe06fecaa
Author: Filipe Manana <fdmanana at suse.com>
Date:   Wed Nov 4 11:07:31 2020 +0000

    btrfs: fix missing delalloc new bit for new delalloc ranges
    
    When doing a buffered write, through one of the write family syscalls, we
    look for ranges which currently don't have allocated extents and set the
    'delalloc new' bit on them, so that we can report a correct number of used
    blocks to the stat(2) syscall until delalloc is flushed and ordered extents
    complete.
    
    However there are a few other places where we can do a buffered write
    against a range that is mapped to a hole (no extent allocated) and where
    we do not set the 'new delalloc' bit. Those places are:
    
    - Doing a memory mapped write against a hole;
    
    - Cloning an inline extent into a hole starting at file offset 0;
    
    - Calling btrfs_cont_expand() when the i_size of the file is not aligned
      to the sector size and is located in a hole. For example when cloning
      to a destination offset beyond EOF.
    
    So after such cases, until the corresponding delalloc range is flushed and
    the respective ordered extents complete, we can report an incorrect number
    of blocks used through the stat(2) syscall.
    
    In some cases we can end up reporting 0 used blocks to stat(2), which is a
    particular bad value to report as it may mislead tools to think a file is
    completely sparse when its i_size is not zero, making them skip reading
    any data, an undesired consequence for tools such as archivers and other
    backup tools, as reported a long time ago in the following thread (and
    other past threads):
    
      https://lists.gnu.org/archive/html/bug-tar/2016-07/msg00001.html
    
    Example reproducer:
    
      $ cat reproducer.sh
      #!/bin/bash
    
      MNT=/mnt/sdi
      DEV=/dev/sdi
    
      mkfs.btrfs -f $DEV > /dev/null
      # mkfs.xfs -f $DEV > /dev/null
      # mkfs.ext4 -F $DEV > /dev/null
      # mkfs.f2fs -f $DEV > /dev/null
      mount $DEV $MNT
    
      xfs_io -f -c "truncate 64K"   \
          -c "mmap -w 0 64K"        \
          -c "mwrite -S 0xab 0 64K" \
          -c "munmap"               \
          $MNT/foo
    
      blocks_used=$(stat -c %b $MNT/foo)
      echo "blocks used: $blocks_used"
    
      if [ $blocks_used -eq 0 ]; then
          echo "ERROR: blocks used is 0"
      fi
    
      umount $DEV
    
      $ ./reproducer.sh
      blocks used: 0
      ERROR: blocks used is 0
    
    So move the logic that decides to set the 'delalloc bit' bit into the
    function btrfs_set_extent_delalloc(), since that is what we use for all
    those missing cases as well as for the cases that currently work well.
    
    This change is also preparatory work for an upcoming patch that fixes
    other problems related to tracking and reporting the number of bytes used
    by an inode.
    
    CC: stable at vger.kernel.org # 4.19+
    Reviewed-by: Josef Bacik <josef at toxicpanda.com>
    Signed-off-by: Filipe Manana <fdmanana at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 87355a38a654..4373da7bcc0d 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -452,46 +452,6 @@ static void btrfs_drop_pages(struct page **pages, size_t num_pages)
 	}
 }
 
-static int btrfs_find_new_delalloc_bytes(struct btrfs_inode *inode,
-					 const u64 start,
-					 const u64 len,
-					 struct extent_state **cached_state)
-{
-	u64 search_start = start;
-	const u64 end = start + len - 1;
-
-	while (search_start < end) {
-		const u64 search_len = end - search_start + 1;
-		struct extent_map *em;
-		u64 em_len;
-		int ret = 0;
-
-		em = btrfs_get_extent(inode, NULL, 0, search_start, search_len);
-		if (IS_ERR(em))
-			return PTR_ERR(em);
-
-		if (em->block_start != EXTENT_MAP_HOLE)
-			goto next;
-
-		em_len = em->len;
-		if (em->start < search_start)
-			em_len -= search_start - em->start;
-		if (em_len > search_len)
-			em_len = search_len;
-
-		ret = set_extent_bit(&inode->io_tree, search_start,
-				     search_start + em_len - 1,
-				     EXTENT_DELALLOC_NEW,
-				     NULL, cached_state, GFP_NOFS);
-next:
-		search_start = extent_map_end(em);
-		free_extent_map(em);
-		if (ret)
-			return ret;
-	}
-	return 0;
-}
-
 /*
  * after copy_from_user, pages need to be dirtied and we need to make
  * sure holes are created between the current EOF and the start of
@@ -528,23 +488,6 @@ int btrfs_dirty_pages(struct btrfs_inode *inode, struct page **pages,
 			 EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG,
 			 0, 0, cached);
 
-	if (!btrfs_is_free_space_inode(inode)) {
-		if (start_pos >= isize &&
-		    !(inode->flags & BTRFS_INODE_PREALLOC)) {
-			/*
-			 * There can't be any extents following eof in this case
-			 * so just set the delalloc new bit for the range
-			 * directly.
-			 */
-			extra_bits |= EXTENT_DELALLOC_NEW;
-		} else {
-			err = btrfs_find_new_delalloc_bytes(inode, start_pos,
-							    num_bytes, cached);
-			if (err)
-				return err;
-		}
-	}
-
 	err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block,
 					extra_bits, cached);
 	if (err)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index da58c58ef9aa..7e8d8169779d 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -2253,11 +2253,69 @@ static int add_pending_csums(struct btrfs_trans_handle *trans,
 	return 0;
 }
 
+static int btrfs_find_new_delalloc_bytes(struct btrfs_inode *inode,
+					 const u64 start,
+					 const u64 len,
+					 struct extent_state **cached_state)
+{
+	u64 search_start = start;
+	const u64 end = start + len - 1;
+
+	while (search_start < end) {
+		const u64 search_len = end - search_start + 1;
+		struct extent_map *em;
+		u64 em_len;
+		int ret = 0;
+
+		em = btrfs_get_extent(inode, NULL, 0, search_start, search_len);
+		if (IS_ERR(em))
+			return PTR_ERR(em);
+
+		if (em->block_start != EXTENT_MAP_HOLE)
+			goto next;
+
+		em_len = em->len;
+		if (em->start < search_start)
+			em_len -= search_start - em->start;
+		if (em_len > search_len)
+			em_len = search_len;
+
+		ret = set_extent_bit(&inode->io_tree, search_start,
+				     search_start + em_len - 1,
+				     EXTENT_DELALLOC_NEW,
+				     NULL, cached_state, GFP_NOFS);
+next:
+		search_start = extent_map_end(em);
+		free_extent_map(em);
+		if (ret)
+			return ret;
+	}
+	return 0;
+}
+
 int btrfs_set_extent_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
 			      unsigned int extra_bits,
 			      struct extent_state **cached_state)
 {
 	WARN_ON(PAGE_ALIGNED(end));
+
+	if (start >= i_size_read(&inode->vfs_inode) &&
+	    !(inode->flags & BTRFS_INODE_PREALLOC)) {
+		/*
+		 * There can't be any extents following eof in this case so just
+		 * set the delalloc new bit for the range directly.
+		 */
+		extra_bits |= EXTENT_DELALLOC_NEW;
+	} else {
+		int ret;
+
+		ret = btrfs_find_new_delalloc_bytes(inode, start,
+						    end + 1 - start,
+						    cached_state);
+		if (ret)
+			return ret;
+	}
+
 	return set_extent_delalloc(&inode->io_tree, start, end, extra_bits,
 				   cached_state);
 }
diff --git a/fs/btrfs/tests/inode-tests.c b/fs/btrfs/tests/inode-tests.c
index e6719f7db386..04022069761d 100644
--- a/fs/btrfs/tests/inode-tests.c
+++ b/fs/btrfs/tests/inode-tests.c
@@ -983,7 +983,8 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
 	ret = clear_extent_bit(&BTRFS_I(inode)->io_tree,
 			       BTRFS_MAX_EXTENT_SIZE >> 1,
 			       (BTRFS_MAX_EXTENT_SIZE >> 1) + sectorsize - 1,
-			       EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
+			       EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
+			       EXTENT_UPTODATE, 0, 0, NULL);
 	if (ret) {
 		test_err("clear_extent_bit returned %d", ret);
 		goto out;
@@ -1050,7 +1051,8 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
 	ret = clear_extent_bit(&BTRFS_I(inode)->io_tree,
 			       BTRFS_MAX_EXTENT_SIZE + sectorsize,
 			       BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1,
-			       EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
+			       EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
+			       EXTENT_UPTODATE, 0, 0, NULL);
 	if (ret) {
 		test_err("clear_extent_bit returned %d", ret);
 		goto out;
@@ -1082,7 +1084,8 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
 
 	/* Empty */
 	ret = clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, (u64)-1,
-			       EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
+			       EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
+			       EXTENT_UPTODATE, 0, 0, NULL);
 	if (ret) {
 		test_err("clear_extent_bit returned %d", ret);
 		goto out;
@@ -1097,7 +1100,8 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
 out:
 	if (ret)
 		clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, (u64)-1,
-				 EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
+				 EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
+				 EXTENT_UPTODATE, 0, 0, NULL);
 	iput(inode);
 	btrfs_free_dummy_root(root);
 	btrfs_free_dummy_fs_info(fs_info);
commit 9e6a39eae450b81c8b2c8cbbfbdf8218e9b40c81
Merge: 4de010e2c989 bdac39a3bd28
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 12:47:02 2020 -0800

    Merge tag 'devicetree-fixes-for-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
    
    Pull devicetree fixes from Rob Herring:
    
     - fix Flexcan binding schema errors introduced in rc3
    
     - fix an of_node ref counting error in of_dma_is_coherent
    
    * tag 'devicetree-fixes-for-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux:
      dt-bindings: clock: imx5: fix example
      dt-bindings: can: fsl,flexcan.yaml: fix compatible for i.MX35 and i.MX53
      dt-bindings: can: fsl,flexcan.yaml: fix fsl,stop-mode
      of/address: Fix of_node memory leak in of_dma_is_coherent

commit 123f01a0c989905a1cef6c1397a022eb321474d8
Author: Thierry Reding <treding at nvidia.com>
Date:   Fri Nov 13 21:38:35 2020 +0100

    drm/tegra: output: Do not put OF node twice
    
    The original patch for commit 3d2e7aec7013 ("drm/tegra: output: Don't
    leak OF node on error") contained this hunk, but it was accidentally
    dropped during conflict resolution. This causes use-after-free errors
    on devices that use an I2C controller for HDMI DDC/CI on Tegra210 and
    later.
    
    Fixes: 3d2e7aec7013 ("drm/tegra: output: Don't leak OF node on error")
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
index 5a4fd0dbf4cf..47d26b5d9945 100644
--- a/drivers/gpu/drm/tegra/output.c
+++ b/drivers/gpu/drm/tegra/output.c
@@ -129,7 +129,6 @@ int tegra_output_probe(struct tegra_output *output)
 
 		if (!output->ddc) {
 			err = -EPROBE_DEFER;
-			of_node_put(ddc);
 			return err;
 		}
 	}
commit 1395f8df87b0b897eb363625ddbc09891d2fba62
Merge: 4ee18c179e5e 7bc40aedf24d
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Fri Nov 13 11:58:55 2020 -0800

    Merge tag 'mac80211-for-net-2020-11-13' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211
    
    Johannes Berg says:
    
    ====================
    A handful of fixes:
     * a use-after-free fix in rfkill
     * a memory leak fix in the mac80211 TX status path
     * some rate scaling fixes
     * a fix for the often-reported (by syzbot) sleeping
       in atomic issue with mac80211's station removal
    
    * tag 'mac80211-for-net-2020-11-13' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211:
      mac80211: free sta in sta_info_insert_finish() on errors
      mac80211: minstrel: fix tx status processing corner case
      mac80211: minstrel: remove deferred sampling code
      mac80211: fix memory leak on filtered powersave frames
      rfkill: Fix use-after-free in rfkill_resume()
    ====================
    
    Link: https://lore.kernel.org/r/20201113093421.24025-1-johannes@sipsolutions.net
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 4de010e2c989a90e28272a92ca66e4bff4e79e0d
Merge: 29eb6b7d62b0 dadfab0fbf01
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 11:04:25 2020 -0800

    Merge tag 'pinctrl-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
    
    Pull pin control fixes from Linus Walleij:
     "A bunch of pin control fixes for the v5.10 kernel series.
    
      Nothing in particular to say about it, because they are all driver
      fixes.
    
      I'm happy that some AMD driver fixes are appearing, it's been an
      undermaintained driver, and laptops have suffered.
    
      Summary:
    
       - Two fixes to the Intel pin controller drivers: fixing pull
         resistance bias.
    
       - Fix some invalid SSI pins on the Ingenic pin controller.
    
       - Make sure the clock is enabled when requesting interrupts from the
         Rockchip GPIO controller.
    
       - Make sure IRQs are mapped when looking up the IRQ for a GPIO line
         on the Rockchip GPIO Write.
    
       - Two regmap initialization fixes for the MCP23s08.
    
       - Fix a GPI-only prefix function problem on the Aspeed pin
         controller.
    
       - Disable the debounce filter correctly on the AMD pin controller.
    
       - Correct the timer clock setting for the AMD debounce timer.
    
       - Make the Qualcomm pin controller more cautious around the handling
         of PDC-related GPIO interrupts.
    
       - Fix the interrupt map in the Qualcomm SM8250 pin controller"
    
    * tag 'pinctrl-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl:
      pinctrl: qcom: sm8250: Specify PDC map
      pinctrl: qcom: Move clearing pending IRQ to .irq_request_resources callback
      pinctrl: amd: use higher precision for 512 RtcClk
      pinctrl: amd: fix incorrect way to disable debounce filter
      pinctrl: aspeed: Fix GPI only function problem.
      pinctrl: mcp23s08: Print error message when regmap init fails
      pinctrl: mcp23s08: Use full chunk of memory for regmap configuration
      pinctrl: rockchip: create irq mapping in gpio_to_irq
      pinctrl: rockchip: enable gpio pclk for rockchip_gpio_to_irq
      pinctrl: ingenic: Fix invalid SSI pins
      pinctrl: intel: Set default bias in case no particular value given
      pinctrl: intel: Fix 2 kOhm bias which is 833 Ohm

commit 29eb6b7d62b09fee6deb796c58256ba38cb4a07d
Merge: 673cb932b688 b72de3ff19fd
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 10:55:50 2020 -0800

    Merge tag 'gpio-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
    
    Pull GPIO fixes from Linus Walleij:
     "Some GPIO fixes I've collected with the help of Bartosz.
    
      Nothing special about them: all are driver and kbuild fixes + some
      documentation fixes:
    
       - Tidy up a missed function call in the designware driver when
         converting to gpiolib irqchip
    
       - Fix some bitmasks in the Aspeed driver
    
       - Fix some kerneldoc warnings and minor bugs in the improved
         userspace API documentation
    
       - Revert the revert of the OMAP fix for lost edge wakeup interrupts:
         the fix needs to stay in
    
       - Fix a compile error when deselecting the character device
    
       - A bunch of IRQ fixes on the idio GPIO drivers
    
       - Fix an off-by-one error in the SiFive GPIO driver"
    
    * tag 'gpio-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
      gpio: sifive: Fix SiFive gpio probe
      gpio: pcie-idio-24: Enable PEX8311 interrupts
      gpio: pcie-idio-24: Fix IRQ Enable Register value
      gpio: pcie-idio-24: Fix irq mask when masking
      gpiolib: fix sysfs when cdev is not selected
      Revert "Revert "gpio: omap: Fix lost edge wake-up interrupts""
      gpio: uapi: clarify the meaning of 'empty' char arrays
      gpio: uapi: remove whitespace
      gpio: uapi: kernel-doc formatting improvements
      gpio: uapi: comment consistency
      gpio: uapi: fix kernel-doc warnings
      gpio: aspeed: fix ast2600 bank properties
      gpio: dwapb: Fix missing conversion to GPIO-lib-based IRQ-chip

commit d853b3406903a7dc5b14eb5bada3e8cd677f66a2
Author: Nathan Chancellor <natechancellor at gmail.com>
Date:   Fri Nov 13 11:07:02 2020 -0700

    spi: bcm2835aux: Restore err assignment in bcm2835aux_spi_probe
    
    Clang warns:
    
    drivers/spi/spi-bcm2835aux.c:532:50: warning: variable 'err' is
    uninitialized when used here [-Wuninitialized]
                    dev_err(&pdev->dev, "could not get clk: %d\n", err);
                                                                   ^~~
    ./include/linux/dev_printk.h:112:32: note: expanded from macro 'dev_err'
            _dev_err(dev, dev_fmt(fmt), ##__VA_ARGS__)
                                          ^~~~~~~~~~~
    drivers/spi/spi-bcm2835aux.c:495:9: note: initialize the variable 'err'
    to silence this warning
            int err;
                   ^
                    = 0
    1 warning generated.
    
    Restore the assignment so that the error value can be used in the
    dev_err statement and there is no uninitialized memory being leaked.
    
    Fixes: e13ee6cc4781 ("spi: bcm2835aux: Fix use-after-free on unbind")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1199
    Signed-off-by: Nathan Chancellor <natechancellor at gmail.com>
    Link: https://lore.kernel.org/r/20201113180701.455541-1-natechancellor@gmail.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c
index fd58547110e6..1a26865c42f8 100644
--- a/drivers/spi/spi-bcm2835aux.c
+++ b/drivers/spi/spi-bcm2835aux.c
@@ -529,8 +529,9 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
 
 	bs->clk = devm_clk_get(&pdev->dev, NULL);
 	if (IS_ERR(bs->clk)) {
+		err = PTR_ERR(bs->clk);
 		dev_err(&pdev->dev, "could not get clk: %d\n", err);
-		return PTR_ERR(bs->clk);
+		return err;
 	}
 
 	bs->irq = platform_get_irq(pdev, 0);
commit 673cb932b688ad3b03de89dc2b0b97c75ad47112
Merge: e627c25544df 03d80e042a8e
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 10:09:40 2020 -0800

    Merge tag 'mmc-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
    
    Pull MMC fixes from Ulf Hansson:
    
     - tmio: Fixup support for reset
    
     - sdhci-of-esdhc: Extend erratum for pulse width to more broken HWs
    
     - renesas_sdhi: Fix re-binding of drivers
    
    * tag 'mmc-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
      Revert "mmc: renesas_sdhi: workaround a regression when reinserting SD cards"
      mmc: tmio: bring tuning HW to a sane state with MMC_POWER_OFF
      mmc: tmio: when resetting, reset DMA controller, too
      mmc: sdhci-of-esdhc: Handle pulse width detection erratum for more SoCs
      mmc: renesas_sdhi_core: Add missing tmio_mmc_host_free() at remove

commit e627c25544dfec9af56842b07e40ad992731627a
Merge: 6186313d06df 41f3ed2cac86
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 09:53:53 2020 -0800

    Merge tag 'drm-fixes-2020-11-13' of git://anongit.freedesktop.org/drm/drm
    
    Pull drm fixes from Dave Airlie:
     "Nearly didn't send you a PR this week at all, but a few things
      trickled in over the day, not a huge amount here, some i915, amdgpu
      and a bunch of misc fixes. I have a couple of nouveau fixes
      outstanding due to the PR having the wrong base, I'll figure it out
      next week.
    
      amdgpu:
       - Pageflip fix for DCN3
       - Declare TA firmware for green sardine
       - Headless navi fix
    
      i915:
       - Pull phys pread/pwrite implementations to the backend
       - Correctly set SFC capability for video engines
    
      bridge:
       - cdns Kconfig fix
    
      hyperv_fb:
       - fix missing include
    
      gma500:
       - oob access fix
    
      mcde:
       - unbalanced regulator fix"
    
    * tag 'drm-fixes-2020-11-13' of git://anongit.freedesktop.org/drm/drm:
      drm/amdgpu: enable DCN for navi10 headless SKU
      drm/amdgpu: add ta firmware load for green-sardine
      drm/i915: Correctly set SFC capability for video engines
      drm/i915/gem: Pull phys pread/pwrite implementations to the backend
      drm/i915/gem: Allow backends to override pread implementation
      drm/mcde: Fix unbalanced regulator
      drm/gma500: Fix out-of-bounds access to struct drm_device.vblank[]
      video: hyperv_fb: include vmalloc.h
      drm: bridge: cdns: Kconfig: Switch over dependency to ARCH_K3
      drm/amd/display: Add missing pflip irq

commit 02a9c6ee4183af2e438454c55098b828a96085fb
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Nov 13 13:12:41 2020 +0300

    ALSA: firewire: Clean up a locking issue in copy_resp_to_buf()
    
    The spin_lock/unlock_irq() functions cannot be nested.  The problem is
    that presumably we would want the IRQs to be re-enabled on the second
    call the spin_unlock_irq() but instead it will be enabled at the first
    call so IRQs will be enabled earlier than expected.
    
    In this situation the copy_resp_to_buf() function is only called from
    one function and it is called with IRQs disabled.  We can just use
    the regular spin_lock/unlock() functions.
    
    Fixes: 555e8a8f7f14 ("ALSA: fireworks: Add command/response functionality into hwdep interface")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Acked-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201113101241.GB168908@mwanda
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/firewire/fireworks/fireworks_transaction.c b/sound/firewire/fireworks/fireworks_transaction.c
index 0f533f5bd960..9f8c53b39f95 100644
--- a/sound/firewire/fireworks/fireworks_transaction.c
+++ b/sound/firewire/fireworks/fireworks_transaction.c
@@ -123,7 +123,7 @@ copy_resp_to_buf(struct snd_efw *efw, void *data, size_t length, int *rcode)
 	t = (struct snd_efw_transaction *)data;
 	length = min_t(size_t, be32_to_cpu(t->length) * sizeof(u32), length);
 
-	spin_lock_irq(&efw->lock);
+	spin_lock(&efw->lock);
 
 	if (efw->push_ptr < efw->pull_ptr)
 		capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr);
@@ -190,7 +190,7 @@ handle_resp_for_user(struct fw_card *card, int generation, int source,
 
 	copy_resp_to_buf(efw, data, length, rcode);
 end:
-	spin_unlock_irq(&instances_lock);
+	spin_unlock(&instances_lock);
 }
 
 static void
commit 6186313d06dfadbfd0cda5e36e485877d6600179
Merge: e45f90fc72c8 50b8a742850f
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 09:36:10 2020 -0800

    Merge tag 'trace-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
    
    Pull bootconfig fix from Steven Rostedt:
     "Fix alignment of bootconfig
    
      GRUB may align the init ramdisk size to 4 bytes, the magic number at
      the end of the init ramdisk that denotes bootconfig is attached may
      not be at the exact end of the ramdisk. The kernel needs to check back
      at least 4 bytes"
    
    * tag 'trace-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
      bootconfig: Extend the magic check range to the preceding 3 bytes

commit e45f90fc72c8a41097a29ff53dcf983087c16c06
Merge: 88b31f07f3f2 9fa2e7af3d53
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 09:31:20 2020 -0800

    Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
    
    Pull ARM fix from Russell King:
     "Just one bug fix: avoid a fortify panic when copying optprobe template"
    
    * tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
      ARM: 9019/1: kprobes: Avoid fortify_panic() when copying optprobe template

commit 88b31f07f3f2d15a172405ae5d453fda1c12ee5f
Merge: d3ba7afcc11f 23c216416056
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 09:23:10 2020 -0800

    Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
    
    Pull arm64 fixes from Will Deacon:
    
     - Spectre/Meltdown safelisting for some Qualcomm KRYO cores
    
     - Fix RCU splat when failing to online a CPU due to a feature mismatch
    
     - Fix a recently introduced sparse warning in kexec()
    
     - Fix handling of CPU erratum 1418040 for late CPUs
    
     - Ensure hot-added memory falls within linear-mapped region
    
    * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
      arm64: cpu_errata: Apply Erratum 845719 to KRYO2XX Silver
      arm64: proton-pack: Add KRYO2XX silver CPUs to spectre-v2 safe-list
      arm64: kpti: Add KRYO2XX gold/silver CPU cores to kpti safelist
      arm64: Add MIDR value for KRYO2XX gold/silver CPU cores
      arm64/mm: Validate hotplug range before creating linear mapping
      arm64: smp: Tell RCU about CPUs that fail to come online
      arm64: psci: Avoid printing in cpu_psci_cpu_die()
      arm64: kexec_file: Fix sparse warning
      arm64: errata: Fix handling of 1418040 with late CPU onlining

commit d3ba7afcc11fe9146def1664c32762d5a6a47713
Merge: 585e5b17b92d d196e229a80c
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Fri Nov 13 09:05:33 2020 -0800

    Merge tag 'ext4_for_linus_bugfixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
    
    Pull ext4 fixes from Ted Ts'o:
     "Two ext4 bug fixes, one being a revert of a commit sent during the
      merge window"
    
    * tag 'ext4_for_linus_bugfixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
      Revert "ext4: fix superblock checksum calculation race"
      ext4: handle dax mount option collision

commit dabbd6abcdbeb1358a53ec28a244429320eb0e3a
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Fri Nov 13 14:42:27 2020 +0800

    IB/hfi1: Fix error return code in hfi1_init_dd()
    
    Fix to return a negative error code from the error handling case instead
    of 0, as done elsewhere in this function.
    
    Fixes: 4730f4a6c6b2 ("IB/hfi1: Activate the dummy netdev")
    Link: https://lore.kernel.org/r/1605249747-17942-1-git-send-email-zhangchangzhong@huawei.com
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Acked-by: Mike Marciniszyn <mike.marciniszyn at cornelisnetworks.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c
index 7eaf99538216..c87b94ea2939 100644
--- a/drivers/infiniband/hw/hfi1/chip.c
+++ b/drivers/infiniband/hw/hfi1/chip.c
@@ -15245,7 +15245,8 @@ int hfi1_init_dd(struct hfi1_devdata *dd)
 		    & CCE_REVISION_SW_MASK);
 
 	/* alloc netdev data */
-	if (hfi1_netdev_alloc(dd))
+	ret = hfi1_netdev_alloc(dd);
+	if (ret)
 		goto bail_cleanup;
 
 	ret = set_up_context_variables(dd);
commit 18db36a073db6377a52e22ec44eb0500f0a0ecc6
Author: Fabrice Gasnier <fabrice.gasnier at st.com>
Date:   Fri Nov 6 18:50:16 2020 +0100

    docs: ABI: testing: iio: stm32: remove re-introduced unsupported ABI
    
    Remove unsupported ABI that has been re-introduced due to a rebase hunk.
    This ABI has been moved in the past in commit b299d00420e2
    ("IIO: stm32: Remove quadrature related functions from trigger driver")
    
    This also fixes a couple of warnings seen with:
    ./scripts/get_abi.pl validate 2>&1|grep iio
    
    Fixes: 34433332841d ("docs: ABI: testing: make the files compatible with ReST output")
    Acked-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier at st.com>
    Link: https://lore.kernel.org/r/1604685016-2434-1-git-send-email-fabrice.gasnier@st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/Documentation/ABI/testing/sysfs-bus-iio-timer-stm32 b/Documentation/ABI/testing/sysfs-bus-iio-timer-stm32
index a10a4de3e5fe..c4a4497c249a 100644
--- a/Documentation/ABI/testing/sysfs-bus-iio-timer-stm32
+++ b/Documentation/ABI/testing/sysfs-bus-iio-timer-stm32
@@ -109,30 +109,6 @@ Description:
 		When counting down the counter start from preset value
 		and fire event when reach 0.
 
-What:		/sys/bus/iio/devices/iio:deviceX/in_count_quadrature_mode_available
-KernelVersion:	4.12
-Contact:	benjamin.gaignard at st.com
-Description:
-		Reading returns the list possible quadrature modes.
-
-What:		/sys/bus/iio/devices/iio:deviceX/in_count0_quadrature_mode
-KernelVersion:	4.12
-Contact:	benjamin.gaignard at st.com
-Description:
-		Configure the device counter quadrature modes:
-
-		channel_A:
-			Encoder A input servers as the count input and B as
-			the UP/DOWN direction control input.
-
-		channel_B:
-			Encoder B input serves as the count input and A as
-			the UP/DOWN direction control input.
-
-		quadrature:
-			Encoder A and B inputs are mixed to get direction
-			and count with a scale of 0.25.
-
 What:		/sys/bus/iio/devices/iio:deviceX/in_count_enable_mode_available
 KernelVersion:	4.12
 Contact:	benjamin.gaignard at st.com
commit 50431b45685b600fc2851a3f2b53e24643efe6d3
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Fri Nov 13 19:51:52 2020 +0800

    tools, bpftool: Add missing close before bpftool net attach exit
    
    progfd is created by prog_parse_fd() in do_attach() and before the latter
    returns in case of success, the file descriptor should be closed.
    
    Fixes: 04949ccc273e ("tools: bpftool: add net attach command to attach XDP on interface")
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Link: https://lore.kernel.org/bpf/20201113115152.53178-1-wanghai38@huawei.com

diff --git a/tools/bpf/bpftool/net.c b/tools/bpf/bpftool/net.c
index 910e7bac6e9e..3fae61ef6339 100644
--- a/tools/bpf/bpftool/net.c
+++ b/tools/bpf/bpftool/net.c
@@ -578,8 +578,8 @@ static int do_attach(int argc, char **argv)
 
 	ifindex = net_parse_dev(&argc, &argv);
 	if (ifindex < 1) {
-		close(progfd);
-		return -EINVAL;
+		err = -EINVAL;
+		goto cleanup;
 	}
 
 	if (argc) {
@@ -587,8 +587,8 @@ static int do_attach(int argc, char **argv)
 			overwrite = true;
 		} else {
 			p_err("expected 'overwrite', got: '%s'?", *argv);
-			close(progfd);
-			return -EINVAL;
+			err = -EINVAL;
+			goto cleanup;
 		}
 	}
 
@@ -596,17 +596,17 @@ static int do_attach(int argc, char **argv)
 	if (is_prefix("xdp", attach_type_strings[attach_type]))
 		err = do_attach_detach_xdp(progfd, attach_type, ifindex,
 					   overwrite);
-
-	if (err < 0) {
+	if (err) {
 		p_err("interface %s attach failed: %s",
 		      attach_type_strings[attach_type], strerror(-err));
-		return err;
+		goto cleanup;
 	}
 
 	if (json_output)
 		jsonw_null(json_wtr);
-
-	return 0;
+cleanup:
+	close(progfd);
+	return err;
 }
 
 static int do_detach(int argc, char **argv)
commit bdac39a3bd28891fb0ded91c9152459c57773462
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Nov 11 22:35:48 2020 +0100

    dt-bindings: clock: imx5: fix example
    
    Since commit:
    
        0e030a373df3 ("can: flexcan: fix endianess detection")
    
    the fsl,imx53-flexcan isn't compatible with the fsl,p1010-flexcan any more. As
    the former accesses the IP core in Little Endian mode and the latter uses Big
    Endian mode.
    
    With the conversion of the flexcan DT bindings to yaml, the dt_binding_check
    this throws the following error:
    
    Documentation/devicetree/bindings/clock/imx5-clock.example.dt.yaml: can at 53fc8000: compatible: 'oneOf' conditional failed, one must be fixed:
            ['fsl,imx53-flexcan', 'fsl,p1010-flexcan'] is too long
            Additional items are not allowed ('fsl,p1010-flexcan' was unexpected)
            'fsl,imx53-flexcan' is not one of ['fsl,imx7d-flexcan', 'fsl,imx6ul-flexcan', 'fsl,imx6sx-flexcan']
            'fsl,imx53-flexcan' is not one of ['fsl,ls1028ar1-flexcan']
            'fsl,imx6q-flexcan' was expected
            'fsl,lx2160ar1-flexcan' was expected
            From schema: /builds/robherring/linux-dt-bindings/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
    
    The error is fixed by replacing the "fsl,p1010-flexcan" compatible
    (which turned out the be incompatible) with "fsl,imx25-flexcan" in the
    binding example.
    
    Reported-by: Rob Herring <robh+dt at kernel.org>
    Cc: Fabio Estevam <fabio.estevam at nxp.com>
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Link: https://lore.kernel.org/r/20201111213548.1621094-1-mkl@pengutronix.de
    [robh: Add "fsl,imx25-flexcan" as fallback]
    Signed-off-by: Rob Herring <robh at kernel.org>

diff --git a/Documentation/devicetree/bindings/clock/imx5-clock.yaml b/Documentation/devicetree/bindings/clock/imx5-clock.yaml
index 4d9e7c73dce9..90775c2669b8 100644
--- a/Documentation/devicetree/bindings/clock/imx5-clock.yaml
+++ b/Documentation/devicetree/bindings/clock/imx5-clock.yaml
@@ -57,7 +57,7 @@ examples:
     };
 
     can at 53fc8000 {
-        compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";
+        compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
         reg = <0x53fc8000 0x4000>;
         interrupts = <82>;
         clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>, <&clks IMX5_CLK_CAN1_SERIAL_GATE>;
commit 3bbb73f8e60f505aced2ae820436cdacdbb19bca
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Nov 11 14:05:06 2020 +0100

    dt-bindings: can: fsl,flexcan.yaml: fix compatible for i.MX35 and i.MX53
    
    As both the i.MX35 and i.MX53 flexcan IP cores are compatible to the i.MX25,
    they are listed as:
    
        compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
    
    and:
    
        compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
    
    in the SoC device trees.
    
    This patch fixes the following errors, which shows up during a dtbs_check:
    
    arch/arm/boot/dts/imx53-ard.dt.yaml: can at 53fc8000: compatible: 'oneOf' conditional failed, one must be fixed:
       ['fsl,imx53-flexcan', 'fsl,imx25-flexcan'] is too long
       Additional items are not allowed ('fsl,imx25-flexcan' was unexpected)
       'fsl,imx53-flexcan' is not one of ['fsl,imx7d-flexcan', 'fsl,imx6ul-flexcan', 'fsl,imx6sx-flexcan']
       'fsl,imx53-flexcan' is not one of ['fsl,ls1028ar1-flexcan']
       'fsl,imx6q-flexcan' was expected
       'fsl,lx2160ar1-flexcan' was expected
       From schema: Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
    
    Fixes: e5ab9aa7e49b ("dt-bindings: can: flexcan: convert fsl,*flexcan bindings to yaml")
    Reported-by: Rob Herring <robh+dt at kernel.org>
    Cc: Oleksij Rempel <o.rempel at pengutronix.de>
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Link: https://lore.kernel.org/r/20201111130507.1560881-4-mkl@pengutronix.de
    [robh: drop singular fsl,imx53-flexcan and fsl,imx35-flexcan]
    Signed-off-by: Rob Herring <robh at kernel.org>

diff --git a/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml b/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
index 3093c22e761c..13875eab2ed6 100644
--- a/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
+++ b/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
@@ -20,14 +20,17 @@ properties:
           - fsl,imx8qm-flexcan
           - fsl,imx8mp-flexcan
           - fsl,imx6q-flexcan
-          - fsl,imx53-flexcan
-          - fsl,imx35-flexcan
           - fsl,imx28-flexcan
           - fsl,imx25-flexcan
           - fsl,p1010-flexcan
           - fsl,vf610-flexcan
           - fsl,ls1021ar2-flexcan
           - fsl,lx2160ar1-flexcan
+      - items:
+          - enum:
+              - fsl,imx53-flexcan
+              - fsl,imx35-flexcan
+          - const: fsl,imx25-flexcan
       - items:
           - enum:
               - fsl,imx7d-flexcan
commit 60268b0e8258fdea9a3c9f4b51e161c123571db3
Author: Naveen Krishna Chatradhi <nchatrad at amd.com>
Date:   Thu Nov 12 22:51:59 2020 +0530

    hwmon: (amd_energy) modify the visibility of the counters
    
    This patch limits the visibility to owner and groups only for the
    energy counters exposed through the hwmon based amd_energy driver.
    
    Cc: stable at vger.kernel.org
    Reviewed-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
    Signed-off-by: Naveen Krishna Chatradhi <nchatrad at amd.com>
    Link: https://lore.kernel.org/r/20201112172159.8781-1-nchatrad@amd.com
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>

diff --git a/drivers/hwmon/amd_energy.c b/drivers/hwmon/amd_energy.c
index d06597303d5a..3197cda7bcd9 100644
--- a/drivers/hwmon/amd_energy.c
+++ b/drivers/hwmon/amd_energy.c
@@ -171,7 +171,7 @@ static umode_t amd_energy_is_visible(const void *_data,
 				     enum hwmon_sensor_types type,
 				     u32 attr, int channel)
 {
-	return 0444;
+	return 0440;
 }
 
 static int energy_accumulator(void *p)
commit 6d853c9e4104b4fc8d55dc9cd3b99712aa347174
Author: Chris Brandt <chris.brandt at renesas.com>
Date:   Wed Nov 11 08:12:09 2020 -0500

    usb: cdc-acm: Add DISABLE_ECHO for Renesas USB Download mode
    
    Renesas R-Car and RZ/G SoCs have a firmware download mode over USB.
    However, on reset a banner string is transmitted out which is not expected
    to be echoed back and will corrupt the protocol.
    
    Cc: stable <stable at vger.kernel.org>
    Acked-by: Oliver Neukum <oneukum at suse.com>
    Signed-off-by: Chris Brandt <chris.brandt at renesas.com>
    Link: https://lore.kernel.org/r/20201111131209.3977903-1-chris.brandt@renesas.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 1e7568867910..f52f1bc0559f 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1693,6 +1693,15 @@ static const struct usb_device_id acm_ids[] = {
 	{ USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
 	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
 	},
+	{ USB_DEVICE(0x045b, 0x023c),	/* Renesas USB Download mode */
+	.driver_info = DISABLE_ECHO,	/* Don't echo banner */
+	},
+	{ USB_DEVICE(0x045b, 0x0248),	/* Renesas USB Download mode */
+	.driver_info = DISABLE_ECHO,	/* Don't echo banner */
+	},
+	{ USB_DEVICE(0x045b, 0x024D),	/* Renesas USB Download mode */
+	.driver_info = DISABLE_ECHO,	/* Don't echo banner */
+	},
 	{ USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov at gmail.com */
 	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
 	},
commit 4df694a477685a3df7b561bfe6393db073bf476c
Author: Andrey Konovalov <andreyknvl at google.com>
Date:   Wed Nov 11 03:17:55 2020 +0100

    MAINTAINERS: add usb raw gadget entry
    
    Add myself (using the personal email address) as a reviewer for the
    USB Raw Gadget driver.
    
    Acked-by: Andrey Konovalov <andreyknvl at gmail.com>
    Signed-off-by: Andrey Konovalov <andreyknvl at google.com>
    Link: https://lore.kernel.org/r/245047b3fffaf5c0b791ed226d1ea272b2aef031.1605060950.git.andreyknvl@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index 3da6d8c154e4..f572d525a172 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -18175,6 +18175,14 @@ L:	linux-usb at vger.kernel.org
 S:	Supported
 F:	drivers/usb/class/usblp.c
 
+USB RAW GADGET DRIVER
+R:	Andrey Konovalov <andreyknvl at gmail.com>
+L:	linux-usb at vger.kernel.org
+S:	Maintained
+F:	Documentation/usb/raw-gadget.rst
+F:	drivers/usb/gadget/legacy/raw_gadget.c
+F:	include/uapi/linux/usb/raw_gadget.h
+
 USB QMI WWAN NETWORK DRIVER
 M:	Bjørn Mork <bjorn at mork.no>
 L:	netdev at vger.kernel.org
commit 0e6371fbfba3a4f76489e6e97c1c7f8386ad5fd2
Author: Heikki Krogerus <heikki.krogerus at linux.intel.com>
Date:   Tue Nov 10 15:05:47 2020 +0300

    usb: typec: ucsi: Report power supply changes
    
    When the ucsi power supply goes online/offline, and when the
    power levels change, the power supply class needs to be
    notified so it can inform the user space.
    
    Fixes: 992a60ed0d5e ("usb: typec: ucsi: register with power_supply class")
    Cc: stable at vger.kernel.org
    Reported-and-tested-by: Vladimir Yerilov <openmindead at gmail.com>
    Signed-off-by: Heikki Krogerus <heikki.krogerus at linux.intel.com>
    Link: https://lore.kernel.org/r/20201110120547.67922-1-heikki.krogerus@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/typec/ucsi/psy.c b/drivers/usb/typec/ucsi/psy.c
index 26ed0b520749..571a51e16234 100644
--- a/drivers/usb/typec/ucsi/psy.c
+++ b/drivers/usb/typec/ucsi/psy.c
@@ -238,4 +238,13 @@ void ucsi_unregister_port_psy(struct ucsi_connector *con)
 		return;
 
 	power_supply_unregister(con->psy);
+	con->psy = NULL;
+}
+
+void ucsi_port_psy_changed(struct ucsi_connector *con)
+{
+	if (IS_ERR_OR_NULL(con->psy))
+		return;
+
+	power_supply_changed(con->psy);
 }
diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 758b988ac518..51a570d40a42 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -643,8 +643,10 @@ static void ucsi_handle_connector_change(struct work_struct *work)
 	role = !!(con->status.flags & UCSI_CONSTAT_PWR_DIR);
 
 	if (con->status.change & UCSI_CONSTAT_POWER_OPMODE_CHANGE ||
-	    con->status.change & UCSI_CONSTAT_POWER_LEVEL_CHANGE)
+	    con->status.change & UCSI_CONSTAT_POWER_LEVEL_CHANGE) {
 		ucsi_pwr_opmode_change(con);
+		ucsi_port_psy_changed(con);
+	}
 
 	if (con->status.change & UCSI_CONSTAT_POWER_DIR_CHANGE) {
 		typec_set_pwr_role(con->port, role);
@@ -674,6 +676,8 @@ static void ucsi_handle_connector_change(struct work_struct *work)
 			ucsi_register_partner(con);
 		else
 			ucsi_unregister_partner(con);
+
+		ucsi_port_psy_changed(con);
 	}
 
 	if (con->status.change & UCSI_CONSTAT_CAM_CHANGE) {
@@ -994,6 +998,7 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)
 				  !!(con->status.flags & UCSI_CONSTAT_PWR_DIR));
 		ucsi_pwr_opmode_change(con);
 		ucsi_register_partner(con);
+		ucsi_port_psy_changed(con);
 	}
 
 	if (con->partner) {
diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h
index cba6f77bea61..b7a92f246050 100644
--- a/drivers/usb/typec/ucsi/ucsi.h
+++ b/drivers/usb/typec/ucsi/ucsi.h
@@ -340,9 +340,11 @@ int ucsi_resume(struct ucsi *ucsi);
 #if IS_ENABLED(CONFIG_POWER_SUPPLY)
 int ucsi_register_port_psy(struct ucsi_connector *con);
 void ucsi_unregister_port_psy(struct ucsi_connector *con);
+void ucsi_port_psy_changed(struct ucsi_connector *con);
 #else
 static inline int ucsi_register_port_psy(struct ucsi_connector *con) { return 0; }
 static inline void ucsi_unregister_port_psy(struct ucsi_connector *con) { }
+static inline void ucsi_port_psy_changed(struct ucsi_connector *con) { }
 #endif /* CONFIG_POWER_SUPPLY */
 
 #if IS_ENABLED(CONFIG_TYPEC_DP_ALTMODE)
commit f5c042b23f7429e5c2ac987b01a31c69059a978b
Author: Michał Mirosław <mirq-linux at rere.qmqm.pl>
Date:   Fri Nov 13 01:20:28 2020 +0100

    regulator: workaround self-referent regulators
    
    Workaround regulators whose supply name happens to be the same as its
    own name. This fixes boards that used to work before the early supply
    resolving was removed. The error message is left in place so that
    offending drivers can be detected.
    
    Fixes: aea6cb99703e ("regulator: resolve supply after creating regulator")
    Cc: stable at vger.kernel.org
    Reported-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
    Signed-off-by: Michał Mirosław <mirq-linux at rere.qmqm.pl>
    Tested-by: Ahmad Fatoum <a.fatoum at pengutronix.de> # stpmic1
    Link: https://lore.kernel.org/r/d703acde2a93100c3c7a81059d716c50ad1b1f52.1605226675.git.mirq-linux@rere.qmqm.pl
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d3b96efa20fd..42bbd99a36ac 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1844,7 +1844,10 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 	if (r == rdev) {
 		dev_err(dev, "Supply for %s (%s) resolved to itself\n",
 			rdev->desc->name, rdev->supply_name);
-		return -EINVAL;
+		if (!have_full_constraints())
+			return -EINVAL;
+		r = dummy_regulator_rdev;
+		get_device(&r->dev);
 	}
 
 	/*
commit 4b639e254d3d4f15ee4ff2b890a447204cfbeea9
Author: Michał Mirosław <mirq-linux at rere.qmqm.pl>
Date:   Fri Nov 13 01:20:28 2020 +0100

    regulator: avoid resolve_supply() infinite recursion
    
    When a regulator's name equals its supply's name the
    regulator_resolve_supply() recurses indefinitely. Add a check
    so that debugging the problem is easier. The "fixed" commit
    just exposed the problem.
    
    Fixes: aea6cb99703e ("regulator: resolve supply after creating regulator")
    Cc: stable at vger.kernel.org
    Reported-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
    Signed-off-by: Michał Mirosław <mirq-linux at rere.qmqm.pl>
    Tested-by: Ahmad Fatoum <a.fatoum at pengutronix.de> # stpmic1
    Link: https://lore.kernel.org/r/c6171057cfc0896f950c4d8cb82df0f9f1b89ad9.1605226675.git.mirq-linux@rere.qmqm.pl
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 84dd0aea97c5..d3b96efa20fd 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1841,6 +1841,12 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 		}
 	}
 
+	if (r == rdev) {
+		dev_err(dev, "Supply for %s (%s) resolved to itself\n",
+			rdev->desc->name, rdev->supply_name);
+		return -EINVAL;
+	}
+
 	/*
 	 * If the supply's parent device is not the same as the
 	 * regulator's parent device, then ensure the parent device
commit 57a6ad482af256b2a13de14194fb8f67c1a65f10
Author: Michał Mirosław <mirq-linux at rere.qmqm.pl>
Date:   Fri Nov 13 01:20:27 2020 +0100

    regulator: fix memory leak with repeated set_machine_constraints()
    
    Fixed commit introduced a possible second call to
    set_machine_constraints() and that allocates memory for
    rdev->constraints. Move the allocation to the caller so
    it's easier to manage and done once.
    
    Fixes: aea6cb99703e ("regulator: resolve supply after creating regulator")
    Cc: stable at vger.kernel.org
    Signed-off-by: Michał Mirosław <mirq-linux at rere.qmqm.pl>
    Tested-by: Ahmad Fatoum <a.fatoum at pengutronix.de> # stpmic1
    Link: https://lore.kernel.org/r/78c3d4016cebc08d441aad18cb924b4e4d9cf9df.1605226675.git.mirq-linux@rere.qmqm.pl
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 70168f2a53ed..84dd0aea97c5 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1315,7 +1315,6 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
 /**
  * set_machine_constraints - sets regulator constraints
  * @rdev: regulator source
- * @constraints: constraints to apply
  *
  * Allows platform initialisation code to define and constrain
  * regulator circuits e.g. valid voltage/current ranges, etc.  NOTE:
@@ -1323,21 +1322,11 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
  * regulator operations to proceed i.e. set_voltage, set_current_limit,
  * set_mode.
  */
-static int set_machine_constraints(struct regulator_dev *rdev,
-	const struct regulation_constraints *constraints)
+static int set_machine_constraints(struct regulator_dev *rdev)
 {
 	int ret = 0;
 	const struct regulator_ops *ops = rdev->desc->ops;
 
-	if (constraints)
-		rdev->constraints = kmemdup(constraints, sizeof(*constraints),
-					    GFP_KERNEL);
-	else
-		rdev->constraints = kzalloc(sizeof(*constraints),
-					    GFP_KERNEL);
-	if (!rdev->constraints)
-		return -ENOMEM;
-
 	ret = machine_constraints_voltage(rdev, rdev->constraints);
 	if (ret != 0)
 		return ret;
@@ -5146,7 +5135,6 @@ struct regulator_dev *
 regulator_register(const struct regulator_desc *regulator_desc,
 		   const struct regulator_config *cfg)
 {
-	const struct regulation_constraints *constraints = NULL;
 	const struct regulator_init_data *init_data;
 	struct regulator_config *config = NULL;
 	static atomic_t regulator_no = ATOMIC_INIT(-1);
@@ -5285,14 +5273,23 @@ regulator_register(const struct regulator_desc *regulator_desc,
 
 	/* set regulator constraints */
 	if (init_data)
-		constraints = &init_data->constraints;
+		rdev->constraints = kmemdup(&init_data->constraints,
+					    sizeof(*rdev->constraints),
+					    GFP_KERNEL);
+	else
+		rdev->constraints = kzalloc(sizeof(*rdev->constraints),
+					    GFP_KERNEL);
+	if (!rdev->constraints) {
+		ret = -ENOMEM;
+		goto wash;
+	}
 
 	if (init_data && init_data->supply_regulator)
 		rdev->supply_name = init_data->supply_regulator;
 	else if (regulator_desc->supply_name)
 		rdev->supply_name = regulator_desc->supply_name;
 
-	ret = set_machine_constraints(rdev, constraints);
+	ret = set_machine_constraints(rdev);
 	if (ret == -EPROBE_DEFER) {
 		/* Regulator might be in bypass mode and so needs its supply
 		 * to set the constraints */
@@ -5301,7 +5298,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
 		 * that is just being created */
 		ret = regulator_resolve_supply(rdev);
 		if (!ret)
-			ret = set_machine_constraints(rdev, constraints);
+			ret = set_machine_constraints(rdev);
 		else
 			rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
 				 ERR_PTR(ret));
commit 106e6d8df4842d816dae23076c501ae48386afcb
Author: Shuming Fan <shumingf at realtek.com>
Date:   Fri Nov 13 17:21:25 2020 +0800

    ASoC: rt1015: increase the time to detect BCLK
    
    To meet the most platform, the detection time should be increased to
    avoid that the flushing DAC data fails.
    
    Signed-off-by: Shuming Fan <shumingf at realtek.com>
    Link: https://lore.kernel.org/r/20201113092125.19206-1-shumingf@realtek.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/sound/soc/codecs/rt1015.c b/sound/soc/codecs/rt1015.c
index 967193518349..3db07293c70b 100644
--- a/sound/soc/codecs/rt1015.c
+++ b/sound/soc/codecs/rt1015.c
@@ -544,7 +544,7 @@ static void rt1015_flush_work(struct work_struct *work)
 	struct rt1015_priv *rt1015 = container_of(work, struct rt1015_priv,
 						flush_work.work);
 	struct snd_soc_component *component = rt1015->component;
-	unsigned int val, i = 0, count = 20;
+	unsigned int val, i = 0, count = 200;
 
 	while (i < count) {
 		usleep_range(1000, 1500);
commit 76255470ffa2795a44032e8b3c1ced11d81aa2db
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Fri Nov 6 20:22:21 2020 +0800

    xhci: hisilicon: fix refercence leak in xhci_histb_probe
    
    pm_runtime_get_sync() will increment pm usage at first and it
    will resume the device later. We should decrease the usage count
    whetever it succeeded or failed(maybe runtime of the device has
    error, or device is in inaccessible state, or other error state).
    If we do not call put operation to decrease the reference, it will
    result in reference leak in xhci_histb_probe. Moreover, this
    device cannot enter the idle state and always stay busy or other
    non-idle state later. So we fixed it by jumping to error handling
    branch.
    
    Fixes: c508f41da0788 ("xhci: hisilicon: support HiSilicon STB xHCI host controller")
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Link: https://lore.kernel.org/r/20201106122221.2304528-1-zhangqilong3@huawei.com
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-histb.c b/drivers/usb/host/xhci-histb.c
index 5546e7e013a8..08369857686e 100644
--- a/drivers/usb/host/xhci-histb.c
+++ b/drivers/usb/host/xhci-histb.c
@@ -240,7 +240,7 @@ static int xhci_histb_probe(struct platform_device *pdev)
 	/* Initialize dma_mask and coherent_dma_mask to 32-bits */
 	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
 	if (ret)
-		return ret;
+		goto disable_pm;
 
 	hcd = usb_create_hcd(driver, dev, dev_name(dev));
 	if (!hcd) {
commit ffa13d2d94029882eca22a565551783787f121e5
Author: Geert Uytterhoeven <geert+renesas at glider.be>
Date:   Thu Nov 12 14:59:00 2020 +0100

    Revert "usb: musb: convert to devm_platform_ioremap_resource_byname"
    
    This reverts commit 2d30e408a2a6b3443d3232593e3d472584a3e9f8.
    
    On Beaglebone Black, where each interface has 2 children:
    
        musb-dsps 47401c00.usb: can't request region for resource [mem 0x47401800-0x474019ff]
        musb-hdrc musb-hdrc.1: musb_init_controller failed with status -16
        musb-hdrc: probe of musb-hdrc.1 failed with error -16
        musb-dsps 47401400.usb: can't request region for resource [mem 0x47401000-0x474011ff]
        musb-hdrc musb-hdrc.0: musb_init_controller failed with status -16
        musb-hdrc: probe of musb-hdrc.0 failed with error -16
    
    Before, devm_ioremap_resource() was called on "dev" ("musb-hdrc.0" or
    "musb-hdrc.1"), after it is called on "&pdev->dev" ("47401400.usb" or
    "47401c00.usb"), leading to a duplicate region request, which fails.
    
    Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
    Fixes: 2d30e408a2a6 ("usb: musb: convert to devm_platform_ioremap_resource_byname")
    Cc: stable <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201112135900.3822599-1-geert+renesas@glider.be
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 30085b2be7b9..5892f3ce0cdc 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -429,10 +429,12 @@ static int dsps_musb_init(struct musb *musb)
 	struct platform_device *parent = to_platform_device(dev->parent);
 	const struct dsps_musb_wrapper *wrp = glue->wrp;
 	void __iomem *reg_base;
+	struct resource *r;
 	u32 rev, val;
 	int ret;
 
-	reg_base = devm_platform_ioremap_resource_byname(parent, "control");
+	r = platform_get_resource_byname(parent, IORESOURCE_MEM, "control");
+	reg_base = devm_ioremap_resource(dev, r);
 	if (IS_ERR(reg_base))
 		return PTR_ERR(reg_base);
 	musb->ctrl_base = reg_base;
commit b57d5437e3740bffed60ceedf74f881ab5bd6122
Merge: 7e47a750116d 107954afc5df
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 13 14:00:08 2020 +0100

    Merge tag 'sunxi-fixes-for-5.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into arm/fixes
    
    Mostly some fixes for a fallout in a PHY driver that pointed out errors
    in our DTs. Along with that, Jernej agreed to be a reviewer!
    
    * tag 'sunxi-fixes-for-5.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux:
      arm64: dts: allwinner: h5: OrangePi Prime: Fix ethernet node
      arm64: dts: allwinner: a64: bananapi-m64: Enable RGMII RX/TX delay on PHY
      arm64: dts: allwinner: h5: libretech-all-h5-cc: Enable RGMII RX/TX delay on PHY
      ARM: dts: sunxi: bananapi-m2-plus: Enable RGMII RX/TX delay on Ethernet PHY
      ARM: dts: sun9i: Enable both RGMII RX/TX delay on Ethernet PHY
      ARM: dts: sun8i: a83t: Enable both RGMII RX/TX delay on Ethernet PHY
      ARM: dts: sun8i: h3: orangepi-plus2e: Enable RGMII RX/TX delay on Ethernet PHY
      ARM: dts: sun7i: bananapi-m1-plus: Enable RGMII RX/TX delay on Ethernet PHY
      ARM: dts: sun7i: cubietruck: Enable RGMII RX/TX delay on Ethernet PHY
      ARM: dts: sun6i: a31-hummingbird: Enable RGMII RX/TX delay on Ethernet PHY
      Revert "arm: sun8i: orangepi-pc-plus: Set EMAC activity LEDs to active high"
      ARM: dts: sun8i: r40: bananapi-m2-ultra: Fix ethernet node
      arm64: dts: allwinner: h5: OrangePi PC2: Fix ethernet node
      arm64: dts: allwinner: a64: Pine64 Plus: Fix ethernet node
      arm64: dts: allwinner: a64: OrangePi Win: Fix ethernet node
      arm64: dts: allwinner: Pine H64: Enable both RGMII RX/TX delay
      arm64: dts: allwinner: beelink-gs1: Enable both RGMII RX/TX delay
      arm64: dts: allwinner: pinetab: Drop unnecessary address/size-cells information
      MAINTAINERS: Add Jernej Škrabec as a reviewer for Allwinner SoCs support
    
    Link: https://lore.kernel.org/r/d1a1a6a6-fca4-4f1b-93b3-f2f6963b4e04.lettre@localhost
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 7e47a750116d2e1dfdd60008a7fd480a2806a0dd
Merge: 0461a1ae98bc f4c7fa39415d
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 13 13:58:50 2020 +0100

    Merge tag 'stm32-dt-for-v5.10-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32 into arm/fixes
    
    STM32 DT fixes for v5.10, round 2
    
    Highlights:
    -----------
    
     -Fixes are for DHCOM/DHCOR boards:
      - Fix TA3-GPIO-C button
      - Fix LED5 mapping
      - Define VIO regulator supply on DHCOM
      - Enable thermal sensor support on stm32mp15xx-dhcor
      - Keep VDDA LDO1 always on to avoid leakage
    
    * tag 'stm32-dt-for-v5.10-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32:
      ARM: dts: stm32: Keep VDDA LDO1 always on on DHCOM
      ARM: dts: stm32: Enable thermal sensor support on stm32mp15xx-dhcor
      ARM: dts: stm32: Define VIO regulator supply on DHCOM
      ARM: dts: stm32: Fix LED5 on STM32MP1 DHCOM PDK2
      ARM: dts: stm32: Fix TA3-GPIO-C key on STM32MP1 DHCOM PDK2
    
    Link: https://lore.kernel.org/r/65bfc73d-aae1-5309-2e11-1e3da647ad46@st.com
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 0461a1ae98bc3045492333bebf6e79d4e859d3a1
Merge: 53bf2776e313 be353be27874
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 13 13:44:03 2020 +0100

    Merge tag 'amdtee-fixes-for-5.10' of git://git.linaro.org:/people/jens.wiklander/linux-tee into arm/fixes
    
    AMD-TEE driver bug fixes
    
    AMD-TEE driver keeps track of shared memory buffers and their
    corresponding buffer id's in a global linked list. These buffers are
    used to share data between x86 and AMD Secure Processor. This pull
    request fixes issues related to maintaining mapped buffers in a shared
    linked list.
    
    * tag 'amdtee-fixes-for-5.10' of git://git.linaro.org:/people/jens.wiklander/linux-tee:
      tee: amdtee: synchronize access to shm list
      tee: amdtee: fix memory leak due to reset of global shm list
    
    Link: https://lore.kernel.org/r/20201109080809.GA3862873@jade
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 53bf2776e31376f0b6a1fd7c9e1abc61241825a2
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Thu Nov 5 22:47:02 2020 +0100

    ARM: dts: exynos: revert "add input clock to CMU in Exynos4412 Odroid"
    
    This reverts commit eaf2d2f6895d676dda6c95a652b58594f2887720.
    
    The commit eaf2d2f6895d ("ARM: dts: exynos: add input clock to CMU in
    Exynos4412 Odroid") breaks probing of usb3503 USB hub on Odroid U3.
    
    It changes the order of clock drivers probe: the clkout (Exynos PMU)
    driver is probed before the main clk-exynos4 driver.  The clkout driver
    on Exynos4412 depends on clk-exynos4 but it does not support deferred
    probe, therefore this dependency and changed probe order causes probe
    failure.
    
    The usb3503 USB hub on Odroid U3 on the other hand requires clkout
    clock.  This can be seen in logs:
    
        [    5.007442] usb3503 0-0008: unable to request refclk (-517)
    
    Reported-by: Marek Szyprowski <m.szyprowski at samsung.com>
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Link: https://lore.kernel.org/r/20200921174818.15525-1-krzk@kernel.org
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
index ab291cec650a..2983e91bc7dd 100644
--- a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
+++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
@@ -122,7 +122,6 @@
 };
 
 &clock {
-	clocks = <&clock CLK_XUSBXTI>;
 	assigned-clocks = <&clock CLK_FOUT_EPLL>;
 	assigned-clock-rates = <45158401>;
 };
commit 53bbff2668801638566151c8d393484ba7997cca
Merge: e57523fa64d6 f126b6702e73
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 13 13:18:36 2020 +0100

    Merge tag 'socfpga_fix_for_v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux into arm/fixes
    
    arm64: dts: fix for v5.10
    - Fix the qspi node to have the required "jedec,spi-nor"
    
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit e57523fa64d6166de6e70227a3d4395233015bc8
Merge: 47cd1eac336c cd12e4f14f7c
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 13 13:16:00 2020 +0100

    Merge tag 'samsung-fixes-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux into arm/fixes
    
    Samsung changes for v5.10
    
    Remove Kamil Debski, Kyungmin Park and Jeongtae Park from maintainers of
    several drivers.  There were no maintenance activities from them for
    some time.  While at touching credits, this also cleans up white spaces.
    
    * tag 'samsung-fixes-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux:
      CREDITS: remove trailing white spaces
      MAINTAINERS: remove Jeongtae Park from Samsung MFC entry
      MAINTAINERS: move Kyungmin Park to credits
      MAINTAINERS: move Kamil Debski to credits
    
    Link: https://lore.kernel.org/r/20201031120237.8542-1-krzk@kernel.org
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --cc MAINTAINERS
index 3da6d8c154e4,40b4a582b4cc..e7e9225c6239
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@@ -2374,7 -2374,8 +2374,7 @@@ F:	drivers/i2c/busses/i2c-rk3x.
  F:	sound/soc/rockchip/
  N:	rockchip
  
- ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
+ ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
 -M:	Kukjin Kim <kgene at kernel.org>
  M:	Krzysztof Kozlowski <krzk at kernel.org>
  L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
  L:	linux-samsung-soc at vger.kernel.org
commit 47cd1eac336cea6cd37cb27de2ed49b4113c6116
Merge: f8394f232b1e e402599e5e5e
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Fri Nov 13 13:07:53 2020 +0100

    Merge tag 'imx-fixes-5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into arm/fixes
    
    i.MX fixes for 5.10, 3rd round:
    
    - A series from Krzysztof Kozlowski to fix missing PMIC's interrupt
      line pull-up for i.MX8MM and i.MX8MN boards.
    - Set Bluetooth chip max-speed to 4000000 on imx8mm-beacon-som board
      to fix the choppy Bluetooth audio sound.
    - Remove non-existent OTG2, usbphynop2, and the usbmisc2 from i.MX8MN
      device tree.
    - Fix the endianness setting of RCPM node on Layerscape SoCs.
    - Add the missing dma-coherent property for qoriq-fman device to improve
      the performance.
    - Fix the Ethernet PHY address on imx6q-prti6q board.
    
    * tag 'imx-fixes-5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
      ARM: dts: imx6q-prti6q: fix PHY address
      arm64: dts imx8mn: Remove non-existent USB OTG2
      arm64: dts: imx8mm-beacon-som: Fix Choppy BT audio
      arm64: dts: fsl: DPAA FMan DMA operations are coherent
      arm64: dts: fsl: fix endianness issue of rcpm
      arm64: dts: imx8mn-evk: fix missing PMIC's interrupt line pull-up
      arm64: dts: imx8mn-ddr4-evk: fix missing PMIC's interrupt line pull-up
      arm64: dts: imx8mn-var-som: fix missing PMIC's interrupt line pull-up
      arm64: dts: imx8mm-evk: fix missing PMIC's interrupt line pull-up
      arm64: dts: imx8mm-beacon-som: fix missing PMIC's interrupt line pull-up
      arm64: dts: imx8mm-var-som: fix missing PMIC's interrupt line pull-up
    
    Link: https://lore.kernel.org/r/20201030151821.GA28266@dragon
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>

commit 96308b066184d6dcdb677890e620e68290ae98ae
Author: Babu Moger <babu.moger at amd.com>
Date:   Thu Nov 12 16:18:03 2020 -0600

    KVM: SVM: Update cr3_lm_rsvd_bits for AMD SEV guests
    
    For AMD SEV guests, update the cr3_lm_rsvd_bits to mask
    the memory encryption bit in reserved bits.
    
    Signed-off-by: Babu Moger <babu.moger at amd.com>
    Message-Id: <160521948301.32054.5783800787423231162.stgit at bmoger-ubuntu>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 2f32fd09e259..1e81cfebd491 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -3741,6 +3741,7 @@ static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
 static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 {
 	struct vcpu_svm *svm = to_svm(vcpu);
+	struct kvm_cpuid_entry2 *best;
 
 	vcpu->arch.xsaves_enabled = guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) &&
 				    boot_cpu_has(X86_FEATURE_XSAVE) &&
@@ -3753,6 +3754,13 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 	/* Check again if INVPCID interception if required */
 	svm_check_invpcid(svm);
 
+	/* For sev guests, the memory encryption bit is not reserved in CR3.  */
+	if (sev_guest(vcpu->kvm)) {
+		best = kvm_find_cpuid_entry(vcpu, 0x8000001F, 0);
+		if (best)
+			vcpu->arch.cr3_lm_rsvd_bits &= ~(1UL << (best->ebx & 0x3f));
+	}
+
 	if (!kvm_vcpu_apicv_active(vcpu))
 		return;
 
commit 0107973a80adad5b73232d3fbcd26f710ab1f851
Author: Babu Moger <babu.moger at amd.com>
Date:   Thu Nov 12 16:17:56 2020 -0600

    KVM: x86: Introduce cr3_lm_rsvd_bits in kvm_vcpu_arch
    
    SEV guests fail to boot on a system that supports the PCID feature.
    
    While emulating the RSM instruction, KVM reads the guest CR3
    and calls kvm_set_cr3(). If the vCPU is in the long mode,
    kvm_set_cr3() does a sanity check for the CR3 value. In this case,
    it validates whether the value has any reserved bits set. The
    reserved bit range is 63:cpuid_maxphysaddr(). When AMD memory
    encryption is enabled, the memory encryption bit is set in the CR3
    value. The memory encryption bit may fall within the KVM reserved
    bit range, causing the KVM emulation failure.
    
    Introduce a new field cr3_lm_rsvd_bits in kvm_vcpu_arch which will
    cache the reserved bits in the CR3 value. This will be initialized
    to rsvd_bits(cpuid_maxphyaddr(vcpu), 63).
    
    If the architecture has any special bits(like AMD SEV encryption bit)
    that needs to be masked from the reserved bits, should be cleared
    in vendor specific kvm_x86_ops.vcpu_after_set_cpuid handler.
    
    Fixes: a780a3ea628268b2 ("KVM: X86: Fix reserved bits check for MOV to CR3")
    Signed-off-by: Babu Moger <babu.moger at amd.com>
    Message-Id: <160521947657.32054.3264016688005356563.stgit at bmoger-ubuntu>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index d44858b69353..324ddd7fd0aa 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -639,6 +639,7 @@ struct kvm_vcpu_arch {
 	int cpuid_nent;
 	struct kvm_cpuid_entry2 *cpuid_entries;
 
+	unsigned long cr3_lm_rsvd_bits;
 	int maxphyaddr;
 	int max_tdp_level;
 
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index d50041f570e8..f87b5dfbaba4 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -178,6 +178,8 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 	vcpu->arch.cr4_guest_rsvd_bits =
 	    __cr4_reserved_bits(guest_cpuid_has, vcpu);
 
+	vcpu->arch.cr3_lm_rsvd_bits = rsvd_bits(cpuid_maxphyaddr(vcpu), 63);
+
 	/* Invoke the vendor callback only after the above state is updated. */
 	kvm_x86_ops.vcpu_after_set_cpuid(vcpu);
 }
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 447edc0d1d5a..078a39d489fe 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1041,7 +1041,7 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3)
 	}
 
 	if (is_long_mode(vcpu) &&
-	    (cr3 & rsvd_bits(cpuid_maxphyaddr(vcpu), 63)))
+	    (cr3 & vcpu->arch.cr3_lm_rsvd_bits))
 		return 1;
 	else if (is_pae_paging(vcpu) &&
 		 !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
commit 51b958e5aeb1e18c00332e0b37c5d4e95a3eff84
Author: David Edmondson <david.edmondson at oracle.com>
Date:   Tue Nov 3 12:04:00 2020 +0000

    KVM: x86: clflushopt should be treated as a no-op by emulation
    
    The instruction emulator ignores clflush instructions, yet fails to
    support clflushopt. Treat both similarly.
    
    Fixes: 13e457e0eebf ("KVM: x86: Emulator does not decode clflush well")
    Signed-off-by: David Edmondson <david.edmondson at oracle.com>
    Message-Id: <20201103120400.240882-1-david.edmondson at oracle.com>
    Reviewed-by: Joao Martins <joao.m.martins at oracle.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 0d917eb70319..56cae1ff9e3f 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -4046,6 +4046,12 @@ static int em_clflush(struct x86_emulate_ctxt *ctxt)
 	return X86EMUL_CONTINUE;
 }
 
+static int em_clflushopt(struct x86_emulate_ctxt *ctxt)
+{
+	/* emulating clflushopt regardless of cpuid */
+	return X86EMUL_CONTINUE;
+}
+
 static int em_movsxd(struct x86_emulate_ctxt *ctxt)
 {
 	ctxt->dst.val = (s32) ctxt->src.val;
@@ -4585,7 +4591,7 @@ static const struct opcode group11[] = {
 };
 
 static const struct gprefix pfx_0f_ae_7 = {
-	I(SrcMem | ByteOp, em_clflush), N, N, N,
+	I(SrcMem | ByteOp, em_clflush), I(SrcMem | ByteOp, em_clflushopt), N, N,
 };
 
 static const struct group_dual group15 = { {
commit 2c38234c425e627ca493eb0b7a9a34899a1f03ef
Merge: 585e5b17b92d ed4ffaf49bf9
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Fri Nov 13 06:28:23 2020 -0500

    Merge tag 'kvmarm-fixes-5.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD
    
    KVM/arm64 fixes for v5.10, take #3
    
    - Allow userspace to downgrade ID_AA64PFR0_EL1.CSV2
    - Inject UNDEF on SCXTNUM_ELx access

commit ff828729be446b86957f7c294068758231cd2183
Author: Thomas Gleixner <tglx at linutronix.de>
Date:   Thu Nov 12 20:14:16 2020 +0100

    iommu/vt-d: Cure VF irqdomain hickup
    
    The recent changes to store the MSI irqdomain pointer in struct device
    missed that Intel DMAR does not register virtual function devices.  Due to
    that a VF device gets the plain PCI-MSI domain assigned and then issues
    compat MSI messages which get caught by the interrupt remapping unit.
    
    Cure that by inheriting the irq domain from the physical function
    device.
    
    Ideally the irqdomain would be associated to the bus, but DMAR can have
    multiple units and therefore irqdomains on a single bus. The VF 'bus' could
    of course inherit the domain from the PF, but that'd be yet another x86
    oddity.
    
    Fixes: 85a8dfc57a0b ("iommm/vt-d: Store irq domain in struct device")
    Reported-by: Jason Gunthorpe <jgg at nvidia.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Acked-by: Lu Baolu <baolu.lu at linux.intel.com>
    Cc: Joerg Roedel <joro at 8bytes.org>
    Cc: Bjorn Helgaas <bhelgaas at google.com>
    Cc: Marc Zyngier <maz at kernel.org>
    Cc: David Woodhouse <dwmw2 at infradead.org>
    Link: https://lore.kernel.org/r/draft-87eekymlpz.fsf@nanos.tec.linutronix.de

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index 404b40af31cb..b2e804473209 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -333,6 +333,11 @@ static void  dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
 	dmar_iommu_notify_scope_dev(info);
 }
 
+static inline void vf_inherit_msi_domain(struct pci_dev *pdev)
+{
+	dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&pdev->physfn->dev));
+}
+
 static int dmar_pci_bus_notifier(struct notifier_block *nb,
 				 unsigned long action, void *data)
 {
@@ -342,8 +347,20 @@ static int dmar_pci_bus_notifier(struct notifier_block *nb,
 	/* Only care about add/remove events for physical functions.
 	 * For VFs we actually do the lookup based on the corresponding
 	 * PF in device_to_iommu() anyway. */
-	if (pdev->is_virtfn)
+	if (pdev->is_virtfn) {
+		/*
+		 * Ensure that the VF device inherits the irq domain of the
+		 * PF device. Ideally the device would inherit the domain
+		 * from the bus, but DMAR can have multiple units per bus
+		 * which makes this impossible. The VF 'bus' could inherit
+		 * from the PF device, but that's yet another x86'sism to
+		 * inflict on everybody else.
+		 */
+		if (action == BUS_NOTIFY_ADD_DEVICE)
+			vf_inherit_msi_domain(pdev);
 		return NOTIFY_DONE;
+	}
+
 	if (action != BUS_NOTIFY_ADD_DEVICE &&
 	    action != BUS_NOTIFY_REMOVED_DEVICE)
 		return NOTIFY_DONE;
commit 95a793c3bc75cf888e0e641d656e7d080f487d8b
Author: Takashi Sakamoto <o-takashi at sakamocchi.jp>
Date:   Fri Nov 13 18:20:43 2020 +0900

    ALSA: ctl: fix error path at adding user-defined element set
    
    When processing request to add/replace user-defined element set, check
    of given element identifier and decision of numeric identifier is done
    in "__snd_ctl_add_replace()" helper function. When the result of check
    is wrong, the helper function returns error code. The error code shall
    be returned to userspace application.
    
    Current implementation includes bug to return zero to userspace application
    regardless of the result. This commit fixes the bug.
    
    Cc: <stable at vger.kernel.org>
    Fixes: e1a7bfe38079 ("ALSA: control: Fix race between adding and removing a user element")
    Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
    Link: https://lore.kernel.org/r/20201113092043.16148-1-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/core/control.c b/sound/core/control.c
index 4373de42a5a0..3b44378b9dec 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -1539,7 +1539,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
 
  unlock:
 	up_write(&card->controls_rwsem);
-	return 0;
+	return err;
 }
 
 static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
commit 9e885770277d2ed8d85f9cbd4992515ec324242f
Author: Kailang Yang <kailang at realtek.com>
Date:   Tue Nov 3 15:30:51 2020 +0800

    ALSA: hda/realtek - HP Headset Mic can't detect after boot
    
    System boot or warm boot with plugged headset.
    If it turn on power save mode, Headset Mic will lose.
    This patch will solve this issue.
    
    Signed-off-by: Kailang Yang <kailang at realtek.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/1ae4d98e92c147b780ace3911c4e1d73@realtek.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 371f6b865439..739dbaf54517 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6319,6 +6319,7 @@ enum {
 	ALC256_FIXUP_ASUS_HPE,
 	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
 	ALC287_FIXUP_HP_GPIO_LED,
+	ALC256_FIXUP_HP_HEADSET_MIC,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -7733,6 +7734,10 @@ static const struct hda_fixup alc269_fixups[] = {
 		.type = HDA_FIXUP_FUNC,
 		.v.func = alc287_fixup_hp_gpio_led,
 	},
+	[ALC256_FIXUP_HP_HEADSET_MIC] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc274_fixup_hp_headset_mic,
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -8348,6 +8353,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
 		{0x19, 0x02a11020},
 		{0x1a, 0x02a11030},
 		{0x21, 0x0221101f}),
+	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
+		{0x14, 0x90170110},
+		{0x19, 0x02a11020},
+		{0x21, 0x02211030}),
 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
 		{0x14, 0x90170110},
 		{0x21, 0x02211020}),
@@ -8450,6 +8459,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
 		{0x1a, 0x90a70130},
 		{0x1b, 0x90170110},
 		{0x21, 0x03211020}),
+       SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
+		{0x14, 0x90170110},
+		{0x19, 0x02a11020},
+		{0x21, 0x0221101f}),
        SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
 		{0x17, 0x90170110},
 		{0x19, 0x03a11030},
commit a0ccbc5319d57b9efdc55c943a3fde30a0776502
Author: Kailang Yang <kailang at realtek.com>
Date:   Fri Nov 6 15:20:38 2020 +0800

    ALSA: hda/realtek - Add supported mute Led for HP
    
    HP Pavilion x360 Convertible machine, it supported mute led.
    GPIO4 high will turn on led.
    The patch will enable control led via GPIO4 pin.
    
    Signed-off-by: Kailang Yang <kailang at realtek.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/1ae4d98e92c147b780ace3911c4e1d73@realtek.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 69a952c9e011..371f6b865439 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -4226,6 +4226,12 @@ static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
 	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
 }
 
+static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
+				const struct hda_fixup *fix, int action)
+{
+	alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
+}
+
 /* turn on/off mic-mute LED per capture hook via VREF change */
 static int vref_micmute_led_set(struct led_classdev *led_cdev,
 				enum led_brightness brightness)
@@ -6312,6 +6318,7 @@ enum {
 	ALC274_FIXUP_HP_HEADSET_MIC,
 	ALC256_FIXUP_ASUS_HPE,
 	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
+	ALC287_FIXUP_HP_GPIO_LED,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -7722,6 +7729,10 @@ static const struct hda_fixup alc269_fixups[] = {
 		.chained = true,
 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
 	},
+	[ALC287_FIXUP_HP_GPIO_LED] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc287_fixup_hp_gpio_led,
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7876,6 +7887,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
 	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
 	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
+	SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
+	SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
 	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
 	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
 	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
commit 23c216416056148136bdaf0cdd18caf4904bb6e1
Author: Konrad Dybcio <konrad.dybcio at somainline.org>
Date:   Thu Nov 5 00:22:13 2020 +0100

    arm64: cpu_errata: Apply Erratum 845719 to KRYO2XX Silver
    
    QCOM KRYO2XX Silver cores are Cortex-A53 based and are
    susceptible to the 845719 erratum. Add them to the lookup
    list to apply the erratum.
    
    Signed-off-by: Konrad Dybcio <konrad.dybcio at somainline.org>
    Link: https://lore.kernel.org/r/20201104232218.198800-5-konrad.dybcio@somainline.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
index 61314fd70f13..cafaf0da05b7 100644
--- a/arch/arm64/kernel/cpu_errata.c
+++ b/arch/arm64/kernel/cpu_errata.c
@@ -299,6 +299,8 @@ static const struct midr_range erratum_845719_list[] = {
 	MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
 	/* Brahma-B53 r0p[0] */
 	MIDR_REV(MIDR_BRAHMA_B53, 0, 0),
+	/* Kryo2XX Silver rAp4 */
+	MIDR_REV(MIDR_QCOM_KRYO_2XX_SILVER, 0xa, 0x4),
 	{},
 };
 #endif
commit 38328d40116739af0692748427bedda35b286c33
Author: Konrad Dybcio <konrad.dybcio at somainline.org>
Date:   Thu Nov 5 00:22:12 2020 +0100

    arm64: proton-pack: Add KRYO2XX silver CPUs to spectre-v2 safe-list
    
    KRYO2XX silver (LITTLE) CPUs are based on Cortex-A53
    and they are not affected by spectre-v2.
    
    Signed-off-by: Konrad Dybcio <konrad.dybcio at somainline.org>
    Link: https://lore.kernel.org/r/20201104232218.198800-4-konrad.dybcio@somainline.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/proton-pack.c b/arch/arm64/kernel/proton-pack.c
index c18eb7d41274..f6e4e3737405 100644
--- a/arch/arm64/kernel/proton-pack.c
+++ b/arch/arm64/kernel/proton-pack.c
@@ -118,6 +118,7 @@ static enum mitigation_state spectre_v2_get_cpu_hw_mitigation_state(void)
 		MIDR_ALL_VERSIONS(MIDR_CORTEX_A55),
 		MIDR_ALL_VERSIONS(MIDR_BRAHMA_B53),
 		MIDR_ALL_VERSIONS(MIDR_HISI_TSV110),
+		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_2XX_SILVER),
 		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_3XX_SILVER),
 		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_4XX_SILVER),
 		{ /* sentinel */ }
commit e3dd11a9f2521cecbcf30c2fd17ecc5a445dfb94
Author: Konrad Dybcio <konrad.dybcio at somainline.org>
Date:   Thu Nov 5 00:22:11 2020 +0100

    arm64: kpti: Add KRYO2XX gold/silver CPU cores to kpti safelist
    
    QCOM KRYO2XX gold (big) silver (LITTLE) CPU cores are based on
    Cortex-A73 and Cortex-A53 respectively and are meltdown safe,
    hence add them to kpti_safe_list[].
    
    Signed-off-by: Konrad Dybcio <konrad.dybcio at somainline.org>
    Link: https://lore.kernel.org/r/20201104232218.198800-3-konrad.dybcio@somainline.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index dcc165b3fc04..6f36c4f62f69 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -1337,6 +1337,8 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
 		MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
 		MIDR_ALL_VERSIONS(MIDR_HISI_TSV110),
 		MIDR_ALL_VERSIONS(MIDR_NVIDIA_CARMEL),
+		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_2XX_GOLD),
+		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_2XX_SILVER),
 		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_3XX_SILVER),
 		MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_4XX_SILVER),
 		{ /* sentinel */ }
commit 77473cffef21611b4423f613fe32836afb26405e
Author: Konrad Dybcio <konrad.dybcio at somainline.org>
Date:   Thu Nov 5 00:22:10 2020 +0100

    arm64: Add MIDR value for KRYO2XX gold/silver CPU cores
    
    Add MIDR value for KRYO2XX gold (big) and silver (LITTLE)
    CPU cores which are used in Qualcomm Technologies, Inc.
    SoCs. This will be used to identify and apply errata
    which are applicable for these CPU cores.
    
    Signed-off-by: Konrad Dybcio <konrad.dybcio at somainline.org>
    Link: https://lore.kernel.org/r/20201104232218.198800-2-konrad.dybcio@somainline.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
index 9e2e9a63c7b6..ef5b040dee44 100644
--- a/arch/arm64/include/asm/cputype.h
+++ b/arch/arm64/include/asm/cputype.h
@@ -86,6 +86,8 @@
 #define QCOM_CPU_PART_FALKOR_V1		0x800
 #define QCOM_CPU_PART_FALKOR		0xC00
 #define QCOM_CPU_PART_KRYO		0x200
+#define QCOM_CPU_PART_KRYO_2XX_GOLD	0x800
+#define QCOM_CPU_PART_KRYO_2XX_SILVER	0x801
 #define QCOM_CPU_PART_KRYO_3XX_SILVER	0x803
 #define QCOM_CPU_PART_KRYO_4XX_GOLD	0x804
 #define QCOM_CPU_PART_KRYO_4XX_SILVER	0x805
@@ -116,6 +118,8 @@
 #define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
 #define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
 #define MIDR_QCOM_KRYO MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO)
+#define MIDR_QCOM_KRYO_2XX_GOLD MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_2XX_GOLD)
+#define MIDR_QCOM_KRYO_2XX_SILVER MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_2XX_SILVER)
 #define MIDR_QCOM_KRYO_3XX_SILVER MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_3XX_SILVER)
 #define MIDR_QCOM_KRYO_4XX_GOLD MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_4XX_GOLD)
 #define MIDR_QCOM_KRYO_4XX_SILVER MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_4XX_SILVER)
commit 58284a901b426e6130672e9f14c30dfd5a9dbde0
Author: Anshuman Khandual <anshuman.khandual at arm.com>
Date:   Fri Nov 13 13:00:14 2020 +0530

    arm64/mm: Validate hotplug range before creating linear mapping
    
    During memory hotplug process, the linear mapping should not be created for
    a given memory range if that would fall outside the maximum allowed linear
    range. Else it might cause memory corruption in the kernel virtual space.
    
    Maximum linear mapping region is [PAGE_OFFSET..(PAGE_END -1)] accommodating
    both its ends but excluding PAGE_END. Max physical range that can be mapped
    inside this linear mapping range, must also be derived from its end points.
    
    This ensures that arch_add_memory() validates memory hot add range for its
    potential linear mapping requirements, before creating it with
    __create_pgd_mapping().
    
    Fixes: 4ab215061554 ("arm64: Add memory hotplug support")
    Signed-off-by: Anshuman Khandual <anshuman.khandual at arm.com>
    Reviewed-by: Ard Biesheuvel <ardb at kernel.org>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: Will Deacon <will at kernel.org>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Ard Biesheuvel <ardb at kernel.org>
    Cc: Steven Price <steven.price at arm.com>
    Cc: Robin Murphy <robin.murphy at arm.com>
    Cc: David Hildenbrand <david at redhat.com>
    Cc: Andrew Morton <akpm at linux-foundation.org>
    Cc: linux-arm-kernel at lists.infradead.org
    Cc: linux-kernel at vger.kernel.org
    Link: https://lore.kernel.org/r/1605252614-761-1-git-send-email-anshuman.khandual@arm.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 1c0f3e02f731..ca692a815731 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -1444,11 +1444,28 @@ static void __remove_pgd_mapping(pgd_t *pgdir, unsigned long start, u64 size)
 	free_empty_tables(start, end, PAGE_OFFSET, PAGE_END);
 }
 
+static bool inside_linear_region(u64 start, u64 size)
+{
+	/*
+	 * Linear mapping region is the range [PAGE_OFFSET..(PAGE_END - 1)]
+	 * accommodating both its ends but excluding PAGE_END. Max physical
+	 * range which can be mapped inside this linear mapping range, must
+	 * also be derived from its end points.
+	 */
+	return start >= __pa(_PAGE_OFFSET(vabits_actual)) &&
+	       (start + size - 1) <= __pa(PAGE_END - 1);
+}
+
 int arch_add_memory(int nid, u64 start, u64 size,
 		    struct mhp_params *params)
 {
 	int ret, flags = 0;
 
+	if (!inside_linear_region(start, size)) {
+		pr_err("[%llx %llx] is outside linear mapping region\n", start, start + size);
+		return -EINVAL;
+	}
+
 	if (rodata_full || debug_pagealloc_enabled())
 		flags = NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
 
commit 7bc40aedf24d31d8bea80e1161e996ef4299fb10
Author: Johannes Berg <johannes.berg at intel.com>
Date:   Thu Nov 12 11:22:04 2020 +0100

    mac80211: free sta in sta_info_insert_finish() on errors
    
    If sta_info_insert_finish() fails, we currently keep the station
    around and free it only in the caller, but there's only one such
    caller and it always frees it immediately.
    
    As syzbot found, another consequence of this split is that we can
    put things that sleep only into __cleanup_single_sta() and not in
    sta_info_free(), but this is the only place that requires such of
    sta_info_free() now.
    
    Change this to free the station in sta_info_insert_finish(), in
    which case we can still sleep. This will also let us unify the
    cleanup code later.
    
    Cc: stable at vger.kernel.org
    Fixes: dcd479e10a05 ("mac80211: always wind down STA state")
    Reported-by: syzbot+32c6c38c4812d22f2f0b at syzkaller.appspotmail.com
    Reported-by: syzbot+4c81fe92e372d26c4246 at syzkaller.appspotmail.com
    Reported-by: syzbot+6a7fe9faf0d1d61bc24a at syzkaller.appspotmail.com
    Reported-by: syzbot+abed06851c5ffe010921 at syzkaller.appspotmail.com
    Reported-by: syzbot+b7aeb9318541a1c709f1 at syzkaller.appspotmail.com
    Reported-by: syzbot+d5a9416c6cafe53b5dd0 at syzkaller.appspotmail.com
    Link: https://lore.kernel.org/r/20201112112201.ee6b397b9453.I9c31d667a0ea2151441cc64ed6613d36c18a48e0@changeid
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 4fe284ff1ea3..ec6973ee88ef 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -705,7 +705,7 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
  out_drop_sta:
 	local->num_sta--;
 	synchronize_net();
-	__cleanup_single_sta(sta);
+	cleanup_single_sta(sta);
  out_err:
 	mutex_unlock(&local->sta_mtx);
 	kfree(sinfo);
@@ -724,19 +724,13 @@ int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU)
 
 	err = sta_info_insert_check(sta);
 	if (err) {
+		sta_info_free(local, sta);
 		mutex_unlock(&local->sta_mtx);
 		rcu_read_lock();
-		goto out_free;
+		return err;
 	}
 
-	err = sta_info_insert_finish(sta);
-	if (err)
-		goto out_free;
-
-	return 0;
- out_free:
-	sta_info_free(local, sta);
-	return err;
+	return sta_info_insert_finish(sta);
 }
 
 int sta_info_insert(struct sta_info *sta)
commit 41f3ed2cac86ba533ce6a334a2e7fae5c7082946
Merge: 858fbdbcef36 38a250918495
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 13 16:05:30 2020 +1000

    Merge tag 'amd-drm-fixes-5.10-2020-11-12' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
    
    amd-drm-fixes-5.10-2020-11-12:
    
    amdgpu:
    - Pageflip fix for DCN3
    - Declare TA firmware for green sardine
    - Headless navi fix
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    From: Alex Deucher <alexdeucher at gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201113055512.3963-1-alexander.deucher@amd.com

commit 858fbdbcef36d41de20fda8f39662e572f59e6de
Merge: 59f7dcd92959 5ce6861d36ed
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 13 16:01:35 2020 +1000

    Merge tag 'drm-intel-fixes-2020-11-13' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
    
    - Pull phys pread/pwrite implementations to the backend (Chris)
    - Correctly set SFC capability for video engines (Venkata)
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Rodrigo Vivi <rodrigo.vivi at intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201113052551.GA1319429@intel.com

commit 38a2509184952f799d465b26279ef1bd36fb8277
Author: Tianci.Yin <tianci.yin at amd.com>
Date:   Fri Nov 6 14:56:35 2020 +0800

    drm/amdgpu: enable DCN for navi10 headless SKU
    
    There is a NULL pointer crash when DCN disabled on headless SKU.
    On normal SKU, the variable adev->ddev.mode_config.funcs is
    initialized in dm_hw_init(), and it is fine to access it in
    amdgpu_device_resume(). But on headless SKU, DCN is disabled,
    the funcs variable is not initialized, then crash arises.
    Enable DCN to fix this issue.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Reviewed-by: Guchun Chen <guchun.chen at amd.com>
    Signed-off-by: Tianci.Yin <tianci.yin at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c
index d5715c1d177b..8eeba8096493 100644
--- a/drivers/gpu/drm/amd/amdgpu/nv.c
+++ b/drivers/gpu/drm/amd/amdgpu/nv.c
@@ -492,8 +492,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
 		if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
 #if defined(CONFIG_DRM_AMD_DC)
-		else if (amdgpu_device_has_dc_support(adev) &&
-			 !nv_is_headless_sku(adev->pdev))
+		else if (amdgpu_device_has_dc_support(adev))
 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
 #endif
 		amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
commit 266421925574f91bf9d373128f38771c565f107a
Author: Roman Li <roman.li at amd.com>
Date:   Mon Oct 26 17:12:34 2020 -0400

    drm/amdgpu: add ta firmware load for green-sardine
    
    [Why]
    In preparation to enabling hdcp on green sardine.
    
    [How]
    Add green-sardine ta f/w loading in psp_v12
    
    Signed-off-by: Roman Li <roman.li at amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
index dff5c15b4858..c4828bd3264b 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c
@@ -40,6 +40,7 @@
 MODULE_FIRMWARE("amdgpu/renoir_asd.bin");
 MODULE_FIRMWARE("amdgpu/renoir_ta.bin");
 MODULE_FIRMWARE("amdgpu/green_sardine_asd.bin");
+MODULE_FIRMWARE("amdgpu/green_sardine_ta.bin");
 
 /* address block */
 #define smnMP1_FIRMWARE_FLAGS		0x3010024
commit 59f7dcd92959f8de775f6cb72d3eec7f6d1d7d69
Merge: f8394f232b1e a6c40b8032b8
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 13 15:01:03 2020 +1000

    Merge tag 'drm-misc-fixes-2020-11-12' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
    
    One Kconfig fix for bridge/cdns, a missing include for hypervb_fb, an
    out-of-bound access fix for gma500 and a unbalanced regulator fix for
    mcde.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    
    From: Maxime Ripard <maxime at cerno.tech>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201112130726.qwtryqvgspmljkax@gilmour.lan

commit 4ec2b69da5e1544dbadb30cddb49c8df60209b0c
Author: Xiongfeng Wang <wangxiongfeng2 at huawei.com>
Date:   Thu Nov 12 21:22:32 2020 +0800

    drm/i915/gvt: return error when failing to take the module reference
    
    When we fail to take the module reference, we go to the 'undo*' branch and
    return. But the returned variable 'ret' has been set as zero by the
    above code. Change 'ret' to '-ENODEV' in this situation.
    
    Fixes: 9bdb073464d6 ("drm/i915/gvt: Change KVMGT as self load module")
    Reviewed-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Xiongfeng Wang <wangxiongfeng2 at huawei.com>
    Signed-off-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/1605187352-51761-1-git-send-email-wangxiongfeng2@huawei.com

diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
index ad8a9df49f29..778eb8cab610 100644
--- a/drivers/gpu/drm/i915/gvt/kvmgt.c
+++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
@@ -829,8 +829,10 @@ static int intel_vgpu_open(struct mdev_device *mdev)
 	/* Take a module reference as mdev core doesn't take
 	 * a reference for vendor driver.
 	 */
-	if (!try_module_get(THIS_MODULE))
+	if (!try_module_get(THIS_MODULE)) {
+		ret = -ENODEV;
 		goto undo_group;
+	}
 
 	ret = kvmgt_guest_init(mdev);
 	if (ret)
commit 4ee18c179e5e815fa5575e0d2db0c05795a804ee
Author: Xie He <xie.he.0141 at gmail.com>
Date:   Thu Nov 12 02:35:06 2020 -0800

    net: x25: Increase refcnt of "struct x25_neigh" in x25_rx_call_request
    
    The x25_disconnect function in x25_subr.c would decrease the refcount of
    "x25->neighbour" (struct x25_neigh) and reset this pointer to NULL.
    
    However, the x25_rx_call_request function in af_x25.c, which is called
    when we receive a connection request, does not increase the refcount when
    it assigns the pointer.
    
    Fix this issue by increasing the refcount of "struct x25_neigh" in
    x25_rx_call_request.
    
    This patch fixes frequent kernel crashes when using AF_X25 sockets.
    
    Fixes: 4becb7ee5b3d ("net/x25: Fix x25_neigh refcnt leak when x25 disconnect")
    Cc: Martin Schiller <ms at dev.tdt.de>
    Signed-off-by: Xie He <xie.he.0141 at gmail.com>
    Link: https://lore.kernel.org/r/20201112103506.5875-1-xie.he.0141@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 046d3fee66a9..a10487e7574c 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -1050,6 +1050,7 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
 	makex25->lci           = lci;
 	makex25->dest_addr     = dest_addr;
 	makex25->source_addr   = source_addr;
+	x25_neigh_hold(nb);
 	makex25->neighbour     = nb;
 	makex25->facilities    = facilities;
 	makex25->dte_facilities= dte_facilities;
commit baee1991fad928d6c8dd5be3197ecb413c420c97
Author: Zhang Changzhong <zhangchangzhong at huawei.com>
Date:   Thu Nov 12 19:34:39 2020 +0800

    net: ethernet: mtk-star-emac: fix error return code in mtk_star_enable()
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 8c7bd5a454ff ("net: ethernet: mtk-star-emac: new driver")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zhang Changzhong <zhangchangzhong at huawei.com>
    Acked-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Link: https://lore.kernel.org/r/1605180879-2573-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
index e56a26f797f2..a8641a407c06 100644
--- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
+++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
@@ -966,6 +966,7 @@ static int mtk_star_enable(struct net_device *ndev)
 				      mtk_star_adjust_link, 0, priv->phy_intf);
 	if (!priv->phydev) {
 		netdev_err(ndev, "failed to connect to PHY\n");
+		ret = -ENODEV;
 		goto err_free_irq;
 	}
 
commit 50b8a742850fce7293bed45753152c425f7e931b
Author: Masami Hiramatsu <mhiramat at kernel.org>
Date:   Fri Nov 13 02:27:31 2020 +0900

    bootconfig: Extend the magic check range to the preceding 3 bytes
    
    Since Grub may align the size of initrd to 4 if user pass
    initrd from cpio, we have to check the preceding 3 bytes as well.
    
    Link: https://lkml.kernel.org/r/160520205132.303174.4876760192433315429.stgit@devnote2
    
    Cc: stable at vger.kernel.org
    Fixes: 85c46b78da58 ("bootconfig: Add bootconfig magic word for indicating bootconfig explicitly")
    Reported-by: Chen Yu <yu.chen.surf at gmail.com>
    Tested-by: Chen Yu <yu.chen.surf at gmail.com>
    Signed-off-by: Masami Hiramatsu <mhiramat at kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt at goodmis.org>

diff --git a/init/main.c b/init/main.c
index 130376ec10ba..20baced721ad 100644
--- a/init/main.c
+++ b/init/main.c
@@ -269,14 +269,24 @@ static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum)
 	u32 size, csum;
 	char *data;
 	u32 *hdr;
+	int i;
 
 	if (!initrd_end)
 		return NULL;
 
 	data = (char *)initrd_end - BOOTCONFIG_MAGIC_LEN;
-	if (memcmp(data, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN))
-		return NULL;
+	/*
+	 * Since Grub may align the size of initrd to 4, we must
+	 * check the preceding 3 bytes as well.
+	 */
+	for (i = 0; i < 4; i++) {
+		if (!memcmp(data, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN))
+			goto found;
+		data--;
+	}
+	return NULL;
 
+found:
 	hdr = (u32 *)(data - 8);
 	size = hdr[0];
 	csum = hdr[1];
commit c350f8bea271782e2733419bd2ab9bf4ec2051ef
Author: Chen Zhou <chenzhou10 at huawei.com>
Date:   Thu Nov 12 21:53:32 2020 +0800

    selinux: Fix error return code in sel_ib_pkey_sid_slow()
    
    Fix to return a negative error code from the error handling case
    instead of 0 in function sel_ib_pkey_sid_slow(), as done elsewhere
    in this function.
    
    Cc: stable at vger.kernel.org
    Fixes: 409dcf31538a ("selinux: Add a cache for quicker retreival of PKey SIDs")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Chen Zhou <chenzhou10 at huawei.com>
    Signed-off-by: Paul Moore <paul at paul-moore.com>

diff --git a/security/selinux/ibpkey.c b/security/selinux/ibpkey.c
index f68a7617cfb9..3a63a989e55e 100644
--- a/security/selinux/ibpkey.c
+++ b/security/selinux/ibpkey.c
@@ -151,8 +151,10 @@ static int sel_ib_pkey_sid_slow(u64 subnet_prefix, u16 pkey_num, u32 *sid)
 	 * is valid, it just won't be added to the cache.
 	 */
 	new = kzalloc(sizeof(*new), GFP_ATOMIC);
-	if (!new)
+	if (!new) {
+		ret = -ENOMEM;
 		goto out;
+	}
 
 	new->psec.subnet_prefix = subnet_prefix;
 	new->psec.pkey = pkey_num;
commit e8aa6d520b448efc88670a98eccd196713639f2f
Author: Vincent Stehlé <vincent.stehle at laposte.net>
Date:   Thu Nov 12 09:48:33 2020 +0100

    net: ethernet: mtk-star-emac: return ok when xmit drops
    
    The ndo_start_xmit() method must return NETDEV_TX_OK if the DMA mapping
    fails, after freeing the socket buffer.
    Fix the mtk_star_netdev_start_xmit() function accordingly.
    
    Fixes: 8c7bd5a454ff ("net: ethernet: mtk-star-emac: new driver")
    Signed-off-by: Vincent Stehlé <vincent.stehle at laposte.net>
    Acked-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Link: https://lore.kernel.org/r/20201112084833.21842-1-vincent.stehle@laposte.net
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
index 13250553263b..e56a26f797f2 100644
--- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
+++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
@@ -1053,7 +1053,7 @@ static int mtk_star_netdev_start_xmit(struct sk_buff *skb,
 err_drop_packet:
 	dev_kfree_skb(skb);
 	ndev->stats.tx_dropped++;
-	return NETDEV_TX_BUSY;
+	return NETDEV_TX_OK;
 }
 
 /* Returns the number of bytes sent or a negative number on the first
commit 1922a46b8c18cb09d33e06a6cc2e43844ac1b9d0
Author: Joel Stanley <joel at jms.id.au>
Date:   Thu Nov 12 16:42:10 2020 +1030

    net/ncsi: Fix netlink registration
    
    If a user unbinds and re-binds a NC-SI aware driver the kernel will
    attempt to register the netlink interface at runtime. The structure is
    marked __ro_after_init so registration fails spectacularly at this point.
    
     # echo 1e660000.ethernet > /sys/bus/platform/drivers/ftgmac100/unbind
     # echo 1e660000.ethernet > /sys/bus/platform/drivers/ftgmac100/bind
      ftgmac100 1e660000.ethernet: Read MAC address 52:54:00:12:34:56 from chip
      ftgmac100 1e660000.ethernet: Using NCSI interface
      8<--- cut here ---
      Unable to handle kernel paging request at virtual address 80a8f858
      pgd = 8c768dd6
      [80a8f858] *pgd=80a0841e(bad)
      Internal error: Oops: 80d [#1] SMP ARM
      CPU: 0 PID: 116 Comm: sh Not tainted 5.10.0-rc3-next-20201111-00003-gdd25b227ec1e #51
      Hardware name: Generic DT based system
      PC is at genl_register_family+0x1f8/0x6d4
      LR is at 0xff26ffff
      pc : [<8073f930>]    lr : [<ff26ffff>]    psr: 20000153
      sp : 8553bc80  ip : 81406244  fp : 8553bd04
      r10: 8085d12c  r9 : 80a8f73c  r8 : 85739000
      r7 : 00000017  r6 : 80a8f860  r5 : 80c8ab98  r4 : 80a8f858
      r3 : 00000000  r2 : 00000000  r1 : 81406130  r0 : 00000017
      Flags: nzCv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment none
      Control: 00c5387d  Table: 85524008  DAC: 00000051
      Process sh (pid: 116, stack limit = 0x1f1988d6)
     ...
      Backtrace:
      [<8073f738>] (genl_register_family) from [<80860ac0>] (ncsi_init_netlink+0x20/0x48)
       r10:8085d12c r9:80c8fb0c r8:85739000 r7:00000000 r6:81218000 r5:85739000
       r4:8121c000
      [<80860aa0>] (ncsi_init_netlink) from [<8085d740>] (ncsi_register_dev+0x1b0/0x210)
       r5:8121c400 r4:8121c000
      [<8085d590>] (ncsi_register_dev) from [<805a8060>] (ftgmac100_probe+0x6e0/0x778)
       r10:00000004 r9:80950228 r8:8115bc10 r7:8115ab00 r6:9eae2c24 r5:813b6f88
       r4:85739000
      [<805a7980>] (ftgmac100_probe) from [<805355ec>] (platform_drv_probe+0x58/0xa8)
       r9:80c76bb0 r8:00000000 r7:80cd4974 r6:80c76bb0 r5:8115bc10 r4:00000000
      [<80535594>] (platform_drv_probe) from [<80532d58>] (really_probe+0x204/0x514)
       r7:80cd4974 r6:00000000 r5:80cd4868 r4:8115bc10
    
    Jakub pointed out that ncsi_register_dev is obviously broken, because
    there is only one family so it would never work if there was more than
    one ncsi netdev.
    
    Fix the crash by registering the netlink family once on boot, and drop
    the code to unregister it.
    
    Fixes: 955dc68cb9b2 ("net/ncsi: Add generic netlink family")
    Signed-off-by: Joel Stanley <joel at jms.id.au>
    Reviewed-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
    Link: https://lore.kernel.org/r/20201112061210.914621-1-joel@jms.id.au
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
index f1be3e3f6425..a9cb355324d1 100644
--- a/net/ncsi/ncsi-manage.c
+++ b/net/ncsi/ncsi-manage.c
@@ -1726,9 +1726,6 @@ struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
 	ndp->ptype.dev = dev;
 	dev_add_pack(&ndp->ptype);
 
-	/* Set up generic netlink interface */
-	ncsi_init_netlink(dev);
-
 	pdev = to_platform_device(dev->dev.parent);
 	if (pdev) {
 		np = pdev->dev.of_node;
@@ -1892,8 +1889,6 @@ void ncsi_unregister_dev(struct ncsi_dev *nd)
 	list_del_rcu(&ndp->node);
 	spin_unlock_irqrestore(&ncsi_dev_lock, flags);
 
-	ncsi_unregister_netlink(nd->dev);
-
 	kfree(ndp);
 }
 EXPORT_SYMBOL_GPL(ncsi_unregister_dev);
diff --git a/net/ncsi/ncsi-netlink.c b/net/ncsi/ncsi-netlink.c
index adddc7707aa4..bb5f1650f11c 100644
--- a/net/ncsi/ncsi-netlink.c
+++ b/net/ncsi/ncsi-netlink.c
@@ -766,24 +766,8 @@ static struct genl_family ncsi_genl_family __ro_after_init = {
 	.n_small_ops = ARRAY_SIZE(ncsi_ops),
 };
 
-int ncsi_init_netlink(struct net_device *dev)
+static int __init ncsi_init_netlink(void)
 {
-	int rc;
-
-	rc = genl_register_family(&ncsi_genl_family);
-	if (rc)
-		netdev_err(dev, "ncsi: failed to register netlink family\n");
-
-	return rc;
-}
-
-int ncsi_unregister_netlink(struct net_device *dev)
-{
-	int rc;
-
-	rc = genl_unregister_family(&ncsi_genl_family);
-	if (rc)
-		netdev_err(dev, "ncsi: failed to unregister netlink family\n");
-
-	return rc;
+	return genl_register_family(&ncsi_genl_family);
 }
+subsys_initcall(ncsi_init_netlink);
diff --git a/net/ncsi/ncsi-netlink.h b/net/ncsi/ncsi-netlink.h
index 7502723fba83..39a1a9d7bf77 100644
--- a/net/ncsi/ncsi-netlink.h
+++ b/net/ncsi/ncsi-netlink.h
@@ -22,7 +22,4 @@ int ncsi_send_netlink_err(struct net_device *dev,
 			  struct nlmsghdr *nlhdr,
 			  int err);
 
-int ncsi_init_netlink(struct net_device *dev);
-int ncsi_unregister_netlink(struct net_device *dev);
-
 #endif /* __NCSI_NETLINK_H__ */
commit 5ce6861d36ed5207aff9e5eead4c7cc38a986586
Author: Venkata Sandeep Dhanalakota <venkata.s.dhanalakota at intel.com>
Date:   Thu Nov 5 17:18:42 2020 -0800

    drm/i915: Correctly set SFC capability for video engines
    
    SFC capability of video engines is not set correctly because i915
    is testing for incorrect bits.
    
    Fixes: c5d3e39caa45 ("drm/i915: Engine discovery query")
    Cc: Matt Roper <matthew.d.roper at intel.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Signed-off-by: Venkata Sandeep Dhanalakota <venkata.s.dhanalakota at intel.com>
    Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
    Cc: <stable at vger.kernel.org> # v5.3+
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201106011842.36203-1-daniele.ceraolospurio@intel.com
    (cherry picked from commit ad18fa0f5f052046cad96fee762b5c64f42dd86a)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 5bfb5f7ed02c..efdeb7b7b2a0 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -371,7 +371,8 @@ static void __setup_engine_capabilities(struct intel_engine_cs *engine)
 		 * instances.
 		 */
 		if ((INTEL_GEN(i915) >= 11 &&
-		     engine->gt->info.vdbox_sfc_access & engine->mask) ||
+		     (engine->gt->info.vdbox_sfc_access &
+		      BIT(engine->instance))) ||
 		    (INTEL_GEN(i915) >= 9 && engine->instance == 0))
 			engine->uabi_capabilities |=
 				I915_VIDEO_AND_ENHANCE_CLASS_CAPABILITY_SFC;
commit 0eb0feb9aeac392edf01b525a54acde9b002312e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Nov 5 15:49:34 2020 +0000

    drm/i915/gem: Pull phys pread/pwrite implementations to the backend
    
    Move the specialised interactions with the physical GEM object from the
    pread/pwrite ioctl handler into the phys backend.
    
    Currently, if one is able to exhaust the entire aperture and then try to
    pwrite into an object not backed by struct page, we accidentally invoked
    the phys pwrite handler on a non-phys object; calamitous.
    
    Fixes: c6790dc22312 ("drm/i915: Wean off drm_pci_alloc/drm_pci_free")
    Testcase: igt/gem_pwrite/exhaustion
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Matthew Auld <matthew.auld at intel.com>
    Cc: stable at vger.kernel.org
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105154934.16022-2-chris@chris-wilson.co.uk
    (cherry picked from commit 852e1b3644817f071427b83859b889c788a0cf69)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_phys.c b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
index 28147aab47b9..3a4dfe2ef1da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_phys.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
@@ -134,6 +134,58 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
 			  vaddr, dma);
 }
 
+static int
+phys_pwrite(struct drm_i915_gem_object *obj,
+	    const struct drm_i915_gem_pwrite *args)
+{
+	void *vaddr = sg_page(obj->mm.pages->sgl) + args->offset;
+	char __user *user_data = u64_to_user_ptr(args->data_ptr);
+	int err;
+
+	err = i915_gem_object_wait(obj,
+				   I915_WAIT_INTERRUPTIBLE |
+				   I915_WAIT_ALL,
+				   MAX_SCHEDULE_TIMEOUT);
+	if (err)
+		return err;
+
+	/*
+	 * We manually control the domain here and pretend that it
+	 * remains coherent i.e. in the GTT domain, like shmem_pwrite.
+	 */
+	i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
+
+	if (copy_from_user(vaddr, user_data, args->size))
+		return -EFAULT;
+
+	drm_clflush_virt_range(vaddr, args->size);
+	intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt);
+
+	i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
+	return 0;
+}
+
+static int
+phys_pread(struct drm_i915_gem_object *obj,
+	   const struct drm_i915_gem_pread *args)
+{
+	void *vaddr = sg_page(obj->mm.pages->sgl) + args->offset;
+	char __user *user_data = u64_to_user_ptr(args->data_ptr);
+	int err;
+
+	err = i915_gem_object_wait(obj,
+				   I915_WAIT_INTERRUPTIBLE,
+				   MAX_SCHEDULE_TIMEOUT);
+	if (err)
+		return err;
+
+	drm_clflush_virt_range(vaddr, args->size);
+	if (copy_to_user(user_data, vaddr, args->size))
+		return -EFAULT;
+
+	return 0;
+}
+
 static void phys_release(struct drm_i915_gem_object *obj)
 {
 	fput(obj->base.filp);
@@ -144,6 +196,9 @@ static const struct drm_i915_gem_object_ops i915_gem_phys_ops = {
 	.get_pages = i915_gem_object_get_pages_phys,
 	.put_pages = i915_gem_object_put_pages_phys,
 
+	.pread  = phys_pread,
+	.pwrite = phys_pwrite,
+
 	.release = phys_release,
 };
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d58fe1ddc3e1..58276694c848 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -179,30 +179,6 @@ try_again:
 	return ret;
 }
 
-static int
-i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
-		     struct drm_i915_gem_pwrite *args,
-		     struct drm_file *file)
-{
-	void *vaddr = sg_page(obj->mm.pages->sgl) + args->offset;
-	char __user *user_data = u64_to_user_ptr(args->data_ptr);
-
-	/*
-	 * We manually control the domain here and pretend that it
-	 * remains coherent i.e. in the GTT domain, like shmem_pwrite.
-	 */
-	i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
-
-	if (copy_from_user(vaddr, user_data, args->size))
-		return -EFAULT;
-
-	drm_clflush_virt_range(vaddr, args->size);
-	intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt);
-
-	i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
-	return 0;
-}
-
 static int
 i915_gem_create(struct drm_file *file,
 		struct intel_memory_region *mr,
@@ -872,8 +848,6 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
 	if (ret == -EFAULT || ret == -ENOSPC) {
 		if (i915_gem_object_has_struct_page(obj))
 			ret = i915_gem_shmem_pwrite(obj, args);
-		else
-			ret = i915_gem_phys_pwrite(obj, args, file);
 	}
 
 	i915_gem_object_unpin_pages(obj);
commit 0a1db6f0841288274f0d1e3a8fa8a3a787e05633
Author: Matthew Auld <matthew.auld at intel.com>
Date:   Thu Nov 5 15:49:33 2020 +0000

    drm/i915/gem: Allow backends to override pread implementation
    
    As there are more and more complicated interactions between the different
    backing stores and userspace, push the control into the backends rather
    than accumulate them all inside the ioctl handlers.
    
    Signed-off-by: Matthew Auld <matthew.auld at intel.com>
    Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105154934.16022-1-chris@chris-wilson.co.uk
    (cherry picked from commit 0049b688459b846f819b6e51c24cd0781fcfde41)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
index b5c15557cc87..d6711caa7f39 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h
@@ -56,6 +56,8 @@ struct drm_i915_gem_object_ops {
 	void (*truncate)(struct drm_i915_gem_object *obj);
 	void (*writeback)(struct drm_i915_gem_object *obj);
 
+	int (*pread)(struct drm_i915_gem_object *obj,
+		     const struct drm_i915_gem_pread *arg);
 	int (*pwrite)(struct drm_i915_gem_object *obj,
 		      const struct drm_i915_gem_pwrite *arg);
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index bb0c12975f38..d58fe1ddc3e1 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -527,6 +527,12 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
 
 	trace_i915_gem_object_pread(obj, args->offset, args->size);
 
+	ret = -ENODEV;
+	if (obj->ops->pread)
+		ret = obj->ops->pread(obj, args);
+	if (ret != -ENODEV)
+		goto out;
+
 	ret = i915_gem_object_wait(obj,
 				   I915_WAIT_INTERRUPTIBLE,
 				   MAX_SCHEDULE_TIMEOUT);
commit 585e5b17b92dead8a3aca4e3c9876fbca5f7e0ba
Merge: 20ca21dfccb6 d19d8d345eec
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 12 16:39:58 2020 -0800

    Merge tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt
    
    Pull fscrypt fix from Eric Biggers:
     "Fix a regression where new files weren't using inline encryption when
      they should be"
    
    * tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt:
      fscrypt: fix inline encryption not used on new files

commit 20ca21dfccb6dd6ae4d1d22b91c3c7514f4a712c
Merge: db7c95355538 4e79e3f08e57
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 12 16:37:14 2020 -0800

    Merge tag 'gfs2-v5.10-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2
    
    Pull gfs2 fixes from Andreas Gruenbacher:
     "Fix jdata data corruption and glock reference leak"
    
    * tag 'gfs2-v5.10-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
      gfs2: Fix case in which ail writes are done to jdata holes
      Revert "gfs2: Ignore journal log writes for jdata holes"
      gfs2: fix possible reference leak in gfs2_check_blk_type

commit 77c7e1bc060deab6430f1dff5922ccd3093d9776
Author: Mike Travis <mike.travis at hpe.com>
Date:   Tue Nov 10 19:04:18 2020 -0600

    x86/platform/uv: Fix copied UV5 output archtype
    
    A test shows that the output contains a space:
        # cat /proc/sgi_uv/archtype
        NSGI4 U/UVX
    
    Remove that embedded space by copying the "trimmed" buffer instead of the
    untrimmed input character list.  Use sizeof to remove size dependency on
    copy out length.  Increase output buffer size by one character just in case
    BIOS sends an 8 character string for archtype.
    
    Fixes: 1e61f5a95f19 ("Add and decode Arch Type in UVsystab")
    Signed-off-by: Mike Travis <mike.travis at hpe.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Reviewed-by: Steve Wahl <steve.wahl at hpe.com>
    Link: https://lore.kernel.org/r/20201111010418.82133-1-mike.travis@hpe.com

diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
index 3115caa7d7d0..1b98f8c12b96 100644
--- a/arch/x86/kernel/apic/x2apic_uv_x.c
+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
@@ -33,7 +33,7 @@ static union uvh_apicid		uvh_apicid;
 static int			uv_node_id;
 
 /* Unpack AT/OEM/TABLE ID's to be NULL terminated strings */
-static u8 uv_archtype[UV_AT_SIZE];
+static u8 uv_archtype[UV_AT_SIZE + 1];
 static u8 oem_id[ACPI_OEM_ID_SIZE + 1];
 static u8 oem_table_id[ACPI_OEM_TABLE_ID_SIZE + 1];
 
@@ -320,7 +320,7 @@ static int __init decode_arch_type(unsigned long ptr)
 
 	if (n > 0 && n < sizeof(uv_ate->archtype)) {
 		pr_info("UV: UVarchtype received from BIOS\n");
-		uv_stringify(UV_AT_SIZE, uv_archtype, uv_ate->archtype);
+		uv_stringify(sizeof(uv_archtype), uv_archtype, uv_ate->archtype);
 		return 1;
 	}
 	return 0;
@@ -378,7 +378,7 @@ static int __init uv_set_system_type(char *_oem_id, char *_oem_table_id)
 	if (!early_get_arch_type())
 
 		/* If not use OEM ID for UVarchtype */
-		uv_stringify(UV_AT_SIZE, uv_archtype, _oem_id);
+		uv_stringify(sizeof(uv_archtype), uv_archtype, oem_id);
 
 	/* Check if not hubbed */
 	if (strncmp(uv_archtype, "SGI", 3) != 0) {
commit db7c953555388571a96ed8783ff6c5745ba18ab9
Merge: 200f9d21aa92 edbc21113bde
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 12 14:02:04 2020 -0800

    Merge tag 'net-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
    
    Pull networking fixes from Jakub Kicinski:
     "Current release - regressions:
    
       - arm64: dts: fsl-ls1028a-kontron-sl28: specify in-band mode for
         ENETC
    
      Current release - bugs in new features:
    
       - mptcp: provide rmem[0] limit offset to fix oops
    
      Previous release - regressions:
    
       - IPv6: Set SIT tunnel hard_header_len to zero to fix path MTU
         calculations
    
       - lan743x: correctly handle chips with internal PHY
    
       - bpf: Don't rely on GCC __attribute__((optimize)) to disable GCSE
    
       - mlx5e: Fix VXLAN port table synchronization after function reload
    
      Previous release - always broken:
    
       - bpf: Zero-fill re-used per-cpu map element
    
       - fix out-of-order UDP packets when forwarding with UDP GSO fraglists
         turned on:
           - fix UDP header access on Fast/frag0 UDP GRO
           - fix IP header access and skb lookup on Fast/frag0 UDP GRO
    
       - ethtool: netlink: add missing netdev_features_change() call
    
       - net: Update window_clamp if SOCK_RCVBUF is set
    
       - igc: Fix returning wrong statistics
    
       - ch_ktls: fix multiple leaks and corner cases in Chelsio TLS offload
    
       - tunnels: Fix off-by-one in lower MTU bounds for ICMP/ICMPv6 replies
    
       - r8169: disable hw csum for short packets on all chip versions
    
       - vrf: Fix fast path output packet handling with async Netfilter
         rules"
    
    * tag 'net-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (65 commits)
      lan743x: fix use of uninitialized variable
      net: udp: fix IP header access and skb lookup on Fast/frag0 UDP GRO
      net: udp: fix UDP header access on Fast/frag0 UDP GRO
      devlink: Avoid overwriting port attributes of registered port
      vrf: Fix fast path output packet handling with async Netfilter rules
      cosa: Add missing kfree in error path of cosa_write
      net: switch to the kernel.org patchwork instance
      ch_ktls: stop the txq if reaches threshold
      ch_ktls: tcb update fails sometimes
      ch_ktls/cxgb4: handle partial tag alone SKBs
      ch_ktls: don't free skb before sending FIN
      ch_ktls: packet handling prior to start marker
      ch_ktls: Correction in middle record handling
      ch_ktls: missing handling of header alone
      ch_ktls: Correction in trimmed_len calculation
      cxgb4/ch_ktls: creating skbs causes panic
      ch_ktls: Update cheksum information
      ch_ktls: Correction in finding correct length
      cxgb4/ch_ktls: decrypted bit is not enough
      net/x25: Fix null-ptr-deref in x25_connect
      ...

commit 200f9d21aa92ae55390030b6c84757c2aa75bce0
Merge: af5043c89a8e 11decaf8127b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 12 13:49:12 2020 -0800

    Merge tag 'nfs-for-5.10-2' of git://git.linux-nfs.org/projects/anna/linux-nfs
    
    Pull NFS client bugfixes from Anna Schumaker:
     "Stable fixes:
      - Fix failure to unregister shrinker
    
      Other fixes:
      - Fix unnecessary locking to clear up some contention
      - Fix listxattr receive buffer size
      - Fix default mount options for nfsroot"
    
    * tag 'nfs-for-5.10-2' of git://git.linux-nfs.org/projects/anna/linux-nfs:
      NFS: Remove unnecessary inode lock in nfs_fsync_dir()
      NFS: Remove unnecessary inode locking in nfs_llseek_dir()
      NFS: Fix listxattr receive buffer size
      NFSv4.2: fix failure to unregister shrinker
      nfsroot: Default mount option should ask for built-in NFS version

commit ed4ffaf49bf9ce1002b516d8c6aa04937b7950bc
Author: Marc Zyngier <maz at kernel.org>
Date:   Tue Nov 10 14:13:08 2020 +0000

    KVM: arm64: Handle SCXTNUM_ELx traps
    
    As the kernel never sets HCR_EL2.EnSCXT, accesses to SCXTNUM_ELx
    will trap to EL2. Let's handle that as gracefully as possible
    by injecting an UNDEF exception into the guest. This is consistent
    with the guest's view of ID_AA64PFR0_EL1.CSV2 being at most 1.
    
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201110141308.451654-4-maz@kernel.org

diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index d52c1b3ce589..a427a5653369 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -372,6 +372,8 @@
 #define SYS_CONTEXTIDR_EL1		sys_reg(3, 0, 13, 0, 1)
 #define SYS_TPIDR_EL1			sys_reg(3, 0, 13, 0, 4)
 
+#define SYS_SCXTNUM_EL1			sys_reg(3, 0, 13, 0, 7)
+
 #define SYS_CNTKCTL_EL1			sys_reg(3, 0, 14, 1, 0)
 
 #define SYS_CCSIDR_EL1			sys_reg(3, 1, 0, 0, 0)
@@ -404,6 +406,8 @@
 #define SYS_TPIDR_EL0			sys_reg(3, 3, 13, 0, 2)
 #define SYS_TPIDRRO_EL0			sys_reg(3, 3, 13, 0, 3)
 
+#define SYS_SCXTNUM_EL0			sys_reg(3, 3, 13, 0, 7)
+
 /* Definitions for system register interface to AMU for ARMv8.4 onwards */
 #define SYS_AM_EL0(crm, op2)		sys_reg(3, 3, 13, (crm), (op2))
 #define SYS_AMCR_EL0			SYS_AM_EL0(2, 0)
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index b0022f37c8f1..c1726fb7f3d9 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1598,6 +1598,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_CONTEXTIDR_EL1), access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 },
 	{ SYS_DESC(SYS_TPIDR_EL1), NULL, reset_unknown, TPIDR_EL1 },
 
+	{ SYS_DESC(SYS_SCXTNUM_EL1), undef_access },
+
 	{ SYS_DESC(SYS_CNTKCTL_EL1), NULL, reset_val, CNTKCTL_EL1, 0},
 
 	{ SYS_DESC(SYS_CCSIDR_EL1), access_ccsidr },
@@ -1626,6 +1628,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_TPIDR_EL0), NULL, reset_unknown, TPIDR_EL0 },
 	{ SYS_DESC(SYS_TPIDRRO_EL0), NULL, reset_unknown, TPIDRRO_EL0 },
 
+	{ SYS_DESC(SYS_SCXTNUM_EL0), undef_access },
+
 	{ SYS_DESC(SYS_AMCR_EL0), undef_access },
 	{ SYS_DESC(SYS_AMCFGR_EL0), undef_access },
 	{ SYS_DESC(SYS_AMCGCR_EL0), undef_access },
commit 338b17933a6077bb5406b33d8b9fb9616fffc1af
Author: Marc Zyngier <maz at kernel.org>
Date:   Tue Nov 10 14:13:07 2020 +0000

    KVM: arm64: Unify trap handlers injecting an UNDEF
    
    A large number of system register trap handlers only inject an
    UNDEF exeption, and yet each class of sysreg seems to provide its
    own, identical function.
    
    Let's unify them all, saving us introducing yet another one later.
    
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201110141308.451654-3-maz@kernel.org

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 0aa86250e354..b0022f37c8f1 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1038,8 +1038,8 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
 	{ SYS_DESC(SYS_PMEVTYPERn_EL0(n)),					\
 	  access_pmu_evtyper, reset_unknown, (PMEVTYPER0_EL0 + n), }
 
-static bool access_amu(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
-			     const struct sys_reg_desc *r)
+static bool undef_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
+			 const struct sys_reg_desc *r)
 {
 	kvm_inject_undefined(vcpu);
 
@@ -1047,24 +1047,10 @@ static bool access_amu(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
 }
 
 /* Macro to expand the AMU counter and type registers*/
-#define AMU_AMEVCNTR0_EL0(n) { SYS_DESC(SYS_AMEVCNTR0_EL0(n)), access_amu }
-#define AMU_AMEVTYPER0_EL0(n) { SYS_DESC(SYS_AMEVTYPER0_EL0(n)), access_amu }
-#define AMU_AMEVCNTR1_EL0(n) { SYS_DESC(SYS_AMEVCNTR1_EL0(n)), access_amu }
-#define AMU_AMEVTYPER1_EL0(n) { SYS_DESC(SYS_AMEVTYPER1_EL0(n)), access_amu }
-
-static bool trap_ptrauth(struct kvm_vcpu *vcpu,
-			 struct sys_reg_params *p,
-			 const struct sys_reg_desc *rd)
-{
-	/*
-	 * If we land here, that is because we didn't fixup the access on exit
-	 * by allowing the PtrAuth sysregs. The only way this happens is when
-	 * the guest does not have PtrAuth support enabled.
-	 */
-	kvm_inject_undefined(vcpu);
-
-	return false;
-}
+#define AMU_AMEVCNTR0_EL0(n) { SYS_DESC(SYS_AMEVCNTR0_EL0(n)), undef_access }
+#define AMU_AMEVTYPER0_EL0(n) { SYS_DESC(SYS_AMEVTYPER0_EL0(n)), undef_access }
+#define AMU_AMEVCNTR1_EL0(n) { SYS_DESC(SYS_AMEVCNTR1_EL0(n)), undef_access }
+#define AMU_AMEVTYPER1_EL0(n) { SYS_DESC(SYS_AMEVTYPER1_EL0(n)), undef_access }
 
 static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
 			const struct sys_reg_desc *rd)
@@ -1072,8 +1058,14 @@ static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
 	return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN;
 }
 
+/*
+ * If we land here on a PtrAuth access, that is because we didn't
+ * fixup the access on exit by allowing the PtrAuth sysregs. The only
+ * way this happens is when the guest does not have PtrAuth support
+ * enabled.
+ */
 #define __PTRAUTH_KEY(k)						\
-	{ SYS_DESC(SYS_## k), trap_ptrauth, reset_unknown, k,		\
+	{ SYS_DESC(SYS_## k), undef_access, reset_unknown, k,		\
 	.visibility = ptrauth_visibility}
 
 #define PTRAUTH_KEY(k)							\
@@ -1374,13 +1366,6 @@ static bool access_ccsidr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
 	return true;
 }
 
-static bool access_mte_regs(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
-			    const struct sys_reg_desc *r)
-{
-	kvm_inject_undefined(vcpu);
-	return false;
-}
-
 /* sys_reg_desc initialiser for known cpufeature ID registers */
 #define ID_SANITISED(name) {			\
 	SYS_DESC(SYS_##name),			\
@@ -1549,8 +1534,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_ACTLR_EL1), access_actlr, reset_actlr, ACTLR_EL1 },
 	{ SYS_DESC(SYS_CPACR_EL1), NULL, reset_val, CPACR_EL1, 0 },
 
-	{ SYS_DESC(SYS_RGSR_EL1), access_mte_regs },
-	{ SYS_DESC(SYS_GCR_EL1), access_mte_regs },
+	{ SYS_DESC(SYS_RGSR_EL1), undef_access },
+	{ SYS_DESC(SYS_GCR_EL1), undef_access },
 
 	{ SYS_DESC(SYS_ZCR_EL1), NULL, reset_val, ZCR_EL1, 0, .visibility = sve_visibility },
 	{ SYS_DESC(SYS_TTBR0_EL1), access_vm_reg, reset_unknown, TTBR0_EL1 },
@@ -1576,8 +1561,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_ERXMISC0_EL1), trap_raz_wi },
 	{ SYS_DESC(SYS_ERXMISC1_EL1), trap_raz_wi },
 
-	{ SYS_DESC(SYS_TFSR_EL1), access_mte_regs },
-	{ SYS_DESC(SYS_TFSRE0_EL1), access_mte_regs },
+	{ SYS_DESC(SYS_TFSR_EL1), undef_access },
+	{ SYS_DESC(SYS_TFSRE0_EL1), undef_access },
 
 	{ SYS_DESC(SYS_FAR_EL1), access_vm_reg, reset_unknown, FAR_EL1 },
 	{ SYS_DESC(SYS_PAR_EL1), NULL, reset_unknown, PAR_EL1 },
@@ -1641,14 +1626,14 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_TPIDR_EL0), NULL, reset_unknown, TPIDR_EL0 },
 	{ SYS_DESC(SYS_TPIDRRO_EL0), NULL, reset_unknown, TPIDRRO_EL0 },
 
-	{ SYS_DESC(SYS_AMCR_EL0), access_amu },
-	{ SYS_DESC(SYS_AMCFGR_EL0), access_amu },
-	{ SYS_DESC(SYS_AMCGCR_EL0), access_amu },
-	{ SYS_DESC(SYS_AMUSERENR_EL0), access_amu },
-	{ SYS_DESC(SYS_AMCNTENCLR0_EL0), access_amu },
-	{ SYS_DESC(SYS_AMCNTENSET0_EL0), access_amu },
-	{ SYS_DESC(SYS_AMCNTENCLR1_EL0), access_amu },
-	{ SYS_DESC(SYS_AMCNTENSET1_EL0), access_amu },
+	{ SYS_DESC(SYS_AMCR_EL0), undef_access },
+	{ SYS_DESC(SYS_AMCFGR_EL0), undef_access },
+	{ SYS_DESC(SYS_AMCGCR_EL0), undef_access },
+	{ SYS_DESC(SYS_AMUSERENR_EL0), undef_access },
+	{ SYS_DESC(SYS_AMCNTENCLR0_EL0), undef_access },
+	{ SYS_DESC(SYS_AMCNTENSET0_EL0), undef_access },
+	{ SYS_DESC(SYS_AMCNTENCLR1_EL0), undef_access },
+	{ SYS_DESC(SYS_AMCNTENSET1_EL0), undef_access },
 	AMU_AMEVCNTR0_EL0(0),
 	AMU_AMEVCNTR0_EL0(1),
 	AMU_AMEVCNTR0_EL0(2),
commit 23711a5e662c1a66e14cb9288e7dfd2b840efcd5
Author: Marc Zyngier <maz at kernel.org>
Date:   Tue Nov 10 14:13:06 2020 +0000

    KVM: arm64: Allow setting of ID_AA64PFR0_EL1.CSV2 from userspace
    
    We now expose ID_AA64PFR0_EL1.CSV2=1 to guests running on hosts
    that are immune to Spectre-v2, but that don't have this field set,
    most likely because they predate the specification.
    
    However, this prevents the migration of guests that have started on
    a host the doesn't fake this CSV2 setting to one that does, as KVM
    rejects the write to ID_AA64PFR0_EL2 on the grounds that it isn't
    what is already there.
    
    In order to fix this, allow userspace to set this field as long as
    this doesn't result in a promising more than what is already there
    (setting CSV2 to 0 is acceptable, but setting it to 1 when it is
    already set to 0 isn't).
    
    Fixes: e1026237f9067 ("KVM: arm64: Set CSV2 for guests on hardware unaffected by Spectre-v2")
    Reported-by: Peng Liang <liangpeng10 at huawei.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Acked-by: Will Deacon <will at kernel.org>
    Link: https://lore.kernel.org/r/20201110141308.451654-2-maz@kernel.org

diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index 781d029b8aa8..0cd9f0f75c13 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -118,6 +118,8 @@ struct kvm_arch {
 	 */
 	unsigned long *pmu_filter;
 	unsigned int pmuver;
+
+	u8 pfr0_csv2;
 };
 
 struct kvm_vcpu_fault_info {
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index a3b32df1afb0..a6e25a4b4dc5 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -102,6 +102,20 @@ static int kvm_arm_default_max_vcpus(void)
 	return vgic_present ? kvm_vgic_get_max_vcpus() : KVM_MAX_VCPUS;
 }
 
+static void set_default_csv2(struct kvm *kvm)
+{
+	/*
+	 * The default is to expose CSV2 == 1 if the HW isn't affected.
+	 * Although this is a per-CPU feature, we make it global because
+	 * asymmetric systems are just a nuisance.
+	 *
+	 * Userspace can override this as long as it doesn't promise
+	 * the impossible.
+	 */
+	if (arm64_get_spectre_v2_state() == SPECTRE_UNAFFECTED)
+		kvm->arch.pfr0_csv2 = 1;
+}
+
 /**
  * kvm_arch_init_vm - initializes a VM data structure
  * @kvm:	pointer to the KVM struct
@@ -127,6 +141,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 	/* The maximum number of VCPUs is limited by the host's GIC model */
 	kvm->arch.max_vcpus = kvm_arm_default_max_vcpus();
 
+	set_default_csv2(kvm);
+
 	return ret;
 out_free_stage2_pgd:
 	kvm_free_stage2_pgd(&kvm->arch.mmu);
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 6d287eefd9f1..0aa86250e354 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1128,9 +1128,8 @@ static u64 read_id_reg(const struct kvm_vcpu *vcpu,
 		if (!vcpu_has_sve(vcpu))
 			val &= ~(0xfUL << ID_AA64PFR0_SVE_SHIFT);
 		val &= ~(0xfUL << ID_AA64PFR0_AMU_SHIFT);
-		if (!(val & (0xfUL << ID_AA64PFR0_CSV2_SHIFT)) &&
-		    arm64_get_spectre_v2_state() == SPECTRE_UNAFFECTED)
-			val |= (1UL << ID_AA64PFR0_CSV2_SHIFT);
+		val &= ~(0xfUL << ID_AA64PFR0_CSV2_SHIFT);
+		val |= ((u64)vcpu->kvm->arch.pfr0_csv2 << ID_AA64PFR0_CSV2_SHIFT);
 	} else if (id == SYS_ID_AA64PFR1_EL1) {
 		val &= ~(0xfUL << ID_AA64PFR1_MTE_SHIFT);
 	} else if (id == SYS_ID_AA64ISAR1_EL1 && !vcpu_has_ptrauth(vcpu)) {
@@ -1213,6 +1212,40 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
 	return REG_HIDDEN;
 }
 
+static int set_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
+			       const struct sys_reg_desc *rd,
+			       const struct kvm_one_reg *reg, void __user *uaddr)
+{
+	const u64 id = sys_reg_to_index(rd);
+	int err;
+	u64 val;
+	u8 csv2;
+
+	err = reg_from_user(&val, uaddr, id);
+	if (err)
+		return err;
+
+	/*
+	 * Allow AA64PFR0_EL1.CSV2 to be set from userspace as long as
+	 * it doesn't promise more than what is actually provided (the
+	 * guest could otherwise be covered in ectoplasmic residue).
+	 */
+	csv2 = cpuid_feature_extract_unsigned_field(val, ID_AA64PFR0_CSV2_SHIFT);
+	if (csv2 > 1 ||
+	    (csv2 && arm64_get_spectre_v2_state() != SPECTRE_UNAFFECTED))
+		return -EINVAL;
+
+	/* We can only differ with CSV2, and anything else is an error */
+	val ^= read_id_reg(vcpu, rd, false);
+	val &= ~(0xFUL << ID_AA64PFR0_CSV2_SHIFT);
+	if (val)
+		return -EINVAL;
+
+	vcpu->kvm->arch.pfr0_csv2 = csv2;
+
+	return 0;
+}
+
 /*
  * cpufeature ID register user accessors
  *
@@ -1472,7 +1505,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 
 	/* AArch64 ID registers */
 	/* CRm=4 */
-	ID_SANITISED(ID_AA64PFR0_EL1),
+	{ SYS_DESC(SYS_ID_AA64PFR0_EL1), .access = access_id_reg,
+	  .get_user = get_id_reg, .set_user = set_id_aa64pfr0_el1, },
 	ID_SANITISED(ID_AA64PFR1_EL1),
 	ID_UNALLOCATED(4,2),
 	ID_UNALLOCATED(4,3),
commit bc551d776b691022f49b5bb5379bd58f7c4eb76a
Author: Jonathan Liu <net147 at gmail.com>
Date:   Sat Oct 31 19:17:47 2020 +1100

    drm: bridge: dw-hdmi: Avoid resetting force in the detect function
    
    It has been observed that resetting force in the detect function can
    result in the PHY being powered down in response to hot-plug detect
    being asserted, even when the HDMI connector is forced on.
    
    Enabling debug messages and adding a call to dump_stack() in
    dw_hdmi_phy_power_off() shows the following in dmesg:
    [  160.637413] dwhdmi-rockchip ff940000.hdmi: EVENT=plugin
    [  160.637433] dwhdmi-rockchip ff940000.hdmi: PHY powered down in 0 iterations
    
    Call trace:
    dw_hdmi_phy_power_off
    dw_hdmi_phy_disable
    dw_hdmi_update_power
    dw_hdmi_detect
    dw_hdmi_connector_detect
    drm_helper_probe_detect_ctx
    drm_helper_hpd_irq_event
    dw_hdmi_irq
    irq_thread_fn
    irq_thread
    kthread
    ret_from_fork
    
    Fixes: 381f05a7a842 ("drm: bridge/dw_hdmi: add connector mode forcing")
    Signed-off-by: Jonathan Liu <net147 at gmail.com>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201031081747.372599-1-net147@gmail.com

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 748df1cacd2b..0c79a9ba48bb 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2327,12 +2327,6 @@ static enum drm_connector_status dw_hdmi_detect(struct dw_hdmi *hdmi)
 {
 	enum drm_connector_status result;
 
-	mutex_lock(&hdmi->mutex);
-	hdmi->force = DRM_FORCE_UNSPECIFIED;
-	dw_hdmi_update_power(hdmi);
-	dw_hdmi_update_phy_mask(hdmi);
-	mutex_unlock(&hdmi->mutex);
-
 	result = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data);
 
 	mutex_lock(&hdmi->mutex);
commit 4f6b838c378a52ea3ae0b15f12ca8a20849072fa
Merge: c512298eed03 3650b228f83a
Author: Marc Zyngier <maz at kernel.org>
Date:   Thu Nov 12 21:20:43 2020 +0000

    Merge tag 'v5.10-rc1' into kvmarm-master/next
    
    Linux 5.10-rc1
    
    Signed-off-by: Marc Zyngier <maz at kernel.org>

commit c01a21b77722db0474bbcc4eafc8c4e0d8fed6d8
Author: Petr Vorel <pvorel at suse.cz>
Date:   Thu Nov 12 17:50:05 2020 +0100

    loop: Fix occasional uevent drop
    
    Commit 716ad0986cbd ("loop: Switch to set_capacity_revalidate_and_notify")
    causes an occasional drop of loop device uevent, which are no longer
    triggered in loop_set_size() but in a different part of code.
    
    Bug is reproducible with LTP test uevent01 [1]:
    
    i=0; while true; do
        i=$((i+1)); echo "== $i =="
        lsmod |grep -q loop && rmmod -f loop
        ./uevent01 || break
    done
    
    Put back triggering through code called in loop_set_size().
    
    Fix required to add yet another parameter to
    set_capacity_revalidate_and_notify().
    
    [1] https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/uevents/uevent01.c
    
    [hch: rebased on a different change to the prototype of
     set_capacity_revalidate_and_notify]
    
    Cc: stable at vger.kernel.org # v5.9
    Fixes: 716ad0986cbd ("loop: Switch to set_capacity_revalidate_and_notify")
    Reported-by: <ltp at lists.linux.it>
    Signed-off-by: Petr Vorel <pvorel at suse.cz>
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index cb1191d6e945..a58084c2ed7c 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -255,7 +255,8 @@ static void loop_set_size(struct loop_device *lo, loff_t size)
 
 	bd_set_nr_sectors(bdev, size);
 
-	set_capacity_revalidate_and_notify(lo->lo_disk, size, false);
+	if (!set_capacity_revalidate_and_notify(lo->lo_disk, size, false))
+		kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
 }
 
 static inline int
commit 7e890c37c25c7cbca37ff0ab292873d8146e713b
Author: Christoph Hellwig <hch at lst.de>
Date:   Thu Nov 12 17:50:04 2020 +0100

    block: add a return value to set_capacity_revalidate_and_notify
    
    Return if the function ended up sending an uevent or not.
    
    Cc: stable at vger.kernel.org # v5.9
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Petr Vorel <pvorel at suse.cz>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/block/genhd.c b/block/genhd.c
index 0a273211fec2..9387f050c248 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -49,7 +49,7 @@ static void disk_release_events(struct gendisk *disk);
  * Set disk capacity and notify if the size is not currently
  * zero and will not be set to zero
  */
-void set_capacity_revalidate_and_notify(struct gendisk *disk, sector_t size,
+bool set_capacity_revalidate_and_notify(struct gendisk *disk, sector_t size,
 					bool update_bdev)
 {
 	sector_t capacity = get_capacity(disk);
@@ -62,7 +62,10 @@ void set_capacity_revalidate_and_notify(struct gendisk *disk, sector_t size,
 		char *envp[] = { "RESIZE=1", NULL };
 
 		kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp);
+		return true;
 	}
+
+	return false;
 }
 
 EXPORT_SYMBOL_GPL(set_capacity_revalidate_and_notify);
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 38f23d757013..03da3f603d30 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -315,7 +315,7 @@ static inline int get_disk_ro(struct gendisk *disk)
 extern void disk_block_events(struct gendisk *disk);
 extern void disk_unblock_events(struct gendisk *disk);
 extern void disk_flush_events(struct gendisk *disk, unsigned int mask);
-void set_capacity_revalidate_and_notify(struct gendisk *disk, sector_t size,
+bool set_capacity_revalidate_and_notify(struct gendisk *disk, sector_t size,
 		bool update_bdev);
 
 /* drivers/char/random.c */
commit c3213d260a23e263ef85ba21ac68c9e7578020b5
Author: Scott Mayhew <smayhew at redhat.com>
Date:   Thu Nov 12 15:17:32 2020 -0500

    SUNRPC: Fix oops in the rpc_xdr_buf event class
    
    Backchannel rpc tasks don't have task->tk_client set, so it's necessary
    to check it for NULL before dereferencing.
    
    Fixes: c509f15a5801 ("SUNRPC: Split the xdr_buf event class")
    Signed-off-by: Scott Mayhew <smayhew at redhat.com>
    Reviewed-by: Chuck Lever <chuck.lever at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h
index 2477014e3fa6..2a03263b5f9d 100644
--- a/include/trace/events/sunrpc.h
+++ b/include/trace/events/sunrpc.h
@@ -68,7 +68,8 @@ DECLARE_EVENT_CLASS(rpc_xdr_buf_class,
 
 	TP_fast_assign(
 		__entry->task_id = task->tk_pid;
-		__entry->client_id = task->tk_client->cl_clid;
+		__entry->client_id = task->tk_client ?
+				     task->tk_client->cl_clid : -1;
 		__entry->head_base = xdr->head[0].iov_base;
 		__entry->head_len = xdr->head[0].iov_len;
 		__entry->tail_base = xdr->tail[0].iov_base;
commit dd94ac807a5e10e0b25b68397c473276905cca73
Author: Leo Yan <leo.yan at linaro.org>
Date:   Tue Nov 10 14:34:17 2020 +0800

    perf test: Update branch sample pattern for cs-etm
    
    Since the commit 943b69ac1884 ("perf parse-events: Set exclude_guest=1
    for user-space counting"), 'exclude_guest=1' is set for user-space
    counting; and the branch sample's modifier has been altered, the sample
    event name has been changed from "branches:u:" to "branches:uH:", which
    gives out info for "user-space and host counting".
    
    But the cs-etm testing's regular expression cannot match the updated
    branch sample event and leads to test failure.
    
    This patch updates the branch sample pattern by using a more flexible
    expression '.*' to match branch sample's modifiers, so that allows the
    testing to work as expected.
    
    Fixes: 943b69ac1884 ("perf parse-events: Set exclude_guest=1 for user-space counting")
    Signed-off-by: Leo Yan <leo.yan at linaro.org>
    Reviewed-by: Mathieu Poirier <mathieu.poirier at linaro.org>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: Jin Yao <yao.jin at linux.intel.com>
    Cc: Jiri Olsa <jolsa at redhat.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Mike Leach <mike.leach at linaro.org>
    Cc: Namhyung Kim <namhyung at kernel.org>
    Cc: Peter Zijlstra <peterz at infradead.org>
    Cc: Suzuki Poulouse <suzuki.poulose at arm.com>
    Cc: coresight ml <coresight at lists.linaro.org>
    Cc: stable at kernel.org
    Link: http://lore.kernel.org/lkml/20201110063417.14467-2-leo.yan@linaro.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/tests/shell/test_arm_coresight.sh b/tools/perf/tests/shell/test_arm_coresight.sh
index 59d847d4981d..18fde2f179cd 100755
--- a/tools/perf/tests/shell/test_arm_coresight.sh
+++ b/tools/perf/tests/shell/test_arm_coresight.sh
@@ -44,7 +44,7 @@ perf_script_branch_samples() {
 	#   touch  6512          1         branches:u:      ffffb22082e0 strcmp+0xa0 (/lib/aarch64-linux-gnu/ld-2.27.so)
 	#   touch  6512          1         branches:u:      ffffb2208320 strcmp+0xe0 (/lib/aarch64-linux-gnu/ld-2.27.so)
 	perf script -F,-time -i ${perfdata} | \
-		egrep " +$1 +[0-9]+ .* +branches:([u|k]:)? +"
+		egrep " +$1 +[0-9]+ .* +branches:(.*:)? +"
 }
 
 perf_report_branch_samples() {
commit db2ac2e49e564c2b219c4b33d9903aa383334256
Author: Leo Yan <leo.yan at linaro.org>
Date:   Tue Nov 10 14:34:16 2020 +0800

    perf test: Fix a typo in cs-etm testing
    
    Fix a typo: s/devce_name/device_name.
    
    Fixes: fe0aed19b266 ("perf test: Introduce script for Arm CoreSight testing")
    Signed-off-by: Leo Yan <leo.yan at linaro.org>
    Reviewed-by: Mathieu Poirier <mathieu.poirier at linaro.org>
    Cc: Alexander Shishkin <alexander.shishkin at linux.intel.com>
    Cc: Jin Yao <yao.jin at linux.intel.com>
    Cc: Jiri Olsa <jolsa at redhat.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Cc: Mike Leach <mike.leach at linaro.org>
    Cc: Namhyung Kim <namhyung at kernel.org>
    Cc: Peter Zijlstra <peterz at infradead.org>
    Cc: Suzuki Poulouse <suzuki.poulose at arm.com>
    Cc: coresight ml <coresight at lists.linaro.org>
    Cc: stable at kernel.org
    Link: http://lore.kernel.org/lkml/20201110063417.14467-1-leo.yan@linaro.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/tests/shell/test_arm_coresight.sh b/tools/perf/tests/shell/test_arm_coresight.sh
index 8d84fdbed6a6..59d847d4981d 100755
--- a/tools/perf/tests/shell/test_arm_coresight.sh
+++ b/tools/perf/tests/shell/test_arm_coresight.sh
@@ -105,7 +105,7 @@ arm_cs_iterate_devices() {
 		#     `> device_name = 'tmc_etf0'
 		device_name=$(basename $path)
 
-		if is_device_sink $path $devce_name; then
+		if is_device_sink $path $device_name; then
 
 			record_touch_file $device_name $2 &&
 			perf_script_branch_samples touch &&
commit db1a8b97a0a36155171dbb805fbcb276e07559f6
Author: Arnaldo Carvalho de Melo <acme at redhat.com>
Date:   Mon Nov 9 13:59:15 2020 -0300

    tools arch: Update arch/x86/lib/mem{cpy,set}_64.S copies used in 'perf bench mem memcpy'
    
    To bring in the change made in this cset:
    
      4d6ffa27b8e5116c ("x86/lib: Change .weak to SYM_FUNC_START_WEAK for arch/x86/lib/mem*_64.S")
      6dcc5627f6aec4cb ("x86/asm: Change all ENTRY+ENDPROC to SYM_FUNC_*")
    
    I needed to define SYM_FUNC_START_LOCAL() as SYM_L_GLOBAL as
    mem{cpy,set}_{orig,erms} are used by 'perf bench'.
    
    This silences these perf tools build warnings:
    
      Warning: Kernel ABI header at 'tools/arch/x86/lib/memcpy_64.S' differs from latest version at 'arch/x86/lib/memcpy_64.S'
      diff -u tools/arch/x86/lib/memcpy_64.S arch/x86/lib/memcpy_64.S
      Warning: Kernel ABI header at 'tools/arch/x86/lib/memset_64.S' differs from latest version at 'arch/x86/lib/memset_64.S'
      diff -u tools/arch/x86/lib/memset_64.S arch/x86/lib/memset_64.S
    
    Cc: Adrian Hunter <adrian.hunter at intel.com>
    Cc: Borislav Petkov <bp at suse.de>
    Cc: Fangrui Song <maskray at google.com>
    Cc: Ian Rogers <irogers at google.com>
    Cc: Jiri Olsa <jolsa at kernel.org>
    Cc: Jiri Slaby <jirislaby at kernel.org>
    Cc: Namhyung Kim <namhyung at kernel.org>
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/arch/x86/lib/memcpy_64.S b/tools/arch/x86/lib/memcpy_64.S
index 0b5b8ae56bd9..1e299ac73c86 100644
--- a/tools/arch/x86/lib/memcpy_64.S
+++ b/tools/arch/x86/lib/memcpy_64.S
@@ -16,8 +16,6 @@
  * to a jmp to memcpy_erms which does the REP; MOVSB mem copy.
  */
 
-.weak memcpy
-
 /*
  * memcpy - Copy a memory block.
  *
@@ -30,7 +28,7 @@
  * rax original destination
  */
 SYM_FUNC_START_ALIAS(__memcpy)
-SYM_FUNC_START_LOCAL(memcpy)
+SYM_FUNC_START_WEAK(memcpy)
 	ALTERNATIVE_2 "jmp memcpy_orig", "", X86_FEATURE_REP_GOOD, \
 		      "jmp memcpy_erms", X86_FEATURE_ERMS
 
@@ -51,14 +49,14 @@ EXPORT_SYMBOL(__memcpy)
  * memcpy_erms() - enhanced fast string memcpy. This is faster and
  * simpler than memcpy. Use memcpy_erms when possible.
  */
-SYM_FUNC_START(memcpy_erms)
+SYM_FUNC_START_LOCAL(memcpy_erms)
 	movq %rdi, %rax
 	movq %rdx, %rcx
 	rep movsb
 	ret
 SYM_FUNC_END(memcpy_erms)
 
-SYM_FUNC_START(memcpy_orig)
+SYM_FUNC_START_LOCAL(memcpy_orig)
 	movq %rdi, %rax
 
 	cmpq $0x20, %rdx
diff --git a/tools/arch/x86/lib/memset_64.S b/tools/arch/x86/lib/memset_64.S
index fd5d25a474b7..0bfd26e4ca9e 100644
--- a/tools/arch/x86/lib/memset_64.S
+++ b/tools/arch/x86/lib/memset_64.S
@@ -4,8 +4,7 @@
 #include <linux/linkage.h>
 #include <asm/cpufeatures.h>
 #include <asm/alternative-asm.h>
-
-.weak memset
+#include <asm/export.h>
 
 /*
  * ISO C memset - set a memory block to a byte value. This function uses fast
@@ -18,7 +17,7 @@
  *
  * rax   original destination
  */
-SYM_FUNC_START_ALIAS(memset)
+SYM_FUNC_START_WEAK(memset)
 SYM_FUNC_START(__memset)
 	/*
 	 * Some CPUs support enhanced REP MOVSB/STOSB feature. It is recommended
@@ -44,6 +43,8 @@ SYM_FUNC_START(__memset)
 	ret
 SYM_FUNC_END(__memset)
 SYM_FUNC_END_ALIAS(memset)
+EXPORT_SYMBOL(memset)
+EXPORT_SYMBOL(__memset)
 
 /*
  * ISO C memset - set a memory block to a byte value. This function uses
@@ -56,7 +57,7 @@ SYM_FUNC_END_ALIAS(memset)
  *
  * rax   original destination
  */
-SYM_FUNC_START(memset_erms)
+SYM_FUNC_START_LOCAL(memset_erms)
 	movq %rdi,%r9
 	movb %sil,%al
 	movq %rdx,%rcx
@@ -65,7 +66,7 @@ SYM_FUNC_START(memset_erms)
 	ret
 SYM_FUNC_END(memset_erms)
 
-SYM_FUNC_START(memset_orig)
+SYM_FUNC_START_LOCAL(memset_orig)
 	movq %rdi,%r10
 
 	/* expand byte value  */
diff --git a/tools/perf/bench/mem-memcpy-x86-64-asm.S b/tools/perf/bench/mem-memcpy-x86-64-asm.S
index 9ad015a1e202..6eb45a2aa8db 100644
--- a/tools/perf/bench/mem-memcpy-x86-64-asm.S
+++ b/tools/perf/bench/mem-memcpy-x86-64-asm.S
@@ -2,6 +2,9 @@
 
 /* Various wrappers to make the kernel .S file build in user-space: */
 
+// memcpy_orig and memcpy_erms are being defined as SYM_L_LOCAL but we need it
+#define SYM_FUNC_START_LOCAL(name)                      \
+        SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
 #define memcpy MEMCPY /* don't hide glibc's memcpy() */
 #define altinstr_replacement text
 #define globl p2align 4; .globl
diff --git a/tools/perf/bench/mem-memset-x86-64-asm.S b/tools/perf/bench/mem-memset-x86-64-asm.S
index d550bd526162..6f093c483842 100644
--- a/tools/perf/bench/mem-memset-x86-64-asm.S
+++ b/tools/perf/bench/mem-memset-x86-64-asm.S
@@ -1,4 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0 */
+// memset_orig and memset_erms are being defined as SYM_L_LOCAL but we need it
+#define SYM_FUNC_START_LOCAL(name)                      \
+        SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
 #define memset MEMSET /* don't hide glibc's memset() */
 #define altinstr_replacement text
 #define globl p2align 4; .globl
diff --git a/tools/perf/util/include/linux/linkage.h b/tools/perf/util/include/linux/linkage.h
index b8a5159361b4..5acf053fca7d 100644
--- a/tools/perf/util/include/linux/linkage.h
+++ b/tools/perf/util/include/linux/linkage.h
@@ -25,6 +25,7 @@
 
 /* SYM_L_* -- linkage of symbols */
 #define SYM_L_GLOBAL(name)			.globl name
+#define SYM_L_WEAK(name)			.weak name
 #define SYM_L_LOCAL(name)			/* nothing */
 
 #define ALIGN __ALIGN
@@ -84,6 +85,12 @@
 	SYM_END(name, SYM_T_FUNC)
 #endif
 
+/* SYM_FUNC_START_WEAK -- use for weak functions */
+#ifndef SYM_FUNC_START_WEAK
+#define SYM_FUNC_START_WEAK(name)			\
+	SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN)
+#endif
+
 /*
  * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START,
  * SYM_FUNC_START_WEAK, ...
commit b0e5a05cc9e37763c7f19366d94b1a6160c755bc
Author: Leo Yan <leo.yan at linaro.org>
Date:   Wed Nov 4 17:42:29 2020 +0800

    perf lock: Don't free "lock_seq_stat" if read_count isn't zero
    
    When execute command "perf lock report", it hits failure and outputs log
    as follows:
    
      perf: builtin-lock.c:623: report_lock_release_event: Assertion `!(seq->read_count < 0)' failed.
      Aborted
    
    This is an imbalance issue.  The locking sequence structure
    "lock_seq_stat" contains the reader counter and it is used to check if
    the locking sequence is balance or not between acquiring and releasing.
    
    If the tool wrongly frees "lock_seq_stat" when "read_count" isn't zero,
    the "read_count" will be reset to zero when allocate a new structure at
    the next time; thus it causes the wrong counting for reader and finally
    results in imbalance issue.
    
    To fix this issue, if detects "read_count" is not zero (means still have
    read user in the locking sequence), goto the "end" tag to skip freeing
    structure "lock_seq_stat".
    
    Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")
    Signed-off-by: Leo Yan <leo.yan at linaro.org>
    Acked-by: Jiri Olsa <jolsa at redhat.com>
    Link: https://lore.kernel.org/r/20201104094229.17509-2-leo.yan@linaro.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index 5cecc1ad78e1..a2f1e53f37a7 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -621,7 +621,7 @@ static int report_lock_release_event(struct evsel *evsel,
 	case SEQ_STATE_READ_ACQUIRED:
 		seq->read_count--;
 		BUG_ON(seq->read_count < 0);
-		if (!seq->read_count) {
+		if (seq->read_count) {
 			ls->nr_release++;
 			goto end;
 		}
commit e24a87b54ef3e39261f1d859b7f78416349dfb14
Author: Leo Yan <leo.yan at linaro.org>
Date:   Wed Nov 4 17:42:28 2020 +0800

    perf lock: Correct field name "flags"
    
    The tracepoint "lock:lock_acquire" contains field "flags" but not
    "flag".  Current code wrongly retrieves value from field "flag" and it
    always gets zero for the value, thus "perf lock" doesn't report the
    correct result.
    
    This patch replaces the field name "flag" with "flags", so can read out
    the correct flags for locking.
    
    Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")
    Signed-off-by: Leo Yan <leo.yan at linaro.org>
    Acked-by: Jiri Olsa <jolsa at redhat.com>
    Link: https://lore.kernel.org/r/20201104094229.17509-1-leo.yan@linaro.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index f0a1dbacb46c..5cecc1ad78e1 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -406,7 +406,7 @@ static int report_lock_acquire_event(struct evsel *evsel,
 	struct lock_seq_stat *seq;
 	const char *name = evsel__strval(evsel, sample, "name");
 	u64 tmp	 = evsel__intval(evsel, sample, "lockdep_addr");
-	int flag = evsel__intval(evsel, sample, "flag");
+	int flag = evsel__intval(evsel, sample, "flags");
 
 	memcpy(&addr, &tmp, sizeof(void *));
 
commit c371dcf51cef4ae53d00090a148d004b113217f0
Merge: 4def49da620c 63c5395bb7a9
Author: Mark Brown <broonie at kernel.org>
Date:   Thu Nov 12 19:34:52 2020 +0000

    Merge series "Use-after-free be gone" from Lukas Wunner <lukas at wunner.de>:
    
    Here's my proposal to fix the use-after-free bugs reported by
    Sascha Hauer and Florian Fainelli:
    
    I scrutinized all SPI drivers in the v5.10 tree:
    
    * There are 9 drivers with a use-after-free in the ->remove() hook
      caused by accessing driver private data after spi_unregister_controller().
    
    * There are 8 drivers which leak the spi_controller in the ->probe()
      error path because of a missing spi_controller_put().
    
    I'm introducing devm_spi_alloc_master/slave() which automatically
    calls spi_controller_put() on ->remove().  This fixes both classes
    of bugs while at the same time reducing code amount and complexity
    in the ->probe() hook.
    
    I propose that spi_controller_unregister() should no longer release
    a reference on the spi_controller.  Instead, drivers need to either
    do it themselves or use one of the devm functions introduced herein.
    The vast majority of drivers can be converted to the devm functions.
    See the commit message of patch [1/4] for the rationale and details.
    
    Enclosed are patches for 3 Broadcom drivers.
    Patches for the other drivers are on this branch:
    https://github.com/l1k/linux/commits/spi_fixes
    
    @Florian Fainelli:  Could you verify that there are no KASAN splats or
    leaks with these patches?  Unfortunately I do not have any SPI-capable
    hardware at my disposal right now, so can only compile-test.  You may
    want to augment spi_controller_release() with a printk() to log when
    the spi_controller is freed.
    
    @Mark Brown:  Patches [2/4] to [4/4] reference the SHA-1 of patch [1/4]
    in their stable tags.  Because the hash is unknown to me until you apply
    the patch, I've used "123456789abc" as a placeholder.  You'll have to
    replace the hash if/when applying.  Alternatively, only apply patch [1/4]
    and I'll repost the other patches with the hash fixed up.
    
    Thanks!
    
    Lukas Wunner (4):
      spi: Introduce device-managed SPI controller allocation
      spi: bcm2835: Fix use-after-free on unbind
      spi: bcm2835aux: Fix use-after-free on unbind
      spi: bcm-qspi: Fix use-after-free on unbind
    
     drivers/spi/spi-bcm-qspi.c   | 34 ++++++++-------------
     drivers/spi/spi-bcm2835.c    | 24 +++++----------
     drivers/spi/spi-bcm2835aux.c | 21 +++++--------
     drivers/spi/spi.c            | 58 +++++++++++++++++++++++++++++++++++-
     include/linux/spi/spi.h      | 19 ++++++++++++
     5 files changed, 103 insertions(+), 53 deletions(-)
    
    --
    2.28.0

commit 9602182810cc15e241f06c63c90b828ef63d0507
Author: Alexei Starovoitov <ast at kernel.org>
Date:   Thu Nov 12 10:03:40 2020 -0800

    MAINTAINERS/bpf: Update Andrii's entry.
    
    Andrii has been a de-facto maintainer for libbpf and other components.
    Update maintainers entry to acknowledge his work de-jure.
    
    The folks with git write permissions will continue to follow the rule
    of not applying their own patches unless absolutely trivial.
    
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201112180340.45265-1-alexei.starovoitov@gmail.com

diff --git a/MAINTAINERS b/MAINTAINERS
index cd123d0a6a2d..008ee2bf753b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3243,10 +3243,10 @@ F:	drivers/iio/accel/bma400*
 BPF (Safe dynamic programs and tools)
 M:	Alexei Starovoitov <ast at kernel.org>
 M:	Daniel Borkmann <daniel at iogearbox.net>
+M:	Andrii Nakryiko <andrii at kernel.org>
 R:	Martin KaFai Lau <kafai at fb.com>
 R:	Song Liu <songliubraving at fb.com>
 R:	Yonghong Song <yhs at fb.com>
-R:	Andrii Nakryiko <andrii at kernel.org>
 R:	John Fastabend <john.fastabend at gmail.com>
 R:	KP Singh <kpsingh at chromium.org>
 L:	netdev at vger.kernel.org
commit af5043c89a8ef6b6949a245fff355a552eaed240
Merge: fcfb67918c0b 7222a8a52c9e
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 12 11:06:53 2020 -0800

    Merge tag 'acpi-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
    
    Pull ACPI fixes from Rafael Wysocki:
     "These are mostly docmentation fixes and janitorial changes plus some
      new device IDs and a new quirk.
    
      Specifics:
    
       - Fix documentation regarding GPIO properties (Andy Shevchenko)
    
       - Fix spelling mistakes in ACPI documentation (Flavio Suligoi)
    
       - Fix white space inconsistencies in ACPI code (Maximilian Luz)
    
       - Fix string formatting in the ACPI Generic Event Device (GED) driver
         (Nick Desaulniers)
    
       - Add Intel Alder Lake device IDs to the ACPI drivers used by the
         Dynamic Platform and Thermal Framework (Srinivas Pandruvada)
    
       - Add lid-related DMI quirk for Medion Akoya E2228T to the ACPI
         button driver (Hans de Goede)"
    
    * tag 'acpi-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
      ACPI: DPTF: Support Alder Lake
      Documentation: ACPI: fix spelling mistakes
      ACPI: button: Add DMI quirk for Medion Akoya E2228T
      ACPI: GED: fix -Wformat
      ACPI: Fix whitespace inconsistencies
      ACPI: scan: Fix acpi_dma_configure_id() kerneldoc name
      Documentation: firmware-guide: gpio-properties: Clarify initial output state
      Documentation: firmware-guide: gpio-properties: active_low only for GpioIo()
      Documentation: firmware-guide: gpio-properties: Fix factual mistakes

commit fcfb67918c0bc26c595c424b14f736205a49328a
Merge: 3d5e28bff7ad fcb3a1ab7990
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Thu Nov 12 11:03:38 2020 -0800

    Merge tag 'pm-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
    
    Pull power management fixes from Rafael Wysocki:
     "Make the intel_pstate driver behave as expected when it operates in
      the passive mode with HWP enabled and the 'powersave' governor on top
      of it"
    
    * tag 'pm-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
      cpufreq: intel_pstate: Take CPUFREQ_GOV_STRICT_TARGET into account
      cpufreq: Add strict_target to struct cpufreq_policy
      cpufreq: Introduce CPUFREQ_GOV_STRICT_TARGET
      cpufreq: Introduce governor flags

commit 4def49da620c84a682d9361d6bef0a97eed46fe0
Author: Lukas Wunner <lukas at wunner.de>
Date:   Sun Nov 8 23:41:00 2020 +0100

    spi: lpspi: Fix use-after-free on unbind
    
    Normally the last reference on an spi_controller is released by
    spi_unregister_controller().  In the case of the i.MX lpspi driver,
    the spi_controller is registered with devm_spi_register_controller(),
    so spi_unregister_controller() is invoked automatically after the driver
    has unbound.
    
    However the driver already releases the last reference in
    fsl_lpspi_remove() through a gratuitous call to spi_master_put(),
    causing a use-after-free when spi_unregister_controller() is
    subsequently invoked by the devres framework.
    
    Fix by dropping the superfluous spi_master_put().
    
    Fixes: 944c01a889d9 ("spi: lpspi: enable runtime pm for lpspi")
    Signed-off-by: Lukas Wunner <lukas at wunner.de>
    Cc: <stable at vger.kernel.org> # v5.2+
    Cc: Han Xu <han.xu at nxp.com>
    Link: https://lore.kernel.org/r/ab3c0b18bd820501a12c85e440006e09ec0e275f.1604874488.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
index 986b9793fd3c..a2886ee44e4c 100644
--- a/drivers/spi/spi-fsl-lpspi.c
+++ b/drivers/spi/spi-fsl-lpspi.c
@@ -938,9 +938,6 @@ static int fsl_lpspi_remove(struct platform_device *pdev)
 				spi_controller_get_devdata(controller);
 
 	pm_runtime_disable(fsl_lpspi->dev);
-
-	spi_master_put(controller);
-
 	return 0;
 }
 
commit edbc21113bde13ca3d06eec24b621b1f628583dd
Author: Sven Van Asbroeck <thesven73 at gmail.com>
Date:   Thu Nov 12 10:25:13 2020 -0500

    lan743x: fix use of uninitialized variable
    
    When no devicetree is present, the driver will use an
    uninitialized variable.
    
    Fix by initializing this variable.
    
    Fixes: 902a66e08cea ("lan743x: correctly handle chips with internal PHY")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Sven Van Asbroeck <thesven73 at gmail.com>
    Link: https://lore.kernel.org/r/20201112152513.1941-1-TheSven73@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 173158656559..e2c99d909247 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -1014,8 +1014,8 @@ static void lan743x_phy_close(struct lan743x_adapter *adapter)
 static int lan743x_phy_open(struct lan743x_adapter *adapter)
 {
 	struct lan743x_phy *phy = &adapter->phy;
+	struct phy_device *phydev = NULL;
 	struct device_node *phynode;
-	struct phy_device *phydev;
 	struct net_device *netdev;
 	int ret = -EIO;
 
commit 5861c8cb1c90fc171d56994827a66a5595a44d56
Merge: 8a5c2906c52f 55e729889bb0
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Thu Nov 12 09:55:58 2020 -0800

    Merge branch 'net-udp-fix-fast-frag0-udp-gro'
    
    Alexander Lobakin says:
    
    ====================
    net: udp: fix Fast/frag0 UDP GRO
    
    While testing UDP GSO fraglists forwarding through driver that uses
    Fast GRO (via napi_gro_frags()), I was observing lots of out-of-order
    iperf packets:
    
    [ ID] Interval           Transfer     Bitrate         Jitter
    [SUM]  0.0-40.0 sec  12106 datagrams received out-of-order
    
    Simple switch to napi_gro_receive() or any other method without frag0
    shortcut completely resolved them.
    
    I've found two incorrect header accesses in GRO receive callback(s):
     - udp_hdr() (instead of udp_gro_udphdr()) that always points to junk
       in "fast" mode and could probably do this in "regular".
       This was the actual bug that caused all out-of-order delivers;
     - udp{4,6}_lib_lookup_skb() -> ip{,v6}_hdr() (instead of
       skb_gro_network_header()) that potentionally might return odd
       pointers in both modes.
    
    Each patch addresses one of these two issues.
    
    This doesn't cover a support for nested tunnels as it's out of the
    subject and requires more invasive changes. It will be handled
    separately in net-next series.
    
    Credits:
    Cc: Eric Dumazet <edumazet at google.com>
    Cc: Jakub Kicinski <kuba at kernel.org>
    Cc: Willem de Bruijn <willemb at google.com>
    
    Since v4 [0]:
     - split the fix into two logical ones (Willem);
     - replace ternaries with plain ifs to beautify the code (Jakub);
     - drop p->data part to reintroduce it later in abovementioned set.
    
    Since v3 [1]:
     - restore the original {,__}udp{4,6}_lib_lookup_skb() and use
       private versions of them inside GRO code (Willem).
    
    Since v2 [2]:
     - dropped redundant check introduced in v2 as it's performed right
       before (thanks to Eric);
     - udp_hdr() switched to data + off for skbs from list (also Eric);
     - fixed possible malfunction of {,__}udp{4,6}_lib_lookup_skb() with
       Fast/frag0 due to ip{,v6}_hdr() usage (Willem).
    
    Since v1 [3]:
     - added a NULL pointer check for "uh" as suggested by Willem.
    
    [0] https://lore.kernel.org/netdev/Ha2hou5eJPcblo4abjAqxZRzIl1RaLs2Hy0oOAgFs@cp4-web-036.plabs.ch
    [1] https://lore.kernel.org/netdev/MgZce9htmEtCtHg7pmWxXXfdhmQ6AHrnltXC41zOoo@cp7-web-042.plabs.ch
    [2] https://lore.kernel.org/netdev/0eaG8xtbtKY1dEKCTKUBubGiC9QawGgB3tVZtNqVdY@cp4-web-030.plabs.ch
    [3] https://lore.kernel.org/netdev/YazU6GEzBdpyZMDMwJirxDX7B4sualpDG68ADZYvJI@cp4-web-034.plabs.ch
    ====================
    
    Link: https://lore.kernel.org/r/hjGOh0iCOYyo1FPiZh6TMXcx3YCgNs1T1eGKLrDz8@cp4-web-037.plabs.ch
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 55e729889bb07d68ab071660ce3f5e7a7872ebe8
Author: Alexander Lobakin <alobakin at pm.me>
Date:   Wed Nov 11 20:45:38 2020 +0000

    net: udp: fix IP header access and skb lookup on Fast/frag0 UDP GRO
    
    udp{4,6}_lib_lookup_skb() use ip{,v6}_hdr() to get IP header of the
    packet. While it's probably OK for non-frag0 paths, this helpers
    will also point to junk on Fast/frag0 GRO when all headers are
    located in frags. As a result, sk/skb lookup may fail or give wrong
    results. To support both GRO modes, skb_gro_network_header() might
    be used. To not modify original functions, add private versions of
    udp{4,6}_lib_lookup_skb() only to perform correct sk lookups on GRO.
    
    Present since the introduction of "application-level" UDP GRO
    in 4.7-rc1.
    
    Misc: replace totally unneeded ternaries with plain ifs.
    
    Fixes: a6024562ffd7 ("udp: Add GRO functions to UDP socket")
    Suggested-by: Willem de Bruijn <willemb at google.com>
    Cc: Eric Dumazet <edumazet at google.com>
    Signed-off-by: Alexander Lobakin <alobakin at pm.me>
    Acked-by: Willem de Bruijn <willemb at google.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index 13740e9fe6ec..c62805cd3131 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -500,12 +500,22 @@ out:
 }
 EXPORT_SYMBOL(udp_gro_receive);
 
+static struct sock *udp4_gro_lookup_skb(struct sk_buff *skb, __be16 sport,
+					__be16 dport)
+{
+	const struct iphdr *iph = skb_gro_network_header(skb);
+
+	return __udp4_lib_lookup(dev_net(skb->dev), iph->saddr, sport,
+				 iph->daddr, dport, inet_iif(skb),
+				 inet_sdif(skb), &udp_table, NULL);
+}
+
 INDIRECT_CALLABLE_SCOPE
 struct sk_buff *udp4_gro_receive(struct list_head *head, struct sk_buff *skb)
 {
 	struct udphdr *uh = udp_gro_udphdr(skb);
+	struct sock *sk = NULL;
 	struct sk_buff *pp;
-	struct sock *sk;
 
 	if (unlikely(!uh))
 		goto flush;
@@ -523,7 +533,10 @@ struct sk_buff *udp4_gro_receive(struct list_head *head, struct sk_buff *skb)
 skip:
 	NAPI_GRO_CB(skb)->is_ipv6 = 0;
 	rcu_read_lock();
-	sk = static_branch_unlikely(&udp_encap_needed_key) ? udp4_lib_lookup_skb(skb, uh->source, uh->dest) : NULL;
+
+	if (static_branch_unlikely(&udp_encap_needed_key))
+		sk = udp4_gro_lookup_skb(skb, uh->source, uh->dest);
+
 	pp = udp_gro_receive(head, skb, uh, sk);
 	rcu_read_unlock();
 	return pp;
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c
index 584157a07759..f9e888d1b9af 100644
--- a/net/ipv6/udp_offload.c
+++ b/net/ipv6/udp_offload.c
@@ -111,12 +111,22 @@ out:
 	return segs;
 }
 
+static struct sock *udp6_gro_lookup_skb(struct sk_buff *skb, __be16 sport,
+					__be16 dport)
+{
+	const struct ipv6hdr *iph = skb_gro_network_header(skb);
+
+	return __udp6_lib_lookup(dev_net(skb->dev), &iph->saddr, sport,
+				 &iph->daddr, dport, inet6_iif(skb),
+				 inet6_sdif(skb), &udp_table, NULL);
+}
+
 INDIRECT_CALLABLE_SCOPE
 struct sk_buff *udp6_gro_receive(struct list_head *head, struct sk_buff *skb)
 {
 	struct udphdr *uh = udp_gro_udphdr(skb);
+	struct sock *sk = NULL;
 	struct sk_buff *pp;
-	struct sock *sk;
 
 	if (unlikely(!uh))
 		goto flush;
@@ -135,7 +145,10 @@ struct sk_buff *udp6_gro_receive(struct list_head *head, struct sk_buff *skb)
 skip:
 	NAPI_GRO_CB(skb)->is_ipv6 = 1;
 	rcu_read_lock();
-	sk = static_branch_unlikely(&udpv6_encap_needed_key) ? udp6_lib_lookup_skb(skb, uh->source, uh->dest) : NULL;
+
+	if (static_branch_unlikely(&udpv6_encap_needed_key))
+		sk = udp6_gro_lookup_skb(skb, uh->source, uh->dest);
+
 	pp = udp_gro_receive(head, skb, uh, sk);
 	rcu_read_unlock();
 	return pp;
commit 4b1a86281cc1d0de46df3ad2cb8c1f86ac07681c
Author: Alexander Lobakin <alobakin at pm.me>
Date:   Wed Nov 11 20:45:25 2020 +0000

    net: udp: fix UDP header access on Fast/frag0 UDP GRO
    
    UDP GRO uses udp_hdr(skb) in its .gro_receive() callback. While it's
    probably OK for non-frag0 paths (when all headers or even the entire
    frame are already in skb head), this inline points to junk when
    using Fast GRO (napi_gro_frags() or napi_gro_receive() with only
    Ethernet header in skb head and all the rest in the frags) and breaks
    GRO packet compilation and the packet flow itself.
    To support both modes, skb_gro_header_fast() + skb_gro_header_slow()
    are typically used. UDP even has an inline helper that makes use of
    them, udp_gro_udphdr(). Use that instead of troublemaking udp_hdr()
    to get rid of the out-of-order delivers.
    
    Present since the introduction of plain UDP GRO in 5.0-rc1.
    
    Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.")
    Cc: Eric Dumazet <edumazet at google.com>
    Signed-off-by: Alexander Lobakin <alobakin at pm.me>
    Acked-by: Willem de Bruijn <willemb at google.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index e67a66fbf27b..13740e9fe6ec 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -366,7 +366,7 @@ out:
 static struct sk_buff *udp_gro_receive_segment(struct list_head *head,
 					       struct sk_buff *skb)
 {
-	struct udphdr *uh = udp_hdr(skb);
+	struct udphdr *uh = udp_gro_udphdr(skb);
 	struct sk_buff *pp = NULL;
 	struct udphdr *uh2;
 	struct sk_buff *p;
commit 4e79e3f08e576acd51dffb4520037188703238b3
Author: Bob Peterson <rpeterso at redhat.com>
Date:   Thu Nov 12 10:02:48 2020 -0600

    gfs2: Fix case in which ail writes are done to jdata holes
    
    Patch b2a846dbef4e ("gfs2: Ignore journal log writes for jdata holes")
    tried (unsuccessfully) to fix a case in which writes were done to jdata
    blocks, the blocks are sent to the ail list, then a punch_hole or truncate
    operation caused the blocks to be freed. In other words, the ail items
    are for jdata holes. Before b2a846dbef4e, the jdata hole caused function
    gfs2_block_map to return -EIO, which was eventually interpreted as an
    IO error to the journal, and then withdraw.
    
    This patch changes function gfs2_get_block_noalloc, which is only used
    for jdata writes, so it returns -ENODATA rather than -EIO, and when
    -ENODATA is returned to gfs2_ail1_start_one, the error is ignored.
    We can safely ignore it because gfs2_ail1_start_one is only called
    when the jdata pages have already been written and truncated, so the
    ail1 content no longer applies.
    
    Signed-off-by: Bob Peterson <rpeterso at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c
index 9cd2ecad07db..cc4f987687f3 100644
--- a/fs/gfs2/aops.c
+++ b/fs/gfs2/aops.c
@@ -77,7 +77,7 @@ static int gfs2_get_block_noalloc(struct inode *inode, sector_t lblock,
 	if (error)
 		return error;
 	if (!buffer_mapped(bh_result))
-		return -EIO;
+		return -ENODATA;
 	return 0;
 }
 
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 9133b3178677..2e9314091c81 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -132,6 +132,8 @@ __acquires(&sdp->sd_ail_lock)
 		spin_unlock(&sdp->sd_ail_lock);
 		ret = generic_writepages(mapping, wbc);
 		spin_lock(&sdp->sd_ail_lock);
+		if (ret == -ENODATA) /* if a jdata write into a new hole */
+			ret = 0; /* ignore it */
 		if (ret || wbc->nr_to_write <= 0)
 			break;
 		return -EBUSY;
commit d3039c0615c3f80eaf735e581ed11242c0064299
Author: Bob Peterson <rpeterso at redhat.com>
Date:   Wed Nov 11 11:09:55 2020 -0600

    Revert "gfs2: Ignore journal log writes for jdata holes"
    
    This reverts commit b2a846dbef4ef54ef032f0f5ee188c609a0278a7.
    
    That commit changed the behavior of function gfs2_block_map to return
    -ENODATA in cases where a hole (IOMAP_HOLE) is encountered and create is
    false.  While that fixed the intended problem for jdata, it also broke
    other callers of gfs2_block_map such as some jdata block reads.  Before
    the patch, an encountered hole would be skipped and the buffer seen as
    unmapped by the caller.  The patch changed the behavior to return
    -ENODATA, which is interpreted as an error by the caller.
    
    The -ENODATA return code should be restricted to the specific case where
    jdata holes are encountered during ail1 writes.  That will be done in a
    later patch.
    
    Signed-off-by: Bob Peterson <rpeterso at redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 8dff9cbd0a87..62d9081d1e26 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -1301,12 +1301,8 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
 	trace_gfs2_bmap(ip, bh_map, lblock, create, 1);
 
 	ret = gfs2_iomap_get(inode, pos, length, flags, &iomap, &mp);
-	if (!ret && iomap.type == IOMAP_HOLE) {
-		if (create)
-			ret = gfs2_iomap_alloc(inode, &iomap, &mp);
-		else
-			ret = -ENODATA;
-	}
+	if (create && !ret && iomap.type == IOMAP_HOLE)
+		ret = gfs2_iomap_alloc(inode, &iomap, &mp);
 	release_metapath(&mp);
 	if (ret)
 		goto out;
commit b1e678bf290db5a76f1b6a9f7c381310e03440d6
Author: Christoph Hellwig <hch at lst.de>
Date:   Fri Nov 6 19:19:32 2020 +0100

    RMDA/sw: Don't allow drivers using dma_virt_ops on highmem configs
    
    dma_virt_ops requires that all pages have a kernel virtual address.
    Introduce a INFINIBAND_VIRT_DMA Kconfig symbol that depends on !HIGHMEM
    and make all three drivers depend on the new symbol.
    
    Also remove the ARCH_DMA_ADDR_T_64BIT dependency, which has been obsolete
    since commit 4965a68780c5 ("arch: define the ARCH_DMA_ADDR_T_64BIT config
    symbol in lib/Kconfig")
    
    Fixes: 551199aca1c3 ("lib/dma-virt: Add dma_virt_ops")
    Link: https://lore.kernel.org/r/20201106181941.1878556-2-hch@lst.de
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/Kconfig b/drivers/infiniband/Kconfig
index 32a51432ec4f..9325e189a215 100644
--- a/drivers/infiniband/Kconfig
+++ b/drivers/infiniband/Kconfig
@@ -73,6 +73,9 @@ config INFINIBAND_ADDR_TRANS_CONFIGFS
 	  This allows the user to config the default GID type that the CM
 	  uses for each device, when initiaing new connections.
 
+config INFINIBAND_VIRT_DMA
+	def_bool !HIGHMEM
+
 if INFINIBAND_USER_ACCESS || !INFINIBAND_USER_ACCESS
 source "drivers/infiniband/hw/mthca/Kconfig"
 source "drivers/infiniband/hw/qib/Kconfig"
diff --git a/drivers/infiniband/sw/rdmavt/Kconfig b/drivers/infiniband/sw/rdmavt/Kconfig
index 9ef5f5ce1ff6..c8e268082952 100644
--- a/drivers/infiniband/sw/rdmavt/Kconfig
+++ b/drivers/infiniband/sw/rdmavt/Kconfig
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config INFINIBAND_RDMAVT
 	tristate "RDMA verbs transport library"
-	depends on X86_64 && ARCH_DMA_ADDR_T_64BIT
+	depends on INFINIBAND_VIRT_DMA
+	depends on X86_64
 	depends on PCI
 	select DMA_VIRT_OPS
 	help
diff --git a/drivers/infiniband/sw/rxe/Kconfig b/drivers/infiniband/sw/rxe/Kconfig
index a0c6c7dfc181..8810bfa68049 100644
--- a/drivers/infiniband/sw/rxe/Kconfig
+++ b/drivers/infiniband/sw/rxe/Kconfig
@@ -2,7 +2,7 @@
 config RDMA_RXE
 	tristate "Software RDMA over Ethernet (RoCE) driver"
 	depends on INET && PCI && INFINIBAND
-	depends on !64BIT || ARCH_DMA_ADDR_T_64BIT
+	depends on INFINIBAND_VIRT_DMA
 	select NET_UDP_TUNNEL
 	select CRYPTO_CRC32
 	select DMA_VIRT_OPS
diff --git a/drivers/infiniband/sw/siw/Kconfig b/drivers/infiniband/sw/siw/Kconfig
index b622fc62f2cd..3450ba5081df 100644
--- a/drivers/infiniband/sw/siw/Kconfig
+++ b/drivers/infiniband/sw/siw/Kconfig
@@ -1,6 +1,7 @@
 config RDMA_SIW
 	tristate "Software RDMA over TCP/IP (iWARP) driver"
 	depends on INET && INFINIBAND && LIBCRC32C
+	depends on INFINIBAND_VIRT_DMA
 	select DMA_VIRT_OPS
 	help
 	This driver implements the iWARP RDMA transport over
commit fd63729cc0a6872bdabd393ee933a969642e4076
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Wed Nov 11 15:12:15 2020 -0800

    selftests/bpf: Fix unused attribute usage in subprogs_unused test
    
    Correct attribute name is "unused". maybe_unused is a C++17 addition.
    This patch fixes compilation warning during selftests compilation.
    
    Fixes: 197afc631413 ("libbpf: Don't attempt to load unused subprog as an entry-point BPF program")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201111231215.1779147-1-andrii@kernel.org

diff --git a/tools/testing/selftests/bpf/progs/test_subprogs_unused.c b/tools/testing/selftests/bpf/progs/test_subprogs_unused.c
index 75d975f8cf90..bc49e050d342 100644
--- a/tools/testing/selftests/bpf/progs/test_subprogs_unused.c
+++ b/tools/testing/selftests/bpf/progs/test_subprogs_unused.c
@@ -4,12 +4,12 @@
 
 const char LICENSE[] SEC("license") = "GPL";
 
-__attribute__((maybe_unused)) __noinline int unused1(int x)
+__attribute__((unused)) __noinline int unused1(int x)
 {
 	return x + 1;
 }
 
-static __attribute__((maybe_unused)) __noinline int unused2(int x)
+static __attribute__((unused)) __noinline int unused2(int x)
 {
 	return x + 2;
 }
commit d035c3f6cdb8e5d5a17adcbb79d7453417a6077d
Author: Qinglang Miao <miaoqinglang at huawei.com>
Date:   Wed Nov 11 11:22:02 2020 +0800

    RDMA/pvrdma: Fix missing kfree() in pvrdma_register_device()
    
    Fix missing kfree in pvrdma_register_device() when failure from
    ib_device_set_netdev().
    
    Fixes: 4b38da75e089 ("RDMA/drivers: Convert easy drivers to use ib_device_set_netdev()")
    Link: https://lore.kernel.org/r/20201111032202.17925-1-miaoqinglang@huawei.com
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Qinglang Miao <miaoqinglang at huawei.com>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
index fa2a3fa0c3e4..6895bac53990 100644
--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
+++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
@@ -266,7 +266,7 @@ static int pvrdma_register_device(struct pvrdma_dev *dev)
 	}
 	ret = ib_device_set_netdev(&dev->ib_dev, dev->netdev, 1);
 	if (ret)
-		return ret;
+		goto err_srq_free;
 	spin_lock_init(&dev->srq_tbl_lock);
 	rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group);
 
commit 8a5c2906c52f4a81939b4f8536e0004a4193a154
Merge: 9f73bd1c2c4c 5fb7f75bc138
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Thu Nov 12 08:47:22 2020 -0800

    Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
    
    Tony Nguyen says:
    
    ====================
    Intel Wired LAN Driver Updates 2020-11-10
    
    This series contains updates to i40e and igc drivers and the MAINTAINERS
    file.
    
    Slawomir fixes updating VF MAC addresses to fix various issues related
    to reporting and setting of these addresses for i40e.
    
    Dan Carpenter fixes a possible used before being initialized issue for
    i40e.
    
    Vinicius fixes reporting of netdev stats for igc.
    
    Tony updates repositories for Intel Ethernet Drivers.
    
    * '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue:
      MAINTAINERS: Update repositories for Intel Ethernet Drivers
      igc: Fix returning wrong statistics
      i40e, xsk: uninitialized variable in i40e_clean_rx_irq_zc()
      i40e: Fix MAC address setting for a VF via Host/VM
    ====================
    
    Link: https://lore.kernel.org/r/20201111001955.533210-1-anthony.l.nguyen@intel.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit eb73060b971aa04e4f7421b8c9c0363918608b72
Author: Jason Gunthorpe <jgg at nvidia.com>
Date:   Wed Nov 4 17:40:59 2020 -0400

    RDMA/cm: Make the local_id_table xarray non-irq
    
    The xarray is never mutated from an IRQ handler, only from work queues
    under a spinlock_irq. Thus there is no reason for it be an IRQ type
    xarray.
    
    This was copied over from the original IDR code, but the recent rework put
    the xarray inside another spinlock_irq which will unbalance the unlocking.
    
    Fixes: c206f8bad15d ("RDMA/cm: Make it clearer how concurrency works in cm_req_handler()")
    Link: https://lore.kernel.org/r/0-v1-808b6da3bd3f+1857-cm_xarray_no_irq_jgg@nvidia.com
    Reported-by: Matthew Wilcox <willy at infradead.org>
    Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>

diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 5740d1ba3568..012156624b82 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -859,8 +859,8 @@ static struct cm_id_private *cm_alloc_id_priv(struct ib_device *device,
 	atomic_set(&cm_id_priv->work_count, -1);
 	refcount_set(&cm_id_priv->refcount, 1);
 
-	ret = xa_alloc_cyclic_irq(&cm.local_id_table, &id, NULL, xa_limit_32b,
-				  &cm.local_id_next, GFP_KERNEL);
+	ret = xa_alloc_cyclic(&cm.local_id_table, &id, NULL, xa_limit_32b,
+			      &cm.local_id_next, GFP_KERNEL);
 	if (ret < 0)
 		goto error;
 	cm_id_priv->id.local_id = (__force __be32)id ^ cm.random_id_operand;
@@ -878,8 +878,8 @@ error:
  */
 static void cm_finalize_id(struct cm_id_private *cm_id_priv)
 {
-	xa_store_irq(&cm.local_id_table, cm_local_id(cm_id_priv->id.local_id),
-		     cm_id_priv, GFP_KERNEL);
+	xa_store(&cm.local_id_table, cm_local_id(cm_id_priv->id.local_id),
+		 cm_id_priv, GFP_ATOMIC);
 }
 
 struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
@@ -1169,7 +1169,7 @@ retest:
 	spin_unlock(&cm.lock);
 	spin_unlock_irq(&cm_id_priv->lock);
 
-	xa_erase_irq(&cm.local_id_table, cm_local_id(cm_id->local_id));
+	xa_erase(&cm.local_id_table, cm_local_id(cm_id->local_id));
 	cm_deref_id(cm_id_priv);
 	wait_for_completion(&cm_id_priv->comp);
 	while ((work = cm_dequeue_work(cm_id_priv)) != NULL)
@@ -4482,7 +4482,7 @@ static int __init ib_cm_init(void)
 	cm.remote_id_table = RB_ROOT;
 	cm.remote_qp_table = RB_ROOT;
 	cm.remote_sidr_table = RB_ROOT;
-	xa_init_flags(&cm.local_id_table, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
+	xa_init_flags(&cm.local_id_table, XA_FLAGS_ALLOC);
 	get_random_bytes(&cm.random_id_operand, sizeof cm.random_id_operand);
 	INIT_LIST_HEAD(&cm.timewait_list);
 
commit 9f73bd1c2c4c304b238051fc92b3f807326f0a89
Author: Parav Pandit <parav at nvidia.com>
Date:   Wed Nov 11 05:47:44 2020 +0200

    devlink: Avoid overwriting port attributes of registered port
    
    Cited commit in fixes tag overwrites the port attributes for the
    registered port.
    
    Avoid such error by checking registered flag before setting attributes.
    
    Fixes: 71ad8d55f8e5 ("devlink: Replace devlink_port_attrs_set parameters with a struct")
    Signed-off-by: Parav Pandit <parav at nvidia.com>
    Reviewed-by: Jiri Pirko <jiri at nvidia.com>
    Link: https://lore.kernel.org/r/20201111034744.35554-1-parav@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/core/devlink.c b/net/core/devlink.c
index a932d95be798..ab4b1368904f 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -8254,8 +8254,6 @@ static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
 {
 	struct devlink_port_attrs *attrs = &devlink_port->attrs;
 
-	if (WARN_ON(devlink_port->registered))
-		return -EEXIST;
 	devlink_port->attrs_set = true;
 	attrs->flavour = flavour;
 	if (attrs->switch_id.id_len) {
@@ -8279,6 +8277,8 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
 {
 	int ret;
 
+	if (WARN_ON(devlink_port->registered))
+		return;
 	devlink_port->attrs = *attrs;
 	ret = __devlink_port_attrs_set(devlink_port, attrs->flavour);
 	if (ret)
@@ -8301,6 +8301,8 @@ void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 contro
 	struct devlink_port_attrs *attrs = &devlink_port->attrs;
 	int ret;
 
+	if (WARN_ON(devlink_port->registered))
+		return;
 	ret = __devlink_port_attrs_set(devlink_port,
 				       DEVLINK_PORT_FLAVOUR_PCI_PF);
 	if (ret)
@@ -8326,6 +8328,8 @@ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 contro
 	struct devlink_port_attrs *attrs = &devlink_port->attrs;
 	int ret;
 
+	if (WARN_ON(devlink_port->registered))
+		return;
 	ret = __devlink_port_attrs_set(devlink_port,
 				       DEVLINK_PORT_FLAVOUR_PCI_VF);
 	if (ret)
commit 9e2b7fa2df4365e99934901da4fb4af52d81e820
Author: Martin Willi <martin at strongswan.org>
Date:   Fri Nov 6 08:30:30 2020 +0100

    vrf: Fix fast path output packet handling with async Netfilter rules
    
    VRF devices use an optimized direct path on output if a default qdisc
    is involved, calling Netfilter hooks directly. This path, however, does
    not consider Netfilter rules completing asynchronously, such as with
    NFQUEUE. The Netfilter okfn() is called for asynchronously accepted
    packets, but the VRF never passes that packet down the stack to send
    it out over the slave device. Using the slower redirect path for this
    seems not feasible, as we do not know beforehand if a Netfilter hook
    has asynchronously completing rules.
    
    Fix the use of asynchronously completing Netfilter rules in OUTPUT and
    POSTROUTING by using a special completion function that additionally
    calls dst_output() to pass the packet down the stack. Also, slightly
    adjust the use of nf_reset_ct() so that is called in the asynchronous
    case, too.
    
    Fixes: dcdd43c41e60 ("net: vrf: performance improvements for IPv4")
    Fixes: a9ec54d1b0cd ("net: vrf: performance improvements for IPv6")
    Signed-off-by: Martin Willi <martin at strongswan.org>
    Link: https://lore.kernel.org/r/20201106073030.3974927-1-martin@strongswan.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 60c1aadece89..f2793ffde191 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -608,8 +608,7 @@ static netdev_tx_t vrf_xmit(struct sk_buff *skb, struct net_device *dev)
 	return ret;
 }
 
-static int vrf_finish_direct(struct net *net, struct sock *sk,
-			     struct sk_buff *skb)
+static void vrf_finish_direct(struct sk_buff *skb)
 {
 	struct net_device *vrf_dev = skb->dev;
 
@@ -628,7 +627,8 @@ static int vrf_finish_direct(struct net *net, struct sock *sk,
 		skb_pull(skb, ETH_HLEN);
 	}
 
-	return 1;
+	/* reset skb device */
+	nf_reset_ct(skb);
 }
 
 #if IS_ENABLED(CONFIG_IPV6)
@@ -707,15 +707,41 @@ static struct sk_buff *vrf_ip6_out_redirect(struct net_device *vrf_dev,
 	return skb;
 }
 
+static int vrf_output6_direct_finish(struct net *net, struct sock *sk,
+				     struct sk_buff *skb)
+{
+	vrf_finish_direct(skb);
+
+	return vrf_ip6_local_out(net, sk, skb);
+}
+
 static int vrf_output6_direct(struct net *net, struct sock *sk,
 			      struct sk_buff *skb)
 {
+	int err = 1;
+
 	skb->protocol = htons(ETH_P_IPV6);
 
-	return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING,
-			    net, sk, skb, NULL, skb->dev,
-			    vrf_finish_direct,
-			    !(IPCB(skb)->flags & IPSKB_REROUTED));
+	if (!(IPCB(skb)->flags & IPSKB_REROUTED))
+		err = nf_hook(NFPROTO_IPV6, NF_INET_POST_ROUTING, net, sk, skb,
+			      NULL, skb->dev, vrf_output6_direct_finish);
+
+	if (likely(err == 1))
+		vrf_finish_direct(skb);
+
+	return err;
+}
+
+static int vrf_ip6_out_direct_finish(struct net *net, struct sock *sk,
+				     struct sk_buff *skb)
+{
+	int err;
+
+	err = vrf_output6_direct(net, sk, skb);
+	if (likely(err == 1))
+		err = vrf_ip6_local_out(net, sk, skb);
+
+	return err;
 }
 
 static struct sk_buff *vrf_ip6_out_direct(struct net_device *vrf_dev,
@@ -728,18 +754,15 @@ static struct sk_buff *vrf_ip6_out_direct(struct net_device *vrf_dev,
 	skb->dev = vrf_dev;
 
 	err = nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, sk,
-		      skb, NULL, vrf_dev, vrf_output6_direct);
+		      skb, NULL, vrf_dev, vrf_ip6_out_direct_finish);
 
 	if (likely(err == 1))
 		err = vrf_output6_direct(net, sk, skb);
 
-	/* reset skb device */
 	if (likely(err == 1))
-		nf_reset_ct(skb);
-	else
-		skb = NULL;
+		return skb;
 
-	return skb;
+	return NULL;
 }
 
 static struct sk_buff *vrf_ip6_out(struct net_device *vrf_dev,
@@ -919,15 +942,41 @@ static struct sk_buff *vrf_ip_out_redirect(struct net_device *vrf_dev,
 	return skb;
 }
 
+static int vrf_output_direct_finish(struct net *net, struct sock *sk,
+				    struct sk_buff *skb)
+{
+	vrf_finish_direct(skb);
+
+	return vrf_ip_local_out(net, sk, skb);
+}
+
 static int vrf_output_direct(struct net *net, struct sock *sk,
 			     struct sk_buff *skb)
 {
+	int err = 1;
+
 	skb->protocol = htons(ETH_P_IP);
 
-	return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING,
-			    net, sk, skb, NULL, skb->dev,
-			    vrf_finish_direct,
-			    !(IPCB(skb)->flags & IPSKB_REROUTED));
+	if (!(IPCB(skb)->flags & IPSKB_REROUTED))
+		err = nf_hook(NFPROTO_IPV4, NF_INET_POST_ROUTING, net, sk, skb,
+			      NULL, skb->dev, vrf_output_direct_finish);
+
+	if (likely(err == 1))
+		vrf_finish_direct(skb);
+
+	return err;
+}
+
+static int vrf_ip_out_direct_finish(struct net *net, struct sock *sk,
+				    struct sk_buff *skb)
+{
+	int err;
+
+	err = vrf_output_direct(net, sk, skb);
+	if (likely(err == 1))
+		err = vrf_ip_local_out(net, sk, skb);
+
+	return err;
 }
 
 static struct sk_buff *vrf_ip_out_direct(struct net_device *vrf_dev,
@@ -940,18 +989,15 @@ static struct sk_buff *vrf_ip_out_direct(struct net_device *vrf_dev,
 	skb->dev = vrf_dev;
 
 	err = nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, net, sk,
-		      skb, NULL, vrf_dev, vrf_output_direct);
+		      skb, NULL, vrf_dev, vrf_ip_out_direct_finish);
 
 	if (likely(err == 1))
 		err = vrf_output_direct(net, sk, skb);
 
-	/* reset skb device */
 	if (likely(err == 1))
-		nf_reset_ct(skb);
-	else
-		skb = NULL;
+		return skb;
 
-	return skb;
+	return NULL;
 }
 
 static struct sk_buff *vrf_ip_out(struct net_device *vrf_dev,
commit 11decaf8127b035242cb55de2fc6946f8961f671
Author: Trond Myklebust <trond.myklebust at hammerspace.com>
Date:   Fri Oct 30 17:57:30 2020 -0400

    NFS: Remove unnecessary inode lock in nfs_fsync_dir()
    
    nfs_inc_stats() is already thread-safe, and there are no other reasons
    to hold the inode lock here.
    
    Signed-off-by: Trond Myklebust <trond.myklebust at hammerspace.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index e56b1bd99537..4e011adaf967 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -997,13 +997,9 @@ static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
 static int nfs_fsync_dir(struct file *filp, loff_t start, loff_t end,
 			 int datasync)
 {
-	struct inode *inode = file_inode(filp);
-
 	dfprintk(FILE, "NFS: fsync dir(%pD2) datasync %d\n", filp, datasync);
 
-	inode_lock(inode);
-	nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
-	inode_unlock(inode);
+	nfs_inc_stats(file_inode(filp), NFSIOS_VFSFSYNC);
 	return 0;
 }
 
commit 83f2c45e63935a325f73bde98b1609e0976a12e0
Author: Trond Myklebust <trond.myklebust at hammerspace.com>
Date:   Fri Oct 30 17:57:29 2020 -0400

    NFS: Remove unnecessary inode locking in nfs_llseek_dir()
    
    Remove the contentious inode lock, and instead provide thread safety
    using the file->f_lock spinlock.
    
    Signed-off-by: Trond Myklebust <trond.myklebust at hammerspace.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index cb52db9a0cfb..e56b1bd99537 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -955,7 +955,6 @@ out:
 
 static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
 {
-	struct inode *inode = file_inode(filp);
 	struct nfs_open_dir_context *dir_ctx = filp->private_data;
 
 	dfprintk(FILE, "NFS: llseek dir(%pD2, %lld, %d)\n",
@@ -967,15 +966,15 @@ static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
 	case SEEK_SET:
 		if (offset < 0)
 			return -EINVAL;
-		inode_lock(inode);
+		spin_lock(&filp->f_lock);
 		break;
 	case SEEK_CUR:
 		if (offset == 0)
 			return filp->f_pos;
-		inode_lock(inode);
+		spin_lock(&filp->f_lock);
 		offset += filp->f_pos;
 		if (offset < 0) {
-			inode_unlock(inode);
+			spin_unlock(&filp->f_lock);
 			return -EINVAL;
 		}
 	}
@@ -987,7 +986,7 @@ static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
 			dir_ctx->dir_cookie = 0;
 		dir_ctx->duped = 0;
 	}
-	inode_unlock(inode);
+	spin_unlock(&filp->f_lock);
 	return offset;
 }
 
commit 6c2190b3fcbc92cb79e39cc7e7531656b341e463
Author: Chuck Lever <chuck.lever at oracle.com>
Date:   Sat Oct 31 12:44:25 2020 -0400

    NFS: Fix listxattr receive buffer size
    
    Certain NFSv4.2/RDMA tests fail with v5.9-rc1.
    
    rpcrdma_convert_kvec() runs off the end of the rl_segments array
    because rq_rcv_buf.tail[0].iov_len holds a very large positive
    value. The resultant kernel memory corruption is enough to crash
    the client system.
    
    Callers of rpc_prepare_reply_pages() must reserve an extra XDR_UNIT
    in the maximum decode size for a possible XDR pad of the contents
    of the xdr_buf's pages. That guarantees the allocated receive buffer
    will be large enough to accommodate the usual contents plus that XDR
    pad word.
    
    encode_op_hdr() cannot add that extra word. If it does,
    xdr_inline_pages() underruns the length of the tail iovec.
    
    Fixes: 3e1f02123fba ("NFSv4.2: add client side XDR handling for extended attributes")
    Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c
index 0dc31ad2362e..6e060a88f98c 100644
--- a/fs/nfs/nfs42xdr.c
+++ b/fs/nfs/nfs42xdr.c
@@ -196,7 +196,7 @@
 				 1 + nfs4_xattr_name_maxsz + 1)
 #define decode_setxattr_maxsz   (op_decode_hdr_maxsz + decode_change_info_maxsz)
 #define encode_listxattrs_maxsz  (op_encode_hdr_maxsz + 2 + 1)
-#define decode_listxattrs_maxsz  (op_decode_hdr_maxsz + 2 + 1 + 1)
+#define decode_listxattrs_maxsz  (op_decode_hdr_maxsz + 2 + 1 + 1 + 1)
 #define encode_removexattr_maxsz (op_encode_hdr_maxsz + 1 + \
 				  nfs4_xattr_name_maxsz)
 #define decode_removexattr_maxsz (op_decode_hdr_maxsz + \
@@ -531,7 +531,7 @@ static void encode_listxattrs(struct xdr_stream *xdr,
 {
 	__be32 *p;
 
-	encode_op_hdr(xdr, OP_LISTXATTRS, decode_listxattrs_maxsz + 1, hdr);
+	encode_op_hdr(xdr, OP_LISTXATTRS, decode_listxattrs_maxsz, hdr);
 
 	p = reserve_space(xdr, 12);
 	if (unlikely(!p))
commit 70438afbf17e5194dd607dd17759560a363b7bb4
Author: J. Bruce Fields <bfields at redhat.com>
Date:   Wed Oct 21 10:34:15 2020 -0400

    NFSv4.2: fix failure to unregister shrinker
    
    We forgot to unregister the nfs4_xattr_large_entry_shrinker.
    
    That leaves the global list of shrinkers corrupted after unload of the
    nfs module, after which possibly unrelated code that calls
    register_shrinker() or unregister_shrinker() gets a BUG() with
    "supervisor write access in kernel mode".
    
    And similarly for the nfs4_xattr_large_entry_lru.
    
    Reported-by: Kris Karas <bugs-a17 at moonlit-rail.com>
    Tested-By: Kris Karas <bugs-a17 at moonlit-rail.com>
    Fixes: 95ad37f90c33 "NFSv4.2: add client side xattr caching."
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>
    CC: stable at vger.kernel.org
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/nfs42xattr.c b/fs/nfs/nfs42xattr.c
index b51424ff8159..6c2ce799150f 100644
--- a/fs/nfs/nfs42xattr.c
+++ b/fs/nfs/nfs42xattr.c
@@ -1047,8 +1047,10 @@ out4:
 
 void nfs4_xattr_cache_exit(void)
 {
+	unregister_shrinker(&nfs4_xattr_large_entry_shrinker);
 	unregister_shrinker(&nfs4_xattr_entry_shrinker);
 	unregister_shrinker(&nfs4_xattr_cache_shrinker);
+	list_lru_destroy(&nfs4_xattr_large_entry_lru);
 	list_lru_destroy(&nfs4_xattr_entry_lru);
 	list_lru_destroy(&nfs4_xattr_cache_lru);
 	kmem_cache_destroy(nfs4_xattr_cache_cachep);
commit 7222a8a52c9ec59affc4d6c4e2632b3e4a44cd27
Merge: 8d936bb13ce7 c1e9735975c0 9debfb81e765 7daaa06357bf 38748bcb940e
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Thu Nov 12 16:11:48 2020 +0100

    Merge branches 'acpi-scan', 'acpi-misc', 'acpi-button' and 'acpi-dptf'
    
    * acpi-scan:
      ACPI: scan: Fix acpi_dma_configure_id() kerneldoc name
    
    * acpi-misc:
      ACPI: GED: fix -Wformat
      ACPI: Fix whitespace inconsistencies
    
    * acpi-button:
      ACPI: button: Add DMI quirk for Medion Akoya E2228T
    
    * acpi-dptf:
      ACPI: DPTF: Support Alder Lake

commit 63c5395bb7a9777a33f0e7b5906f2c0170a23692
Author: Lukas Wunner <lukas at wunner.de>
Date:   Wed Nov 11 20:07:40 2020 +0100

    spi: bcm-qspi: Fix use-after-free on unbind
    
    bcm_qspi_remove() calls spi_unregister_master() even though
    bcm_qspi_probe() calls devm_spi_register_master().  The spi_master is
    therefore unregistered and freed twice on unbind.
    
    Moreover, since commit 0392727c261b ("spi: bcm-qspi: Handle clock probe
    deferral"), bcm_qspi_probe() leaks the spi_master allocation if the call
    to devm_clk_get_optional() fails.
    
    Fix by switching over to the new devm_spi_alloc_master() helper which
    keeps the private data accessible until the driver has unbound and also
    avoids the spi_master leak on probe.
    
    While at it, fix an ordering issue in bcm_qspi_remove() wherein
    spi_unregister_master() is called after uninitializing the hardware,
    disabling the clock and freeing an IRQ data structure.  The correct
    order is to call spi_unregister_master() *before* those teardown steps
    because bus accesses may still be ongoing until that function returns.
    
    Fixes: fa236a7ef240 ("spi: bcm-qspi: Add Broadcom MSPI driver")
    Signed-off-by: Lukas Wunner <lukas at wunner.de>
    Cc: <stable at vger.kernel.org> # v4.9+: 123456789abc: spi: Introduce device-managed SPI controller allocation
    Cc: <stable at vger.kernel.org> # v4.9+
    Cc: Kamal Dasu <kdasu.kdev at gmail.com>
    Acked-by: Florian Fainelli <f.fainelli at gmail.com>
    Tested-by: Florian Fainelli <f.fainelli at gmail.com>
    Link: https://lore.kernel.org/r/5e31a9a59fd1c0d0b795b2fe219f25e5ee855f9d.1605121038.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c
index 14c9d0133bce..c028446c7460 100644
--- a/drivers/spi/spi-bcm-qspi.c
+++ b/drivers/spi/spi-bcm-qspi.c
@@ -1327,7 +1327,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
 
 	data = of_id->data;
 
-	master = spi_alloc_master(dev, sizeof(struct bcm_qspi));
+	master = devm_spi_alloc_master(dev, sizeof(struct bcm_qspi));
 	if (!master) {
 		dev_err(dev, "error allocating spi_master\n");
 		return -ENOMEM;
@@ -1367,21 +1367,17 @@ int bcm_qspi_probe(struct platform_device *pdev,
 
 	if (res) {
 		qspi->base[MSPI]  = devm_ioremap_resource(dev, res);
-		if (IS_ERR(qspi->base[MSPI])) {
-			ret = PTR_ERR(qspi->base[MSPI]);
-			goto qspi_resource_err;
-		}
+		if (IS_ERR(qspi->base[MSPI]))
+			return PTR_ERR(qspi->base[MSPI]);
 	} else {
-		goto qspi_resource_err;
+		return 0;
 	}
 
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi");
 	if (res) {
 		qspi->base[BSPI]  = devm_ioremap_resource(dev, res);
-		if (IS_ERR(qspi->base[BSPI])) {
-			ret = PTR_ERR(qspi->base[BSPI]);
-			goto qspi_resource_err;
-		}
+		if (IS_ERR(qspi->base[BSPI]))
+			return PTR_ERR(qspi->base[BSPI]);
 		qspi->bspi_mode = true;
 	} else {
 		qspi->bspi_mode = false;
@@ -1392,18 +1388,14 @@ int bcm_qspi_probe(struct platform_device *pdev,
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg");
 	if (res) {
 		qspi->base[CHIP_SELECT]  = devm_ioremap_resource(dev, res);
-		if (IS_ERR(qspi->base[CHIP_SELECT])) {
-			ret = PTR_ERR(qspi->base[CHIP_SELECT]);
-			goto qspi_resource_err;
-		}
+		if (IS_ERR(qspi->base[CHIP_SELECT]))
+			return PTR_ERR(qspi->base[CHIP_SELECT]);
 	}
 
 	qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id),
 				GFP_KERNEL);
-	if (!qspi->dev_ids) {
-		ret = -ENOMEM;
-		goto qspi_resource_err;
-	}
+	if (!qspi->dev_ids)
+		return -ENOMEM;
 
 	for (val = 0; val < num_irqs; val++) {
 		irq = -1;
@@ -1484,7 +1476,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
 	qspi->xfer_mode.addrlen = -1;
 	qspi->xfer_mode.hp = -1;
 
-	ret = devm_spi_register_master(&pdev->dev, master);
+	ret = spi_register_master(master);
 	if (ret < 0) {
 		dev_err(dev, "can't register master\n");
 		goto qspi_reg_err;
@@ -1497,8 +1489,6 @@ qspi_reg_err:
 	clk_disable_unprepare(qspi->clk);
 qspi_probe_err:
 	kfree(qspi->dev_ids);
-qspi_resource_err:
-	spi_master_put(master);
 	return ret;
 }
 /* probe function to be called by SoC specific platform driver probe */
@@ -1508,10 +1498,10 @@ int bcm_qspi_remove(struct platform_device *pdev)
 {
 	struct bcm_qspi *qspi = platform_get_drvdata(pdev);
 
+	spi_unregister_master(qspi->master);
 	bcm_qspi_hw_uninit(qspi);
 	clk_disable_unprepare(qspi->clk);
 	kfree(qspi->dev_ids);
-	spi_unregister_master(qspi->master);
 
 	return 0;
 }
commit e13ee6cc4781edaf8c7321bee19217e3702ed481
Author: Lukas Wunner <lukas at wunner.de>
Date:   Wed Nov 11 20:07:30 2020 +0100

    spi: bcm2835aux: Fix use-after-free on unbind
    
    bcm2835aux_spi_remove() accesses the driver's private data after calling
    spi_unregister_master() even though that function releases the last
    reference on the spi_master and thereby frees the private data.
    
    Fix by switching over to the new devm_spi_alloc_master() helper which
    keeps the private data accessible until the driver has unbound.
    
    Fixes: b9dd3f6d4172 ("spi: bcm2835aux: Fix controller unregister order")
    Signed-off-by: Lukas Wunner <lukas at wunner.de>
    Cc: <stable at vger.kernel.org> # v4.4+: 123456789abc: spi: Introduce device-managed SPI controller allocation
    Cc: <stable at vger.kernel.org> # v4.4+: b9dd3f6d4172: spi: bcm2835aux: Fix controller unregister order
    Cc: <stable at vger.kernel.org> # v4.4+
    Link: https://lore.kernel.org/r/b290b06357d0c0bdee9cecc539b840a90630f101.1605121038.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c
index 03b034c15d2b..fd58547110e6 100644
--- a/drivers/spi/spi-bcm2835aux.c
+++ b/drivers/spi/spi-bcm2835aux.c
@@ -494,7 +494,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
 	unsigned long clk_hz;
 	int err;
 
-	master = spi_alloc_master(&pdev->dev, sizeof(*bs));
+	master = devm_spi_alloc_master(&pdev->dev, sizeof(*bs));
 	if (!master)
 		return -ENOMEM;
 
@@ -524,29 +524,24 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
 
 	/* the main area */
 	bs->regs = devm_platform_ioremap_resource(pdev, 0);
-	if (IS_ERR(bs->regs)) {
-		err = PTR_ERR(bs->regs);
-		goto out_master_put;
-	}
+	if (IS_ERR(bs->regs))
+		return PTR_ERR(bs->regs);
 
 	bs->clk = devm_clk_get(&pdev->dev, NULL);
 	if (IS_ERR(bs->clk)) {
-		err = PTR_ERR(bs->clk);
 		dev_err(&pdev->dev, "could not get clk: %d\n", err);
-		goto out_master_put;
+		return PTR_ERR(bs->clk);
 	}
 
 	bs->irq = platform_get_irq(pdev, 0);
-	if (bs->irq <= 0) {
-		err = bs->irq ? bs->irq : -ENODEV;
-		goto out_master_put;
-	}
+	if (bs->irq <= 0)
+		return bs->irq ? bs->irq : -ENODEV;
 
 	/* this also enables the HW block */
 	err = clk_prepare_enable(bs->clk);
 	if (err) {
 		dev_err(&pdev->dev, "could not prepare clock: %d\n", err);
-		goto out_master_put;
+		return err;
 	}
 
 	/* just checking if the clock returns a sane value */
@@ -581,8 +576,6 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
 
 out_clk_disable:
 	clk_disable_unprepare(bs->clk);
-out_master_put:
-	spi_master_put(master);
 	return err;
 }
 
commit e1483ac030fb4c57734289742f1c1d38dca61e22
Author: Lukas Wunner <lukas at wunner.de>
Date:   Wed Nov 11 20:07:20 2020 +0100

    spi: bcm2835: Fix use-after-free on unbind
    
    bcm2835_spi_remove() accesses the driver's private data after calling
    spi_unregister_controller() even though that function releases the last
    reference on the spi_controller and thereby frees the private data.
    
    Fix by switching over to the new devm_spi_alloc_master() helper which
    keeps the private data accessible until the driver has unbound.
    
    Fixes: f8043872e796 ("spi: add driver for BCM2835")
    Reported-by: Sascha Hauer <s.hauer at pengutronix.de>
    Reported-by: Florian Fainelli <f.fainelli at gmail.com>
    Signed-off-by: Lukas Wunner <lukas at wunner.de>
    Cc: <stable at vger.kernel.org> # v3.10+: 123456789abc: spi: Introduce device-managed SPI controller allocation
    Cc: <stable at vger.kernel.org> # v3.10+
    Cc: Vladimir Oltean <olteanv at gmail.com>
    Tested-by: Florian Fainelli <f.fainelli at gmail.com>
    Acked-by: Florian Fainelli <f.fainelli at gmail.com>
    Link: https://lore.kernel.org/r/ad66e0a0ad96feb848814842ecf5b6a4539ef35c.1605121038.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c
index 7104cf17b848..197485f2c2b2 100644
--- a/drivers/spi/spi-bcm2835.c
+++ b/drivers/spi/spi-bcm2835.c
@@ -1278,7 +1278,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
 	struct bcm2835_spi *bs;
 	int err;
 
-	ctlr = spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs),
+	ctlr = devm_spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs),
 						  dma_get_cache_alignment()));
 	if (!ctlr)
 		return -ENOMEM;
@@ -1299,23 +1299,17 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
 	bs->ctlr = ctlr;
 
 	bs->regs = devm_platform_ioremap_resource(pdev, 0);
-	if (IS_ERR(bs->regs)) {
-		err = PTR_ERR(bs->regs);
-		goto out_controller_put;
-	}
+	if (IS_ERR(bs->regs))
+		return PTR_ERR(bs->regs);
 
 	bs->clk = devm_clk_get(&pdev->dev, NULL);
-	if (IS_ERR(bs->clk)) {
-		err = dev_err_probe(&pdev->dev, PTR_ERR(bs->clk),
-				    "could not get clk\n");
-		goto out_controller_put;
-	}
+	if (IS_ERR(bs->clk))
+		return dev_err_probe(&pdev->dev, PTR_ERR(bs->clk),
+				     "could not get clk\n");
 
 	bs->irq = platform_get_irq(pdev, 0);
-	if (bs->irq <= 0) {
-		err = bs->irq ? bs->irq : -ENODEV;
-		goto out_controller_put;
-	}
+	if (bs->irq <= 0)
+		return bs->irq ? bs->irq : -ENODEV;
 
 	clk_prepare_enable(bs->clk);
 
@@ -1349,8 +1343,6 @@ out_dma_release:
 	bcm2835_dma_release(ctlr, bs);
 out_clk_disable:
 	clk_disable_unprepare(bs->clk);
-out_controller_put:
-	spi_controller_put(ctlr);
 	return err;
 }
 
commit 5e844cc37a5cbaa460e68f9a989d321d63088a89
Author: Lukas Wunner <lukas at wunner.de>
Date:   Wed Nov 11 20:07:10 2020 +0100

    spi: Introduce device-managed SPI controller allocation
    
    SPI driver probing currently comprises two steps, whereas removal
    comprises only one step:
    
        spi_alloc_master()
        spi_register_controller()
    
        spi_unregister_controller()
    
    That's because spi_unregister_controller() calls device_unregister()
    instead of device_del(), thereby releasing the reference on the
    spi_controller which was obtained by spi_alloc_master().
    
    An SPI driver's private data is contained in the same memory allocation
    as the spi_controller struct.  Thus, once spi_unregister_controller()
    has been called, the private data is inaccessible.  But some drivers
    need to access it after spi_unregister_controller() to perform further
    teardown steps.
    
    Introduce devm_spi_alloc_master() and devm_spi_alloc_slave(), which
    release a reference on the spi_controller struct only after the driver
    has unbound, thereby keeping the memory allocation accessible.  Change
    spi_unregister_controller() to not release a reference if the
    spi_controller was allocated by one of these new devm functions.
    
    The present commit is small enough to be backportable to stable.
    It allows fixing drivers which use the private data in their ->remove()
    hook after it's been freed.  It also allows fixing drivers which neglect
    to release a reference on the spi_controller in the probe error path.
    
    Long-term, most SPI drivers shall be moved over to the devm functions
    introduced herein.  The few that can't shall be changed in a treewide
    commit to explicitly release the last reference on the controller.
    That commit shall amend spi_unregister_controller() to no longer release
    a reference, thereby completing the migration.
    
    As a result, the behaviour will be less surprising and more consistent
    with subsystems such as IIO, which also includes the private data in the
    allocation of the generic iio_dev struct, but calls device_del() in
    iio_device_unregister().
    
    Signed-off-by: Lukas Wunner <lukas at wunner.de>
    Link: https://lore.kernel.org/r/272bae2ef08abd21388c98e23729886663d19192.1605121038.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 7566482c052c..05c75f890ace 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -2442,6 +2442,49 @@ struct spi_controller *__spi_alloc_controller(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(__spi_alloc_controller);
 
+static void devm_spi_release_controller(struct device *dev, void *ctlr)
+{
+	spi_controller_put(*(struct spi_controller **)ctlr);
+}
+
+/**
+ * __devm_spi_alloc_controller - resource-managed __spi_alloc_controller()
+ * @dev: physical device of SPI controller
+ * @size: how much zeroed driver-private data to allocate
+ * @slave: whether to allocate an SPI master (false) or SPI slave (true)
+ * Context: can sleep
+ *
+ * Allocate an SPI controller and automatically release a reference on it
+ * when @dev is unbound from its driver.  Drivers are thus relieved from
+ * having to call spi_controller_put().
+ *
+ * The arguments to this function are identical to __spi_alloc_controller().
+ *
+ * Return: the SPI controller structure on success, else NULL.
+ */
+struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
+						   unsigned int size,
+						   bool slave)
+{
+	struct spi_controller **ptr, *ctlr;
+
+	ptr = devres_alloc(devm_spi_release_controller, sizeof(*ptr),
+			   GFP_KERNEL);
+	if (!ptr)
+		return NULL;
+
+	ctlr = __spi_alloc_controller(dev, size, slave);
+	if (ctlr) {
+		*ptr = ctlr;
+		devres_add(dev, ptr);
+	} else {
+		devres_free(ptr);
+	}
+
+	return ctlr;
+}
+EXPORT_SYMBOL_GPL(__devm_spi_alloc_controller);
+
 #ifdef CONFIG_OF
 static int of_spi_get_gpio_numbers(struct spi_controller *ctlr)
 {
@@ -2778,6 +2821,11 @@ int devm_spi_register_controller(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_spi_register_controller);
 
+static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
+{
+	return *(struct spi_controller **)res == ctlr;
+}
+
 static int __unregister(struct device *dev, void *null)
 {
 	spi_unregister_device(to_spi_device(dev));
@@ -2819,7 +2867,15 @@ void spi_unregister_controller(struct spi_controller *ctlr)
 	list_del(&ctlr->list);
 	mutex_unlock(&board_lock);
 
-	device_unregister(&ctlr->dev);
+	device_del(&ctlr->dev);
+
+	/* Release the last reference on the controller if its driver
+	 * has not yet been converted to devm_spi_alloc_master/slave().
+	 */
+	if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
+			 devm_spi_match_controller, ctlr))
+		put_device(&ctlr->dev);
+
 	/* free bus id */
 	mutex_lock(&board_lock);
 	if (found == ctlr)
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 99380c0825db..b390fdac1587 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -734,6 +734,25 @@ static inline struct spi_controller *spi_alloc_slave(struct device *host,
 	return __spi_alloc_controller(host, size, true);
 }
 
+struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
+						   unsigned int size,
+						   bool slave);
+
+static inline struct spi_controller *devm_spi_alloc_master(struct device *dev,
+							   unsigned int size)
+{
+	return __devm_spi_alloc_controller(dev, size, false);
+}
+
+static inline struct spi_controller *devm_spi_alloc_slave(struct device *dev,
+							  unsigned int size)
+{
+	if (!IS_ENABLED(CONFIG_SPI_SLAVE))
+		return NULL;
+
+	return __devm_spi_alloc_controller(dev, size, true);
+}
+
 extern int spi_register_controller(struct spi_controller *ctlr);
 extern int devm_spi_register_controller(struct device *dev,
 					struct spi_controller *ctlr);
commit 7940fb035abd88040d56be209962feffa33b03d0
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Nov 2 14:36:58 2020 +0100

    HID: Add Logitech Dinovo Edge battery quirk
    
    The battery status is also being reported by the logitech-hidpp driver,
    so ignore the standard HID battery status to avoid reporting the same
    info twice.
    
    Note the logitech-hidpp battery driver provides more info, such as properly
    differentiating between charging and discharging. Also the standard HID
    battery info seems to be wrong, reporting a capacity of just 26% after
    fully charging the device.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index af361cd04bf0..f170feaac40b 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -750,6 +750,7 @@
 #define USB_VENDOR_ID_LOGITECH		0x046d
 #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e
 #define USB_DEVICE_ID_LOGITECH_T651	0xb00c
+#define USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD	0xb309
 #define USB_DEVICE_ID_LOGITECH_C007	0xc007
 #define USB_DEVICE_ID_LOGITECH_C077	0xc077
 #define USB_DEVICE_ID_LOGITECH_RECEIVER	0xc101
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 9770db624bfa..4dca11392459 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -319,6 +319,9 @@ static const struct hid_device_id hid_battery_quirks[] = {
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ASUSTEK,
 		USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD),
 	  HID_BATTERY_QUIRK_IGNORE },
+	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
+		USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD),
+	  HID_BATTERY_QUIRK_IGNORE },
 	{}
 };
 
commit c27168a04a438a457c100253b1aaf0c779218aae
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Nov 2 14:36:57 2020 +0100

    HID: logitech-hidpp: Add HIDPP_CONSUMER_VENDOR_KEYS quirk for the Dinovo Edge
    
    Like the MX5000 and MX5500 quad/bluetooth keyboards the Dinovo Edge also
    needs the HIDPP_CONSUMER_VENDOR_KEYS quirk for some special keys to work.
    Specifically without this the "Phone" and the 'A' - 'D' Smart Keys do not
    send any events.
    
    In addition to fixing these keys not sending any events, adding the
    Bluetooth match, so that hid-logitech-hidpp is used instead of the
    generic HID driver, also adds battery monitoring support when the
    keyboard is connected over Bluetooth.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 730036650f7d..40b7c75b3384 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -3972,6 +3972,9 @@ static const struct hid_device_id hidpp_devices[] = {
 	{ /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */
 	  LDJ_DEVICE(0xb305),
 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
+	{ /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */
+	  LDJ_DEVICE(0xb309),
+	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
 	{ /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
 	  LDJ_DEVICE(0xb30b),
 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
@@ -4014,6 +4017,9 @@ static const struct hid_device_id hidpp_devices[] = {
 	{ /* MX5000 keyboard over Bluetooth */
 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305),
 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
+	{ /* Dinovo Edge keyboard over Bluetooth */
+	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309),
+	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
 	{ /* MX5500 keyboard over Bluetooth */
 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
commit 4d64bb4ba5ecf4831448cdb2fe16d0ae91b2b40b
Author: Brad Campbell <brad at fnarfbargle.com>
Date:   Thu Nov 12 14:08:23 2020 +1100

    hwmon: (applesmc) Re-work SMC comms
    
    Commit fff2d0f701e6 ("hwmon: (applesmc) avoid overlong udelay()")
    introduced an issue whereby communication with the SMC became
    unreliable with write errors like :
    
    [  120.378614] applesmc: send_byte(0x00, 0x0300) fail: 0x40
    [  120.378621] applesmc: LKSB: write data fail
    [  120.512782] applesmc: send_byte(0x00, 0x0300) fail: 0x40
    [  120.512787] applesmc: LKSB: write data fail
    
    The original code appeared to be timing sensitive and was not reliable
    with the timing changes in the aforementioned commit.
    
    This patch re-factors the SMC communication to remove the timing
    dependencies and restore function with the changes previously
    committed.
    
    Tested on : MacbookAir6,2 MacBookPro11,1 iMac12,2, MacBookAir1,1,
    MacBookAir3,1
    
    Fixes: fff2d0f701e6 ("hwmon: (applesmc) avoid overlong udelay()")
    Reported-by: Andreas Kemnade <andreas at kemnade.info>
    Tested-by: Andreas Kemnade <andreas at kemnade.info> # MacBookAir6,2
    Acked-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Brad Campbell <brad at fnarfbargle.com>
    Signed-off-by: Henrik Rydberg <rydberg at bitmath.org>
    Link: https://lore.kernel.org/r/194a7d71-a781-765a-d177-c962ef296b90@fnarfbargle.com
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>

diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
index a18887990f4a..79b498f816fe 100644
--- a/drivers/hwmon/applesmc.c
+++ b/drivers/hwmon/applesmc.c
@@ -32,6 +32,7 @@
 #include <linux/hwmon.h>
 #include <linux/workqueue.h>
 #include <linux/err.h>
+#include <linux/bits.h>
 
 /* data port used by Apple SMC */
 #define APPLESMC_DATA_PORT	0x300
@@ -42,10 +43,13 @@
 
 #define APPLESMC_MAX_DATA_LENGTH 32
 
-/* wait up to 128 ms for a status change. */
-#define APPLESMC_MIN_WAIT	0x0010
-#define APPLESMC_RETRY_WAIT	0x0100
-#define APPLESMC_MAX_WAIT	0x20000
+/* Apple SMC status bits */
+#define SMC_STATUS_AWAITING_DATA  BIT(0) /* SMC has data waiting to be read */
+#define SMC_STATUS_IB_CLOSED      BIT(1) /* Will ignore any input */
+#define SMC_STATUS_BUSY           BIT(2) /* Command in progress */
+
+/* Initial wait is 8us */
+#define APPLESMC_MIN_WAIT      0x0008
 
 #define APPLESMC_READ_CMD	0x10
 #define APPLESMC_WRITE_CMD	0x11
@@ -151,65 +155,84 @@ static unsigned int key_at_index;
 static struct workqueue_struct *applesmc_led_wq;
 
 /*
- * wait_read - Wait for a byte to appear on SMC port. Callers must
- * hold applesmc_lock.
+ * Wait for specific status bits with a mask on the SMC.
+ * Used before all transactions.
+ * This does 10 fast loops of 8us then exponentially backs off for a
+ * minimum total wait of 262ms. Depending on usleep_range this could
+ * run out past 500ms.
  */
-static int wait_read(void)
+
+static int wait_status(u8 val, u8 mask)
 {
-	unsigned long end = jiffies + (APPLESMC_MAX_WAIT * HZ) / USEC_PER_SEC;
 	u8 status;
 	int us;
+	int i;
 
-	for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
-		usleep_range(us, us * 16);
+	us = APPLESMC_MIN_WAIT;
+	for (i = 0; i < 24 ; i++) {
 		status = inb(APPLESMC_CMD_PORT);
-		/* read: wait for smc to settle */
-		if (status & 0x01)
+		if ((status & mask) == val)
 			return 0;
-		/* timeout: give up */
-		if (time_after(jiffies, end))
-			break;
+		usleep_range(us, us * 2);
+		if (i > 9)
+			us <<= 1;
 	}
-
-	pr_warn("wait_read() fail: 0x%02x\n", status);
 	return -EIO;
 }
 
-/*
- * send_byte - Write to SMC port, retrying when necessary. Callers
- * must hold applesmc_lock.
- */
+/* send_byte - Write to SMC data port. Callers must hold applesmc_lock. */
+
 static int send_byte(u8 cmd, u16 port)
 {
-	u8 status;
-	int us;
-	unsigned long end = jiffies + (APPLESMC_MAX_WAIT * HZ) / USEC_PER_SEC;
+	int status;
+
+	status = wait_status(0, SMC_STATUS_IB_CLOSED);
+	if (status)
+		return status;
+	/*
+	 * This needs to be a separate read looking for bit 0x04
+	 * after bit 0x02 falls. If consolidated with the wait above
+	 * this extra read may not happen if status returns both
+	 * simultaneously and this would appear to be required.
+	 */
+	status = wait_status(SMC_STATUS_BUSY, SMC_STATUS_BUSY);
+	if (status)
+		return status;
 
 	outb(cmd, port);
-	for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
-		usleep_range(us, us * 16);
-		status = inb(APPLESMC_CMD_PORT);
-		/* write: wait for smc to settle */
-		if (status & 0x02)
-			continue;
-		/* ready: cmd accepted, return */
-		if (status & 0x04)
-			return 0;
-		/* timeout: give up */
-		if (time_after(jiffies, end))
-			break;
-		/* busy: long wait and resend */
-		udelay(APPLESMC_RETRY_WAIT);
-		outb(cmd, port);
-	}
-
-	pr_warn("send_byte(0x%02x, 0x%04x) fail: 0x%02x\n", cmd, port, status);
-	return -EIO;
+	return 0;
 }
 
+/* send_command - Write a command to the SMC. Callers must hold applesmc_lock. */
+
 static int send_command(u8 cmd)
 {
-	return send_byte(cmd, APPLESMC_CMD_PORT);
+	int ret;
+
+	ret = wait_status(0, SMC_STATUS_IB_CLOSED);
+	if (ret)
+		return ret;
+	outb(cmd, APPLESMC_CMD_PORT);
+	return 0;
+}
+
+/*
+ * Based on logic from the Apple driver. This is issued before any interaction
+ * If busy is stuck high, issue a read command to reset the SMC state machine.
+ * If busy is stuck high after the command then the SMC is jammed.
+ */
+
+static int smc_sane(void)
+{
+	int ret;
+
+	ret = wait_status(0, SMC_STATUS_BUSY);
+	if (!ret)
+		return ret;
+	ret = send_command(APPLESMC_READ_CMD);
+	if (ret)
+		return ret;
+	return wait_status(0, SMC_STATUS_BUSY);
 }
 
 static int send_argument(const char *key)
@@ -226,6 +249,11 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
 {
 	u8 status, data = 0;
 	int i;
+	int ret;
+
+	ret = smc_sane();
+	if (ret)
+		return ret;
 
 	if (send_command(cmd) || send_argument(key)) {
 		pr_warn("%.4s: read arg fail\n", key);
@@ -239,7 +267,8 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
 	}
 
 	for (i = 0; i < len; i++) {
-		if (wait_read()) {
+		if (wait_status(SMC_STATUS_AWAITING_DATA | SMC_STATUS_BUSY,
+				SMC_STATUS_AWAITING_DATA | SMC_STATUS_BUSY)) {
 			pr_warn("%.4s: read data[%d] fail\n", key, i);
 			return -EIO;
 		}
@@ -250,19 +279,24 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
 	for (i = 0; i < 16; i++) {
 		udelay(APPLESMC_MIN_WAIT);
 		status = inb(APPLESMC_CMD_PORT);
-		if (!(status & 0x01))
+		if (!(status & SMC_STATUS_AWAITING_DATA))
 			break;
 		data = inb(APPLESMC_DATA_PORT);
 	}
 	if (i)
 		pr_warn("flushed %d bytes, last value is: %d\n", i, data);
 
-	return 0;
+	return wait_status(0, SMC_STATUS_BUSY);
 }
 
 static int write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len)
 {
 	int i;
+	int ret;
+
+	ret = smc_sane();
+	if (ret)
+		return ret;
 
 	if (send_command(cmd) || send_argument(key)) {
 		pr_warn("%s: write arg fail\n", key);
@@ -281,7 +315,7 @@ static int write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len)
 		}
 	}
 
-	return 0;
+	return wait_status(0, SMC_STATUS_BUSY);
 }
 
 static int read_register_count(unsigned int *count)
commit fd8feec665fef840277515a5c2b9b7c3e3970fad
Author: Paul Barker <pbarker at konsulko.com>
Date:   Wed Nov 11 16:46:43 2020 +0000

    hwmon: (pwm-fan) Fix RPM calculation
    
    To convert the number of pulses counted into an RPM estimation, we need
    to divide by the width of our measurement interval instead of
    multiplying by it. If the width of the measurement interval is zero we
    don't update the RPM value to avoid dividing by zero.
    
    We also don't need to do 64-bit division, with 32-bits we can handle a
    fan running at over 4 million RPM.
    
    Signed-off-by: Paul Barker <pbarker at konsulko.com>
    Link: https://lore.kernel.org/r/20201111164643.7087-1-pbarker@konsulko.com
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>

diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
index bdba2143021a..1f63807c0399 100644
--- a/drivers/hwmon/pwm-fan.c
+++ b/drivers/hwmon/pwm-fan.c
@@ -54,16 +54,18 @@ static irqreturn_t pulse_handler(int irq, void *dev_id)
 static void sample_timer(struct timer_list *t)
 {
 	struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer);
+	unsigned int delta = ktime_ms_delta(ktime_get(), ctx->sample_start);
 	int pulses;
-	u64 tmp;
 
-	pulses = atomic_read(&ctx->pulses);
-	atomic_sub(pulses, &ctx->pulses);
-	tmp = (u64)pulses * ktime_ms_delta(ktime_get(), ctx->sample_start) * 60;
-	do_div(tmp, ctx->pulses_per_revolution * 1000);
-	ctx->rpm = tmp;
+	if (delta) {
+		pulses = atomic_read(&ctx->pulses);
+		atomic_sub(pulses, &ctx->pulses);
+		ctx->rpm = (unsigned int)(pulses * 1000 * 60) /
+			(ctx->pulses_per_revolution * delta);
+
+		ctx->sample_start = ktime_get();
+	}
 
-	ctx->sample_start = ktime_get();
 	mod_timer(&ctx->rpm_timer, jiffies + HZ);
 }
 
commit ee5e58418a854755201eb4952b1230d873a457d5
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Nov 2 14:36:56 2020 +0100

    HID: logitech-dj: Handle quad/bluetooth keyboards with a builtin trackpad
    
    Some quad/bluetooth keyboards, such as the Dinovo Edge (Y-RAY81) have a
    builtin touchpad. In this case when asking the receiver for paired devices,
    we get only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD.
    
    This means that we do not instantiate a second dj_hiddev for the mouse
    (as we normally would) and thus there is no place for us to forward the
    mouse input reports to, causing the touchpad part of the keyboard to not
    work.
    
    There is no way for us to detect these keyboards, so this commit adds
    an array with device-ids for such keyboards and when a keyboard is on
    this list it adds STD_MOUSE to the reports_supported bitmap for the
    dj_hiddev created for the keyboard fixing the touchpad not working.
    
    Using a list of device-ids for this is not ideal, but there are only
    very few such keyboards so this should be fine. Besides the Dinovo Edge,
    other known wireless Logitech keyboards with a builtin touchpad are:
    
    * Dinovo Mini (TODO add its device-id to the list)
    * K400 (uses a unifying receiver so is not affected)
    * K600 (uses a unifying receiver so is not affected)
    
    Cc: stable at vger.kernel.org
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1811424
    Fixes: f2113c3020ef ("HID: logitech-dj: add support for Logitech Bluetooth Mini-Receiver")
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>

diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index 38ee25a813b9..1cafb65428b0 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -866,11 +866,23 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
 	schedule_work(&djrcv_dev->work);
 }
 
+/*
+ * Some quad/bluetooth keyboards have a builtin touchpad in this case we see
+ * only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the
+ * touchpad to work we must also forward mouse input reports to the dj_hiddev
+ * created for the keyboard (instead of forwarding them to a second paired
+ * device with a device_type of REPORT_TYPE_MOUSE as we normally would).
+ */
+static const u16 kbd_builtin_touchpad_ids[] = {
+	0xb309, /* Dinovo Edge */
+};
+
 static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
 					    struct hidpp_event *hidpp_report,
 					    struct dj_workitem *workitem)
 {
 	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
+	int i, id;
 
 	workitem->type = WORKITEM_TYPE_PAIRED;
 	workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
@@ -882,6 +894,13 @@ static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
 		workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
 					       POWER_KEYS | MEDIA_CENTER |
 					       HIDPP;
+		id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb;
+		for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) {
+			if (id == kbd_builtin_touchpad_ids[i]) {
+				workitem->reports_supported |= STD_MOUSE;
+				break;
+			}
+		}
 		break;
 	case REPORT_TYPE_MOUSE:
 		workitem->reports_supported |= STD_MOUSE | HIDPP;
commit bc923818b190c8b63c91a47702969c8053574f5b
Author: Zhang Qilong <zhangqilong3 at huawei.com>
Date:   Sun Nov 8 17:27:41 2020 +0800

    gfs2: fix possible reference leak in gfs2_check_blk_type
    
    In the fail path of gfs2_check_blk_type, forgetting to call
    gfs2_glock_dq_uninit will result in rgd_gh reference leak.
    
    Signed-off-by: Zhang Qilong <zhangqilong3 at huawei.com>
    Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>

diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 92d799a193b8..f7addc6197ed 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -2529,13 +2529,13 @@ int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, unsigned int type)
 
 	rbm.rgd = rgd;
 	error = gfs2_rbm_from_block(&rbm, no_addr);
-	if (WARN_ON_ONCE(error))
-		goto fail;
-
-	if (gfs2_testbit(&rbm, false) != type)
-		error = -ESTALE;
+	if (!WARN_ON_ONCE(error)) {
+		if (gfs2_testbit(&rbm, false) != type)
+			error = -ESTALE;
+	}
 
 	gfs2_glock_dq_uninit(&rgd_gh);
+
 fail:
 	return error;
 }
commit b98467fe96d2415836d154ecfe1cd389bf4147b5
Author: Peter Ujfalusi <peter.ujfalusi at ti.com>
Date:   Thu Oct 29 12:03:35 2020 +0200

    thermal: ti-soc-thermal: Disable the CPU PM notifier for OMAP4430
    
    It has been observed that on OMAP4430 (ES2.0, ES2.1 and ES2.3) the enabled
    notifier causes errors on the DTEMP readout values:
    
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 52
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 64
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 64
    ti-soc-thermal 4a002260.bandgap: out of range ADC val: 0
    thermal thermal_zone0: failed to read out thermal zone (-5)
    ti-soc-thermal 4a002260.bandgap: out of range ADC val: 0
    thermal thermal_zone0: failed to read out thermal zone (-5)
    ti-soc-thermal 4a002260.bandgap: out of range ADC val: 4
    thermal thermal_zone0: failed to read out thermal zone (-5)
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 100
    
    raw 100 translates to 133 Celsius on omap4-sdp, triggering shutdown due to
    critical temperature.
    
    When the notifier is disable for OMAP4430 the DTEMP values are stable:
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 56
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 56
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 57
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 57
    ti-soc-thermal 4a002260.bandgap: in range ADC val: 56
    
    Fixes: 5093402e5b44 ("thermal: ti-soc-thermal: Enable addition power management")
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Tested-by: Tony Lindgren <tony at atomide.com>
    Acked-by: Keerthy <j-keerthy at ti.com>
    Signed-off-by: Daniel Lezcano <daniel.lezcano at linaro.org>
    Link: https://lore.kernel.org/r/20201029100335.27665-1-peter.ujfalusi@ti.com

diff --git a/drivers/thermal/ti-soc-thermal/ti-bandgap.c b/drivers/thermal/ti-soc-thermal/ti-bandgap.c
index 5e596168ba73..dcac99f327b0 100644
--- a/drivers/thermal/ti-soc-thermal/ti-bandgap.c
+++ b/drivers/thermal/ti-soc-thermal/ti-bandgap.c
@@ -20,6 +20,7 @@
 #include <linux/err.h>
 #include <linux/types.h>
 #include <linux/spinlock.h>
+#include <linux/sys_soc.h>
 #include <linux/reboot.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
@@ -864,6 +865,17 @@ static struct ti_bandgap *ti_bandgap_build(struct platform_device *pdev)
 	return bgp;
 }
 
+/*
+ * List of SoCs on which the CPU PM notifier can cause erros on the DTEMP
+ * readout.
+ * Enabled notifier on these machines results in erroneous, random values which
+ * could trigger unexpected thermal shutdown.
+ */
+static const struct soc_device_attribute soc_no_cpu_notifier[] = {
+	{ .machine = "OMAP4430" },
+	{ /* sentinel */ },
+};
+
 /***   Device driver call backs   ***/
 
 static
@@ -1020,7 +1032,8 @@ int ti_bandgap_probe(struct platform_device *pdev)
 
 #ifdef CONFIG_PM_SLEEP
 	bgp->nb.notifier_call = bandgap_omap_cpu_notifier;
-	cpu_pm_register_notifier(&bgp->nb);
+	if (!soc_device_match(soc_no_cpu_notifier))
+		cpu_pm_register_notifier(&bgp->nb);
 #endif
 
 	return 0;
@@ -1056,7 +1069,8 @@ int ti_bandgap_remove(struct platform_device *pdev)
 	struct ti_bandgap *bgp = platform_get_drvdata(pdev);
 	int i;
 
-	cpu_pm_unregister_notifier(&bgp->nb);
+	if (!soc_device_match(soc_no_cpu_notifier))
+		cpu_pm_unregister_notifier(&bgp->nb);
 
 	/* Remove sensor interfaces */
 	for (i = 0; i < bgp->conf->sensor_count; i++) {
commit 78d732e1f326f74f240d416af9484928303d9951
Author: Thomas Richter <tmricht at linux.ibm.com>
Date:   Wed Nov 11 16:26:25 2020 +0100

    s390/cpum_sf.c: fix file permission for cpum_sfb_size
    
    This file is installed by the s390 CPU Measurement sampling
    facility device driver to export supported minimum and
    maximum sample buffer sizes.
    This file is read by lscpumf tool to display the details
    of the device driver capabilities. The lscpumf tool might
    be invoked by a non-root user. In this case it does not
    print anything because the file contents can not be read.
    
    Fix this by allowing read access for all users. Reading
    the file contents is ok, changing the file contents is
    left to the root user only.
    
    For further reference and details see:
     [1] https://github.com/ibm-s390-tools/s390-tools/issues/97
    
    Fixes: 69f239ed335a ("s390/cpum_sf: Dynamically extend the sampling buffer if overflows occur")
    Cc: <stable at vger.kernel.org> # 3.14
    Signed-off-by: Thomas Richter <tmricht at linux.ibm.com>
    Acked-by: Sumanth Korikkar <sumanthk at linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
index 4f9e4626df55..f100c9209743 100644
--- a/arch/s390/kernel/perf_cpum_sf.c
+++ b/arch/s390/kernel/perf_cpum_sf.c
@@ -2228,4 +2228,4 @@ out:
 }
 
 arch_initcall(init_cpum_sampling_pmu);
-core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0640);
+core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0644);
commit 966e7ea434484a006700c144bca629a14f93530c
Author: Heiko Carstens <hca at linux.ibm.com>
Date:   Tue Nov 10 14:46:55 2020 +0100

    s390: update defconfigs
    
    Signed-off-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_defconfig
index a4d3c578fbd8..fe6f529ac82c 100644
--- a/arch/s390/configs/debug_defconfig
+++ b/arch/s390/configs/debug_defconfig
@@ -1,3 +1,4 @@
+CONFIG_UAPI_HEADER_TEST=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_WATCH_QUEUE=y
commit b2911a84396f72149dce310a3b64d8948212c1b3
Author: Felix Fietkau <nbd at nbd.name>
Date:   Wed Nov 11 19:33:59 2020 +0100

    mac80211: minstrel: fix tx status processing corner case
    
    Some drivers fill the status rate list without setting the rate index after
    the final rate to -1. minstrel_ht already deals with this, but minstrel
    doesn't, which causes it to get stuck at the lowest rate on these drivers.
    
    Fix this by checking the count as well.
    
    Cc: stable at vger.kernel.org
    Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
    Link: https://lore.kernel.org/r/20201111183359.43528-3-nbd@nbd.name
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
index a8a940e97a9a..b13b1da19386 100644
--- a/net/mac80211/rc80211_minstrel.c
+++ b/net/mac80211/rc80211_minstrel.c
@@ -274,7 +274,7 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
 	success = !!(info->flags & IEEE80211_TX_STAT_ACK);
 
 	for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
-		if (ar[i].idx < 0)
+		if (ar[i].idx < 0 || !ar[i].count)
 			break;
 
 		ndx = rix_to_ndx(mi, ar[i].idx);
commit 4fe40b8e1566dad04c87fbf299049a1d0d4bd58d
Author: Felix Fietkau <nbd at nbd.name>
Date:   Wed Nov 11 19:33:58 2020 +0100

    mac80211: minstrel: remove deferred sampling code
    
    Deferring sampling attempts to the second stage has some bad interactions
    with drivers that process the rate table in hardware and use the probe flag
    to indicate probing packets (e.g. most mt76 drivers). On affected drivers
    it can lead to probing not working at all.
    
    If the link conditions turn worse, it might not be such a good idea to
    do a lot of sampling for lower rates in this case.
    
    Fix this by simply skipping the sample attempt instead of deferring it,
    but keep the checks that would allow it to be sampled if it was skipped
    too often, but only if it has less than 95% success probability.
    
    Also ensure that IEEE80211_TX_CTL_RATE_CTRL_PROBE is set for all probing
    packets.
    
    Cc: stable at vger.kernel.org
    Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
    Link: https://lore.kernel.org/r/20201111183359.43528-2-nbd@nbd.name
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
index 86bc469a28bc..a8a940e97a9a 100644
--- a/net/mac80211/rc80211_minstrel.c
+++ b/net/mac80211/rc80211_minstrel.c
@@ -287,12 +287,6 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
 			mi->r[ndx].stats.success += success;
 	}
 
-	if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0))
-		mi->sample_packets++;
-
-	if (mi->sample_deferred > 0)
-		mi->sample_deferred--;
-
 	if (time_after(jiffies, mi->last_stats_update +
 				mp->update_interval / (mp->new_avg ? 2 : 1)))
 		minstrel_update_stats(mp, mi);
@@ -367,7 +361,7 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 		return;
 
 	delta = (mi->total_packets * sampling_ratio / 100) -
-			(mi->sample_packets + mi->sample_deferred / 2);
+			mi->sample_packets;
 
 	/* delta < 0: no sampling required */
 	prev_sample = mi->prev_sample;
@@ -376,7 +370,6 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 		return;
 
 	if (mi->total_packets >= 10000) {
-		mi->sample_deferred = 0;
 		mi->sample_packets = 0;
 		mi->total_packets = 0;
 	} else if (delta > mi->n_rates * 2) {
@@ -401,19 +394,8 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 	 * rate sampling method should be used.
 	 * Respect such rates that are not sampled for 20 interations.
 	 */
-	if (mrr_capable &&
-	    msr->perfect_tx_time > mr->perfect_tx_time &&
-	    msr->stats.sample_skipped < 20) {
-		/* Only use IEEE80211_TX_CTL_RATE_CTRL_PROBE to mark
-		 * packets that have the sampling rate deferred to the
-		 * second MRR stage. Increase the sample counter only
-		 * if the deferred sample rate was actually used.
-		 * Use the sample_deferred counter to make sure that
-		 * the sampling is not done in large bursts */
-		info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
-		rate++;
-		mi->sample_deferred++;
-	} else {
+	if (msr->perfect_tx_time < mr->perfect_tx_time ||
+	    msr->stats.sample_skipped >= 20) {
 		if (!msr->sample_limit)
 			return;
 
@@ -433,6 +415,7 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 
 	rate->idx = mi->r[ndx].rix;
 	rate->count = minstrel_get_retry_count(&mi->r[ndx], info);
+	info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
 }
 
 
diff --git a/net/mac80211/rc80211_minstrel.h b/net/mac80211/rc80211_minstrel.h
index dbb43bcd3c45..86cd80b3ffde 100644
--- a/net/mac80211/rc80211_minstrel.h
+++ b/net/mac80211/rc80211_minstrel.h
@@ -126,7 +126,6 @@ struct minstrel_sta_info {
 	u8 max_prob_rate;
 	unsigned int total_packets;
 	unsigned int sample_packets;
-	int sample_deferred;
 
 	unsigned int sample_row;
 	unsigned int sample_column;
commit 1d18288555b3265f84d08f1f75582415e4ec343a
Author: Felix Fietkau <nbd at nbd.name>
Date:   Wed Nov 11 19:33:57 2020 +0100

    mac80211: fix memory leak on filtered powersave frames
    
    After the status rework, ieee80211_tx_status_ext is leaking un-acknowledged
    packets for stations in powersave mode.
    To fix this, move the code handling those packets from __ieee80211_tx_status
    into ieee80211_tx_status_ext
    
    Reported-by: Tobias Waldvogel <tobias.waldvogel at gmail.com>
    Fixes: 3318111cf63d ("mac80211: reduce duplication in tx status functions")
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
    Link: https://lore.kernel.org/r/20201111183359.43528-1-nbd@nbd.name
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index 6feb45135020..3485610755ef 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -49,7 +49,8 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
 	int ac;
 
 	if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
-			   IEEE80211_TX_CTL_AMPDU)) {
+			   IEEE80211_TX_CTL_AMPDU |
+			   IEEE80211_TX_CTL_HW_80211_ENCAP)) {
 		ieee80211_free_txskb(&local->hw, skb);
 		return;
 	}
@@ -915,15 +916,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 			ieee80211_mpsp_trigger_process(
 				ieee80211_get_qos_ctl(hdr), sta, true, acked);
 
-		if (!acked && test_sta_flag(sta, WLAN_STA_PS_STA)) {
-			/*
-			 * The STA is in power save mode, so assume
-			 * that this TX packet failed because of that.
-			 */
-			ieee80211_handle_filtered_frame(local, sta, skb);
-			return;
-		}
-
 		if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
 		    (ieee80211_is_data(hdr->frame_control)) &&
 		    (rates_idx != -1))
@@ -1150,6 +1142,12 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 							    -info->status.ack_signal);
 				}
 			} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
+				/*
+				 * The STA is in power save mode, so assume
+				 * that this TX packet failed because of that.
+				 */
+				if (skb)
+					ieee80211_handle_filtered_frame(local, sta, skb);
 				return;
 			} else if (noack_success) {
 				/* nothing to do here, do not account as lost */
commit 425af483523b76bc78e14674a430579d38b2a593
Author: Zheng Zengkai <zhengzengkai at huawei.com>
Date:   Wed Nov 11 20:44:26 2020 +0800

    serial: ar933x_uart: disable clk on error handling path in probe
    
    ar933x_uart_probe() does not invoke clk_disable_unprepare()
    on one error handling path. This patch fixes that.
    
    Fixes: 9be1064fe524 ("serial: ar933x_uart: add RS485 support")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zheng Zengkai <zhengzengkai at huawei.com>
    Link: https://lore.kernel.org/r/20201111124426.42638-1-zhengzengkai@huawei.com
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c
index 0c80a79d7442..c2be7cf91399 100644
--- a/drivers/tty/serial/ar933x_uart.c
+++ b/drivers/tty/serial/ar933x_uart.c
@@ -789,8 +789,10 @@ static int ar933x_uart_probe(struct platform_device *pdev)
 		goto err_disable_clk;
 
 	up->gpios = mctrl_gpio_init(port, 0);
-	if (IS_ERR(up->gpios) && PTR_ERR(up->gpios) != -ENOSYS)
-		return PTR_ERR(up->gpios);
+	if (IS_ERR(up->gpios) && PTR_ERR(up->gpios) != -ENOSYS) {
+		ret = PTR_ERR(up->gpios);
+		goto err_disable_clk;
+	}
 
 	up->rts_gpiod = mctrl_gpio_to_gpiod(up->gpios, UART_GPIO_RTS);
 
commit e67c139c488e84e7eae6c333231e791f0e89b3fb
Author: Fugang Duan <fugang.duan at nxp.com>
Date:   Wed Nov 11 10:51:36 2020 +0800

    tty: serial: imx: keep console clocks always on
    
    For below code, there has chance to cause deadlock in SMP system:
    Thread 1:
    clk_enable_lock();
    pr_info("debug message");
    clk_enable_unlock();
    
    Thread 2:
    imx_uart_console_write()
            clk_enable()
                    clk_enable_lock();
    
    Thread 1:
    Acuired clk enable_lock -> printk -> console_trylock_spinning
    Thread 2:
    console_unlock() -> imx_uart_console_write -> clk_disable -> Acquite clk enable_lock
    
    So the patch is to keep console port clocks always on like
    other console drivers.
    
    Fixes: 1cf93e0d5488 ("serial: imx: remove the uart_console() check")
    Acked-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
    Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
    Link: https://lore.kernel.org/r/20201111025136.29818-1-fugang.duan@nxp.com
    Cc: stable <stable at vger.kernel.org>
    [fix up build warning - gregkh]
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 3c53a3c89959..cacf7266a262 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -2008,16 +2008,6 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
 	unsigned int ucr1;
 	unsigned long flags = 0;
 	int locked = 1;
-	int retval;
-
-	retval = clk_enable(sport->clk_per);
-	if (retval)
-		return;
-	retval = clk_enable(sport->clk_ipg);
-	if (retval) {
-		clk_disable(sport->clk_per);
-		return;
-	}
 
 	if (sport->port.sysrq)
 		locked = 0;
@@ -2053,9 +2043,6 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
 
 	if (locked)
 		spin_unlock_irqrestore(&sport->port.lock, flags);
-
-	clk_disable(sport->clk_ipg);
-	clk_disable(sport->clk_per);
 }
 
 /*
@@ -2156,15 +2143,14 @@ imx_uart_console_setup(struct console *co, char *options)
 
 	retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);
 
-	clk_disable(sport->clk_ipg);
 	if (retval) {
-		clk_unprepare(sport->clk_ipg);
+		clk_disable_unprepare(sport->clk_ipg);
 		goto error_console;
 	}
 
-	retval = clk_prepare(sport->clk_per);
+	retval = clk_prepare_enable(sport->clk_per);
 	if (retval)
-		clk_unprepare(sport->clk_ipg);
+		clk_disable_unprepare(sport->clk_ipg);
 
 error_console:
 	return retval;
commit d4122754442799187d5d537a9c039a49a67e57f1
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Tue Nov 10 19:35:41 2020 +0100

    speakup: Do not let the line discipline be used several times
    
    Speakup has only one speakup_tty variable to store the tty it is managing. This
    makes sense since its codebase currently assumes that there is only one user who
    controls the screen reading.
    
    That however means that we have to forbid using the line discipline several
    times, otherwise the second closure would try to free a NULL ldisc_data, leading to
    
    general protection fault: 0000 [#1] SMP KASAN PTI
    RIP: 0010:spk_ttyio_ldisc_close+0x2c/0x60
    Call Trace:
     tty_ldisc_release+0xa2/0x340
     tty_release_struct+0x17/0xd0
     tty_release+0x9d9/0xcc0
     __fput+0x231/0x740
     task_work_run+0x12c/0x1a0
     do_exit+0x9b5/0x2230
     ? release_task+0x1240/0x1240
     ? __do_page_fault+0x562/0xa30
     do_group_exit+0xd5/0x2a0
     __x64_sys_exit_group+0x35/0x40
     do_syscall_64+0x89/0x2b0
     ? page_fault+0x8/0x30
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Cc: stable at vger.kernel.org
    Reported-by: 秦世松 <qinshisong1205 at gmail.com>
    Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
    Tested-by: Shisong Qin <qinshisong1205 at gmail.com>
    Link: https://lore.kernel.org/r/20201110183541.fzgnlwhjpgqzjeth@function
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/accessibility/speakup/spk_ttyio.c b/drivers/accessibility/speakup/spk_ttyio.c
index a831ff64f8ba..e69ea0c7aa20 100644
--- a/drivers/accessibility/speakup/spk_ttyio.c
+++ b/drivers/accessibility/speakup/spk_ttyio.c
@@ -49,15 +49,25 @@ static int spk_ttyio_ldisc_open(struct tty_struct *tty)
 
 	if (!tty->ops->write)
 		return -EOPNOTSUPP;
+
+	mutex_lock(&speakup_tty_mutex);
+	if (speakup_tty) {
+		mutex_unlock(&speakup_tty_mutex);
+		return -EBUSY;
+	}
 	speakup_tty = tty;
 
 	ldisc_data = kmalloc(sizeof(*ldisc_data), GFP_KERNEL);
-	if (!ldisc_data)
+	if (!ldisc_data) {
+		speakup_tty = NULL;
+		mutex_unlock(&speakup_tty_mutex);
 		return -ENOMEM;
+	}
 
 	init_completion(&ldisc_data->completion);
 	ldisc_data->buf_free = true;
 	speakup_tty->disc_data = ldisc_data;
+	mutex_unlock(&speakup_tty_mutex);
 
 	return 0;
 }
commit 33f16855dcb973f745c51882d0e286601ff3be2b
Author: Sam Nobs <samuel.nobs at taitradio.com>
Date:   Tue Nov 10 09:50:06 2020 +1300

    tty: serial: imx: fix potential deadlock
    
    Enabling the lock dependency validator has revealed
    that the way spinlocks are used in the IMX serial
    port could result in a deadlock.
    
    Specifically, imx_uart_int() acquires a spinlock
    without disabling the interrupts, meaning that another
    interrupt could come along and try to acquire the same
    spinlock, potentially causing the two to wait for each
    other indefinitely.
    
    Use spin_lock_irqsave() instead to disable interrupts
    upon acquisition of the spinlock.
    
    Fixes: c974991d2620 ("tty:serial:imx: use spin_lock instead of spin_lock_irqsave in isr")
    Reviewed-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
    Signed-off-by: Sam Nobs <samuel.nobs at taitradio.com>
    Link: https://lore.kernel.org/r/1604955006-9363-1-git-send-email-samuel.nobs@taitradio.com
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 1731d9728865..3c53a3c89959 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -942,8 +942,14 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
 	struct imx_port *sport = dev_id;
 	unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4;
 	irqreturn_t ret = IRQ_NONE;
+	unsigned long flags = 0;
 
-	spin_lock(&sport->port.lock);
+	/*
+	 * IRQs might not be disabled upon entering this interrupt handler,
+	 * e.g. when interrupt handlers are forced to be threaded. To support
+	 * this scenario as well, disable IRQs when acquiring the spinlock.
+	 */
+	spin_lock_irqsave(&sport->port.lock, flags);
 
 	usr1 = imx_uart_readl(sport, USR1);
 	usr2 = imx_uart_readl(sport, USR2);
@@ -1013,7 +1019,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
 		ret = IRQ_HANDLED;
 	}
 
-	spin_unlock(&sport->port.lock);
+	spin_unlock_irqrestore(&sport->port.lock, flags);
 
 	return ret;
 }
commit 94e2bd0b259ed39a755fdded47e6734acf1ce464
Author: Claire Chang <tientzu at chromium.org>
Date:   Tue Nov 10 16:49:08 2020 +0800

    rfkill: Fix use-after-free in rfkill_resume()
    
    If a device is getting removed or reprobed during resume, use-after-free
    might happen. For example, h5_btrtl_resume() schedules a work queue for
    device reprobing, which of course requires removal first.
    
    If the removal happens in parallel with the device_resume() and wins the
    race to acquire device_lock(), removal may remove the device from the PM
    lists and all, but device_resume() is already running and will continue
    when the lock can be acquired, thus calling rfkill_resume().
    
    During this, if rfkill_set_block() is then called after the corresponding
    *_unregister() and kfree() are called, there will be an use-after-free
    in hci_rfkill_set_block():
    
    BUG: KASAN: use-after-free in hci_rfkill_set_block+0x58/0xc0 [bluetooth]
    ...
    Call trace:
      dump_backtrace+0x0/0x154
      show_stack+0x20/0x2c
      dump_stack+0xbc/0x12c
      print_address_description+0x88/0x4b0
      __kasan_report+0x144/0x168
      kasan_report+0x10/0x18
      check_memory_region+0x19c/0x1ac
      __kasan_check_write+0x18/0x24
      hci_rfkill_set_block+0x58/0xc0 [bluetooth]
      rfkill_set_block+0x9c/0x120
      rfkill_resume+0x34/0x70
      dpm_run_callback+0xf0/0x1f4
      device_resume+0x210/0x22c
    
    Fix this by checking rfkill->registered in rfkill_resume(). device_del()
    in rfkill_unregister() requires device_lock() and the whole rfkill_resume()
    is also protected by the same lock via device_resume(), we can make sure
    either the rfkill->registered is false before rfkill_resume() starts or the
    rfkill device won't be unregistered before rfkill_resume() returns.
    
    As async_resume() holds a reference to the device, at this level there can
    be no use-after-free; only in the user that doesn't expect this scenario.
    
    Fixes: 8589086f4efd ("Bluetooth: hci_h5: Turn off RTL8723BS on suspend, reprobe on resume")
    Signed-off-by: Claire Chang <tientzu at chromium.org>
    Link: https://lore.kernel.org/r/20201110084908.219088-1-tientzu@chromium.org
    [edit commit message for clarity and add more info provided later]
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>

diff --git a/net/rfkill/core.c b/net/rfkill/core.c
index 971c73c7d34c..97101c55763d 100644
--- a/net/rfkill/core.c
+++ b/net/rfkill/core.c
@@ -876,6 +876,9 @@ static int rfkill_resume(struct device *dev)
 
 	rfkill->suspended = false;
 
+	if (!rfkill->registered)
+		return 0;
+
 	if (!rfkill->persistent) {
 		cur = !!(rfkill->state & RFKILL_BLOCK_SW);
 		rfkill_set_block(rfkill, cur);
commit edb8d77a939c422f3ae57f557cd1d6899d9bafad
Author: Tina Zhang <tina.zhang at intel.com>
Date:   Mon Sep 21 02:58:07 2020 -0400

    drm/i915/gvt: Set ENHANCED_FRAME_CAP bit
    
    Specification says the bit7 of the DPCD MAX_LANE_COUNT (offset 0x02) must
    be set to 1 when comes to the displayport version 1.2. This patch respects
    the definition.
    
    W/o this patch, guest i915 driver can only set the resolution to 1024*768,
    and complains about the unsuccessful link training:
    
    [    5.692193] i915 0000:00:02.0: [drm] *ERROR* index 0, lane_count 1 Link Training Unsuccessful
    
    Fixes: e2e02cbb5beb ("drm/i915/gvt: make dpcd_fix_data supports DP1.2")
    Reviewed-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Signed-off-by: Tina Zhang <tina.zhang at intel.com>
    Signed-off-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20200921065807.247847-1-tina.zhang@intel.com

diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c
index 7ba16ddfe75f..d7898e87791f 100644
--- a/drivers/gpu/drm/i915/gvt/display.c
+++ b/drivers/gpu/drm/i915/gvt/display.c
@@ -164,7 +164,7 @@ static unsigned char virtual_dp_monitor_edid[GVT_EDID_NUM][EDID_SIZE] = {
 
 /* let the virtual display supports DP1.2 */
 static u8 dpcd_fix_data[DPCD_HEADER_SIZE] = {
-	0x12, 0x014, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+	0x12, 0x014, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
 
 static void emulate_monitor_status_change(struct intel_vgpu *vgpu)
commit d19d8d345eecd9247cbe6cbf27aef271bd88aba7
Author: Eric Biggers <ebiggers at google.com>
Date:   Tue Nov 10 17:52:24 2020 -0800

    fscrypt: fix inline encryption not used on new files
    
    The new helper function fscrypt_prepare_new_inode() runs before
    S_ENCRYPTED has been set on the new inode.  This accidentally made
    fscrypt_select_encryption_impl() never enable inline encryption on newly
    created files, due to its use of fscrypt_needs_contents_encryption()
    which only returns true when S_ENCRYPTED is set.
    
    Fix this by using S_ISREG() directly instead of
    fscrypt_needs_contents_encryption(), analogous to what
    select_encryption_mode() does.
    
    I didn't notice this earlier because by design, the user-visible
    behavior is the same (other than performance, potentially) regardless of
    whether inline encryption is used or not.
    
    Fixes: a992b20cd4ee ("fscrypt: add fscrypt_prepare_new_inode() and fscrypt_set_context()")
    Reviewed-by: Satya Tangirala <satyat at google.com>
    Link: https://lore.kernel.org/r/20201111015224.303073-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers at google.com>

diff --git a/fs/crypto/inline_crypt.c b/fs/crypto/inline_crypt.c
index 89bffa82ed74..c57bebfa48fe 100644
--- a/fs/crypto/inline_crypt.c
+++ b/fs/crypto/inline_crypt.c
@@ -74,7 +74,7 @@ int fscrypt_select_encryption_impl(struct fscrypt_info *ci)
 	int i;
 
 	/* The file must need contents encryption, not filenames encryption */
-	if (!fscrypt_needs_contents_encryption(inode))
+	if (!S_ISREG(inode->i_mode))
 		return 0;
 
 	/* The crypto mode must have a blk-crypto counterpart */
commit ae3d6083acf60116d4f409677452399547ed2009
Author: jingle.wu <jingle.wu at emc.com.tw>
Date:   Wed Nov 11 20:06:24 2020 -0800

    Input: elan_i2c - fix firmware update on newer ICs
    
    The argument to iap page type command depends on the firmware page size.
    
    Fixes: bfd9b92bc8f9 ("Input: elan_i2c - handle firmware updated on newer ICs")
    Signed-off-by: Jingle Wu <jingle.wu at emc.com.tw>
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/mouse/elan_i2c.h b/drivers/input/mouse/elan_i2c.h
index c75b00c45d75..36e3cd908671 100644
--- a/drivers/input/mouse/elan_i2c.h
+++ b/drivers/input/mouse/elan_i2c.h
@@ -78,7 +78,7 @@ struct elan_transport_ops {
 	int (*iap_reset)(struct i2c_client *client);
 
 	int (*prepare_fw_update)(struct i2c_client *client, u16 ic_type,
-				 u8 iap_version);
+				 u8 iap_version, u16 fw_page_size);
 	int (*write_fw_block)(struct i2c_client *client, u16 fw_page_size,
 			      const u8 *page, u16 checksum, int idx);
 	int (*finish_fw_update)(struct i2c_client *client,
diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c
index c599e21a8478..61ed3f5ca219 100644
--- a/drivers/input/mouse/elan_i2c_core.c
+++ b/drivers/input/mouse/elan_i2c_core.c
@@ -497,7 +497,8 @@ static int __elan_update_firmware(struct elan_tp_data *data,
 	u16 sw_checksum = 0, fw_checksum = 0;
 
 	error = data->ops->prepare_fw_update(client, data->ic_type,
-					     data->iap_version);
+					     data->iap_version,
+					     data->fw_page_size);
 	if (error)
 		return error;
 
diff --git a/drivers/input/mouse/elan_i2c_i2c.c b/drivers/input/mouse/elan_i2c_i2c.c
index 5a496d4ffa49..13dc097eb6c6 100644
--- a/drivers/input/mouse/elan_i2c_i2c.c
+++ b/drivers/input/mouse/elan_i2c_i2c.c
@@ -517,7 +517,7 @@ static int elan_i2c_set_flash_key(struct i2c_client *client)
 	return 0;
 }
 
-static int elan_read_write_iap_type(struct i2c_client *client)
+static int elan_read_write_iap_type(struct i2c_client *client, u16 fw_page_size)
 {
 	int error;
 	u16 constant;
@@ -526,7 +526,7 @@ static int elan_read_write_iap_type(struct i2c_client *client)
 
 	do {
 		error = elan_i2c_write_cmd(client, ETP_I2C_IAP_TYPE_CMD,
-					   ETP_I2C_IAP_TYPE_REG);
+					   fw_page_size / 2);
 		if (error) {
 			dev_err(&client->dev,
 				"cannot write iap type: %d\n", error);
@@ -543,7 +543,7 @@ static int elan_read_write_iap_type(struct i2c_client *client)
 		constant = le16_to_cpup((__le16 *)val);
 		dev_dbg(&client->dev, "iap type reg: 0x%04x\n", constant);
 
-		if (constant == ETP_I2C_IAP_TYPE_REG)
+		if (constant == fw_page_size / 2)
 			return 0;
 
 	} while (--retry > 0);
@@ -553,7 +553,7 @@ static int elan_read_write_iap_type(struct i2c_client *client)
 }
 
 static int elan_i2c_prepare_fw_update(struct i2c_client *client, u16 ic_type,
-				      u8 iap_version)
+				      u8 iap_version, u16 fw_page_size)
 {
 	struct device *dev = &client->dev;
 	int error;
@@ -594,7 +594,7 @@ static int elan_i2c_prepare_fw_update(struct i2c_client *client, u16 ic_type,
 	}
 
 	if (ic_type >= 0x0D && iap_version >= 1) {
-		error = elan_read_write_iap_type(client);
+		error = elan_read_write_iap_type(client, fw_page_size);
 		if (error)
 			return error;
 	}
diff --git a/drivers/input/mouse/elan_i2c_smbus.c b/drivers/input/mouse/elan_i2c_smbus.c
index 8ff823751f3b..1820f1cfc1dc 100644
--- a/drivers/input/mouse/elan_i2c_smbus.c
+++ b/drivers/input/mouse/elan_i2c_smbus.c
@@ -340,7 +340,7 @@ static int elan_smbus_set_flash_key(struct i2c_client *client)
 }
 
 static int elan_smbus_prepare_fw_update(struct i2c_client *client, u16 ic_type,
-					u8 iap_version)
+					u8 iap_version, u16 fw_page_size)
 {
 	struct device *dev = &client->dev;
 	int len;
commit 52755b66ddcef2e897778fac5656df18817b59ab
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Tue Nov 10 22:46:14 2020 +0800

    cosa: Add missing kfree in error path of cosa_write
    
    If memory allocation for 'kbuf' succeed, cosa_write() doesn't have a
    corresponding kfree() in exception handling. Thus add kfree() for this
    function implementation.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Acked-by: Jan "Yenya" Kasprzak <kas at fi.muni.cz>
    Link: https://lore.kernel.org/r/20201110144614.43194-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c
index f8aed0696d77..2369ca250cd6 100644
--- a/drivers/net/wan/cosa.c
+++ b/drivers/net/wan/cosa.c
@@ -889,6 +889,7 @@ static ssize_t cosa_write(struct file *file,
 			chan->tx_status = 1;
 			spin_unlock_irqrestore(&cosa->lock, flags);
 			up(&chan->wsem);
+			kfree(kbuf);
 			return -ERESTARTSYS;
 		}
 	}
commit 676650d007e06fddcf3fe38238251d71bd179641
Author: Necip Fazil Yildiran <fazilyildiran at gmail.com>
Date:   Wed Nov 11 17:48:52 2020 -0800

    Input: resistive-adc-touch - fix kconfig dependency on IIO_BUFFER
    
    When TOUCHSCREEN_ADC is enabled and IIO_BUFFER is disabled, it results
    in the following Kbuild warning:
    
    WARNING: unmet direct dependencies detected for IIO_BUFFER_CB
      Depends on [n]: IIO [=y] && IIO_BUFFER [=n]
      Selected by [y]:
      - TOUCHSCREEN_ADC [=y] && !UML && INPUT [=y] && INPUT_TOUCHSCREEN [=y] && IIO [=y]
    
    The reason is that TOUCHSCREEN_ADC selects IIO_BUFFER_CB without depending
    on or selecting IIO_BUFFER while IIO_BUFFER_CB depends on IIO_BUFFER. This
    can also fail building the kernel.
    
    Honor the kconfig dependency to remove unmet direct dependency warnings
    and avoid any potential build failures.
    
    Fixes: aa132ffb6b0a ("input: touchscreen: resistive-adc-touch: add generic resistive ADC touchscreen")
    Signed-off-by: Necip Fazil Yildiran <fazilyildiran at gmail.com>
    Acked-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>
    Link: https://lore.kernel.org/r/20201102221504.541279-1-fazilyildiran@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index f012fe746df0..cc18f54ea887 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -96,6 +96,7 @@ config TOUCHSCREEN_AD7879_SPI
 config TOUCHSCREEN_ADC
 	tristate "Generic ADC based resistive touchscreen"
 	depends on IIO
+	select IIO_BUFFER
 	select IIO_BUFFER_CB
 	help
 	  Say Y here if you want to use the generic ADC
commit 460cd17e9f7d60eaa22028baa6a056c478fa7dc6
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Mon Nov 9 19:51:20 2020 -0800

    net: switch to the kernel.org patchwork instance
    
    Move to the kernel.org patchwork instance, it has significantly
    lower latency for accessing from Europe and the US. Other quirks
    include the reply bot.
    
    Link: https://lore.kernel.org/r/20201110035120.642746-1-kuba@kernel.org
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/Documentation/networking/netdev-FAQ.rst b/Documentation/networking/netdev-FAQ.rst
index d5c9320901c3..21537766be4d 100644
--- a/Documentation/networking/netdev-FAQ.rst
+++ b/Documentation/networking/netdev-FAQ.rst
@@ -110,7 +110,7 @@ Q: I sent a patch and I'm wondering what happened to it?
 Q: How can I tell whether it got merged?
 A: Start by looking at the main patchworks queue for netdev:
 
-  http://patchwork.ozlabs.org/project/netdev/list/
+  https://patchwork.kernel.org/project/netdevbpf/list/
 
 The "State" field will tell you exactly where things are at with your
 patch.
@@ -152,7 +152,7 @@ networking subsystem, and then hands them off to Greg.
 
 There is a patchworks queue that you can see here:
 
-  http://patchwork.ozlabs.org/bundle/davem/stable/?state=*
+  https://patchwork.kernel.org/bundle/netdev/stable/?state=*
 
 It contains the patches which Dave has selected, but not yet handed off
 to Greg.  If Greg already has the patch, then it will be here:
diff --git a/Documentation/process/stable-kernel-rules.rst b/Documentation/process/stable-kernel-rules.rst
index 06f743b612c4..3973556250e1 100644
--- a/Documentation/process/stable-kernel-rules.rst
+++ b/Documentation/process/stable-kernel-rules.rst
@@ -39,7 +39,7 @@ Procedure for submitting patches to the -stable tree
    submission guidelines as described in
    :ref:`Documentation/networking/netdev-FAQ.rst <netdev-FAQ>`
    after first checking the stable networking queue at
-   https://patchwork.ozlabs.org/bundle/davem/stable/?series=&submitter=&state=*&q=&archive=
+   https://patchwork.kernel.org/bundle/netdev/stable/?state=*
    to ensure the requested patch is not already queued up.
  - Security patches should not be handled (solely) by the -stable review
    process but should follow the procedures in
diff --git a/Documentation/translations/it_IT/process/stable-kernel-rules.rst b/Documentation/translations/it_IT/process/stable-kernel-rules.rst
index 4f206cee31a7..283d62541c4f 100644
--- a/Documentation/translations/it_IT/process/stable-kernel-rules.rst
+++ b/Documentation/translations/it_IT/process/stable-kernel-rules.rst
@@ -46,7 +46,7 @@ Procedura per sottomettere patch per i sorgenti -stable
    :ref:`Documentation/translations/it_IT/networking/netdev-FAQ.rst <it_netdev-FAQ>`;
    ma solo dopo aver verificato al seguente indirizzo che la patch non sia
    già in coda:
-   https://patchwork.ozlabs.org/bundle/davem/stable/?series=&submitter=&state=*&q=&archive=
+   https://patchwork.kernel.org/bundle/netdev/stable/?state=*
  - Una patch di sicurezza non dovrebbero essere gestite (solamente) dal processo
    di revisione -stable, ma dovrebbe seguire le procedure descritte in
    :ref:`Documentation/translations/it_IT/admin-guide/security-bugs.rst <it_securitybugs>`.
diff --git a/MAINTAINERS b/MAINTAINERS
index fa11fe773df5..eaded39a3858 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1279,7 +1279,7 @@ M:	Igor Russkikh <irusskikh at marvell.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	https://www.marvell.com/
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	Documentation/networking/device_drivers/ethernet/aquantia/atlantic.rst
 F:	drivers/net/ethernet/aquantia/atlantic/
 
@@ -11173,7 +11173,7 @@ M:	Tariq Toukan <tariqt at nvidia.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	drivers/net/ethernet/mellanox/mlx4/en_*
 
 MELLANOX ETHERNET DRIVER (mlx5e)
@@ -11181,7 +11181,7 @@ M:	Saeed Mahameed <saeedm at nvidia.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	drivers/net/ethernet/mellanox/mlx5/core/en_*
 
 MELLANOX ETHERNET INNOVA DRIVERS
@@ -11189,7 +11189,7 @@ R:	Boris Pismenny <borisp at nvidia.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	drivers/net/ethernet/mellanox/mlx5/core/accel/*
 F:	drivers/net/ethernet/mellanox/mlx5/core/en_accel/*
 F:	drivers/net/ethernet/mellanox/mlx5/core/fpga/*
@@ -11201,7 +11201,7 @@ M:	Ido Schimmel <idosch at nvidia.com>
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	drivers/net/ethernet/mellanox/mlxsw/
 F:	tools/testing/selftests/drivers/net/mlxsw/
 
@@ -11210,7 +11210,7 @@ M:	mlxsw at nvidia.com
 L:	netdev at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	drivers/net/ethernet/mellanox/mlxfw/
 
 MELLANOX HARDWARE PLATFORM SUPPORT
@@ -11229,7 +11229,7 @@ L:	netdev at vger.kernel.org
 L:	linux-rdma at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	drivers/net/ethernet/mellanox/mlx4/
 F:	include/linux/mlx4/
 
@@ -11250,7 +11250,7 @@ L:	netdev at vger.kernel.org
 L:	linux-rdma at vger.kernel.org
 S:	Supported
 W:	http://www.mellanox.com
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 F:	Documentation/networking/device_drivers/ethernet/mellanox/
 F:	drivers/net/ethernet/mellanox/mlx5/core/
 F:	include/linux/mlx5/
@@ -12130,7 +12130,7 @@ M:	Jakub Kicinski <kuba at kernel.org>
 L:	netdev at vger.kernel.org
 S:	Maintained
 W:	http://www.linuxfoundation.org/en/Net
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
 F:	Documentation/devicetree/bindings/net/
@@ -12175,7 +12175,7 @@ M:	Jakub Kicinski <kuba at kernel.org>
 L:	netdev at vger.kernel.org
 S:	Maintained
 W:	http://www.linuxfoundation.org/en/Net
-Q:	http://patchwork.ozlabs.org/project/netdev/list/
+Q:	https://patchwork.kernel.org/project/netdevbpf/list/
 B:	mailto:netdev at vger.kernel.org
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
commit fcd1ecc8ee6badf4b25a6de67724390675bbc883
Merge: 361182308766 83a95df04bee
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Wed Nov 11 16:30:41 2020 -0800

    Merge branch 'cxgb4-ch_ktls-fixes-in-nic-tls-code'
    
    Rohit Maheshwari says:
    
    ====================
    cxgb4/ch_ktls: Fixes in nic tls code
    
    This series helps in fixing multiple nic ktls issues. Series is broken
    into 12 patches.
    
    Patch 1 avoids deciding tls packet based on decrypted bit. If its a
    retransmit packet which has tls handshake and finish (for encryption),
    decrypted bit won't be set there, and so we can't rely on decrypted
    bit.
    
    Patch 2 helps supporting linear skb. SKBs were assumed non-linear.
    Corrected the length extraction.
    
    Patch 3 fixes the checksum offload update in WR.
    
    Patch 4 fixes kernel panic happening due to creating new skb for each
    record. As part of fix driver will use same skb to send out one tls
    record (partial data) of the same SKB.
    
    Patch 5 fixes the problem of skb data length smaller than remaining data
    of the record.
    
    Patch 6 fixes the handling of SKBs which has tls header alone pkt, but
    not starting from beginning.
    
    Patch 7 avoids sending extra data which is used to make a record 16 byte
    aligned. We don't need to retransmit those extra few bytes.
    
    Patch 8 handles the cases where retransmit packet has tls starting
    exchanges which are prior to tls start marker.
    
    Patch 9 fixes the problem os skb free before HW knows about tcp FIN.
    
    Patch 10 handles the small packet case which has partial TAG bytes only.
    HW can't handle those, hence using sw crypto for such pkts.
    
    Patch 11 corrects the potential tcb update problem.
    
    Patch 12 stops the queue if queue reaches threshold value.
    
    v1->v2:
    - Corrected fixes tag issue.
    - Marked chcr_ktls_sw_fallback() static.
    
    v2->v3:
    - Replaced GFP_KERNEL with GFP_ATOMIC.
    - Removed mixed fixes.
    
    v3->v4:
    - Corrected fixes tag issue.
    
    v4->v5:
    - Separated mixed fixes from patch 4.
    
    v5-v6:
    - Fixes tag should be at the end.
    ====================
    
    Link: https://lore.kernel.org/r/20201109105142.15398-1-rohitm@chelsio.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 83a95df04bee77c74df5151c961b19d870a70180
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:42 2020 +0530

    ch_ktls: stop the txq if reaches threshold
    
    Stop the queue and ask for the credits if queue reaches to
    threashold.
    
    Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index a732051b21e4..c24485c0d512 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -835,7 +835,7 @@ static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 {
 	bool first_wr = ((tx_info->prev_ack == 0) && (tx_info->prev_win == 0));
 	struct ch_ktls_port_stats_debug *port_stats;
-	u32 len, cpl = 0, ndesc, wr_len;
+	u32 len, cpl = 0, ndesc, wr_len, wr_mid = 0;
 	struct fw_ulptx_wr *wr;
 	int credits;
 	void *pos;
@@ -851,6 +851,11 @@ static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 		return NETDEV_TX_BUSY;
 	}
 
+	if (unlikely(credits < ETHTXQ_STOP_THRES)) {
+		chcr_eth_txq_stop(q);
+		wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F;
+	}
+
 	pos = &q->q.desc[q->q.pidx];
 	/* make space for WR, we'll fill it later when we know all the cpls
 	 * being sent out and have complete length.
@@ -905,7 +910,8 @@ static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 		wr->op_to_compl = htonl(FW_WR_OP_V(FW_ULPTX_WR));
 		wr->cookie = 0;
 		/* fill len in wr field */
-		wr->flowid_len16 = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(len, 16)));
+		wr->flowid_len16 = htonl(wr_mid |
+					 FW_WR_LEN16_V(DIV_ROUND_UP(len, 16)));
 
 		ndesc = DIV_ROUND_UP(len, 64);
 		chcr_txq_advance(&q->q, ndesc);
@@ -986,6 +992,7 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	struct tcphdr *tcp;
 	int len16, pktlen;
 	struct iphdr *ip;
+	u32 wr_mid = 0;
 	int credits;
 	u8 buf[150];
 	u64 cntrl1;
@@ -1010,6 +1017,11 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 		return NETDEV_TX_BUSY;
 	}
 
+	if (unlikely(credits < ETHTXQ_STOP_THRES)) {
+		chcr_eth_txq_stop(q);
+		wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F;
+	}
+
 	pos = &q->q.desc[q->q.pidx];
 	wr = pos;
 
@@ -1017,7 +1029,7 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	wr->op_immdlen = htonl(FW_WR_OP_V(FW_ETH_TX_PKT_WR) |
 			       FW_WR_IMMDLEN_V(ctrl));
 
-	wr->equiq_to_len16 = htonl(FW_WR_LEN16_V(len16));
+	wr->equiq_to_len16 = htonl(wr_mid | FW_WR_LEN16_V(len16));
 	wr->r3 = 0;
 
 	cpl = (void *)(wr + 1);
commit 7d01c428c86b525dc780226924d74df2048cf411
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:41 2020 +0530

    ch_ktls: tcb update fails sometimes
    
    context id and port id should be filled while sending tcb update.
    
    Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index b182c940b4a0..a732051b21e4 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -733,7 +733,8 @@ static int chcr_ktls_cpl_set_tcb_rpl(struct adapter *adap, unsigned char *input)
 }
 
 static void *__chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info,
-					u32 tid, void *pos, u16 word, u64 mask,
+					u32 tid, void *pos, u16 word,
+					struct sge_eth_txq *q, u64 mask,
 					u64 val, u32 reply)
 {
 	struct cpl_set_tcb_field_core *cpl;
@@ -742,7 +743,10 @@ static void *__chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info,
 
 	/* ULP_TXPKT */
 	txpkt = pos;
-	txpkt->cmd_dest = htonl(ULPTX_CMD_V(ULP_TX_PKT) | ULP_TXPKT_DEST_V(0));
+	txpkt->cmd_dest = htonl(ULPTX_CMD_V(ULP_TX_PKT) |
+				ULP_TXPKT_CHANNELID_V(tx_info->port_id) |
+				ULP_TXPKT_FID_V(q->q.cntxt_id) |
+				ULP_TXPKT_RO_F);
 	txpkt->len = htonl(DIV_ROUND_UP(CHCR_SET_TCB_FIELD_LEN, 16));
 
 	/* ULPTX_IDATA sub-command */
@@ -797,7 +801,7 @@ static void *chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info,
 		} else {
 			u8 buf[48] = {0};
 
-			__chcr_write_cpl_set_tcb_ulp(tx_info, tid, buf, word,
+			__chcr_write_cpl_set_tcb_ulp(tx_info, tid, buf, word, q,
 						     mask, val, reply);
 
 			return chcr_copy_to_txd(buf, &q->q, pos,
@@ -805,7 +809,7 @@ static void *chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info,
 		}
 	}
 
-	pos = __chcr_write_cpl_set_tcb_ulp(tx_info, tid, pos, word,
+	pos = __chcr_write_cpl_set_tcb_ulp(tx_info, tid, pos, word, q,
 					   mask, val, reply);
 
 	/* check again if we are at the end of the queue */
commit 21f82acbb8b4e8812521d405479b6fc3790078de
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:40 2020 +0530

    ch_ktls/cxgb4: handle partial tag alone SKBs
    
    If TCP congestion caused a very small packets which only has some
    part fo the TAG, and that too is not till the end. HW can't handle
    such case, so falling back to sw crypto in such cases.
    
    v1->v2:
    - Marked chcr_ktls_sw_fallback() static.
    
    Fixes: dc05f3df8fac ("chcr: Handle first or middle part of record")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
index 0273f40b85f7..17410fe86626 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
@@ -3573,6 +3573,8 @@ static int chcr_stats_show(struct seq_file *seq, void *v)
 		   atomic64_read(&adap->ch_ktls_stats.ktls_tx_complete_pkts));
 	seq_printf(seq, "TX trim pkts :                    %20llu\n",
 		   atomic64_read(&adap->ch_ktls_stats.ktls_tx_trimmed_pkts));
+	seq_printf(seq, "TX sw fallback :                  %20llu\n",
+		   atomic64_read(&adap->ch_ktls_stats.ktls_tx_fallback));
 	while (i < MAX_NPORTS) {
 		ktls_port = &adap->ch_ktls_stats.ktls_port[i];
 		seq_printf(seq, "Port %d\n", i);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
index e2a4941fa802..1b49f2fa9b18 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
@@ -388,6 +388,7 @@ struct ch_ktls_stats_debug {
 	atomic64_t ktls_tx_retransmit_pkts;
 	atomic64_t ktls_tx_complete_pkts;
 	atomic64_t ktls_tx_trimmed_pkts;
+	atomic64_t ktls_tx_fallback;
 };
 #endif
 
diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index a8062e038ebc..b182c940b4a0 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -1545,6 +1545,88 @@ static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info,
 	return 0;
 }
 
+static int chcr_ktls_tunnel_pkt(struct chcr_ktls_info *tx_info,
+				struct sk_buff *skb,
+				struct sge_eth_txq *q)
+{
+	u32 ctrl, iplen, maclen, wr_mid = 0, len16;
+	struct tx_sw_desc *sgl_sdesc;
+	struct fw_eth_tx_pkt_wr *wr;
+	struct cpl_tx_pkt_core *cpl;
+	unsigned int flits, ndesc;
+	int credits, last_desc;
+	u64 cntrl1, *end;
+	void *pos;
+
+	ctrl = sizeof(*cpl);
+	flits = DIV_ROUND_UP(sizeof(*wr) + ctrl, 8);
+
+	flits += chcr_sgl_len(skb_shinfo(skb)->nr_frags + 1);
+	len16 = DIV_ROUND_UP(flits, 2);
+	/* check how many descriptors needed */
+	ndesc = DIV_ROUND_UP(flits, 8);
+
+	credits = chcr_txq_avail(&q->q) - ndesc;
+	if (unlikely(credits < 0)) {
+		chcr_eth_txq_stop(q);
+		return -ENOMEM;
+	}
+
+	if (unlikely(credits < ETHTXQ_STOP_THRES)) {
+		chcr_eth_txq_stop(q);
+		wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F;
+	}
+
+	last_desc = q->q.pidx + ndesc - 1;
+	if (last_desc >= q->q.size)
+		last_desc -= q->q.size;
+	sgl_sdesc = &q->q.sdesc[last_desc];
+
+	if (unlikely(cxgb4_map_skb(tx_info->adap->pdev_dev, skb,
+				   sgl_sdesc->addr) < 0)) {
+		memset(sgl_sdesc->addr, 0, sizeof(sgl_sdesc->addr));
+		q->mapping_err++;
+		return -ENOMEM;
+	}
+
+	iplen = skb_network_header_len(skb);
+	maclen = skb_mac_header_len(skb);
+
+	pos = &q->q.desc[q->q.pidx];
+	end = (u64 *)pos + flits;
+	wr = pos;
+
+	/* Firmware work request header */
+	wr->op_immdlen = htonl(FW_WR_OP_V(FW_ETH_TX_PKT_WR) |
+			       FW_WR_IMMDLEN_V(ctrl));
+
+	wr->equiq_to_len16 = htonl(wr_mid | FW_WR_LEN16_V(len16));
+	wr->r3 = 0;
+
+	cpl = (void *)(wr + 1);
+
+	/* CPL header */
+	cpl->ctrl0 = htonl(TXPKT_OPCODE_V(CPL_TX_PKT) |
+			   TXPKT_INTF_V(tx_info->tx_chan) |
+			   TXPKT_PF_V(tx_info->adap->pf));
+	cpl->pack = 0;
+	cntrl1 = TXPKT_CSUM_TYPE_V(tx_info->ip_family == AF_INET ?
+				   TX_CSUM_TCPIP : TX_CSUM_TCPIP6);
+	cntrl1 |= T6_TXPKT_ETHHDR_LEN_V(maclen - ETH_HLEN) |
+		  TXPKT_IPHDR_LEN_V(iplen);
+	/* checksum offload */
+	cpl->ctrl1 = cpu_to_be64(cntrl1);
+	cpl->len = htons(skb->len);
+
+	pos = cpl + 1;
+
+	cxgb4_write_sgl(skb, &q->q, pos, end, 0, sgl_sdesc->addr);
+	sgl_sdesc->skb = skb;
+	chcr_txq_advance(&q->q, ndesc);
+	cxgb4_ring_tx_db(tx_info->adap, &q->q, ndesc);
+	return 0;
+}
+
 /*
  * chcr_ktls_copy_record_in_skb
  * @nskb - new skb where the frags to be added.
@@ -1733,7 +1815,7 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 				      (TLS_CIPHER_AES_GCM_128_TAG_SIZE -
 				       remaining_record);
 		if (!trimmed_len)
-			goto out;
+			return FALLBACK;
 
 		WARN_ON(trimmed_len > data_len);
 
@@ -1837,6 +1919,34 @@ out:
 	return NETDEV_TX_BUSY;
 }
 
+static int chcr_ktls_sw_fallback(struct sk_buff *skb,
+				 struct chcr_ktls_info *tx_info,
+				 struct sge_eth_txq *q)
+{
+	u32 data_len, skb_offset;
+	struct sk_buff *nskb;
+	struct tcphdr *th;
+
+	nskb = tls_encrypt_skb(skb);
+
+	if (!nskb)
+		return 0;
+
+	th = tcp_hdr(nskb);
+	skb_offset =  skb_transport_offset(nskb) + tcp_hdrlen(nskb);
+	data_len = nskb->len - skb_offset;
+	skb_tx_timestamp(nskb);
+
+	if (chcr_ktls_tunnel_pkt(tx_info, nskb, q))
+		goto out;
+
+	tx_info->prev_seq = ntohl(th->seq) + data_len;
+	atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_fallback);
+	return 0;
+out:
+	dev_kfree_skb_any(nskb);
+	return 0;
+}
 /* nic tls TX handler */
 static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 {
@@ -2012,6 +2122,10 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 		if (ret) {
 			if (th->fin)
 				dev_kfree_skb_any(skb);
+
+			if (ret == FALLBACK)
+				return chcr_ktls_sw_fallback(skb, tx_info, q);
+
 			return NETDEV_TX_OK;
 		}
 
diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.h b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.h
index c1651b1431a0..18b3b1f02415 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.h
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.h
@@ -26,6 +26,7 @@
 
 #define CHCR_KTLS_WR_SIZE	(CHCR_PLAIN_TX_DATA_LEN +\
 				 sizeof(struct cpl_tx_sec_pdu))
+#define FALLBACK		35
 
 enum ch_ktls_open_state {
 	CH_KTLS_OPEN_SUCCESS = 0,
commit 659bf0383d15b07e492e27443d87736b24171558
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:39 2020 +0530

    ch_ktls: don't free skb before sending FIN
    
    If its a last packet and fin is set. Make sure FIN is informed
    to HW before skb gets freed.
    
    Fixes: 429765a149f1 ("chcr: handle partial end part of a record")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index bbda71b7f98b..a8062e038ebc 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -1932,6 +1932,9 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 						       flags);
 				goto out;
 			}
+
+			if (th->fin)
+				skb_get(skb);
 		}
 
 		if (unlikely(tls_record_is_start_marker(record))) {
@@ -2006,8 +2009,11 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 			__skb_frag_unref(&record->frags[i]);
 		}
 		/* if any failure, come out from the loop. */
-		if (ret)
+		if (ret) {
+			if (th->fin)
+				dev_kfree_skb_any(skb);
 			return NETDEV_TX_OK;
+		}
 
 		/* length should never be less than 0 */
 		WARN_ON(data_len < 0);
@@ -2020,8 +2026,10 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 	/* tcp finish is set, send a separate tcp msg including all the options
 	 * as well.
 	 */
-	if (th->fin)
+	if (th->fin) {
 		chcr_ktls_write_tcp_options(tx_info, skb, q, tx_info->tx_chan);
+		dev_kfree_skb_any(skb);
+	}
 
 	return NETDEV_TX_OK;
 out:
commit 9478e083941c873d60a97b232760a14dec6c69d3
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:38 2020 +0530

    ch_ktls: packet handling prior to start marker
    
    There could be a case where ACK for tls exchanges prior to start
    marker is missed out, and by the time tls is offloaded. This pkt
    should not be discarded and handled carefully. It could be
    plaintext alone or plaintext + finish as well.
    
    Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 026c66599d1e..bbda71b7f98b 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -1909,11 +1909,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 			goto out;
 		}
 
-		if (unlikely(tls_record_is_start_marker(record))) {
-			spin_unlock_irqrestore(&tx_ctx->base.lock, flags);
-			atomic64_inc(&port_stats->ktls_tx_skip_no_sync_data);
-			goto out;
-		}
 		tls_end_offset = record->end_seq - tcp_seq;
 
 		pr_debug("seq 0x%x, end_seq 0x%x prev_seq 0x%x, datalen 0x%x\n",
@@ -1938,6 +1933,39 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 				goto out;
 			}
 		}
+
+		if (unlikely(tls_record_is_start_marker(record))) {
+			atomic64_inc(&port_stats->ktls_tx_skip_no_sync_data);
+			/* If tls_end_offset < data_len, means there is some
+			 * data after start marker, which needs encryption, send
+			 * plaintext first and take skb refcount. else send out
+			 * complete pkt as plaintext.
+			 */
+			if (tls_end_offset < data_len)
+				skb_get(skb);
+			else
+				tls_end_offset = data_len;
+
+			ret = chcr_ktls_tx_plaintxt(tx_info, skb, tcp_seq, mss,
+						    (!th->fin && th->psh), q,
+						    tx_info->port_id, NULL,
+						    tls_end_offset, skb_offset,
+						    0);
+
+			spin_unlock_irqrestore(&tx_ctx->base.lock, flags);
+			if (ret) {
+				/* free the refcount taken earlier */
+				if (tls_end_offset < data_len)
+					dev_kfree_skb_any(skb);
+				goto out;
+			}
+
+			data_len -= tls_end_offset;
+			tcp_seq = record->end_seq;
+			skb_offset += tls_end_offset;
+			continue;
+		}
+
 		/* increase page reference count of the record, so that there
 		 * won't be any chance of page free in middle if in case stack
 		 * receives ACK and try to delete the record.
commit 63ee4591fa2f97dc08ce37514f214fc0430e9dc3
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:37 2020 +0530

    ch_ktls: Correction in middle record handling
    
    If a record starts in middle, reset TCB UNA so that we could
    avoid sending out extra packet which is needed to make it 16
    byte aligned to start AES CTR.
    Check also considers prev_seq, which should be what is
    actually sent, not the skb data length.
    Avoid updating partial TAG to HW at any point of time, that's
    why we need to check if remaining part is smaller than TAG
    size, then reset TX_MAX to be TAG starting sequence number.
    
    Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 8a54fce9bfae..026c66599d1e 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -827,7 +827,7 @@ static void *chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info,
  */
 static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 				   struct sge_eth_txq *q, u64 tcp_seq,
-				   u64 tcp_ack, u64 tcp_win)
+				   u64 tcp_ack, u64 tcp_win, bool offset)
 {
 	bool first_wr = ((tx_info->prev_ack == 0) && (tx_info->prev_win == 0));
 	struct ch_ktls_port_stats_debug *port_stats;
@@ -862,7 +862,7 @@ static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 		cpl++;
 	}
 	/* reset snd una if it's a re-transmit pkt */
-	if (tcp_seq != tx_info->prev_seq) {
+	if (tcp_seq != tx_info->prev_seq || offset) {
 		/* reset snd_una */
 		port_stats =
 			&tx_info->adap->ch_ktls_stats.ktls_port[tx_info->port_id];
@@ -871,7 +871,8 @@ static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 						 TCB_SND_UNA_RAW_V
 						 (TCB_SND_UNA_RAW_M),
 						 TCB_SND_UNA_RAW_V(0), 0);
-		atomic64_inc(&port_stats->ktls_tx_ooo);
+		if (tcp_seq != tx_info->prev_seq)
+			atomic64_inc(&port_stats->ktls_tx_ooo);
 		cpl++;
 	}
 	/* update ack */
@@ -1661,11 +1662,6 @@ static int chcr_end_part_handler(struct chcr_ktls_info *tx_info,
 		 * accordingly.
 		 */
 		tcp_seq = tls_record_start_seq(record);
-		/* reset snd una, so the middle record won't send the already
-		 * sent part.
-		 */
-		if (chcr_ktls_update_snd_una(tx_info, q))
-			goto out;
 		/* reset skb offset */
 		skb_offset = 0;
 
@@ -1684,6 +1680,7 @@ static int chcr_end_part_handler(struct chcr_ktls_info *tx_info,
 				       mss)) {
 		goto out;
 	}
+	tx_info->prev_seq = record->end_seq;
 	return 0;
 out:
 	dev_kfree_skb_any(nskb);
@@ -1752,6 +1749,7 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 					  data_len, skb_offset, prior_data_len))
 			goto out;
 
+		tx_info->prev_seq = tcp_seq + data_len;
 		return 0;
 	}
 
@@ -1832,6 +1830,7 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 		goto out;
 	}
 
+	tx_info->prev_seq = tcp_seq + data_len + prior_data_len;
 	return 0;
 out:
 	dev_kfree_skb_any(skb);
@@ -1885,13 +1884,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 		if (ret)
 			return NETDEV_TX_BUSY;
 	}
-	/* update tcb */
-	ret = chcr_ktls_xmit_tcb_cpls(tx_info, q, ntohl(th->seq),
-				      ntohl(th->ack_seq),
-				      ntohs(th->window));
-	if (ret) {
-		return NETDEV_TX_BUSY;
-	}
 
 	/* TCP segments can be in received either complete or partial.
 	 * chcr_end_part_handler will handle cases if complete record or end
@@ -1922,6 +1914,30 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 			atomic64_inc(&port_stats->ktls_tx_skip_no_sync_data);
 			goto out;
 		}
+		tls_end_offset = record->end_seq - tcp_seq;
+
+		pr_debug("seq 0x%x, end_seq 0x%x prev_seq 0x%x, datalen 0x%x\n",
+			 tcp_seq, record->end_seq, tx_info->prev_seq, data_len);
+		/* update tcb for the skb */
+		if (skb_data_len == data_len) {
+			u32 tx_max = tcp_seq;
+
+			if (!tls_record_is_start_marker(record) &&
+			    tls_end_offset < TLS_CIPHER_AES_GCM_128_TAG_SIZE)
+				tx_max = record->end_seq -
+					TLS_CIPHER_AES_GCM_128_TAG_SIZE;
+
+			ret = chcr_ktls_xmit_tcb_cpls(tx_info, q, tx_max,
+						      ntohl(th->ack_seq),
+						      ntohs(th->window),
+						      tls_end_offset !=
+						      record->len);
+			if (ret) {
+				spin_unlock_irqrestore(&tx_ctx->base.lock,
+						       flags);
+				goto out;
+			}
+		}
 		/* increase page reference count of the record, so that there
 		 * won't be any chance of page free in middle if in case stack
 		 * receives ACK and try to delete the record.
@@ -1931,10 +1947,7 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 		/* lock cleared */
 		spin_unlock_irqrestore(&tx_ctx->base.lock, flags);
 
-		tls_end_offset = record->end_seq - tcp_seq;
 
-		pr_debug("seq 0x%x, end_seq 0x%x prev_seq 0x%x, datalen 0x%x\n",
-			 tcp_seq, record->end_seq, tx_info->prev_seq, data_len);
 		/* if a tls record is finishing in this SKB */
 		if (tls_end_offset <= data_len) {
 			ret = chcr_end_part_handler(tx_info, skb, record,
@@ -1973,7 +1986,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 
 	} while (data_len > 0);
 
-	tx_info->prev_seq = ntohl(th->seq) + skb_data_len;
 	atomic64_inc(&port_stats->ktls_tx_encrypted_packets);
 	atomic64_add(skb_data_len, &port_stats->ktls_tx_encrypted_bytes);
 
commit 83deb094dd5c636a790da3914008570c9fd1693f
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:36 2020 +0530

    ch_ktls: missing handling of header alone
    
    If an skb has only header part which doesn't start from
    beginning, is not being handled properly.
    
    Fixes: dc05f3df8fac ("chcr: Handle first or middle part of record")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 4286decce095..8a54fce9bfae 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -1744,6 +1744,17 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 		atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_trimmed_pkts);
 	}
 
+	/* check if it is only the header part. */
+	if (tls_rec_offset + data_len <= (TLS_HEADER_SIZE + tx_info->iv_size)) {
+		if (chcr_ktls_tx_plaintxt(tx_info, skb, tcp_seq, mss,
+					  tcp_push_no_fin, q,
+					  tx_info->port_id, prior_data,
+					  data_len, skb_offset, prior_data_len))
+			goto out;
+
+		return 0;
+	}
+
 	/* check if the middle record's start point is 16 byte aligned. CTR
 	 * needs 16 byte aligned start point to start encryption.
 	 */
@@ -1812,20 +1823,6 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 			goto out;
 		atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_middle_pkts);
 	} else {
-		/* Else means, its a partial first part of the record. Check if
-		 * its only the header, don't need to send for encryption then.
-		 */
-		if (data_len <= TLS_HEADER_SIZE + tx_info->iv_size) {
-			if (chcr_ktls_tx_plaintxt(tx_info, skb, tcp_seq, mss,
-						  tcp_push_no_fin, q,
-						  tx_info->port_id,
-						  prior_data,
-						  data_len, skb_offset,
-						  prior_data_len)) {
-				goto out;
-			}
-			return 0;
-		}
 		atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_start_pkts);
 	}
 
commit c68a28a9e2798a4602dde1c77046a3b577eb31f4
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:35 2020 +0530

    ch_ktls: Correction in trimmed_len calculation
    
    trimmed length calculation goes wrong if skb has only tag part
    to send. It should be zero if there is no data bytes apart from
    TAG.
    
    Fixes: dc05f3df8fac ("chcr: Handle first or middle part of record")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 950841988ffe..4286decce095 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -1729,10 +1729,13 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 
 	if (remaining_record > 0 &&
 	    remaining_record < TLS_CIPHER_AES_GCM_128_TAG_SIZE) {
-		int trimmed_len = data_len -
-			(TLS_CIPHER_AES_GCM_128_TAG_SIZE - remaining_record);
-		/* don't process the pkt if it is only a partial tag */
-		if (data_len < TLS_CIPHER_AES_GCM_128_TAG_SIZE)
+		int trimmed_len = 0;
+
+		if (tls_end_offset > TLS_CIPHER_AES_GCM_128_TAG_SIZE)
+			trimmed_len = data_len -
+				      (TLS_CIPHER_AES_GCM_128_TAG_SIZE -
+				       remaining_record);
+		if (!trimmed_len)
 			goto out;
 
 		WARN_ON(trimmed_len > data_len);
commit 687823d2d104df8226eacba74fda9f4ba3aecd6c
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:34 2020 +0530

    cxgb4/ch_ktls: creating skbs causes panic
    
    Creating SKB per tls record and freeing the original one causes
    panic. There will be race if connection reset is requested. By
    freeing original skb, refcnt will be decremented and that means,
    there is no pending record to send, and so tls_dev_del will be
    requested in control path while SKB of related connection is in
    queue.
     Better approach is to use same SKB to send one record (partial
    data) at a time. We still have to create a new SKB when partial
    last part of a record is requested.
     This fix introduces new API cxgb4_write_partial_sgl() to send
    partial part of skb. Present cxgb4_write_sgl can only provide
    feasibility to start from an offset which limits to header only
    and it can write sgls for the whole skb len. But this new API
    will help in both. It can start from any offset and can end
    writing in middle of the skb.
    
    v4->v5:
    - Removed extra changes.
    
    Fixes: 429765a149f1 ("chcr: handle partial end part of a record")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 3352dad6ca99..27308600da15 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -2124,6 +2124,9 @@ void cxgb4_inline_tx_skb(const struct sk_buff *skb, const struct sge_txq *q,
 void cxgb4_write_sgl(const struct sk_buff *skb, struct sge_txq *q,
 		     struct ulptx_sgl *sgl, u64 *end, unsigned int start,
 		     const dma_addr_t *addr);
+void cxgb4_write_partial_sgl(const struct sk_buff *skb, struct sge_txq *q,
+			     struct ulptx_sgl *sgl, u64 *end,
+			     const dma_addr_t *addr, u32 start, u32 send_len);
 void cxgb4_ring_tx_db(struct adapter *adap, struct sge_txq *q, int n);
 int t4_set_vlan_acl(struct adapter *adap, unsigned int mbox, unsigned int vf,
 		    u16 vlan);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
index 01bd9c0dfe4e..196652a114c5 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
@@ -890,6 +890,114 @@ void cxgb4_write_sgl(const struct sk_buff *skb, struct sge_txq *q,
 }
 EXPORT_SYMBOL(cxgb4_write_sgl);
 
+/*	cxgb4_write_partial_sgl - populate SGL for partial packet
+ *	@skb: the packet
+ *	@q: the Tx queue we are writing into
+ *	@sgl: starting location for writing the SGL
+ *	@end: points right after the end of the SGL
+ *	@addr: the list of bus addresses for the SGL elements
+ *	@start: start offset in the SKB where partial data starts
+ *	@len: length of data from @start to send out
+ *
+ *	This API will handle sending out partial data of a skb if required.
+ *	Unlike cxgb4_write_sgl, @start can be any offset into the skb data,
+ *	and @len will decide how much data after @start offset to send out.
+ */
+void cxgb4_write_partial_sgl(const struct sk_buff *skb, struct sge_txq *q,
+			     struct ulptx_sgl *sgl, u64 *end,
+			     const dma_addr_t *addr, u32 start, u32 len)
+{
+	struct ulptx_sge_pair buf[MAX_SKB_FRAGS / 2 + 1] = {0}, *to;
+	u32 frag_size, skb_linear_data_len = skb_headlen(skb);
+	struct skb_shared_info *si = skb_shinfo(skb);
+	u8 i = 0, frag_idx = 0, nfrags = 0;
+	skb_frag_t *frag;
+
+	/* Fill the first SGL either from linear data or from partial
+	 * frag based on @start.
+	 */
+	if (unlikely(start < skb_linear_data_len)) {
+		frag_size = min(len, skb_linear_data_len - start);
+		sgl->len0 = htonl(frag_size);
+		sgl->addr0 = cpu_to_be64(addr[0] + start);
+		len -= frag_size;
+		nfrags++;
+	} else {
+		start -= skb_linear_data_len;
+		frag = &si->frags[frag_idx];
+		frag_size = skb_frag_size(frag);
+		/* find the first frag */
+		while (start >= frag_size) {
+			start -= frag_size;
+			frag_idx++;
+			frag = &si->frags[frag_idx];
+			frag_size = skb_frag_size(frag);
+		}
+
+		frag_size = min(len, skb_frag_size(frag) - start);
+		sgl->len0 = cpu_to_be32(frag_size);
+		sgl->addr0 = cpu_to_be64(addr[frag_idx + 1] + start);
+		len -= frag_size;
+		nfrags++;
+		frag_idx++;
+	}
+
+	/* If the entire partial data fit in one SGL, then send it out
+	 * now.
+	 */
+	if (!len)
+		goto done;
+
+	/* Most of the complexity below deals with the possibility we hit the
+	 * end of the queue in the middle of writing the SGL.  For this case
+	 * only we create the SGL in a temporary buffer and then copy it.
+	 */
+	to = (u8 *)end > (u8 *)q->stat ? buf : sgl->sge;
+
+	/* If the skb couldn't fit in first SGL completely, fill the
+	 * rest of the frags in subsequent SGLs. Note that each SGL
+	 * pair can store 2 frags.
+	 */
+	while (len) {
+		frag_size = min(len, skb_frag_size(&si->frags[frag_idx]));
+		to->len[i & 1] = cpu_to_be32(frag_size);
+		to->addr[i & 1] = cpu_to_be64(addr[frag_idx + 1]);
+		if (i && (i & 1))
+			to++;
+		nfrags++;
+		frag_idx++;
+		i++;
+		len -= frag_size;
+	}
+
+	/* If we ended in an odd boundary, then set the second SGL's
+	 * length in the pair to 0.
+	 */
+	if (i & 1)
+		to->len[1] = cpu_to_be32(0);
+
+	/* Copy from temporary buffer to Tx ring, in case we hit the
+	 * end of the queue in the middle of writing the SGL.
+	 */
+	if (unlikely((u8 *)end > (u8 *)q->stat)) {
+		u32 part0 = (u8 *)q->stat - (u8 *)sgl->sge, part1;
+
+		if (likely(part0))
+			memcpy(sgl->sge, buf, part0);
+		part1 = (u8 *)end - (u8 *)q->stat;
+		memcpy(q->desc, (u8 *)buf + part0, part1);
+		end = (void *)q->desc + part1;
+	}
+
+	/* 0-pad to multiple of 16 */
+	if ((uintptr_t)end & 8)
+		*end = 0;
+done:
+	sgl->cmd_nsge = htonl(ULPTX_CMD_V(ULP_TX_SC_DSGL) |
+			ULPTX_NSGE_V(nfrags));
+}
+EXPORT_SYMBOL(cxgb4_write_partial_sgl);
+
 /* This function copies 64 byte coalesced work request to
  * memory mapped BAR2 space. For coalesced WR SGE fetches
  * data from the FIFO instead of from Host.
diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index b7a3e757ee72..950841988ffe 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -14,6 +14,50 @@
 static LIST_HEAD(uld_ctx_list);
 static DEFINE_MUTEX(dev_mutex);
 
+/* chcr_get_nfrags_to_send: get the remaining nfrags after start offset
+ * @skb: skb
+ * @start: start offset.
+ * @len: how much data to send after @start
+ */
+static int chcr_get_nfrags_to_send(struct sk_buff *skb, u32 start, u32 len)
+{
+	struct skb_shared_info *si = skb_shinfo(skb);
+	u32 frag_size, skb_linear_data_len = skb_headlen(skb);
+	u8 nfrags = 0, frag_idx = 0;
+	skb_frag_t *frag;
+
+	/* if its a linear skb then return 1 */
+	if (!skb_is_nonlinear(skb))
+		return 1;
+
+	if (unlikely(start < skb_linear_data_len)) {
+		frag_size = min(len, skb_linear_data_len - start);
+		start = 0;
+	} else {
+		start -= skb_linear_data_len;
+
+		frag = &si->frags[frag_idx];
+		frag_size = skb_frag_size(frag);
+		while (start >= frag_size) {
+			start -= frag_size;
+			frag_idx++;
+			frag = &si->frags[frag_idx];
+			frag_size = skb_frag_size(frag);
+		}
+		frag_size = min(len, skb_frag_size(frag) - start);
+	}
+	len -= frag_size;
+	nfrags++;
+
+	while (len) {
+		frag_size = min(len, skb_frag_size(&si->frags[frag_idx]));
+		len -= frag_size;
+		nfrags++;
+		frag_idx++;
+	}
+	return nfrags;
+}
+
 static int chcr_init_tcb_fields(struct chcr_ktls_info *tx_info);
 /*
  * chcr_ktls_save_keys: calculate and save crypto keys.
@@ -865,35 +909,15 @@ static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info,
 	return 0;
 }
 
-/*
- * chcr_ktls_skb_copy
- * @nskb - new skb where the frags to be added.
- * @skb - old skb from which frags will be copied.
- */
-static void chcr_ktls_skb_copy(struct sk_buff *skb, struct sk_buff *nskb)
-{
-	int i;
-
-	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-		skb_shinfo(nskb)->frags[i] = skb_shinfo(skb)->frags[i];
-		__skb_frag_ref(&skb_shinfo(nskb)->frags[i]);
-	}
-
-	skb_shinfo(nskb)->nr_frags = skb_shinfo(skb)->nr_frags;
-	nskb->len += skb->data_len;
-	nskb->data_len = skb->data_len;
-	nskb->truesize += skb->data_len;
-}
-
 /*
  * chcr_ktls_get_tx_flits
  * returns number of flits to be sent out, it includes key context length, WR
  * size and skb fragments.
  */
 static unsigned int
-chcr_ktls_get_tx_flits(const struct sk_buff *skb, unsigned int key_ctx_len)
+chcr_ktls_get_tx_flits(u32 nr_frags, unsigned int key_ctx_len)
 {
-	return chcr_sgl_len(skb_shinfo(skb)->nr_frags) +
+	return chcr_sgl_len(nr_frags) +
 	       DIV_ROUND_UP(key_ctx_len + CHCR_KTLS_WR_SIZE, 8);
 }
 
@@ -1038,71 +1062,6 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	return 0;
 }
 
-/* chcr_ktls_skb_shift - Shifts request length paged data from skb to another.
- * @tgt- buffer into which tail data gets added
- * @skb- buffer from which the paged data comes from
- * @shiftlen- shift up to this many bytes
- */
-static int chcr_ktls_skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
-			       int shiftlen)
-{
-	skb_frag_t *fragfrom, *fragto;
-	int from, to, todo;
-
-	WARN_ON(shiftlen > skb->data_len);
-
-	todo = shiftlen;
-	from = 0;
-	to = 0;
-	fragfrom = &skb_shinfo(skb)->frags[from];
-
-	while ((todo > 0) && (from < skb_shinfo(skb)->nr_frags)) {
-		fragfrom = &skb_shinfo(skb)->frags[from];
-		fragto = &skb_shinfo(tgt)->frags[to];
-
-		if (todo >= skb_frag_size(fragfrom)) {
-			*fragto = *fragfrom;
-			todo -= skb_frag_size(fragfrom);
-			from++;
-			to++;
-
-		} else {
-			__skb_frag_ref(fragfrom);
-			skb_frag_page_copy(fragto, fragfrom);
-			skb_frag_off_copy(fragto, fragfrom);
-			skb_frag_size_set(fragto, todo);
-
-			skb_frag_off_add(fragfrom, todo);
-			skb_frag_size_sub(fragfrom, todo);
-			todo = 0;
-
-			to++;
-			break;
-		}
-	}
-
-	/* Ready to "commit" this state change to tgt */
-	skb_shinfo(tgt)->nr_frags = to;
-
-	/* Reposition in the original skb */
-	to = 0;
-	while (from < skb_shinfo(skb)->nr_frags)
-		skb_shinfo(skb)->frags[to++] = skb_shinfo(skb)->frags[from++];
-
-	skb_shinfo(skb)->nr_frags = to;
-
-	WARN_ON(todo > 0 && !skb_shinfo(skb)->nr_frags);
-
-	skb->len -= shiftlen;
-	skb->data_len -= shiftlen;
-	skb->truesize -= shiftlen;
-	tgt->len += shiftlen;
-	tgt->data_len += shiftlen;
-	tgt->truesize += shiftlen;
-
-	return shiftlen;
-}
-
 /*
  * chcr_ktls_xmit_wr_complete: This sends out the complete record. If an skb
  * received has partial end part of the record, send out the complete record, so
@@ -1118,6 +1077,8 @@ static int chcr_ktls_skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
 static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb,
 				      struct chcr_ktls_info *tx_info,
 				      struct sge_eth_txq *q, u32 tcp_seq,
+				      bool is_last_wr, u32 data_len,
+				      u32 skb_offset, u32 nfrags,
 				      bool tcp_push, u32 mss)
 {
 	u32 len16, wr_mid = 0, flits = 0, ndesc, cipher_start;
@@ -1133,7 +1094,7 @@ static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb,
 	u64 *end;
 
 	/* get the number of flits required */
-	flits = chcr_ktls_get_tx_flits(skb, tx_info->key_ctx_len);
+	flits = chcr_ktls_get_tx_flits(nfrags, tx_info->key_ctx_len);
 	/* number of descriptors */
 	ndesc = chcr_flits_to_desc(flits);
 	/* check if enough credits available */
@@ -1162,6 +1123,9 @@ static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb,
 		return NETDEV_TX_BUSY;
 	}
 
+	if (!is_last_wr)
+		skb_get(skb);
+
 	pos = &q->q.desc[q->q.pidx];
 	end = (u64 *)pos + flits;
 	/* FW_ULPTX_WR */
@@ -1194,7 +1158,7 @@ static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb,
 		      CPL_TX_SEC_PDU_CPLLEN_V(CHCR_CPL_TX_SEC_PDU_LEN_64BIT) |
 		      CPL_TX_SEC_PDU_PLACEHOLDER_V(1) |
 		      CPL_TX_SEC_PDU_IVINSRTOFST_V(TLS_HEADER_SIZE + 1));
-	cpl->pldlen = htonl(skb->data_len);
+	cpl->pldlen = htonl(data_len);
 
 	/* encryption should start after tls header size + iv size */
 	cipher_start = TLS_HEADER_SIZE + tx_info->iv_size + 1;
@@ -1236,7 +1200,7 @@ static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb,
 	/* CPL_TX_DATA */
 	tx_data = (void *)pos;
 	OPCODE_TID(tx_data) = htonl(MK_OPCODE_TID(CPL_TX_DATA, tx_info->tid));
-	tx_data->len = htonl(TX_DATA_MSS_V(mss) | TX_LENGTH_V(skb->data_len));
+	tx_data->len = htonl(TX_DATA_MSS_V(mss) | TX_LENGTH_V(data_len));
 
 	tx_data->rsvd = htonl(tcp_seq);
 
@@ -1256,8 +1220,8 @@ static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb,
 	}
 
 	/* send the complete packet except the header */
-	cxgb4_write_sgl(skb, &q->q, pos, end, skb->len - skb->data_len,
-			sgl_sdesc->addr);
+	cxgb4_write_partial_sgl(skb, &q->q, pos, end, sgl_sdesc->addr,
+				skb_offset, data_len);
 	sgl_sdesc->skb = skb;
 
 	chcr_txq_advance(&q->q, ndesc);
@@ -1289,10 +1253,11 @@ static int chcr_ktls_xmit_wr_short(struct sk_buff *skb,
 				   struct sge_eth_txq *q,
 				   u32 tcp_seq, bool tcp_push, u32 mss,
 				   u32 tls_rec_offset, u8 *prior_data,
-				   u32 prior_data_len)
+				   u32 prior_data_len, u32 data_len,
+				   u32 skb_offset)
 {
+	u32 len16, wr_mid = 0, cipher_start, nfrags;
 	struct adapter *adap = tx_info->adap;
-	u32 len16, wr_mid = 0, cipher_start;
 	unsigned int flits = 0, ndesc;
 	int credits, left, last_desc;
 	struct tx_sw_desc *sgl_sdesc;
@@ -1305,10 +1270,11 @@ static int chcr_ktls_xmit_wr_short(struct sk_buff *skb,
 	void *pos;
 	u64 *end;
 
+	nfrags = chcr_get_nfrags_to_send(skb, skb_offset, data_len);
 	/* get the number of flits required, it's a partial record so 2 flits
 	 * (AES_BLOCK_SIZE) will be added.
 	 */
-	flits = chcr_ktls_get_tx_flits(skb, tx_info->key_ctx_len) + 2;
+	flits = chcr_ktls_get_tx_flits(nfrags, tx_info->key_ctx_len) + 2;
 	/* get the correct 8 byte IV of this record */
 	iv_record = cpu_to_be64(tx_info->iv + tx_info->record_no);
 	/* If it's a middle record and not 16 byte aligned to run AES CTR, need
@@ -1380,7 +1346,7 @@ static int chcr_ktls_xmit_wr_short(struct sk_buff *skb,
 		htonl(CPL_TX_SEC_PDU_OPCODE_V(CPL_TX_SEC_PDU) |
 		      CPL_TX_SEC_PDU_CPLLEN_V(CHCR_CPL_TX_SEC_PDU_LEN_64BIT) |
 		      CPL_TX_SEC_PDU_IVINSRTOFST_V(1));
-	cpl->pldlen = htonl(skb->data_len + AES_BLOCK_LEN + prior_data_len);
+	cpl->pldlen = htonl(data_len + AES_BLOCK_LEN + prior_data_len);
 	cpl->aadstart_cipherstop_hi =
 		htonl(CPL_TX_SEC_PDU_CIPHERSTART_V(cipher_start));
 	cpl->cipherstop_lo_authinsert = 0;
@@ -1411,7 +1377,7 @@ static int chcr_ktls_xmit_wr_short(struct sk_buff *skb,
 	tx_data = (void *)pos;
 	OPCODE_TID(tx_data) = htonl(MK_OPCODE_TID(CPL_TX_DATA, tx_info->tid));
 	tx_data->len = htonl(TX_DATA_MSS_V(mss) |
-			TX_LENGTH_V(skb->data_len + prior_data_len));
+			     TX_LENGTH_V(data_len + prior_data_len));
 	tx_data->rsvd = htonl(tcp_seq);
 	tx_data->flags = htonl(TX_BYPASS_F);
 	if (tcp_push)
@@ -1444,8 +1410,8 @@ static int chcr_ktls_xmit_wr_short(struct sk_buff *skb,
 	if (prior_data_len)
 		pos = chcr_copy_to_txd(prior_data, &q->q, pos, 16);
 	/* send the complete packet except the header */
-	cxgb4_write_sgl(skb, &q->q, pos, end, skb->len - skb->data_len,
-			sgl_sdesc->addr);
+	cxgb4_write_partial_sgl(skb, &q->q, pos, end, sgl_sdesc->addr,
+				skb_offset, data_len);
 	sgl_sdesc->skb = skb;
 
 	chcr_txq_advance(&q->q, ndesc);
@@ -1473,6 +1439,7 @@ static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info,
 				 struct sk_buff *skb, u32 tcp_seq, u32 mss,
 				 bool tcp_push, struct sge_eth_txq *q,
 				 u32 port_id, u8 *prior_data,
+				 u32 data_len, u32 skb_offset,
 				 u32 prior_data_len)
 {
 	int credits, left, len16, last_desc;
@@ -1482,14 +1449,16 @@ static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info,
 	struct ulptx_idata *idata;
 	struct ulp_txpkt *ulptx;
 	struct fw_ulptx_wr *wr;
-	u32 wr_mid = 0;
+	u32 wr_mid = 0, nfrags;
 	void *pos;
 	u64 *end;
 
 	flits = DIV_ROUND_UP(CHCR_PLAIN_TX_DATA_LEN, 8);
-	flits += chcr_sgl_len(skb_shinfo(skb)->nr_frags);
+	nfrags = chcr_get_nfrags_to_send(skb, skb_offset, data_len);
+	flits += chcr_sgl_len(nfrags);
 	if (prior_data_len)
 		flits += 2;
+
 	/* WR will need len16 */
 	len16 = DIV_ROUND_UP(flits, 2);
 	/* check how many descriptors needed */
@@ -1542,7 +1511,7 @@ static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info,
 	tx_data = (struct cpl_tx_data *)(idata + 1);
 	OPCODE_TID(tx_data) = htonl(MK_OPCODE_TID(CPL_TX_DATA, tx_info->tid));
 	tx_data->len = htonl(TX_DATA_MSS_V(mss) |
-			TX_LENGTH_V(skb->data_len + prior_data_len));
+			     TX_LENGTH_V(data_len + prior_data_len));
 	/* set tcp seq number */
 	tx_data->rsvd = htonl(tcp_seq);
 	tx_data->flags = htonl(TX_BYPASS_F);
@@ -1566,8 +1535,8 @@ static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info,
 		end = pos + left;
 	}
 	/* send the complete packet including the header */
-	cxgb4_write_sgl(skb, &q->q, pos, end, skb->len - skb->data_len,
-			sgl_sdesc->addr);
+	cxgb4_write_partial_sgl(skb, &q->q, pos, end, sgl_sdesc->addr,
+				skb_offset, data_len);
 	sgl_sdesc->skb = skb;
 
 	chcr_txq_advance(&q->q, ndesc);
@@ -1578,9 +1547,11 @@ static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info,
 /*
  * chcr_ktls_copy_record_in_skb
  * @nskb - new skb where the frags to be added.
+ * @skb - old skb, to copy socket and destructor details.
  * @record - specific record which has complete 16k record in frags.
  */
 static void chcr_ktls_copy_record_in_skb(struct sk_buff *nskb,
+					 struct sk_buff *skb,
 					 struct tls_record_info *record)
 {
 	int i = 0;
@@ -1595,6 +1566,9 @@ static void chcr_ktls_copy_record_in_skb(struct sk_buff *nskb,
 	nskb->data_len = record->len;
 	nskb->len += record->len;
 	nskb->truesize += record->len;
+	nskb->sk = skb->sk;
+	nskb->destructor = skb->destructor;
+	refcount_add(nskb->truesize, &nskb->sk->sk_wmem_alloc);
 }
 
 /*
@@ -1666,7 +1640,7 @@ static int chcr_end_part_handler(struct chcr_ktls_info *tx_info,
 				 struct sk_buff *skb,
 				 struct tls_record_info *record,
 				 u32 tcp_seq, int mss, bool tcp_push_no_fin,
-				 struct sge_eth_txq *q,
+				 struct sge_eth_txq *q, u32 skb_offset,
 				 u32 tls_end_offset, bool last_wr)
 {
 	struct sk_buff *nskb = NULL;
@@ -1675,13 +1649,14 @@ static int chcr_end_part_handler(struct chcr_ktls_info *tx_info,
 		nskb = skb;
 		atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_complete_pkts);
 	} else {
-		dev_kfree_skb_any(skb);
-
-		nskb = alloc_skb(0, GFP_KERNEL);
-		if (!nskb)
+		nskb = alloc_skb(0, GFP_ATOMIC);
+		if (!nskb) {
+			dev_kfree_skb_any(skb);
 			return NETDEV_TX_BUSY;
+		}
+
 		/* copy complete record in skb */
-		chcr_ktls_copy_record_in_skb(nskb, record);
+		chcr_ktls_copy_record_in_skb(nskb, skb, record);
 		/* packet is being sent from the beginning, update the tcp_seq
 		 * accordingly.
 		 */
@@ -1691,10 +1666,20 @@ static int chcr_end_part_handler(struct chcr_ktls_info *tx_info,
 		 */
 		if (chcr_ktls_update_snd_una(tx_info, q))
 			goto out;
+		/* reset skb offset */
+		skb_offset = 0;
+
+		if (last_wr)
+			dev_kfree_skb_any(skb);
+
+		last_wr = true;
+
 		atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_end_pkts);
 	}
 
 	if (chcr_ktls_xmit_wr_complete(nskb, tx_info, q, tcp_seq,
+				       last_wr, record->len, skb_offset,
+				       record->num_frags,
 				       (last_wr && tcp_push_no_fin),
 				       mss)) {
 		goto out;
@@ -1730,41 +1715,32 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 				     struct sk_buff *skb,
 				     struct tls_record_info *record,
 				     u32 tcp_seq, int mss, bool tcp_push_no_fin,
+				     u32 data_len, u32 skb_offset,
 				     struct sge_eth_txq *q, u32 tls_end_offset)
 {
 	u32 tls_rec_offset = tcp_seq - tls_record_start_seq(record);
 	u8 prior_data[16] = {0};
 	u32 prior_data_len = 0;
-	u32 data_len;
 
 	/* check if the skb is ending in middle of tag/HASH, its a big
 	 * trouble, send the packet before the HASH.
 	 */
-	int remaining_record = tls_end_offset - skb->data_len;
+	int remaining_record = tls_end_offset - data_len;
 
 	if (remaining_record > 0 &&
 	    remaining_record < TLS_CIPHER_AES_GCM_128_TAG_SIZE) {
-		int trimmed_len = skb->data_len -
+		int trimmed_len = data_len -
 			(TLS_CIPHER_AES_GCM_128_TAG_SIZE - remaining_record);
-		struct sk_buff *tmp_skb = NULL;
 		/* don't process the pkt if it is only a partial tag */
-		if (skb->data_len < TLS_CIPHER_AES_GCM_128_TAG_SIZE)
+		if (data_len < TLS_CIPHER_AES_GCM_128_TAG_SIZE)
 			goto out;
 
-		WARN_ON(trimmed_len > skb->data_len);
-
-		/* shift to those many bytes */
-		tmp_skb = alloc_skb(0, GFP_KERNEL);
-		if (unlikely(!tmp_skb))
-			goto out;
+		WARN_ON(trimmed_len > data_len);
 
-		chcr_ktls_skb_shift(tmp_skb, skb, trimmed_len);
-		/* free the last trimmed portion */
-		dev_kfree_skb_any(skb);
-		skb = tmp_skb;
+		data_len = trimmed_len;
 		atomic64_inc(&tx_info->adap->ch_ktls_stats.ktls_tx_trimmed_pkts);
 	}
-	data_len = skb->data_len;
+
 	/* check if the middle record's start point is 16 byte aligned. CTR
 	 * needs 16 byte aligned start point to start encryption.
 	 */
@@ -1825,9 +1801,6 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 			}
 			/* reset tcp_seq as per the prior_data_required len */
 			tcp_seq -= prior_data_len;
-			/* include prio_data_len for  further calculation.
-			 */
-			data_len += prior_data_len;
 		}
 		/* reset snd una, so the middle record won't send the already
 		 * sent part.
@@ -1844,6 +1817,7 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 						  tcp_push_no_fin, q,
 						  tx_info->port_id,
 						  prior_data,
+						  data_len, skb_offset,
 						  prior_data_len)) {
 				goto out;
 			}
@@ -1854,7 +1828,7 @@ static int chcr_short_record_handler(struct chcr_ktls_info *tx_info,
 
 	if (chcr_ktls_xmit_wr_short(skb, tx_info, q, tcp_seq, tcp_push_no_fin,
 				    mss, tls_rec_offset, prior_data,
-				    prior_data_len)) {
+				    prior_data_len, data_len, skb_offset)) {
 		goto out;
 	}
 
@@ -1876,7 +1850,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 	struct tls_record_info *record;
 	struct chcr_ktls_info *tx_info;
 	struct tls_context *tls_ctx;
-	struct sk_buff *local_skb;
 	struct sge_eth_txq *q;
 	struct adapter *adap;
 	unsigned long flags;
@@ -1898,14 +1871,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 	if (unlikely(!tx_info))
 		goto out;
 
-	/* don't touch the original skb, make a new skb to extract each records
-	 * and send them separately.
-	 */
-	local_skb = alloc_skb(0, GFP_KERNEL);
-
-	if (unlikely(!local_skb))
-		return NETDEV_TX_BUSY;
-
 	adap = tx_info->adap;
 	stats = &adap->ch_ktls_stats;
 	port_stats = &stats->ktls_port[tx_info->port_id];
@@ -1925,13 +1890,9 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 				      ntohl(th->ack_seq),
 				      ntohs(th->window));
 	if (ret) {
-		dev_kfree_skb_any(local_skb);
 		return NETDEV_TX_BUSY;
 	}
 
-	/* copy skb contents into local skb */
-	chcr_ktls_skb_copy(skb, local_skb);
-
 	/* TCP segments can be in received either complete or partial.
 	 * chcr_end_part_handler will handle cases if complete record or end
 	 * part of the record is received. Incase of partial end part of record,
@@ -1961,7 +1922,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 			atomic64_inc(&port_stats->ktls_tx_skip_no_sync_data);
 			goto out;
 		}
-
 		/* increase page reference count of the record, so that there
 		 * won't be any chance of page free in middle if in case stack
 		 * receives ACK and try to delete the record.
@@ -1977,44 +1937,28 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 			 tcp_seq, record->end_seq, tx_info->prev_seq, data_len);
 		/* if a tls record is finishing in this SKB */
 		if (tls_end_offset <= data_len) {
-			struct sk_buff *nskb = NULL;
-
-			if (tls_end_offset < data_len) {
-				nskb = alloc_skb(0, GFP_KERNEL);
-				if (unlikely(!nskb)) {
-					ret = -ENOMEM;
-					goto clear_ref;
-				}
-
-				chcr_ktls_skb_shift(nskb, local_skb,
-						    tls_end_offset);
-			} else {
-				/* its the only record in this skb, directly
-				 * point it.
-				 */
-				nskb = local_skb;
-			}
-			ret = chcr_end_part_handler(tx_info, nskb, record,
+			ret = chcr_end_part_handler(tx_info, skb, record,
 						    tcp_seq, mss,
 						    (!th->fin && th->psh), q,
+						    skb_offset,
 						    tls_end_offset,
-						    (nskb == local_skb));
-
-			if (ret && nskb != local_skb)
-				dev_kfree_skb_any(local_skb);
+						    skb_offset +
+						    tls_end_offset == skb->len);
 
 			data_len -= tls_end_offset;
 			/* tcp_seq increment is required to handle next record.
 			 */
 			tcp_seq += tls_end_offset;
+			skb_offset += tls_end_offset;
 		} else {
-			ret = chcr_short_record_handler(tx_info, local_skb,
+			ret = chcr_short_record_handler(tx_info, skb,
 							record, tcp_seq, mss,
 							(!th->fin && th->psh),
+							data_len, skb_offset,
 							q, tls_end_offset);
 			data_len = 0;
 		}
-clear_ref:
+
 		/* clear the frag ref count which increased locally before */
 		for (i = 0; i < record->num_frags; i++) {
 			/* clear the frag ref count */
@@ -2022,7 +1966,8 @@ clear_ref:
 		}
 		/* if any failure, come out from the loop. */
 		if (ret)
-			goto out;
+			return NETDEV_TX_OK;
+
 		/* length should never be less than 0 */
 		WARN_ON(data_len < 0);
 
@@ -2038,6 +1983,7 @@ clear_ref:
 	if (th->fin)
 		chcr_ktls_write_tcp_options(tx_info, skb, q, tx_info->tx_chan);
 
+	return NETDEV_TX_OK;
 out:
 	dev_kfree_skb_any(skb);
 	return NETDEV_TX_OK;
commit 86716b51d14fc2201938939b323ba3ad99186910
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:33 2020 +0530

    ch_ktls: Update cheksum information
    
    Checksum update was missing in the WR.
    
    Fixes: 429765a149f1 ("chcr: handle partial end part of a record")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 447aec7ae954..b7a3e757ee72 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -959,6 +959,7 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	struct iphdr *ip;
 	int credits;
 	u8 buf[150];
+	u64 cntrl1;
 	void *pos;
 
 	iplen = skb_network_header_len(skb);
@@ -997,22 +998,28 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 			   TXPKT_PF_V(tx_info->adap->pf));
 	cpl->pack = 0;
 	cpl->len = htons(pktlen);
-	/* checksum offload */
-	cpl->ctrl1 = 0;
-
-	pos = cpl + 1;
 
 	memcpy(buf, skb->data, pktlen);
 	if (tx_info->ip_family == AF_INET) {
 		/* we need to correct ip header len */
 		ip = (struct iphdr *)(buf + maclen);
 		ip->tot_len = htons(pktlen - maclen);
+		cntrl1 = TXPKT_CSUM_TYPE_V(TX_CSUM_TCPIP);
 #if IS_ENABLED(CONFIG_IPV6)
 	} else {
 		ip6 = (struct ipv6hdr *)(buf + maclen);
 		ip6->payload_len = htons(pktlen - maclen - iplen);
+		cntrl1 = TXPKT_CSUM_TYPE_V(TX_CSUM_TCPIP6);
 #endif
 	}
+
+	cntrl1 |= T6_TXPKT_ETHHDR_LEN_V(maclen - ETH_HLEN) |
+		  TXPKT_IPHDR_LEN_V(iplen);
+	/* checksum offload */
+	cpl->ctrl1 = cpu_to_be64(cntrl1);
+
+	pos = cpl + 1;
+
 	/* now take care of the tcp header, if fin is not set then clear push
 	 * bit as well, and if fin is set, it will be sent at the last so we
 	 * need to update the tcp sequence number as per the last packet.
commit b1b5cb18032b37ab69b23a461eb8be1a44fcfc3b
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:32 2020 +0530

    ch_ktls: Correction in finding correct length
    
    There is a possibility of linear skbs coming in. Correcting
    the length extraction logic.
    
    v2->v3:
    - Separated un-related changes from this patch.
    
    Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 43c723c72c61..447aec7ae954 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -967,7 +967,7 @@ chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb,
 	/* packet length = eth hdr len + ip hdr len + tcp hdr len
 	 * (including options).
 	 */
-	pktlen = skb->len - skb->data_len;
+	pktlen = skb_transport_offset(skb) + tcp_hdrlen(skb);
 
 	ctrl = sizeof(*cpl) + pktlen;
 	len16 = DIV_ROUND_UP(sizeof(*wr) + ctrl, 16);
@@ -1860,6 +1860,7 @@ out:
 /* nic tls TX handler */
 static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 {
+	u32 tls_end_offset, tcp_seq, skb_data_len, skb_offset;
 	struct ch_ktls_port_stats_debug *port_stats;
 	struct chcr_ktls_ofld_ctx_tx *tx_ctx;
 	struct ch_ktls_stats_debug *stats;
@@ -1867,7 +1868,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 	int data_len, qidx, ret = 0, mss;
 	struct tls_record_info *record;
 	struct chcr_ktls_info *tx_info;
-	u32 tls_end_offset, tcp_seq;
 	struct tls_context *tls_ctx;
 	struct sk_buff *local_skb;
 	struct sge_eth_txq *q;
@@ -1875,8 +1875,11 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 	unsigned long flags;
 
 	tcp_seq = ntohl(th->seq);
+	skb_offset = skb_transport_offset(skb) + tcp_hdrlen(skb);
+	skb_data_len = skb->len - skb_offset;
+	data_len = skb_data_len;
 
-	mss = skb_is_gso(skb) ? skb_shinfo(skb)->gso_size : skb->data_len;
+	mss = skb_is_gso(skb) ? skb_shinfo(skb)->gso_size : data_len;
 
 	tls_ctx = tls_get_ctx(skb->sk);
 	if (unlikely(tls_ctx->netdev != dev))
@@ -1922,8 +1925,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 	/* copy skb contents into local skb */
 	chcr_ktls_skb_copy(skb, local_skb);
 
-	/* go through the skb and send only one record at a time. */
-	data_len = skb->data_len;
 	/* TCP segments can be in received either complete or partial.
 	 * chcr_end_part_handler will handle cases if complete record or end
 	 * part of the record is received. Incase of partial end part of record,
@@ -2020,9 +2021,9 @@ clear_ref:
 
 	} while (data_len > 0);
 
-	tx_info->prev_seq = ntohl(th->seq) + skb->data_len;
+	tx_info->prev_seq = ntohl(th->seq) + skb_data_len;
 	atomic64_inc(&port_stats->ktls_tx_encrypted_packets);
-	atomic64_add(skb->data_len, &port_stats->ktls_tx_encrypted_bytes);
+	atomic64_add(skb_data_len, &port_stats->ktls_tx_encrypted_bytes);
 
 	/* tcp finish is set, send a separate tcp msg including all the options
 	 * as well.
commit 9d2e5e9eeb59524a59b461fe256139826d464e1e
Author: Rohit Maheshwari <rohitm at chelsio.com>
Date:   Mon Nov 9 16:21:31 2020 +0530

    cxgb4/ch_ktls: decrypted bit is not enough
    
    If skb has retransmit data starting before start marker, e.g. ccs,
    decrypted bit won't be set for that, and if it has some data to
    encrypt, then it must be given to crypto ULD. So in place of
    decrypted, check if socket is tls offloaded. Also, unless skb has
    some data to encrypt, no need to give it for tls offload handling.
    
    v2->v3:
    - Removed ifdef.
    
    Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
    Signed-off-by: Rohit Maheshwari <rohitm at chelsio.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index a952fe198eb9..7fd264a6d085 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -1176,6 +1176,7 @@ static u16 cxgb_select_queue(struct net_device *dev, struct sk_buff *skb,
 		txq = netdev_pick_tx(dev, skb, sb_dev);
 		if (xfrm_offload(skb) || is_ptp_enabled(skb, dev) ||
 		    skb->encapsulation ||
+		    cxgb4_is_ktls_skb(skb) ||
 		    (proto != IPPROTO_TCP && proto != IPPROTO_UDP))
 			txq = txq % pi->nqsets;
 
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
index b169776ab484..e2a4941fa802 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
@@ -493,6 +493,11 @@ struct cxgb4_uld_info {
 #endif
 };
 
+static inline bool cxgb4_is_ktls_skb(struct sk_buff *skb)
+{
+	return skb->sk && tls_is_sk_tx_device_offloaded(skb->sk);
+}
+
 void cxgb4_uld_enable(struct adapter *adap);
 void cxgb4_register_uld(enum cxgb4_uld type, const struct cxgb4_uld_info *p);
 int cxgb4_unregister_uld(enum cxgb4_uld type);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
index a9e9c7ae565d..01bd9c0dfe4e 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
@@ -1422,7 +1422,8 @@ static netdev_tx_t cxgb4_eth_xmit(struct sk_buff *skb, struct net_device *dev)
 #endif /* CHELSIO_IPSEC_INLINE */
 
 #if IS_ENABLED(CONFIG_CHELSIO_TLS_DEVICE)
-	if (skb->decrypted)
+	if (cxgb4_is_ktls_skb(skb) &&
+	    (skb->len - (skb_transport_offset(skb) + tcp_hdrlen(skb))))
 		return adap->uld[CXGB4_ULD_KTLS].tx_handler(skb, dev);
 #endif /* CHELSIO_TLS_DEVICE */
 
diff --git a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
index 5195f692f14d..43c723c72c61 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
@@ -1878,10 +1878,6 @@ static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
 
 	mss = skb_is_gso(skb) ? skb_shinfo(skb)->gso_size : skb->data_len;
 
-	/* check if we haven't set it for ktls offload */
-	if (!skb->sk || !tls_is_sk_tx_device_offloaded(skb->sk))
-		goto out;
-
 	tls_ctx = tls_get_ctx(skb->sk);
 	if (unlikely(tls_ctx->netdev != dev))
 		goto out;
commit 49c3e714ff4391144d8bb3fa99d0b460f8dbfd86
Author: Marc Kleine-Budde <mkl at pengutronix.de>
Date:   Wed Nov 11 14:05:07 2020 +0100

    dt-bindings: can: fsl,flexcan.yaml: fix fsl,stop-mode
    
    The fsl,stop-mode property is a phandle-array and should consist of one phandle
    and two 32 bit integers, e.g.:
    
        fsl,stop-mode = <&gpr 0x34 28>;
    
    This patch fixes the following errors, which shows up during a dtbs_check:
    
    arch/arm/boot/dts/imx6dl-apf6dev.dt.yaml: can at 2090000: fsl,stop-mode: [[1, 52, 28]] is too short
        From schema: Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
    
    Fixes: e5ab9aa7e49b ("dt-bindings: can: flexcan: convert fsl,*flexcan bindings to yaml")
    Reported-by: Rob Herring <robh+dt at kernel.org>
    Cc: Oleksij Rempel <o.rempel at pengutronix.de>
    Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
    Link: https://lore.kernel.org/r/20201111130507.1560881-5-mkl@pengutronix.de
    Signed-off-by: Rob Herring <robh at kernel.org>

diff --git a/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml b/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
index 43df15ba8fa4..3093c22e761c 100644
--- a/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
+++ b/Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
@@ -81,11 +81,12 @@ properties:
       req_bit is the bit offset of CAN stop request.
     $ref: /schemas/types.yaml#/definitions/phandle-array
     items:
-      - description: The 'gpr' is the phandle to general purpose register node.
-      - description: The 'req_gpr' is the gpr register offset of CAN stop request.
-        maximum: 0xff
-      - description: The 'req_bit' is the bit offset of CAN stop request.
-        maximum: 0x1f
+      items:
+        - description: The 'gpr' is the phandle to general purpose register node.
+        - description: The 'req_gpr' is the gpr register offset of CAN stop request.
+          maximum: 0xff
+        - description: The 'req_bit' is the bit offset of CAN stop request.
+          maximum: 0x1f
 
   fsl,clk-source:
     description: |
commit a5bea04fcc0b3c0aec71ee1fd58fd4ff7ee36177
Author: Evan Nimmo <evan.nimmo at alliedtelesis.co.nz>
Date:   Tue Nov 10 15:28:25 2020 +1300

    of/address: Fix of_node memory leak in of_dma_is_coherent
    
    Commit dabf6b36b83a ("of: Add OF_DMA_DEFAULT_COHERENT & select it on
    powerpc") added a check to of_dma_is_coherent which returns early
    if OF_DMA_DEFAULT_COHERENT is enabled. This results in the of_node_put()
    being skipped causing a memory leak. Moved the of_node_get() below this
    check so we now we only get the node if OF_DMA_DEFAULT_COHERENT is not
    enabled.
    
    Fixes: dabf6b36b83a ("of: Add OF_DMA_DEFAULT_COHERENT & select it on powerpc")
    Signed-off-by: Evan Nimmo <evan.nimmo at alliedtelesis.co.nz>
    Link: https://lore.kernel.org/r/20201110022825.30895-1-evan.nimmo@alliedtelesis.co.nz
    Signed-off-by: Rob Herring <robh at kernel.org>

diff --git a/drivers/of/address.c b/drivers/of/address.c
index eb9ab4f1e80b..1c3257a2d4e3 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -1034,11 +1034,13 @@ out:
  */
 bool of_dma_is_coherent(struct device_node *np)
 {
-	struct device_node *node = of_node_get(np);
+	struct device_node *node;
 
 	if (IS_ENABLED(CONFIG_OF_DMA_DEFAULT_COHERENT))
 		return true;
 
+	node = of_node_get(np);
+
 	while (node) {
 		if (of_property_read_bool(node, "dma-coherent")) {
 			of_node_put(node);
commit 361182308766a265b6c521879b34302617a8c209
Author: Martin Schiller <ms at dev.tdt.de>
Date:   Mon Nov 9 07:54:49 2020 +0100

    net/x25: Fix null-ptr-deref in x25_connect
    
    This fixes a regression for blocking connects introduced by commit
    4becb7ee5b3d ("net/x25: Fix x25_neigh refcnt leak when x25 disconnect").
    
    The x25->neighbour is already set to "NULL" by x25_disconnect() now,
    while a blocking connect is waiting in
    x25_wait_for_connection_establishment(). Therefore x25->neighbour must
    not be accessed here again and x25->state is also already set to
    X25_STATE_0 by x25_disconnect().
    
    Fixes: 4becb7ee5b3d ("net/x25: Fix x25_neigh refcnt leak when x25 disconnect")
    Signed-off-by: Martin Schiller <ms at dev.tdt.de>
    Reviewed-by: Xie He <xie.he.0141 at gmail.com>
    Link: https://lore.kernel.org/r/20201109065449.9014-1-ms@dev.tdt.de
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 0bbb283f23c9..046d3fee66a9 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -825,7 +825,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
 	sock->state = SS_CONNECTED;
 	rc = 0;
 out_put_neigh:
-	if (rc) {
+	if (rc && x25->neighbour) {
 		read_lock_bh(&x25_list_lock);
 		x25_neigh_put(x25->neighbour);
 		x25->neighbour = NULL;
commit df392aefe96b9f94efb01ef298b617bab346a9be
Author: Michael Walle <michael at walle.cc>
Date:   Mon Nov 9 12:04:36 2020 +0100

    arm64: dts: fsl-ls1028a-kontron-sl28: specify in-band mode for ENETC
    
    Since commit 71b77a7a27a3 ("enetc: Migrate to PHYLINK and PCS_LYNX") the
    network port of the Kontron sl28 board is broken. After the migration to
    phylink the device tree has to specify the in-band-mode property. Add
    it.
    
    Fixes: 71b77a7a27a3 ("enetc: Migrate to PHYLINK and PCS_LYNX")
    Suggested-by: Vladimir Oltean <vladimir.oltean at nxp.com>
    Signed-off-by: Michael Walle <michael at walle.cc>
    Reviewed-by: Vladimir Oltean <vladimir.oltean at nxp.com>
    Link: https://lore.kernel.org/r/20201109110436.5906-1-michael@walle.cc
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dts b/arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dts
index f46eb47cfa4d..8161dd237971 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dts
@@ -75,6 +75,7 @@
 &enetc_port0 {
 	phy-handle = <&phy0>;
 	phy-connection-type = "sgmii";
+	managed = "in-band-status";
 	status = "okay";
 
 	mdio {
commit fa6882c63621821f73cc806f291208e1c6ea6187
Author: Wang Hai <wanghai38 at huawei.com>
Date:   Mon Nov 9 22:09:13 2020 +0800

    tipc: fix memory leak in tipc_topsrv_start()
    
    kmemleak report a memory leak as follows:
    
    unreferenced object 0xffff88810a596800 (size 512):
      comm "ip", pid 21558, jiffies 4297568990 (age 112.120s)
      hex dump (first 32 bytes):
        00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00  .....N..........
        ff ff ff ff ff ff ff ff 00 83 60 b0 ff ff ff ff  ..........`.....
      backtrace:
        [<0000000022bbe21f>] tipc_topsrv_init_net+0x1f3/0xa70
        [<00000000fe15ddf7>] ops_init+0xa8/0x3c0
        [<00000000138af6f2>] setup_net+0x2de/0x7e0
        [<000000008c6807a3>] copy_net_ns+0x27d/0x530
        [<000000006b21adbd>] create_new_namespaces+0x382/0xa30
        [<00000000bb169746>] unshare_nsproxy_namespaces+0xa1/0x1d0
        [<00000000fe2e42bc>] ksys_unshare+0x39c/0x780
        [<0000000009ba3b19>] __x64_sys_unshare+0x2d/0x40
        [<00000000614ad866>] do_syscall_64+0x56/0xa0
        [<00000000a1b5ca3c>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    'srv' is malloced in tipc_topsrv_start() but not free before
    leaving from the error handling cases. We need to free it.
    
    Fixes: 5c45ab24ac77 ("tipc: make struct tipc_server private for server.c")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Wang Hai <wanghai38 at huawei.com>
    Link: https://lore.kernel.org/r/20201109140913.47370-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c
index 5f6f86051c83..13f3143609f9 100644
--- a/net/tipc/topsrv.c
+++ b/net/tipc/topsrv.c
@@ -664,12 +664,18 @@ static int tipc_topsrv_start(struct net *net)
 
 	ret = tipc_topsrv_work_start(srv);
 	if (ret < 0)
-		return ret;
+		goto err_start;
 
 	ret = tipc_topsrv_create_listener(srv);
 	if (ret < 0)
-		tipc_topsrv_work_stop(srv);
+		goto err_create;
 
+	return 0;
+
+err_create:
+	tipc_topsrv_work_stop(srv);
+err_start:
+	kfree(srv);
 	return ret;
 }
 
commit 3d5e28bff7ad55aea081c1af516cc1c94a5eca7d
Merge: eccc87672492 fc0021aa340a
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Wed Nov 11 14:15:06 2020 -0800

    Merge branch 'stable/for-linus-5.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb
    
    Pull swiotlb fixes from Konrad Rzeszutek Wilk:
     "Two tiny fixes for issues that make drivers under Xen unhappy under
      certain conditions"
    
    * 'stable/for-linus-5.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb:
      swiotlb: remove the tbl_dma_addr argument to swiotlb_tbl_map_single
      swiotlb: fix "x86: Don't panic if can not alloc buffer for swiotlb"

commit d196e229a80c39254f4adbc312f55f5198e98941
Author: Theodore Ts'o <tytso at mit.edu>
Date:   Wed Nov 11 14:24:18 2020 -0500

    Revert "ext4: fix superblock checksum calculation race"
    
    This reverts commit acaa532687cdc3a03757defafece9c27aa667546 which can
    result in a ext4_superblock_csum_set() trying to sleep while a
    spinlock is being held.
    
    For more discussion of this issue, please see:
    
    https://lore.kernel.org/r/000000000000f50cb705b313ed70@google.com
    
    Reported-by: syzbot+7a4ba6a239b91a126c28 at syzkaller.appspotmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index c3b864588a0b..6633b20224d5 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -289,18 +289,7 @@ void ext4_superblock_csum_set(struct super_block *sb)
 	if (!ext4_has_metadata_csum(sb))
 		return;
 
-	/*
-	 * Locking the superblock prevents the scenario
-	 * where:
-	 *  1) a first thread pauses during checksum calculation.
-	 *  2) a second thread updates the superblock, recalculates
-	 *     the checksum, and updates s_checksum
-	 *  3) the first thread resumes and finishes its checksum calculation
-	 *     and updates s_checksum with a potentially stale or torn value.
-	 */
-	lock_buffer(EXT4_SB(sb)->s_sbh);
 	es->s_checksum = ext4_superblock_csum(sb, es);
-	unlock_buffer(EXT4_SB(sb)->s_sbh);
 }
 
 ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
commit a72b38eebea4661d4d67b194353124e63ce48f66
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Wed Nov 11 10:32:09 2020 -0800

    ext4: handle dax mount option collision
    
    Mount options dax=inode and dax=never collided with fast_commit and
    journal checksum. Redefine the mount flags to remove the collision.
    
    Reported-by: Murphy Zhou <jencce.kernel at gmail.com>
    Fixes: 9cb20f94afcd2 ("fs/ext4: Make DAX mount option a tri-state")
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201111183209.447175-1-harshads@google.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 1b399cafb15a..bf9429484462 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1231,13 +1231,13 @@ struct ext4_inode_info {
 						      blocks */
 #define EXT4_MOUNT2_HURD_COMPAT		0x00000004 /* Support HURD-castrated
 						      file systems */
-#define EXT4_MOUNT2_DAX_NEVER		0x00000008 /* Do not allow Direct Access */
-#define EXT4_MOUNT2_DAX_INODE		0x00000010 /* For printing options only */
-
 #define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM	0x00000008 /* User explicitly
 						specified journal checksum */
 
 #define EXT4_MOUNT2_JOURNAL_FAST_COMMIT	0x00000010 /* Journal fast commit */
+#define EXT4_MOUNT2_DAX_NEVER		0x00000020 /* Do not allow Direct Access */
+#define EXT4_MOUNT2_DAX_INODE		0x00000040 /* For printing options only */
+
 
 #define clear_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt &= \
 						~EXT4_MOUNT_##opt
commit 88ec3211e46344a7d10cf6cb5045f839f7785f8e
Author: Jens Axboe <axboe at kernel.dk>
Date:   Wed Nov 11 10:38:53 2020 -0700

    io_uring: round-up cq size before comparing with rounded sq size
    
    If an application specifies IORING_SETUP_CQSIZE to set the CQ ring size
    to a specific size, we ensure that the CQ size is at least that of the
    SQ ring size. But in doing so, we compare the already rounded up to power
    of two SQ size to the as-of yet unrounded CQ size. This means that if an
    application passes in non power of two sizes, we can return -EINVAL when
    the final value would've been fine. As an example, an application passing
    in 100/100 for sq/cq size should end up with 128 for both. But since we
    round the SQ size first, we compare the CQ size of 100 to 128, and return
    -EINVAL as that is too small.
    
    Cc: stable at vger.kernel.org
    Fixes: 33a107f0a1b8 ("io_uring: allow application controlled CQ ring size")
    Reported-by: Dan Melnic <dmm at fb.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 8018c7076b25..c77584de68d7 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -9226,6 +9226,7 @@ static int io_uring_create(unsigned entries, struct io_uring_params *p,
 		 * to a power-of-two, if it isn't already. We do NOT impose
 		 * any cq vs sq ring sizing.
 		 */
+		p->cq_entries = roundup_pow_of_two(p->cq_entries);
 		if (p->cq_entries < p->sq_entries)
 			return -EINVAL;
 		if (p->cq_entries > IORING_MAX_CQ_ENTRIES) {
@@ -9233,7 +9234,6 @@ static int io_uring_create(unsigned entries, struct io_uring_params *p,
 				return -EINVAL;
 			p->cq_entries = IORING_MAX_CQ_ENTRIES;
 		}
-		p->cq_entries = roundup_pow_of_two(p->cq_entries);
 	} else {
 		p->cq_entries = 2 * p->sq_entries;
 	}
commit 2bd3fa793aaa7e98b74e3653fdcc72fa753913b5
Author: Christoph Hellwig <hch at lst.de>
Date:   Wed Nov 11 08:07:37 2020 -0800

    xfs: fix a missing unlock on error in xfs_fs_map_blocks
    
    We also need to drop the iolock when invalidate_inode_pages2 fails, not
    only on all other error or successful cases.
    
    Fixes: 527851124d10 ("xfs: implement pNFS export operations")
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Darrick J. Wong <darrick.wong at oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>

diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c
index b101feb2aab4..f3082a957d5e 100644
--- a/fs/xfs/xfs_pnfs.c
+++ b/fs/xfs/xfs_pnfs.c
@@ -134,7 +134,7 @@ xfs_fs_map_blocks(
 		goto out_unlock;
 	error = invalidate_inode_pages2(inode->i_mapping);
 	if (WARN_ON_ONCE(error))
-		return error;
+		goto out_unlock;
 
 	end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + length);
 	offset_fsb = XFS_B_TO_FSBT(mp, offset);
commit ee4ad5d06509b3aea79b6a77bebd09ef891bed8d
Author: Eddie James <eajames at linux.ibm.com>
Date:   Tue Nov 10 15:47:36 2020 -0600

    spi: fsi: Fix transfer returning without finalizing message
    
    In the case that the SPI mux isn't set, the transfer_one_message
    function returns without finalizing the message. This means that
    the transfer never completes, resulting in hung tasks and an
    eventual kernel panic. Fix it by finalizing the transfer in this
    case.
    
    Fixes: 9211a441e606 ("spi: fsi: Check mux status before transfers")
    Signed-off-by: Eddie James <eajames at linux.ibm.com>
    Reviewed-by: Joel Stanley <joel at jms.id.au>
    Link: https://lore.kernel.org/r/20201110214736.25718-1-eajames@linux.ibm.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi-fsi.c b/drivers/spi/spi-fsi.c
index 8a440c7078ef..3920cd3286d8 100644
--- a/drivers/spi/spi-fsi.c
+++ b/drivers/spi/spi-fsi.c
@@ -477,7 +477,7 @@ static int fsi_spi_transfer_one_message(struct spi_controller *ctlr,
 
 	rc = fsi_spi_check_mux(ctx->fsi, ctx->dev);
 	if (rc)
-		return rc;
+		goto error;
 
 	list_for_each_entry(transfer, &mesg->transfers, transfer_list) {
 		struct fsi_spi_sequence seq;
commit 766c6b63aa044e84b045803b40b14754d69a2a1d
Author: Sven Van Asbroeck <thesven73 at gmail.com>
Date:   Fri Nov 6 10:07:06 2020 -0500

    spi: fix client driver breakages when using GPIO descriptors
    
    Commit f3186dd87669 ("spi: Optionally use GPIO descriptors for CS GPIOs")
    introduced the optional use of GPIO descriptors for chip selects.
    
    A side-effect of this change: when a SPI bus uses GPIO descriptors,
    all its client devices have SPI_CS_HIGH set in spi->mode. This flag is
    required for the SPI bus to operate correctly.
    
    This unfortunately breaks many client drivers, which use the following
    pattern to configure their underlying SPI bus:
    
    static int client_device_probe(struct spi_device *spi)
    {
            ...
            spi->mode = SPI_MODE_0;
            spi->bits_per_word = 8;
            err = spi_setup(spi);
            ..
    }
    
    In short, many client drivers overwrite the SPI_CS_HIGH bit in
    spi->mode, and break the underlying SPI bus driver.
    
    This is especially true for Freescale/NXP imx ecspi, where large
    numbers of spi client drivers now no longer work.
    
    Proposed fix:
    -------------
    When using gpio descriptors, depend on gpiolib to handle CS polarity.
    Existing quirks in gpiolib ensure that this is handled correctly.
    
    Existing gpiolib behaviour will force the polarity of any chip-select
    gpiod to active-high (if 'spi-active-high' devicetree prop present) or
    active-low (if 'spi-active-high' absent). Irrespective of whether
    the gpio is marked GPIO_ACTIVE_[HIGH|LOW] in the devicetree.
    
    Loose ends:
    -----------
    If this fix is applied:
    - is commit 138c9c32f090
      ("spi: spidev: Fix CS polarity if GPIO descriptors are used")
      still necessary / correct ?
    
    Fixes: f3186dd87669 ("spi: Optionally use GPIO descriptors for CS GPIOs")
    Signed-off-by: Sven Van Asbroeck <thesven73 at gmail.com>
    Acked-by: Linus Walleij <linus.walleij at linaro.org>
    Link: https://lore.kernel.org/r/20201106150706.29089-1-TheSven73@gmail.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 0cab239d8e7f..7566482c052c 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -812,18 +812,16 @@ static void spi_set_cs(struct spi_device *spi, bool enable)
 		enable = !enable;
 
 	if (spi->cs_gpiod || gpio_is_valid(spi->cs_gpio)) {
-		/*
-		 * Honour the SPI_NO_CS flag and invert the enable line, as
-		 * active low is default for SPI. Execution paths that handle
-		 * polarity inversion in gpiolib (such as device tree) will
-		 * enforce active high using the SPI_CS_HIGH resulting in a
-		 * double inversion through the code above.
-		 */
 		if (!(spi->mode & SPI_NO_CS)) {
 			if (spi->cs_gpiod)
+				/* polarity handled by gpiolib */
 				gpiod_set_value_cansleep(spi->cs_gpiod,
-							 !enable);
+							 enable1);
 			else
+				/*
+				 * invert the enable line, as active low is
+				 * default for SPI.
+				 */
 				gpio_set_value_cansleep(spi->cs_gpio, !enable);
 		}
 		/* Some SPI masters need both GPIO CS & slave_select */
@@ -1992,15 +1990,6 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
 	}
 	spi->chip_select = value;
 
-	/*
-	 * For descriptors associated with the device, polarity inversion is
-	 * handled in the gpiolib, so all gpio chip selects are "active high"
-	 * in the logical sense, the gpiolib will invert the line if need be.
-	 */
-	if ((ctlr->use_gpio_descriptors) && ctlr->cs_gpiods &&
-	    ctlr->cs_gpiods[spi->chip_select])
-		spi->mode |= SPI_CS_HIGH;
-
 	/* Device speed */
 	if (!of_property_read_u32(nc, "spi-max-frequency", &value))
 		spi->max_speed_hz = value;
commit 365ec8b61689bd64d6a61e129e0319bf71336407
Author: Sean Nyekjaer <sean at geanix.com>
Date:   Tue Nov 10 18:41:13 2020 +0100

    regulator: pfuze100: limit pfuze-support-disable-sw to pfuze{100,200}
    
    Limit the fsl,pfuze-support-disable-sw to the pfuze100 and pfuze200
    variants.
    When enabling fsl,pfuze-support-disable-sw and using a pfuze3000 or
    pfuze3001, the driver would choose pfuze100_sw_disable_regulator_ops
    instead of the newly introduced and correct pfuze3000_sw_regulator_ops.
    
    Signed-off-by: Sean Nyekjaer <sean at geanix.com>
    Fixes: 6f1cf5257acc ("regualtor: pfuze100: correct sw1a/sw2 on pfuze3000")
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201110174113.2066534-1-sean@geanix.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c
index 7e8ba9246167..01a12cfcea7c 100644
--- a/drivers/regulator/pfuze100-regulator.c
+++ b/drivers/regulator/pfuze100-regulator.c
@@ -836,11 +836,14 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
 		 * the switched regulator till yet.
 		 */
 		if (pfuze_chip->flags & PFUZE_FLAG_DISABLE_SW) {
-			if (pfuze_chip->regulator_descs[i].sw_reg) {
-				desc->ops = &pfuze100_sw_disable_regulator_ops;
-				desc->enable_val = 0x8;
-				desc->disable_val = 0x0;
-				desc->enable_time = 500;
+			if (pfuze_chip->chip_id == PFUZE100 ||
+				pfuze_chip->chip_id == PFUZE200) {
+				if (pfuze_chip->regulator_descs[i].sw_reg) {
+					desc->ops = &pfuze100_sw_disable_regulator_ops;
+					desc->enable_val = 0x8;
+					desc->disable_val = 0x0;
+					desc->enable_time = 500;
+				}
 			}
 		}
 
commit b2896458b850ec7cb69b054b195b4b399f7e1f22
Author: Jiri Slaby <jslaby at suse.cz>
Date:   Mon Nov 9 10:36:53 2020 +0100

    x86/platform/uv: Drop last traces of uv_flush_tlb_others
    
    Commit 39297dde7390 ("x86/platform/uv: Remove UV BAU TLB Shootdown
    Handler") removed uv_flush_tlb_others. Its declaration was removed also
    from asm/uv/uv.h. But only for the CONFIG_X86_UV=y case. The inline
    definition (!X86_UV case) is still in place.
    
    So remove this implementation with everything what was added to support
    uv_flush_tlb_others:
    * include of asm/tlbflush.h
    * forward declarations of struct cpumask, mm_struct, and flush_tlb_info
    
    Signed-off-by: Jiri Slaby <jslaby at suse.cz>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Acked-by: Mike Travis <mike.travis at hpe.com>
    Acked-by: Steve Wahl <steve.wahl at hpe.com>
    Link: https://lore.kernel.org/r/20201109093653.2042-1-jslaby@suse.cz

diff --git a/arch/x86/include/asm/uv/uv.h b/arch/x86/include/asm/uv/uv.h
index 172d3e4a9e4b..648eb23fe7f0 100644
--- a/arch/x86/include/asm/uv/uv.h
+++ b/arch/x86/include/asm/uv/uv.h
@@ -2,14 +2,8 @@
 #ifndef _ASM_X86_UV_UV_H
 #define _ASM_X86_UV_UV_H
 
-#include <asm/tlbflush.h>
-
 enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC};
 
-struct cpumask;
-struct mm_struct;
-struct flush_tlb_info;
-
 #ifdef CONFIG_X86_UV
 #include <linux/efi.h>
 
@@ -44,10 +38,6 @@ static inline int is_uv_system(void)	{ return 0; }
 static inline int is_uv_hubbed(int uv)	{ return 0; }
 static inline void uv_cpu_init(void)	{ }
 static inline void uv_system_init(void)	{ }
-static inline const struct cpumask *
-uv_flush_tlb_others(const struct cpumask *cpumask,
-		    const struct flush_tlb_info *info)
-{ return cpumask; }
 
 #endif	/* X86_UV */
 
commit 92e4dc8b05663d6539b1b8375f3b1cf7b204cfe9
Author: Chris Co <chrco at microsoft.com>
Date:   Tue Nov 10 19:01:18 2020 +0000

    Drivers: hv: vmbus: Allow cleanup of VMBUS_CONNECT_CPU if disconnected
    
    When invoking kexec() on a Linux guest running on a Hyper-V host, the
    kernel panics.
    
        RIP: 0010:cpuhp_issue_call+0x137/0x140
        Call Trace:
        __cpuhp_remove_state_cpuslocked+0x99/0x100
        __cpuhp_remove_state+0x1c/0x30
        hv_kexec_handler+0x23/0x30 [hv_vmbus]
        hv_machine_shutdown+0x1e/0x30
        machine_shutdown+0x10/0x20
        kernel_kexec+0x6d/0x96
        __do_sys_reboot+0x1ef/0x230
        __x64_sys_reboot+0x1d/0x20
        do_syscall_64+0x6b/0x3d8
        entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    This was due to hv_synic_cleanup() callback returning -EBUSY to
    cpuhp_issue_call() when tearing down the VMBUS_CONNECT_CPU, even
    if the vmbus_connection.conn_state = DISCONNECTED. hv_synic_cleanup()
    should succeed in the case where vmbus_connection.conn_state
    is DISCONNECTED.
    
    Fix is to add an extra condition to test for
    vmbus_connection.conn_state == CONNECTED on the VMBUS_CONNECT_CPU and
    only return early if true. This way the kexec() path can still shut
    everything down while preserving the initial behavior of preventing
    CPU offlining on the VMBUS_CONNECT_CPU while the VM is running.
    
    Fixes: 8a857c55420f29 ("Drivers: hv: vmbus: Always handle the VMBus messages on CPU0")
    Signed-off-by: Chris Co <chrco at microsoft.com>
    Reviewed-by: Andrea Parri (Microsoft) <parri.andrea at gmail.com>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201110190118.15596-1-chrco@linux.microsoft.com
    Signed-off-by: Wei Liu <wei.liu at kernel.org>

diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index da69338f92f5..75a8638ff68b 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -244,9 +244,13 @@ int hv_synic_cleanup(unsigned int cpu)
 
 	/*
 	 * Hyper-V does not provide a way to change the connect CPU once
-	 * it is set; we must prevent the connect CPU from going offline.
+	 * it is set; we must prevent the connect CPU from going offline
+	 * while the VM is running normally. But in the panic or kexec()
+	 * path where the vmbus is already disconnected, the CPU must be
+	 * allowed to shut down.
 	 */
-	if (cpu == VMBUS_CONNECT_CPU)
+	if (cpu == VMBUS_CONNECT_CPU &&
+	    vmbus_connection.conn_state == CONNECTED)
 		return -EBUSY;
 
 	/*
commit f16e631333a8f12ae8128826e695db4b2a528407
Author: Kaixu Xia <kaixuxia at tencent.com>
Date:   Wed Nov 11 13:03:46 2020 +0800

    bpf: Fix unsigned 'datasec_id' compared with zero in check_pseudo_btf_id
    
    The unsigned variable datasec_id is assigned a return value from the call
    to check_pseudo_btf_id(), which may return negative error code.
    
    This fixes the following coccicheck warning:
    
      ./kernel/bpf/verifier.c:9616:5-15: WARNING: Unsigned expression compared with zero: datasec_id > 0
    
    Fixes: eaa6bcb71ef6 ("bpf: Introduce bpf_per_cpu_ptr()")
    Reported-by: Tosk Robot <tencent_os_robot at tencent.com>
    Signed-off-by: Kaixu Xia <kaixuxia at tencent.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Acked-by: John Fastabend <john.fastabend at gmail.com>
    Cc: Hao Luo <haoluo at google.com>
    Link: https://lore.kernel.org/bpf/1605071026-25906-1-git-send-email-kaixuxia@tencent.com

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 6200519582a6..6204ec705d80 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -9572,12 +9572,13 @@ static int check_pseudo_btf_id(struct bpf_verifier_env *env,
 			       struct bpf_insn *insn,
 			       struct bpf_insn_aux_data *aux)
 {
-	u32 datasec_id, type, id = insn->imm;
 	const struct btf_var_secinfo *vsi;
 	const struct btf_type *datasec;
 	const struct btf_type *t;
 	const char *sym_name;
 	bool percpu = false;
+	u32 type, id = insn->imm;
+	s32 datasec_id;
 	u64 addr;
 	int i;
 
commit b72de3ff19fdc4bbe4d4bb3f4483c7e46e00bac3
Author: Damien Le Moal <damien.lemoal at wdc.com>
Date:   Sat Nov 7 17:13:57 2020 +0900

    gpio: sifive: Fix SiFive gpio probe
    
    Fix the check on the number of IRQs to allow up to the maximum (32)
    instead of only the maximum minus one.
    
    Fixes: 96868dce644d ("gpio/sifive: Add GPIO driver for SiFive SoCs")
    Cc: stable at vger.kernel.org
    Signed-off-by: Damien Le Moal <damien.lemoal at wdc.com>
    Link: https://lore.kernel.org/r/20201107081420.60325-10-damien.lemoal@wdc.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/gpio/gpio-sifive.c b/drivers/gpio/gpio-sifive.c
index c54dd08f2cbf..d5eb9ca11901 100644
--- a/drivers/gpio/gpio-sifive.c
+++ b/drivers/gpio/gpio-sifive.c
@@ -183,7 +183,7 @@ static int sifive_gpio_probe(struct platform_device *pdev)
 		return PTR_ERR(chip->regs);
 
 	ngpio = of_irq_count(node);
-	if (ngpio >= SIFIVE_GPIO_MAX) {
+	if (ngpio > SIFIVE_GPIO_MAX) {
 		dev_err(dev, "Too many GPIO interrupts (max=%d)\n",
 			SIFIVE_GPIO_MAX);
 		return -ENXIO;
commit 6cbf1e960fa52e4c63a6dfa4cda8736375b34ccc
Author: Collin Walling <walling at linux.ibm.com>
Date:   Wed Nov 4 13:10:32 2020 -0500

    KVM: s390: remove diag318 reset code
    
    The diag318 data must be set to 0 by VM-wide reset events
    triggered by diag308. As such, KVM should not handle
    resetting this data via the VCPU ioctls.
    
    Fixes: 23a60f834406 ("s390/kvm: diagnose 0x318 sync and reset")
    Signed-off-by: Collin Walling <walling at linux.ibm.com>
    Reviewed-by: Christian Borntraeger <borntraeger at de.ibm.com>
    Reviewed-by: Janosch Frank <frankja at linux.ibm.com>
    Acked-by: Cornelia Huck <cohuck at redhat.com>
    Signed-off-by: Christian Borntraeger <borntraeger at de.ibm.com>
    Link: https://lore.kernel.org/r/20201104181032.109800-1-walling@linux.ibm.com

diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 08ea6c4735cd..425d3d75320b 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -3564,7 +3564,6 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
 		vcpu->arch.sie_block->pp = 0;
 		vcpu->arch.sie_block->fpf &= ~FPF_BPBC;
 		vcpu->arch.sie_block->todpr = 0;
-		vcpu->arch.sie_block->cpnc = 0;
 	}
 }
 
@@ -3582,7 +3581,6 @@ static void kvm_arch_vcpu_ioctl_clear_reset(struct kvm_vcpu *vcpu)
 
 	regs->etoken = 0;
 	regs->etoken_extension = 0;
-	regs->diag318 = 0;
 }
 
 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
commit 1ed576a20cd5c93295f57d6b7400357bd8d01b21
Author: Janosch Frank <frankja at linux.ibm.com>
Date:   Tue Oct 20 06:12:07 2020 -0400

    KVM: s390: pv: Mark mm as protected after the set secure parameters and improve cleanup
    
    We can only have protected guest pages after a successful set secure
    parameters call as only then the UV allows imports and unpacks.
    
    By moving the test we can now also check for it in s390_reset_acc()
    and do an early return if it is 0.
    
    Signed-off-by: Janosch Frank <frankja at linux.ibm.com>
    Fixes: 29b40f105ec8 ("KVM: s390: protvirt: Add initial vm and cpu lifecycle handling")
    Reviewed-by: Cornelia Huck <cohuck at redhat.com>
    Signed-off-by: Christian Borntraeger <borntraeger at de.ibm.com>

diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 6b74b92c1a58..08ea6c4735cd 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -2312,7 +2312,7 @@ static int kvm_s390_handle_pv(struct kvm *kvm, struct kvm_pv_cmd *cmd)
 		struct kvm_s390_pv_unp unp = {};
 
 		r = -EINVAL;
-		if (!kvm_s390_pv_is_protected(kvm))
+		if (!kvm_s390_pv_is_protected(kvm) || !mm_is_protected(kvm->mm))
 			break;
 
 		r = -EFAULT;
diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
index eb99e2f95ebe..f5847f9dec7c 100644
--- a/arch/s390/kvm/pv.c
+++ b/arch/s390/kvm/pv.c
@@ -208,7 +208,6 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
 		return -EIO;
 	}
 	kvm->arch.gmap->guest_handle = uvcb.guest_handle;
-	atomic_set(&kvm->mm->context.is_protected, 1);
 	return 0;
 }
 
@@ -228,6 +227,8 @@ int kvm_s390_pv_set_sec_parms(struct kvm *kvm, void *hdr, u64 length, u16 *rc,
 	*rrc = uvcb.header.rrc;
 	KVM_UV_EVENT(kvm, 3, "PROTVIRT VM SET PARMS: rc %x rrc %x",
 		     *rc, *rrc);
+	if (!cc)
+		atomic_set(&kvm->mm->context.is_protected, 1);
 	return cc ? -EINVAL : 0;
 }
 
diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index cfb0017f33a7..64795d034926 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -2690,6 +2690,8 @@ static const struct mm_walk_ops reset_acc_walk_ops = {
 #include <linux/sched/mm.h>
 void s390_reset_acc(struct mm_struct *mm)
 {
+	if (!mm_is_protected(mm))
+		return;
 	/*
 	 * we might be called during
 	 * reset:                             we walk the pages and clear
commit b5acfe152abaa2721c9ca8aa67f941d7de55d24e
Author: PeiSen Hou <pshou at realtek.com>
Date:   Wed Nov 11 08:58:59 2020 +0100

    ALSA: hda/realtek: Add some Clove SSID in the ALC293(ALC1220)
    
    Fix "use as headset mic, without its own jack detect" problem.
    
    [ Minor coding style fixes by tiwai ]
    
    Signed-off-by: PeiSen Hou <pshou at realtek.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/481963e4a5694ff19f27ae1e283d79ad@realtek.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index c3a02738ead2..69a952c9e011 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2522,13 +2522,23 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
 	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x950A, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
@@ -7931,11 +7941,49 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
+	SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
+	SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
 	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
commit 99fba3205cd499255a36fd87f1d6064adc622a5b
Author: Grygorii Strashko <grygorii.strashko at ti.com>
Date:   Thu Oct 1 22:20:23 2020 +0300

    ARM: dts: am437x-l4: fix compatible for cpsw switch dt node
    
    Fix compatible the new CPSW switchdev DT node to avoid probing of legacy
    CPSW driver which fails:
    [    2.781009] cpsw 4a100000.switch: invalid resource
    
    Fixes: 7bf8f37aea82 ("ARM: dts: am437x-l4: add dt node for new cpsw switchdev driver")
    Signed-off-by: Grygorii Strashko <grygorii.strashko at ti.com>
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/arch/arm/boot/dts/am437x-l4.dtsi b/arch/arm/boot/dts/am437x-l4.dtsi
index c220dc3c4e0f..243e35f7a56c 100644
--- a/arch/arm/boot/dts/am437x-l4.dtsi
+++ b/arch/arm/boot/dts/am437x-l4.dtsi
@@ -521,7 +521,7 @@
 			ranges = <0x0 0x100000 0x8000>;
 
 			mac_sw: switch at 0 {
-				compatible = "ti,am4372-cpsw","ti,cpsw-switch";
+				compatible = "ti,am4372-cpsw-switch", "ti,cpsw-switch";
 				reg = <0x0 0x4000>;
 				ranges = <0 0 0x4000>;
 				clocks = <&cpsw_125mhz_gclk>, <&dpll_clksel_mac_clk>;
commit 2e6f11a797a24d1e2141a214a6dd6dfbe709f55d
Author: Qinglang Miao <miaoqinglang at huawei.com>
Date:   Tue Nov 10 15:42:23 2020 +0800

    scsi: ufshcd: Fix missing destroy_workqueue()
    
    Add the missing destroy_workqueue() before return from ufshcd_init in the
    error handling case as well as in ufshcd_remove.
    
    Link: https://lore.kernel.org/r/20201110074223.41280-1-miaoqinglang@huawei.com
    Fixes: 4db7a2360597 ("scsi: ufs: Fix concurrency of error handler and other error recovery paths")
    Suggested-by: Avri Altman <Avri.Altman at wdc.com>
    Reviewed-by: Asutosh Das <asutoshd at codeaurora.org>
    Reviewed-by: Avri Altman <avri.altman at wdc.com>
    Signed-off-by: Qinglang Miao <miaoqinglang at huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 5167c3e770a3..7a160b86adc6 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -8928,6 +8928,7 @@ void ufshcd_remove(struct ufs_hba *hba)
 	blk_mq_free_tag_set(&hba->tmf_tag_set);
 	blk_cleanup_queue(hba->cmd_queue);
 	scsi_remove_host(hba->host);
+	destroy_workqueue(hba->eh_wq);
 	/* disable interrupts */
 	ufshcd_disable_intr(hba, hba->intr_mask);
 	ufshcd_hba_stop(hba);
@@ -9228,6 +9229,7 @@ out_remove_scsi_host:
 exit_gating:
 	ufshcd_exit_clk_scaling(hba);
 	ufshcd_exit_clk_gating(hba);
+	destroy_workqueue(hba->eh_wq);
 out_disable:
 	hba->is_irq_enabled = false;
 	ufshcd_hba_exit(hba);
commit e87d24fce924bfcef9714bbaeb1514162420052e
Merge: 2b52a4b65bc8 4711497ae85d
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Tue Nov 10 18:08:21 2020 -0800

    Merge branch 'net-iucv-fixes-2020-11-09'
    
    Julian Wiedmann says:
    
    ====================
    net/iucv: fixes 2020-11-09
    
    One fix in the shutdown path for af_iucv sockets. This is relevant for
    stable as well.
    Also sending along an update for the Maintainers file.
    
    v1 -> v2: use the correct Fixes tag in patch 1 (Jakub)
    ====================
    
    Link: https://lore.kernel.org/r/20201109075706.56573-1-jwi@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 4711497ae85d90de903671989daf5145054c123e
Author: Ursula Braun <ubraun at linux.ibm.com>
Date:   Mon Nov 9 08:57:06 2020 +0100

    MAINTAINERS: remove Ursula Braun as s390 network maintainer
    
    I am retiring soon. Thus this patch removes myself from the
    MAINTAINERS file (s390 network).
    
    Signed-off-by: Ursula Braun <ubraun at linux.ibm.com>
    [jwi: fix up the subject]
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/MAINTAINERS b/MAINTAINERS
index cd123d0a6a2d..fa11fe773df5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -15246,7 +15246,6 @@ F:	drivers/iommu/s390-iommu.c
 S390 IUCV NETWORK LAYER
 M:	Julian Wiedmann <jwi at linux.ibm.com>
 M:	Karsten Graul <kgraul at linux.ibm.com>
-M:	Ursula Braun <ubraun at linux.ibm.com>
 L:	linux-s390 at vger.kernel.org
 S:	Supported
 W:	http://www.ibm.com/developerworks/linux/linux390/
@@ -15257,7 +15256,6 @@ F:	net/iucv/
 S390 NETWORK DRIVERS
 M:	Julian Wiedmann <jwi at linux.ibm.com>
 M:	Karsten Graul <kgraul at linux.ibm.com>
-M:	Ursula Braun <ubraun at linux.ibm.com>
 L:	linux-s390 at vger.kernel.org
 S:	Supported
 W:	http://www.ibm.com/developerworks/linux/linux390/
@@ -15828,7 +15826,6 @@ S:	Maintained
 F:	drivers/misc/sgi-xp/
 
 SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
-M:	Ursula Braun <ubraun at linux.ibm.com>
 M:	Karsten Graul <kgraul at linux.ibm.com>
 L:	linux-s390 at vger.kernel.org
 S:	Supported
commit 4031eeafa71eaf22ae40a15606a134ae86345daf
Author: Ursula Braun <ubraun at linux.ibm.com>
Date:   Mon Nov 9 08:57:05 2020 +0100

    net/af_iucv: fix null pointer dereference on shutdown
    
    syzbot reported the following KASAN finding:
    
    BUG: KASAN: nullptr-dereference in iucv_send_ctrl+0x390/0x3f0 net/iucv/af_iucv.c:385
    Read of size 2 at addr 000000000000021e by task syz-executor907/519
    
    CPU: 0 PID: 519 Comm: syz-executor907 Not tainted 5.9.0-syzkaller-07043-gbcf9877ad213 #0
    Hardware name: IBM 3906 M04 701 (KVM/Linux)
    Call Trace:
     [<00000000c576af60>] unwind_start arch/s390/include/asm/unwind.h:65 [inline]
     [<00000000c576af60>] show_stack+0x180/0x228 arch/s390/kernel/dumpstack.c:135
     [<00000000c9dcd1f8>] __dump_stack lib/dump_stack.c:77 [inline]
     [<00000000c9dcd1f8>] dump_stack+0x268/0x2f0 lib/dump_stack.c:118
     [<00000000c5fed016>] print_address_description.constprop.0+0x5e/0x218 mm/kasan/report.c:383
     [<00000000c5fec82a>] __kasan_report mm/kasan/report.c:517 [inline]
     [<00000000c5fec82a>] kasan_report+0x11a/0x168 mm/kasan/report.c:534
     [<00000000c98b5b60>] iucv_send_ctrl+0x390/0x3f0 net/iucv/af_iucv.c:385
     [<00000000c98b6262>] iucv_sock_shutdown+0x44a/0x4c0 net/iucv/af_iucv.c:1457
     [<00000000c89d3a54>] __sys_shutdown+0x12c/0x1c8 net/socket.c:2204
     [<00000000c89d3b70>] __do_sys_shutdown net/socket.c:2212 [inline]
     [<00000000c89d3b70>] __s390x_sys_shutdown+0x38/0x48 net/socket.c:2210
     [<00000000c9e36eac>] system_call+0xe0/0x28c arch/s390/kernel/entry.S:415
    
    There is nothing to shutdown if a connection has never been established.
    Besides that iucv->hs_dev is not yet initialized if a socket is in
    IUCV_OPEN state and iucv->path is not yet initialized if socket is in
    IUCV_BOUND state.
    So, just skip the shutdown calls for a socket in these states.
    
    Fixes: eac3731bd04c ("[S390]: Add AF_IUCV socket support")
    Fixes: 82492a355fac ("af_iucv: add shutdown for HS transport")
    Reviewed-by: Vasily Gorbik <gor at linux.ibm.com>
    Signed-off-by: Ursula Braun <ubraun at linux.ibm.com>
    [jwi: correct one Fixes tag]
    Signed-off-by: Julian Wiedmann <jwi at linux.ibm.com>
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
index d80572074667..047238f01ba6 100644
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -1434,7 +1434,8 @@ static int iucv_sock_shutdown(struct socket *sock, int how)
 		break;
 	}
 
-	if (how == SEND_SHUTDOWN || how == SHUTDOWN_MASK) {
+	if ((how == SEND_SHUTDOWN || how == SHUTDOWN_MASK) &&
+	    sk->sk_state == IUCV_CONNECTED) {
 		if (iucv->transport == AF_IUCV_TRANS_IUCV) {
 			txmsg.class = 0;
 			txmsg.tag = 0;
commit 2b52a4b65bc8f14520fe6e996ea7fb3f7e400761
Author: Sven Van Asbroeck <thesven73 at gmail.com>
Date:   Mon Nov 9 15:38:28 2020 -0500

    lan743x: fix "BUG: invalid wait context" when setting rx mode
    
    In the net core, the struct net_device_ops -> ndo_set_rx_mode()
    callback is called with the dev->addr_list_lock spinlock held.
    
    However, this driver's ndo_set_rx_mode callback eventually calls
    lan743x_dp_write(), which acquires a mutex. Mutex acquisition
    may sleep, and this is not allowed when holding a spinlock.
    
    Fix by removing the dp_lock mutex entirely. Its purpose is to
    prevent concurrent accesses to the data port. No concurrent
    accesses are possible, because the dev->addr_list_lock
    spinlock in the core only lets through one thread at a time.
    
    Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver")
    Signed-off-by: Sven Van Asbroeck <thesven73 at gmail.com>
    Link: https://lore.kernel.org/r/20201109203828.5115-1-TheSven73@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index bd77877cf1cc..173158656559 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -674,14 +674,12 @@ clean_up:
 static int lan743x_dp_write(struct lan743x_adapter *adapter,
 			    u32 select, u32 addr, u32 length, u32 *buf)
 {
-	int ret = -EIO;
 	u32 dp_sel;
 	int i;
 
-	mutex_lock(&adapter->dp_lock);
 	if (lan743x_csr_wait_for_bit(adapter, DP_SEL, DP_SEL_DPRDY_,
 				     1, 40, 100, 100))
-		goto unlock;
+		return -EIO;
 	dp_sel = lan743x_csr_read(adapter, DP_SEL);
 	dp_sel &= ~DP_SEL_MASK_;
 	dp_sel |= select;
@@ -693,13 +691,10 @@ static int lan743x_dp_write(struct lan743x_adapter *adapter,
 		lan743x_csr_write(adapter, DP_CMD, DP_CMD_WRITE_);
 		if (lan743x_csr_wait_for_bit(adapter, DP_SEL, DP_SEL_DPRDY_,
 					     1, 40, 100, 100))
-			goto unlock;
+			return -EIO;
 	}
-	ret = 0;
 
-unlock:
-	mutex_unlock(&adapter->dp_lock);
-	return ret;
+	return 0;
 }
 
 static u32 lan743x_mac_mii_access(u16 id, u16 index, int read)
@@ -2735,7 +2730,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
 
 	adapter->intr.irq = adapter->pdev->irq;
 	lan743x_csr_write(adapter, INT_EN_CLR, 0xFFFFFFFF);
-	mutex_init(&adapter->dp_lock);
 
 	ret = lan743x_gpio_init(adapter);
 	if (ret)
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index c61a40411317..a536f4a4994d 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -712,9 +712,6 @@ struct lan743x_adapter {
 	struct lan743x_csr      csr;
 	struct lan743x_intr     intr;
 
-	/* lock, used to prevent concurrent access to data port */
-	struct mutex		dp_lock;
-
 	struct lan743x_gpio	gpio;
 	struct lan743x_ptp	ptp;
 
commit 2bae900b9419db3f3e43bbda3194657235fee096
Author: zhangxiaoxu <zhangxiaoxu5 at huawei.com>
Date:   Mon Nov 9 09:44:16 2020 -0500

    net: dsa: mv88e6xxx: Fix memleak in mv88e6xxx_region_atu_snapshot
    
    When mv88e6xxx_fid_map return error, we lost free the table.
    
    Fix it.
    
    Fixes: bfb255428966 ("net: dsa: mv88e6xxx: Add devlink regions")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: zhangxiaoxu <zhangxiaoxu5 at huawei.com>
    Reviewed-by: Andrew Lunn <andrew at lunn.ch>
    Link: https://lore.kernel.org/r/20201109144416.1540867-1-zhangxiaoxu5@huawei.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/dsa/mv88e6xxx/devlink.c b/drivers/net/dsa/mv88e6xxx/devlink.c
index 10cd1bfd81a0..ade04c036fd9 100644
--- a/drivers/net/dsa/mv88e6xxx/devlink.c
+++ b/drivers/net/dsa/mv88e6xxx/devlink.c
@@ -393,8 +393,10 @@ static int mv88e6xxx_region_atu_snapshot(struct devlink *dl,
 	mv88e6xxx_reg_lock(chip);
 
 	err = mv88e6xxx_fid_map(chip, fid_bitmap);
-	if (err)
+	if (err) {
+		kfree(table);
 		goto out;
+	}
 
 	while (1) {
 		fid = find_next_bit(fid_bitmap, MV88E6XXX_N_FID, fid + 1);
commit 909172a149749242990a6e64cb55d55460d4e417
Author: Mao Wenan <wenan.mao at linux.alibaba.com>
Date:   Tue Nov 10 08:16:31 2020 +0800

    net: Update window_clamp if SOCK_RCVBUF is set
    
    When net.ipv4.tcp_syncookies=1 and syn flood is happened,
    cookie_v4_check or cookie_v6_check tries to redo what
    tcp_v4_send_synack or tcp_v6_send_synack did,
    rsk_window_clamp will be changed if SOCK_RCVBUF is set,
    which will make rcv_wscale is different, the client
    still operates with initial window scale and can overshot
    granted window, the client use the initial scale but local
    server use new scale to advertise window value, and session
    work abnormally.
    
    Fixes: e88c64f0a425 ("tcp: allow effective reduction of TCP's rcv-buffer via setsockopt")
    Signed-off-by: Mao Wenan <wenan.mao at linux.alibaba.com>
    Signed-off-by: Eric Dumazet <edumazet at google.com>
    Link: https://lore.kernel.org/r/1604967391-123737-1-git-send-email-wenan.mao@linux.alibaba.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c
index 6ac473b47f30..00dc3f943c80 100644
--- a/net/ipv4/syncookies.c
+++ b/net/ipv4/syncookies.c
@@ -331,7 +331,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb)
 	__u32 cookie = ntohl(th->ack_seq) - 1;
 	struct sock *ret = sk;
 	struct request_sock *req;
-	int mss;
+	int full_space, mss;
 	struct rtable *rt;
 	__u8 rcv_wscale;
 	struct flowi4 fl4;
@@ -427,8 +427,13 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb)
 
 	/* Try to redo what tcp_v4_send_synack did. */
 	req->rsk_window_clamp = tp->window_clamp ? :dst_metric(&rt->dst, RTAX_WINDOW);
+	/* limit the window selection if the user enforce a smaller rx buffer */
+	full_space = tcp_full_space(sk);
+	if (sk->sk_userlocks & SOCK_RCVBUF_LOCK &&
+	    (req->rsk_window_clamp > full_space || req->rsk_window_clamp == 0))
+		req->rsk_window_clamp = full_space;
 
-	tcp_select_initial_window(sk, tcp_full_space(sk), req->mss,
+	tcp_select_initial_window(sk, full_space, req->mss,
 				  &req->rsk_rcv_wnd, &req->rsk_window_clamp,
 				  ireq->wscale_ok, &rcv_wscale,
 				  dst_metric(&rt->dst, RTAX_INITRWND));
diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c
index e796a64be308..9b6cae1e49d9 100644
--- a/net/ipv6/syncookies.c
+++ b/net/ipv6/syncookies.c
@@ -136,7 +136,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)
 	__u32 cookie = ntohl(th->ack_seq) - 1;
 	struct sock *ret = sk;
 	struct request_sock *req;
-	int mss;
+	int full_space, mss;
 	struct dst_entry *dst;
 	__u8 rcv_wscale;
 	u32 tsoff = 0;
@@ -241,7 +241,13 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)
 	}
 
 	req->rsk_window_clamp = tp->window_clamp ? :dst_metric(dst, RTAX_WINDOW);
-	tcp_select_initial_window(sk, tcp_full_space(sk), req->mss,
+	/* limit the window selection if the user enforce a smaller rx buffer */
+	full_space = tcp_full_space(sk);
+	if (sk->sk_userlocks & SOCK_RCVBUF_LOCK &&
+	    (req->rsk_window_clamp > full_space || req->rsk_window_clamp == 0))
+		req->rsk_window_clamp = full_space;
+
+	tcp_select_initial_window(sk, full_space, req->mss,
 				  &req->rsk_rcv_wnd, &req->rsk_window_clamp,
 				  ireq->wscale_ok, &rcv_wscale,
 				  dst_metric(dst, RTAX_INITRWND));
commit c583bcb8f5edd48c1798798e341f78afb9bf4f6f
Author: Paul E. McKenney <paulmck at kernel.org>
Date:   Thu Sep 24 15:11:55 2020 -0700

    rcu: Don't invoke try_invoke_on_locked_down_task() with irqs disabled
    
    The try_invoke_on_locked_down_task() function requires that
    interrupts be enabled, but it is called with interrupts disabled from
    rcu_print_task_stall(), resulting in an "IRQs not enabled as expected"
    diagnostic.  This commit therefore updates rcu_print_task_stall()
    to accumulate a list of the first few tasks while holding the current
    leaf rcu_node structure's ->lock, then releases that lock and only then
    uses try_invoke_on_locked_down_task() to attempt to obtain per-task
    detailed information.  Of course, as soon as ->lock is released, the
    task might exit, so the get_task_struct() function is used to prevent
    the task structure from going away in the meantime.
    
    Link: https://lore.kernel.org/lkml/000000000000903d5805ab908fc4@google.com/
    Fixes: 5bef8da66a9c ("rcu: Add per-task state to RCU CPU stall warnings")
    Reported-by: syzbot+cb3b69ae80afd6535b0e at syzkaller.appspotmail.com
    Reported-by: syzbot+f04854e1c5c9e913cc27 at syzkaller.appspotmail.com
    Tested-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
    Signed-off-by: Paul E. McKenney <paulmck at kernel.org>

diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
index 0fde39b8daab..ca21d28a0f98 100644
--- a/kernel/rcu/tree_stall.h
+++ b/kernel/rcu/tree_stall.h
@@ -249,13 +249,16 @@ static bool check_slow_task(struct task_struct *t, void *arg)
 
 /*
  * Scan the current list of tasks blocked within RCU read-side critical
- * sections, printing out the tid of each.
+ * sections, printing out the tid of each of the first few of them.
  */
-static int rcu_print_task_stall(struct rcu_node *rnp)
+static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags)
+	__releases(rnp->lock)
 {
+	int i = 0;
 	int ndetected = 0;
 	struct rcu_stall_chk_rdr rscr;
 	struct task_struct *t;
+	struct task_struct *ts[8];
 
 	if (!rcu_preempt_blocked_readers_cgp(rnp))
 		return 0;
@@ -264,6 +267,14 @@ static int rcu_print_task_stall(struct rcu_node *rnp)
 	t = list_entry(rnp->gp_tasks->prev,
 		       struct task_struct, rcu_node_entry);
 	list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry) {
+		get_task_struct(t);
+		ts[i++] = t;
+		if (i >= ARRAY_SIZE(ts))
+			break;
+	}
+	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
+	for (i--; i; i--) {
+		t = ts[i];
 		if (!try_invoke_on_locked_down_task(t, check_slow_task, &rscr))
 			pr_cont(" P%d", t->pid);
 		else
@@ -273,6 +284,7 @@ static int rcu_print_task_stall(struct rcu_node *rnp)
 				".q"[rscr.rs.b.need_qs],
 				".e"[rscr.rs.b.exp_hint],
 				".l"[rscr.on_blkd_list]);
+		put_task_struct(t);
 		ndetected++;
 	}
 	pr_cont("\n");
@@ -293,8 +305,9 @@ static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp)
  * Because preemptible RCU does not exist, we never have to check for
  * tasks blocked within RCU read-side critical sections.
  */
-static int rcu_print_task_stall(struct rcu_node *rnp)
+static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags)
 {
+	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
 	return 0;
 }
 #endif /* #else #ifdef CONFIG_PREEMPT_RCU */
@@ -472,7 +485,6 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
 	pr_err("INFO: %s detected stalls on CPUs/tasks:\n", rcu_state.name);
 	rcu_for_each_leaf_node(rnp) {
 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
-		ndetected += rcu_print_task_stall(rnp);
 		if (rnp->qsmask != 0) {
 			for_each_leaf_node_possible_cpu(rnp, cpu)
 				if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) {
@@ -480,7 +492,7 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
 					ndetected++;
 				}
 		}
-		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
+		ndetected += rcu_print_task_stall(rnp, flags); // Releases rnp->lock.
 	}
 
 	for_each_possible_cpu(cpu)
commit 9b8523423b23ee3dfd88e32f5b7207be56a4e782
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Tue Nov 10 16:50:21 2020 -0800

    vfs: move __sb_{start,end}_write* to fs.h
    
    Now that we've straightened out the callers, move these three functions
    to fs.h since they're fairly trivial.
    
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Jan Kara <jack at suse.cz>

diff --git a/fs/super.c b/fs/super.c
index 59aa59279133..98bb0629ee10 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1631,36 +1631,6 @@ int super_setup_bdi(struct super_block *sb)
 }
 EXPORT_SYMBOL(super_setup_bdi);
 
-/*
- * This is an internal function, please use sb_end_{write,pagefault,intwrite}
- * instead.
- */
-void __sb_end_write(struct super_block *sb, int level)
-{
-	percpu_up_read(sb->s_writers.rw_sem + level-1);
-}
-EXPORT_SYMBOL(__sb_end_write);
-
-/*
- * This is an internal function, please use sb_start_{write,pagefault,intwrite}
- * instead.
- */
-void __sb_start_write(struct super_block *sb, int level)
-{
-	percpu_down_read(sb->s_writers.rw_sem + level - 1);
-}
-EXPORT_SYMBOL(__sb_start_write);
-
-/*
- * This is an internal function, please use sb_start_{write,pagefault,intwrite}
- * instead.
- */
-bool __sb_start_write_trylock(struct super_block *sb, int level)
-{
-	return percpu_down_read_trylock(sb->s_writers.rw_sem + level - 1);
-}
-EXPORT_SYMBOL_GPL(__sb_start_write_trylock);
-
 /**
  * sb_wait_write - wait until all writers to given file system finish
  * @sb: the super for which we wait
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 305989afd49c..6dabd019cab0 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1580,9 +1580,24 @@ extern struct timespec64 current_time(struct inode *inode);
  * Snapshotting support.
  */
 
-void __sb_end_write(struct super_block *sb, int level);
-void __sb_start_write(struct super_block *sb, int level);
-bool __sb_start_write_trylock(struct super_block *sb, int level);
+/*
+ * These are internal functions, please use sb_start_{write,pagefault,intwrite}
+ * instead.
+ */
+static inline void __sb_end_write(struct super_block *sb, int level)
+{
+	percpu_up_read(sb->s_writers.rw_sem + level-1);
+}
+
+static inline void __sb_start_write(struct super_block *sb, int level)
+{
+	percpu_down_read(sb->s_writers.rw_sem + level - 1);
+}
+
+static inline bool __sb_start_write_trylock(struct super_block *sb, int level)
+{
+	return percpu_down_read_trylock(sb->s_writers.rw_sem + level - 1);
+}
 
 #define __sb_writers_acquired(sb, lev)	\
 	percpu_rwsem_acquire(&(sb)->s_writers.rw_sem[(lev)-1], 1, _THIS_IP_)
commit 8a3c84b649b033024d2349f96234b26cbd6083a6
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Tue Nov 10 16:50:21 2020 -0800

    vfs: separate __sb_start_write into blocking and non-blocking helpers
    
    Break this function into two helpers so that it's obvious that the
    trylock versions return a value that must be checked, and the blocking
    versions don't require that.  While we're at it, clean up the return
    type mismatch.
    
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Jan Kara <jack at suse.cz>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/aio.c b/fs/aio.c
index c45c20d87538..6a21d8919409 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1572,7 +1572,7 @@ static int aio_write(struct kiocb *req, const struct iocb *iocb,
 		 * we return to userspace.
 		 */
 		if (S_ISREG(file_inode(file)->i_mode)) {
-			__sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);
+			sb_start_write(file_inode(file)->i_sb);
 			__sb_writers_release(file_inode(file)->i_sb, SB_FREEZE_WRITE);
 		}
 		req->ki_flags |= IOCB_WRITE;
diff --git a/fs/io_uring.c b/fs/io_uring.c
index b42dfa0243bf..4cbaddfe3d80 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -3532,8 +3532,7 @@ static int io_write(struct io_kiocb *req, bool force_nonblock,
 	 * we return to userspace.
 	 */
 	if (req->flags & REQ_F_ISREG) {
-		__sb_start_write(file_inode(req->file)->i_sb,
-					SB_FREEZE_WRITE, true);
+		sb_start_write(file_inode(req->file)->i_sb);
 		__sb_writers_release(file_inode(req->file)->i_sb,
 					SB_FREEZE_WRITE);
 	}
diff --git a/fs/super.c b/fs/super.c
index e1fd667454d4..59aa59279133 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1645,16 +1645,22 @@ EXPORT_SYMBOL(__sb_end_write);
  * This is an internal function, please use sb_start_{write,pagefault,intwrite}
  * instead.
  */
-int __sb_start_write(struct super_block *sb, int level, bool wait)
+void __sb_start_write(struct super_block *sb, int level)
 {
-	if (!wait)
-		return percpu_down_read_trylock(sb->s_writers.rw_sem + level-1);
-
-	percpu_down_read(sb->s_writers.rw_sem + level-1);
-	return 1;
+	percpu_down_read(sb->s_writers.rw_sem + level - 1);
 }
 EXPORT_SYMBOL(__sb_start_write);
 
+/*
+ * This is an internal function, please use sb_start_{write,pagefault,intwrite}
+ * instead.
+ */
+bool __sb_start_write_trylock(struct super_block *sb, int level)
+{
+	return percpu_down_read_trylock(sb->s_writers.rw_sem + level - 1);
+}
+EXPORT_SYMBOL_GPL(__sb_start_write_trylock);
+
 /**
  * sb_wait_write - wait until all writers to given file system finish
  * @sb: the super for which we wait
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 0bd126418bb6..305989afd49c 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1581,7 +1581,8 @@ extern struct timespec64 current_time(struct inode *inode);
  */
 
 void __sb_end_write(struct super_block *sb, int level);
-int __sb_start_write(struct super_block *sb, int level, bool wait);
+void __sb_start_write(struct super_block *sb, int level);
+bool __sb_start_write_trylock(struct super_block *sb, int level);
 
 #define __sb_writers_acquired(sb, lev)	\
 	percpu_rwsem_acquire(&(sb)->s_writers.rw_sem[(lev)-1], 1, _THIS_IP_)
@@ -1645,12 +1646,12 @@ static inline void sb_end_intwrite(struct super_block *sb)
  */
 static inline void sb_start_write(struct super_block *sb)
 {
-	__sb_start_write(sb, SB_FREEZE_WRITE, true);
+	__sb_start_write(sb, SB_FREEZE_WRITE);
 }
 
-static inline int sb_start_write_trylock(struct super_block *sb)
+static inline bool sb_start_write_trylock(struct super_block *sb)
 {
-	return __sb_start_write(sb, SB_FREEZE_WRITE, false);
+	return __sb_start_write_trylock(sb, SB_FREEZE_WRITE);
 }
 
 /**
@@ -1674,7 +1675,7 @@ static inline int sb_start_write_trylock(struct super_block *sb)
  */
 static inline void sb_start_pagefault(struct super_block *sb)
 {
-	__sb_start_write(sb, SB_FREEZE_PAGEFAULT, true);
+	__sb_start_write(sb, SB_FREEZE_PAGEFAULT);
 }
 
 /*
@@ -1692,12 +1693,12 @@ static inline void sb_start_pagefault(struct super_block *sb)
  */
 static inline void sb_start_intwrite(struct super_block *sb)
 {
-	__sb_start_write(sb, SB_FREEZE_FS, true);
+	__sb_start_write(sb, SB_FREEZE_FS);
 }
 
-static inline int sb_start_intwrite_trylock(struct super_block *sb)
+static inline bool sb_start_intwrite_trylock(struct super_block *sb)
 {
-	return __sb_start_write(sb, SB_FREEZE_FS, false);
+	return __sb_start_write_trylock(sb, SB_FREEZE_FS);
 }
 
 
@@ -2756,14 +2757,14 @@ static inline void file_start_write(struct file *file)
 {
 	if (!S_ISREG(file_inode(file)->i_mode))
 		return;
-	__sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);
+	sb_start_write(file_inode(file)->i_sb);
 }
 
 static inline bool file_start_write_trylock(struct file *file)
 {
 	if (!S_ISREG(file_inode(file)->i_mode))
 		return true;
-	return __sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, false);
+	return sb_start_write_trylock(file_inode(file)->i_sb);
 }
 
 static inline void file_end_write(struct file *file)
commit 22843291efc986ce7722610073fcf85a39b4cb13
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Tue Nov 10 16:49:29 2020 -0800

    vfs: remove lockdep bogosity in __sb_start_write
    
    __sb_start_write has some weird looking lockdep code that claims to
    exist to handle nested freeze locking requests from xfs.  The code as
    written seems broken -- if we think we hold a read lock on any of the
    higher freeze levels (e.g. we hold SB_FREEZE_WRITE and are trying to
    lock SB_FREEZE_PAGEFAULT), it converts a blocking lock attempt into a
    trylock.
    
    However, it's not correct to downgrade a blocking lock attempt to a
    trylock unless the downgrading code or the callers are prepared to deal
    with that situation.  Neither __sb_start_write nor its callers handle
    this at all.  For example:
    
    sb_start_pagefault ignores the return value completely, with the result
    that if xfs_filemap_fault loses a race with a different thread trying to
    fsfreeze, it will proceed without pagefault freeze protection (thereby
    breaking locking rules) and then unlocks the pagefault freeze lock that
    it doesn't own on its way out (thereby corrupting the lock state), which
    leads to a system hang shortly afterwards.
    
    Normally, this won't happen because our ownership of a read lock on a
    higher freeze protection level blocks fsfreeze from grabbing a write
    lock on that higher level.  *However*, if lockdep is offline,
    lock_is_held_type unconditionally returns 1, which means that
    percpu_rwsem_is_held returns 1, which means that __sb_start_write
    unconditionally converts blocking freeze lock attempts into trylocks,
    even when we *don't* hold anything that would block a fsfreeze.
    
    Apparently this all held together until 5.10-rc1, when bugs in lockdep
    caused lockdep to shut itself off early in an fstests run, and once
    fstests gets to the "race writes with freezer" tests, kaboom.  This
    might explain the long trail of vanishingly infrequent livelocks in
    fstests after lockdep goes offline that I've never been able to
    diagnose.
    
    We could fix it by spinning on the trylock if wait==true, but AFAICT the
    locking works fine if lockdep is not built at all (and I didn't see any
    complaints running fstests overnight), so remove this snippet entirely.
    
    NOTE: Commit f4b554af9931 in 2015 created the current weird logic (which
    used to exist in a different form in commit 5accdf82ba25c from 2012) in
    __sb_start_write.  XFS solved this whole problem in the late 2.6 era by
    creating a variant of transactions (XFS_TRANS_NO_WRITECOUNT) that don't
    grab intwrite freeze protection, thus making lockdep's solution
    unnecessary.  The commit claims that Dave Chinner explained that the
    trylock hack + comment could be removed, but nobody ever did.
    
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Jan Kara <jack at suse.cz>

diff --git a/fs/super.c b/fs/super.c
index a51c2083cd6b..e1fd667454d4 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1647,36 +1647,11 @@ EXPORT_SYMBOL(__sb_end_write);
  */
 int __sb_start_write(struct super_block *sb, int level, bool wait)
 {
-	bool force_trylock = false;
-	int ret = 1;
+	if (!wait)
+		return percpu_down_read_trylock(sb->s_writers.rw_sem + level-1);
 
-#ifdef CONFIG_LOCKDEP
-	/*
-	 * We want lockdep to tell us about possible deadlocks with freezing
-	 * but it's it bit tricky to properly instrument it. Getting a freeze
-	 * protection works as getting a read lock but there are subtle
-	 * problems. XFS for example gets freeze protection on internal level
-	 * twice in some cases, which is OK only because we already hold a
-	 * freeze protection also on higher level. Due to these cases we have
-	 * to use wait == F (trylock mode) which must not fail.
-	 */
-	if (wait) {
-		int i;
-
-		for (i = 0; i < level - 1; i++)
-			if (percpu_rwsem_is_held(sb->s_writers.rw_sem + i)) {
-				force_trylock = true;
-				break;
-			}
-	}
-#endif
-	if (wait && !force_trylock)
-		percpu_down_read(sb->s_writers.rw_sem + level-1);
-	else
-		ret = percpu_down_read_trylock(sb->s_writers.rw_sem + level-1);
-
-	WARN_ON(force_trylock && !ret);
-	return ret;
+	percpu_down_read(sb->s_writers.rw_sem + level-1);
+	return 1;
 }
 EXPORT_SYMBOL(__sb_start_write);
 
commit 54e9b09e153842ab5adb8a460b891e11b39e9c3d
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:42 2020 -0800

    xfs: fix brainos in the refcount scrubber's rmap fragment processor
    
    Fix some serious WTF in the reference count scrubber's rmap fragment
    processing.  The code comment says that this loop is supposed to move
    all fragment records starting at or before bno onto the worklist, but
    there's no obvious reason why nr (the number of items added) should
    increment starting from 1, and breaking the loop when we've added the
    target number seems dubious since we could have more rmap fragments that
    should have been added to the worklist.
    
    This seems to manifest in xfs/411 when adding one to the refcount field.
    
    Fixes: dbde19da9637 ("xfs: cross-reference the rmapbt data with the refcountbt")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/scrub/refcount.c b/fs/xfs/scrub/refcount.c
index beaeb6fa3119..dd672e6bbc75 100644
--- a/fs/xfs/scrub/refcount.c
+++ b/fs/xfs/scrub/refcount.c
@@ -170,7 +170,6 @@ xchk_refcountbt_process_rmap_fragments(
 	 */
 	INIT_LIST_HEAD(&worklist);
 	rbno = NULLAGBLOCK;
-	nr = 1;
 
 	/* Make sure the fragments actually /are/ in agbno order. */
 	bno = 0;
@@ -184,15 +183,14 @@ xchk_refcountbt_process_rmap_fragments(
 	 * Find all the rmaps that start at or before the refc extent,
 	 * and put them on the worklist.
 	 */
+	nr = 0;
 	list_for_each_entry_safe(frag, n, &refchk->fragments, list) {
-		if (frag->rm.rm_startblock > refchk->bno)
-			goto done;
+		if (frag->rm.rm_startblock > refchk->bno || nr > target_nr)
+			break;
 		bno = frag->rm.rm_startblock + frag->rm.rm_blockcount;
 		if (bno < rbno)
 			rbno = bno;
 		list_move_tail(&frag->list, &worklist);
-		if (nr == target_nr)
-			break;
 		nr++;
 	}
 
commit 6ff646b2ceb0eec916101877f38da0b73e3a5b7f
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:44 2020 -0800

    xfs: fix rmap key and record comparison functions
    
    Keys for extent interval records in the reverse mapping btree are
    supposed to be computed as follows:
    
    (physical block, owner, fork, is_btree, is_unwritten, offset)
    
    This provides users the ability to look up a reverse mapping from a bmbt
    record -- start with the physical block; then if there are multiple
    records for the same block, move on to the owner; then the inode fork
    type; and so on to the file offset.
    
    However, the key comparison functions incorrectly remove the
    fork/btree/unwritten information that's encoded in the on-disk offset.
    This means that lookup comparisons are only done with:
    
    (physical block, owner, offset)
    
    This means that queries can return incorrect results.  On consistent
    filesystems this hasn't been an issue because blocks are never shared
    between forks or with bmbt blocks; and are never unwritten.  However,
    this bug means that online repair cannot always detect corruption in the
    key information in internal rmapbt nodes.
    
    Found by fuzzing keys[1].attrfork = ones on xfs/371.
    
    Fixes: 4b8ed67794fe ("xfs: add rmap btree operations")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
index beb81c84a937..577a66381327 100644
--- a/fs/xfs/libxfs/xfs_rmap_btree.c
+++ b/fs/xfs/libxfs/xfs_rmap_btree.c
@@ -243,8 +243,8 @@ xfs_rmapbt_key_diff(
 	else if (y > x)
 		return -1;
 
-	x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset));
-	y = rec->rm_offset;
+	x = be64_to_cpu(kp->rm_offset);
+	y = xfs_rmap_irec_offset_pack(rec);
 	if (x > y)
 		return 1;
 	else if (y > x)
@@ -275,8 +275,8 @@ xfs_rmapbt_diff_two_keys(
 	else if (y > x)
 		return -1;
 
-	x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset));
-	y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset));
+	x = be64_to_cpu(kp1->rm_offset);
+	y = be64_to_cpu(kp2->rm_offset);
 	if (x > y)
 		return 1;
 	else if (y > x)
@@ -390,8 +390,8 @@ xfs_rmapbt_keys_inorder(
 		return 1;
 	else if (a > b)
 		return 0;
-	a = XFS_RMAP_OFF(be64_to_cpu(k1->rmap.rm_offset));
-	b = XFS_RMAP_OFF(be64_to_cpu(k2->rmap.rm_offset));
+	a = be64_to_cpu(k1->rmap.rm_offset);
+	b = be64_to_cpu(k2->rmap.rm_offset);
 	if (a <= b)
 		return 1;
 	return 0;
@@ -420,8 +420,8 @@ xfs_rmapbt_recs_inorder(
 		return 1;
 	else if (a > b)
 		return 0;
-	a = XFS_RMAP_OFF(be64_to_cpu(r1->rmap.rm_offset));
-	b = XFS_RMAP_OFF(be64_to_cpu(r2->rmap.rm_offset));
+	a = be64_to_cpu(r1->rmap.rm_offset);
+	b = be64_to_cpu(r2->rmap.rm_offset);
 	if (a <= b)
 		return 1;
 	return 0;
commit 5dda3897fd90783358c4c6115ef86047d8c8f503
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:43 2020 -0800

    xfs: set the unwritten bit in rmap lookup flags in xchk_bmap_get_rmapextents
    
    When the bmbt scrubber is looking up rmap extents, we need to set the
    extent flags from the bmbt record fully.  This will matter once we fix
    the rmap btree comparison functions to check those flags correctly.
    
    Fixes: d852657ccfc0 ("xfs: cross-reference reverse-mapping btree")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/scrub/bmap.c b/fs/xfs/scrub/bmap.c
index 955302e7cdde..412e2ec55e38 100644
--- a/fs/xfs/scrub/bmap.c
+++ b/fs/xfs/scrub/bmap.c
@@ -113,6 +113,8 @@ xchk_bmap_get_rmap(
 
 	if (info->whichfork == XFS_ATTR_FORK)
 		rflags |= XFS_RMAP_ATTR_FORK;
+	if (irec->br_state == XFS_EXT_UNWRITTEN)
+		rflags |= XFS_RMAP_UNWRITTEN;
 
 	/*
 	 * CoW staging extents are owned (on disk) by the refcountbt, so
commit ea8439899c0b15a176664df62aff928010fad276
Author: Darrick J. Wong <darrick.wong at oracle.com>
Date:   Sun Nov 8 16:32:43 2020 -0800

    xfs: fix flags argument to rmap lookup when converting shared file rmaps
    
    Pass the same oldext argument (which contains the existing rmapping's
    unwritten state) to xfs_rmap_lookup_le_range at the start of
    xfs_rmap_convert_shared.  At this point in the code, flags is zero,
    which means that we perform lookups using the wrong key.
    
    Fixes: 3f165b334e51 ("xfs: convert unwritten status of reverse mappings for shared files")
    Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>

diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c
index 340c83f76c80..2668ebe02865 100644
--- a/fs/xfs/libxfs/xfs_rmap.c
+++ b/fs/xfs/libxfs/xfs_rmap.c
@@ -1514,7 +1514,7 @@ xfs_rmap_convert_shared(
 	 * record for our insertion point. This will also give us the record for
 	 * start block contiguity tests.
 	 */
-	error = xfs_rmap_lookup_le_range(cur, bno, owner, offset, flags,
+	error = xfs_rmap_lookup_le_range(cur, bno, owner, offset, oldext,
 			&PREV, &i);
 	if (error)
 		goto done;
commit f3037c5a31b58a73b32a36e938ad0560085acadd
Author: Heiner Kallweit <hkallweit1 at gmail.com>
Date:   Sun Nov 8 22:44:02 2020 +0100

    net: phy: realtek: support paged operations on RTL8201CP
    
    The RTL8401-internal PHY identifies as RTL8201CP, and the init
    sequence in r8169, copied from vendor driver r8168, uses paged
    operations. Therefore set the same paged operation callbacks as
    for the other Realtek PHY's.
    
    Fixes: cdafdc29ef75 ("r8169: sync support for RTL8401 with vendor driver")
    Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
    Link: https://lore.kernel.org/r/69882f7a-ca2f-e0c7-ae83-c9b6937282cd@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index fb1db713b7fb..575580d3ffe0 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -551,6 +551,8 @@ static struct phy_driver realtek_drvs[] = {
 	{
 		PHY_ID_MATCH_EXACT(0x00008201),
 		.name           = "RTL8201CP Ethernet",
+		.read_page	= rtl821x_read_page,
+		.write_page	= rtl821x_write_page,
 	}, {
 		PHY_ID_MATCH_EXACT(0x001cc816),
 		.name		= "RTL8201F Fast Ethernet",
commit 902a66e08ceaadb9a7a1ab3a4f3af611cd1d8cba
Author: Sven Van Asbroeck <thesven73 at gmail.com>
Date:   Sun Nov 8 12:12:24 2020 -0500

    lan743x: correctly handle chips with internal PHY
    
    Commit 6f197fb63850 ("lan743x: Added fixed link and RGMII support")
    assumes that chips with an internal PHY will never have a devicetree
    entry. This is incorrect: even for these chips, a devicetree entry
    can be useful e.g. to pass the mac address from bootloader to chip:
    
        &pcie {
                status = "okay";
    
                host at 0 {
                        reg = <0 0 0 0 0>;
    
                        #address-cells = <3>;
                        #size-cells = <2>;
    
                        lan7430: ethernet at 0 {
                                /* LAN7430 with internal PHY */
                                compatible = "microchip,lan743x";
                                status = "okay";
                                reg = <0 0 0 0 0>;
                                /* filled in by bootloader */
                                local-mac-address = [00 00 00 00 00 00];
                        };
                };
        };
    
    If a devicetree entry is present, the driver will not attach the chip
    to its internal phy, and the chip will be non-operational.
    
    Fix by tweaking the phy connection algorithm:
    - first try to connect to a phy specified in the devicetree
      (could be 'real' phy, or just a 'fixed-link')
    - if that doesn't succeed, try to connect to an internal phy, even
      if the chip has a devnode
    
    Tested on a LAN7430 with internal PHY. I cannot test a device using
    fixed-link, as I do not have access to one.
    
    Fixes: 6f197fb63850 ("lan743x: Added fixed link and RGMII support")
    Tested-by: Sven Van Asbroeck <thesven73 at gmail.com> # lan7430
    Reviewed-by: Andrew Lunn <andrew at lunn.ch>
    Signed-off-by: Sven Van Asbroeck <thesven73 at gmail.com>
    Link: https://lore.kernel.org/r/20201108171224.23829-1-TheSven73@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index a1938842f828..bd77877cf1cc 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -1026,9 +1026,9 @@ static int lan743x_phy_open(struct lan743x_adapter *adapter)
 
 	netdev = adapter->netdev;
 	phynode = of_node_get(adapter->pdev->dev.of_node);
-	adapter->phy_mode = PHY_INTERFACE_MODE_GMII;
 
 	if (phynode) {
+		/* try devicetree phy, or fixed link */
 		of_get_phy_mode(phynode, &adapter->phy_mode);
 
 		if (of_phy_is_fixed_link(phynode)) {
@@ -1044,13 +1044,15 @@ static int lan743x_phy_open(struct lan743x_adapter *adapter)
 					lan743x_phy_link_status_change, 0,
 					adapter->phy_mode);
 		of_node_put(phynode);
-		if (!phydev)
-			goto return_error;
-	} else {
+	}
+
+	if (!phydev) {
+		/* try internal phy */
 		phydev = phy_find_first(adapter->mdiobus);
 		if (!phydev)
 			goto return_error;
 
+		adapter->phy_mode = PHY_INTERFACE_MODE_GMII;
 		ret = phy_connect_direct(netdev, phydev,
 					 lan743x_phy_link_status_change,
 					 adapter->phy_mode);
commit 866358ec331f8faa394995fb4b511af1db0247c8
Author: Paul Moore <paul at paul-moore.com>
Date:   Sun Nov 8 09:08:26 2020 -0500

    netlabel: fix our progress tracking in netlbl_unlabel_staticlist()
    
    The current NetLabel code doesn't correctly keep track of the netlink
    dump state in some cases, in particular when multiple interfaces with
    large configurations are loaded.  The problem manifests itself by not
    reporting the full configuration to userspace, even though it is
    loaded and active in the kernel.  This patch fixes this by ensuring
    that the dump state is properly reset when necessary inside the
    netlbl_unlabel_staticlist() function.
    
    Fixes: 8cc44579d1bd ("NetLabel: Introduce static network labels for unlabeled connections")
    Signed-off-by: Paul Moore <paul at paul-moore.com>
    Link: https://lore.kernel.org/r/160484450633.3752.16512718263560813473.stgit@sifl
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c
index 2e8e3f7b2111..fc55c9116da0 100644
--- a/net/netlabel/netlabel_unlabeled.c
+++ b/net/netlabel/netlabel_unlabeled.c
@@ -1166,12 +1166,13 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
 	struct netlbl_unlhsh_walk_arg cb_arg;
 	u32 skip_bkt = cb->args[0];
 	u32 skip_chain = cb->args[1];
-	u32 iter_bkt;
-	u32 iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0;
+	u32 skip_addr4 = cb->args[2];
+	u32 iter_bkt, iter_chain, iter_addr4 = 0, iter_addr6 = 0;
 	struct netlbl_unlhsh_iface *iface;
 	struct list_head *iter_list;
 	struct netlbl_af4list *addr4;
 #if IS_ENABLED(CONFIG_IPV6)
+	u32 skip_addr6 = cb->args[3];
 	struct netlbl_af6list *addr6;
 #endif
 
@@ -1182,7 +1183,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
 	rcu_read_lock();
 	for (iter_bkt = skip_bkt;
 	     iter_bkt < rcu_dereference(netlbl_unlhsh)->size;
-	     iter_bkt++, iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0) {
+	     iter_bkt++) {
 		iter_list = &rcu_dereference(netlbl_unlhsh)->tbl[iter_bkt];
 		list_for_each_entry_rcu(iface, iter_list, list) {
 			if (!iface->valid ||
@@ -1190,7 +1191,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
 				continue;
 			netlbl_af4list_foreach_rcu(addr4,
 						   &iface->addr4_list) {
-				if (iter_addr4++ < cb->args[2])
+				if (iter_addr4++ < skip_addr4)
 					continue;
 				if (netlbl_unlabel_staticlist_gen(
 					      NLBL_UNLABEL_C_STATICLIST,
@@ -1203,10 +1204,12 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
 					goto unlabel_staticlist_return;
 				}
 			}
+			iter_addr4 = 0;
+			skip_addr4 = 0;
 #if IS_ENABLED(CONFIG_IPV6)
 			netlbl_af6list_foreach_rcu(addr6,
 						   &iface->addr6_list) {
-				if (iter_addr6++ < cb->args[3])
+				if (iter_addr6++ < skip_addr6)
 					continue;
 				if (netlbl_unlabel_staticlist_gen(
 					      NLBL_UNLABEL_C_STATICLIST,
@@ -1219,8 +1222,12 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
 					goto unlabel_staticlist_return;
 				}
 			}
+			iter_addr6 = 0;
+			skip_addr6 = 0;
 #endif /* IPv6 */
 		}
+		iter_chain = 0;
+		skip_chain = 0;
 	}
 
 unlabel_staticlist_return:
commit a6c40b8032b845f132abfcbcbed6bddebbcc3b4a
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Sun Nov 8 12:35:35 2020 +0100

    drm/mcde: Fix unbalanced regulator
    
    Since we now turn off the EPOD regulator to reset the
    hardware, we need to balance the regulators after that
    point. If registering the master fails we only need
    to disable one regulator. Fix this by open-coding
    this leg of the error path.
    
    Fixes: c4842d4d0f74 ("drm/mcde: Fix display pipeline restart")
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
    Reviewed-by: Sam Ravnborg <sam at ravnborg.org>
    Cc: Stephan Gerhold <stephan at gerhold.net>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201108113535.1819952-1-linus.walleij@linaro.org

diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c
index c592957ed07f..92f8bd907193 100644
--- a/drivers/gpu/drm/mcde/mcde_drv.c
+++ b/drivers/gpu/drm/mcde/mcde_drv.c
@@ -413,7 +413,13 @@ static int mcde_probe(struct platform_device *pdev)
 					      match);
 	if (ret) {
 		dev_err(dev, "failed to add component master\n");
-		goto clk_disable;
+		/*
+		 * The EPOD regulator is already disabled at this point so some
+		 * special errorpath code is needed
+		 */
+		clk_disable_unprepare(mcde->mcde_clk);
+		regulator_disable(mcde->vana);
+		return ret;
 	}
 
 	return 0;
commit 5fb7f75bc138c868df2df40d386c7244122cca77
Author: Tony Nguyen <anthony.l.nguyen at intel.com>
Date:   Mon Nov 9 16:07:35 2020 -0800

    MAINTAINERS: Update repositories for Intel Ethernet Drivers
    
    Update Intel Ethernet Drivers repositories to new locations.
    
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/MAINTAINERS b/MAINTAINERS
index cd123d0a6a2d..9e826b55fcd9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8829,8 +8829,8 @@ S:	Supported
 W:	http://www.intel.com/support/feedback.htm
 W:	http://e1000.sourceforge.net/
 Q:	http://patchwork.ozlabs.org/project/intel-wired-lan/list/
-T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue.git
-T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue.git
+T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue.git
+T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue.git
 F:	Documentation/networking/device_drivers/ethernet/intel/
 F:	drivers/net/ethernet/intel/
 F:	drivers/net/ethernet/intel/*/
commit 6b7ed22ae4c96a415001f0c3116ebee15bb8491a
Author: Vinicius Costa Gomes <vinicius.gomes at intel.com>
Date:   Fri Sep 25 11:35:37 2020 -0700

    igc: Fix returning wrong statistics
    
    'igc_update_stats()' was not updating 'netdev->stats', so the returned
    statistics, for example, requested by:
    
    $ ip -s link show dev enp3s0
    
    were not being updated and were always zero.
    
    Fix by returning a set of statistics that are actually being
    updated (adapter->stats64).
    
    Fixes: c9a11c23ceb6 ("igc: Add netdev")
    Signed-off-by: Vinicius Costa Gomes <vinicius.gomes at intel.com>
    Tested-by: Aaron Brown <aaron.f.brown at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 9112dff075cf..b673ac1199bb 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -3891,21 +3891,23 @@ static int igc_change_mtu(struct net_device *netdev, int new_mtu)
 }
 
 /**
- * igc_get_stats - Get System Network Statistics
+ * igc_get_stats64 - Get System Network Statistics
  * @netdev: network interface device structure
+ * @stats: rtnl_link_stats64 pointer
  *
  * Returns the address of the device statistics structure.
  * The statistics are updated here and also from the timer callback.
  */
-static struct net_device_stats *igc_get_stats(struct net_device *netdev)
+static void igc_get_stats64(struct net_device *netdev,
+			    struct rtnl_link_stats64 *stats)
 {
 	struct igc_adapter *adapter = netdev_priv(netdev);
 
+	spin_lock(&adapter->stats64_lock);
 	if (!test_bit(__IGC_RESETTING, &adapter->state))
 		igc_update_stats(adapter);
-
-	/* only return the current stats */
-	return &netdev->stats;
+	memcpy(stats, &adapter->stats64, sizeof(*stats));
+	spin_unlock(&adapter->stats64_lock);
 }
 
 static netdev_features_t igc_fix_features(struct net_device *netdev,
@@ -4855,7 +4857,7 @@ static const struct net_device_ops igc_netdev_ops = {
 	.ndo_set_rx_mode	= igc_set_rx_mode,
 	.ndo_set_mac_address	= igc_set_mac,
 	.ndo_change_mtu		= igc_change_mtu,
-	.ndo_get_stats		= igc_get_stats,
+	.ndo_get_stats64	= igc_get_stats64,
 	.ndo_fix_features	= igc_fix_features,
 	.ndo_set_features	= igc_set_features,
 	.ndo_features_check	= igc_features_check,
commit 1773482fd8cecd5b060d409853f8145be3064a41
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Wed Sep 16 17:32:28 2020 +0300

    i40e, xsk: uninitialized variable in i40e_clean_rx_irq_zc()
    
    The "failure" variable is used without being initialized.  It should be
    set to false.
    
    Fixes: 8cbf74149903 ("i40e, xsk: move buffer allocation out of the Rx processing loop")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Acked-by: Björn Töpel <bjorn.topel at intel.com>
    Tested-by: George Kuruvinakunnel <george.kuruvinakunnel at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
index 6acede0acdca..567fd67e900e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
@@ -281,8 +281,8 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget)
 	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
 	u16 cleaned_count = I40E_DESC_UNUSED(rx_ring);
 	unsigned int xdp_res, xdp_xmit = 0;
+	bool failure = false;
 	struct sk_buff *skb;
-	bool failure;
 
 	while (likely(total_rx_packets < (unsigned int)budget)) {
 		union i40e_rx_desc *rx_desc;
commit 3a7001788fed0311d6fb77ed0dabe7bed3567bc0
Author: Slawomir Laba <slawomirx.laba at intel.com>
Date:   Wed Oct 14 08:54:09 2020 +0000

    i40e: Fix MAC address setting for a VF via Host/VM
    
    Fix MAC setting flow for the PF driver.
    
    Update the unicast VF's MAC address in VF structure if it is
    a new setting in i40e_vc_add_mac_addr_msg.
    
    When unicast MAC address gets deleted, record that and
    set the new unicast MAC address that is already waiting in the filter
    list. This logic is based on the order of messages arriving to
    the PF driver.
    
    Without this change the MAC address setting was interpreted
    incorrectly in the following use cases:
    1) Print incorrect VF MAC or zero MAC
    ip link show dev $pf
    2) Don't preserve MAC between driver reload
    rmmod iavf; modprobe iavf
    3) Update VF MAC when macvlan was set
    ip link add link $vf address $mac $vf.1 type macvlan
    4) Failed to update mac address when VF was trusted
    ip link set dev $vf address $mac
    
    This includes all other configurations including above commands.
    
    Fixes: f657a6e1313b ("i40e: Fix VF driver MAC address configuration")
    Signed-off-by: Slawomir Laba <slawomirx.laba at intel.com>
    Tested-by: Konrad Jankowski <konrad0.jankowski at intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index c96e2f2d4cba..4919d22d7b6b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -2713,6 +2713,10 @@ static int i40e_vc_add_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
 				spin_unlock_bh(&vsi->mac_filter_hash_lock);
 				goto error_param;
 			}
+			if (is_valid_ether_addr(al->list[i].addr) &&
+			    is_zero_ether_addr(vf->default_lan_addr.addr))
+				ether_addr_copy(vf->default_lan_addr.addr,
+						al->list[i].addr);
 		}
 	}
 	spin_unlock_bh(&vsi->mac_filter_hash_lock);
@@ -2740,6 +2744,7 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
 {
 	struct virtchnl_ether_addr_list *al =
 	    (struct virtchnl_ether_addr_list *)msg;
+	bool was_unimac_deleted = false;
 	struct i40e_pf *pf = vf->pf;
 	struct i40e_vsi *vsi = NULL;
 	i40e_status ret = 0;
@@ -2759,6 +2764,8 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
 			ret = I40E_ERR_INVALID_MAC_ADDR;
 			goto error_param;
 		}
+		if (ether_addr_equal(al->list[i].addr, vf->default_lan_addr.addr))
+			was_unimac_deleted = true;
 	}
 	vsi = pf->vsi[vf->lan_vsi_idx];
 
@@ -2779,10 +2786,25 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
 		dev_err(&pf->pdev->dev, "Unable to program VF %d MAC filters, error %d\n",
 			vf->vf_id, ret);
 
+	if (vf->trusted && was_unimac_deleted) {
+		struct i40e_mac_filter *f;
+		struct hlist_node *h;
+		u8 *macaddr = NULL;
+		int bkt;
+
+		/* set last unicast mac address as default */
+		spin_lock_bh(&vsi->mac_filter_hash_lock);
+		hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
+			if (is_valid_ether_addr(f->macaddr))
+				macaddr = f->macaddr;
+		}
+		if (macaddr)
+			ether_addr_copy(vf->default_lan_addr.addr, macaddr);
+		spin_unlock_bh(&vsi->mac_filter_hash_lock);
+	}
 error_param:
 	/* send the response to the VF */
-	return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_DEL_ETH_ADDR,
-				       ret);
+	return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_DEL_ETH_ADDR, ret);
 }
 
 /**
commit 97adb13dc9ba08ecd4758bc59efc0205f5cbf377
Author: Vlad Buslov <vlad at buslov.dev>
Date:   Sat Nov 7 13:19:28 2020 +0200

    selftest: fix flower terse dump tests
    
    Iproute2 tc classifier terse dump has been accepted with modified syntax.
    Update the tests accordingly.
    
    Signed-off-by: Vlad Buslov <vlad at buslov.dev>
    Fixes: e7534fd42a99 ("selftests: implement flower classifier terse dump tests")
    Link: https://lore.kernel.org/r/20201107111928.453534-1-vlad@buslov.dev
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json b/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json
index bb543bf69d69..361235ad574b 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json
@@ -100,7 +100,7 @@
         ],
         "cmdUnderTest": "$TC filter add dev $DEV2 protocol ip pref 1 ingress flower dst_mac e4:11:22:11:4a:51 action drop",
         "expExitCode": "0",
-        "verifyCmd": "$TC filter show terse dev $DEV2 ingress",
+        "verifyCmd": "$TC -br filter show dev $DEV2 ingress",
         "matchPattern": "filter protocol ip pref 1 flower.*handle",
         "matchCount": "1",
         "teardown": [
@@ -119,7 +119,7 @@
         ],
         "cmdUnderTest": "$TC filter add dev $DEV2 protocol ip pref 1 ingress flower dst_mac e4:11:22:11:4a:51 action drop",
         "expExitCode": "0",
-        "verifyCmd": "$TC filter show terse dev $DEV2 ingress",
+        "verifyCmd": "$TC -br filter show dev $DEV2 ingress",
         "matchPattern": "  dst_mac e4:11:22:11:4a:51",
         "matchCount": "0",
         "teardown": [
commit 9a5085b3fad5d5d6019a3d160cdd70357d35c8b1
Author: Richard Weinberger <richard at nod.at>
Date:   Mon Oct 19 23:10:49 2020 +0200

    um: Call pgtable_pmd_page_dtor() in __pmd_free_tlb()
    
    Commit b2b29d6d0119 ("mm: account PMD tables like PTE tables") uncovered
    a bug in uml, we forgot to call the destructor.
    While we are here, give x a sane name.
    
    Reported-by: Anton Ivanov <anton.ivanov at cambridgegreys.com>
    Co-developed-by: Matthew Wilcox (Oracle) <willy at infradead.org>
    Signed-off-by: Richard Weinberger <richard at nod.at>
    Tested-by: Christopher Obbard <chris.obbard at collabora.com>

diff --git a/arch/um/include/asm/pgalloc.h b/arch/um/include/asm/pgalloc.h
index 5393e13e07e0..2bbf28cf3aa9 100644
--- a/arch/um/include/asm/pgalloc.h
+++ b/arch/um/include/asm/pgalloc.h
@@ -33,7 +33,13 @@ do {							\
 } while (0)
 
 #ifdef CONFIG_3_LEVEL_PGTABLES
-#define __pmd_free_tlb(tlb,x, address)   tlb_remove_page((tlb),virt_to_page(x))
+
+#define __pmd_free_tlb(tlb, pmd, address)		\
+do {							\
+	pgtable_pmd_page_dtor(virt_to_page(pmd));	\
+	tlb_remove_page((tlb),virt_to_page(pmd));	\
+} while (0)						\
+
 #endif
 
 #endif
commit 3084db0e0d5076cd48408274ab0911cd3ccdae88
Author: Daniel Latypov <dlatypov at google.com>
Date:   Mon Nov 2 15:23:04 2020 -0800

    kunit: fix display of failed expectations for strings
    
    Currently the following expectation
      KUNIT_EXPECT_STREQ(test, "hi", "bye");
    will produce:
      Expected "hi" == "bye", but
          "hi" == 1625079497
          "bye" == 1625079500
    
    After this patch:
      Expected "hi" == "bye", but
          "hi" == hi
          "bye" == bye
    
    KUNIT_INIT_BINARY_STR_ASSERT_STRUCT() was written but just mistakenly
    not actually used by KUNIT_EXPECT_STREQ() and friends.
    
    Signed-off-by: Daniel Latypov <dlatypov at google.com>
    Reviewed-by: Brendan Higgins <brendanhiggins at google.com>
    Tested-by: Brendan Higgins <brendanhiggins at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/include/kunit/test.h b/include/kunit/test.h
index db1b0ae666c4..df60be7e22ca 100644
--- a/include/kunit/test.h
+++ b/include/kunit/test.h
@@ -1105,7 +1105,7 @@ do {									       \
 	KUNIT_ASSERTION(test,						       \
 			strcmp(__left, __right) op 0,			       \
 			kunit_binary_str_assert,			       \
-			KUNIT_INIT_BINARY_ASSERT_STRUCT(test,		       \
+			KUNIT_INIT_BINARY_STR_ASSERT_STRUCT(test,	       \
 							assert_type,	       \
 							#op,		       \
 							#left,		       \
commit 060352e141e4c71ce147a2737f6d30a97f2ec317
Author: Daniel Latypov <dlatypov at google.com>
Date:   Fri Oct 30 15:38:53 2020 -0700

    kunit: tool: fix extra trailing \n in raw + parsed test output
    
    For simplcity, strip all trailing whitespace from parsed output.
    I imagine no one is printing out meaningful trailing whitespace via
    KUNIT_FAIL() or similar, and that if they are, they really shouldn't.
    
    `isolate_kunit_output()` yielded liens with trailing \n, which results
    in artifacty output like this:
    
    $ ./tools/testing/kunit/kunit.py run
    [16:16:46] [FAILED] example_simple_test
    [16:16:46]     # example_simple_test: EXPECTATION FAILED at lib/kunit/kunit-example-test.c:29
    
    [16:16:46]     Expected 1 + 1 == 3, but
    
    [16:16:46]         1 + 1 == 2
    
    [16:16:46]         3 == 3
    
    [16:16:46]     not ok 1 - example_simple_test
    
    [16:16:46]
    
    After this change:
    [16:16:46]     # example_simple_test: EXPECTATION FAILED at lib/kunit/kunit-example-test.c:29
    [16:16:46]     Expected 1 + 1 == 3, but
    [16:16:46]         1 + 1 == 2
    [16:16:46]         3 == 3
    [16:16:46]     not ok 1 - example_simple_test
    [16:16:46]
    
    We should *not* be expecting lines to end with \n in kunit_tool_test.py
    for this reason.
    
    Do the same for `raw_output()` as well which suffers from the same
    issue.
    
    This is a followup to [1], but rebased onto kunit-fixes to pick up the
    other raw_output() fix and fixes for kunit_tool_test.py.
    
    [1] https://lore.kernel.org/linux-kselftest/20201020233219.4146059-1-dlatypov@google.com/
    
    Signed-off-by: Daniel Latypov <dlatypov at google.com>
    Reviewed-by: David Gow <davidgow at google.com>
    Tested-by: David Gow <davidgow at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/kunit_parser.py b/tools/testing/kunit/kunit_parser.py
index db0347baa428..bbfe1b4e4c1c 100644
--- a/tools/testing/kunit/kunit_parser.py
+++ b/tools/testing/kunit/kunit_parser.py
@@ -54,6 +54,7 @@ kunit_end_re = re.compile('(List of all partitions:|'
 def isolate_kunit_output(kernel_output):
 	started = False
 	for line in kernel_output:
+		line = line.rstrip()  # line always has a trailing \n
 		if kunit_start_re.search(line):
 			prefix_len = len(line.split('TAP version')[0])
 			started = True
@@ -65,7 +66,7 @@ def isolate_kunit_output(kernel_output):
 
 def raw_output(kernel_output):
 	for line in kernel_output:
-		print(line)
+		print(line.rstrip())
 
 DIVIDER = '=' * 60
 
diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py
index 0b60855fb819..497ab51bc170 100755
--- a/tools/testing/kunit/kunit_tool_test.py
+++ b/tools/testing/kunit/kunit_tool_test.py
@@ -102,7 +102,7 @@ class KUnitParserTest(unittest.TestCase):
 			'test_data/test_output_isolated_correctly.log')
 		file = open(log_path)
 		result = kunit_parser.isolate_kunit_output(file.readlines())
-		self.assertContains('TAP version 14\n', result)
+		self.assertContains('TAP version 14', result)
 		self.assertContains('	# Subtest: example', result)
 		self.assertContains('	1..2', result)
 		self.assertContains('	ok 1 - example_simple_test', result)
@@ -115,7 +115,7 @@ class KUnitParserTest(unittest.TestCase):
 			'test_data/test_pound_sign.log')
 		with open(log_path) as file:
 			result = kunit_parser.isolate_kunit_output(file.readlines())
-		self.assertContains('TAP version 14\n', result)
+		self.assertContains('TAP version 14', result)
 		self.assertContains('	# Subtest: kunit-resource-test', result)
 		self.assertContains('	1..5', result)
 		self.assertContains('	ok 1 - kunit_resource_test_init_resources', result)
commit 390881448b1ff1e9d82896abbbda7cdb8e0be27c
Author: Daniel Latypov <dlatypov at google.com>
Date:   Thu Oct 29 15:09:29 2020 -0700

    kunit: tool: print out stderr from make (like build warnings)
    
    Currently the tool redirects make stdout + stderr, and only shows them
    if the make command fails.
    This means build warnings aren't shown to the user.
    
    This change prints the contents of stderr even if make succeeds, under
    the assumption these are only build warnings or other messages the user
    likely wants to see.
    
    We drop stdout from the raised exception since we can no longer easily
    collate stdout and stderr and just showing the stderr seems fine.
    
    Example with a warning:
    
    [14:56:35] Building KUnit Kernel ...
    ../lib/kunit/kunit-test.c: In function ‘kunit_test_successful_try’:
    ../lib/kunit/kunit-test.c:19:6: warning: unused variable ‘unused’ [-Wunused-variable]
       19 |  int unused;
          |      ^~~~~~
    
    [14:56:40] Starting KUnit Kernel ...
    
    Note the stderr has a trailing \n, and since we use print, we add
    another, but it helps separate make and kunit.py output.
    
    Example with a build error:
    
    [15:02:45] Building KUnit Kernel ...
    ERROR:root:../lib/kunit/kunit-test.c: In function ‘kunit_test_successful_try’:
    ../lib/kunit/kunit-test.c:19:2: error: unknown type name ‘invalid_type’
       19 |  invalid_type *test = data;
          |  ^~~~~~~~~~~~
    ...
    
    Signed-off-by: Daniel Latypov <dlatypov at google.com>
    Reviewed-by: David Gow <davidgow at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/kunit_kernel.py b/tools/testing/kunit/kunit_kernel.py
index b4768fa03ce0..2e3cc0fac726 100644
--- a/tools/testing/kunit/kunit_kernel.py
+++ b/tools/testing/kunit/kunit_kernel.py
@@ -84,11 +84,16 @@ class LinuxSourceTreeOperations(object):
 		if build_dir:
 			command += ['O=' + build_dir]
 		try:
-			subprocess.check_output(command, stderr=subprocess.STDOUT)
+			proc = subprocess.Popen(command,
+						stderr=subprocess.PIPE,
+						stdout=subprocess.DEVNULL)
 		except OSError as e:
-			raise BuildError('Could not call execute make: ' + str(e))
-		except subprocess.CalledProcessError as e:
-			raise BuildError(e.output.decode())
+			raise BuildError('Could not call make command: ' + str(e))
+		_, stderr = proc.communicate()
+		if proc.returncode != 0:
+			raise BuildError(stderr.decode())
+		if stderr:  # likely only due to build warnings
+			print(stderr.decode())
 
 	def linux_bin(self, params, timeout, build_dir):
 		"""Runs the Linux UML binary. Must be named 'linux'."""
commit 873ddeb881e055fb0c4e371cc3a006bfd9388f00
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Wed Oct 28 10:43:19 2020 -0700

    KUnit: Docs: usage: wording fixes
    
    Fix minor grammar and punctutation glitches.
    Hyphenate "architecture-specific" instances.
    
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: David Gow <davidgow at google.com>
    Cc: linux-kselftest at vger.kernel.org
    Cc: kunit-dev at googlegroups.com
    Cc: Shuah Khan <shuah at kernel.org>
    Cc: Shuah Khan <skhan at linuxfoundation.org>
    Cc: Brendan Higgins <brendanhiggins at google.com>
    Reviewed-by: David Gow <davidgow at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/Documentation/dev-tools/kunit/usage.rst b/Documentation/dev-tools/kunit/usage.rst
index 62142a47488c..9c28c518e6a3 100644
--- a/Documentation/dev-tools/kunit/usage.rst
+++ b/Documentation/dev-tools/kunit/usage.rst
@@ -92,7 +92,7 @@ behavior of a function called ``add``; the first parameter is always of type
 the second parameter, in this case, is what the value is expected to be; the
 last value is what the value actually is. If ``add`` passes all of these
 expectations, the test case, ``add_test_basic`` will pass; if any one of these
-expectations fail, the test case will fail.
+expectations fails, the test case will fail.
 
 It is important to understand that a test case *fails* when any expectation is
 violated; however, the test will continue running, potentially trying other
@@ -202,7 +202,7 @@ Example:
 	kunit_test_suite(example_test_suite);
 
 In the above example the test suite, ``example_test_suite``, would run the test
-cases ``example_test_foo``, ``example_test_bar``, and ``example_test_baz``,
+cases ``example_test_foo``, ``example_test_bar``, and ``example_test_baz``;
 each would have ``example_test_init`` called immediately before it and would
 have ``example_test_exit`` called immediately after it.
 ``kunit_test_suite(example_test_suite)`` registers the test suite with the
@@ -229,7 +229,7 @@ through some sort of indirection where a function is exposed as part of an API
 such that the definition of that function can be changed without affecting the
 rest of the code base. In the kernel this primarily comes from two constructs,
 classes, structs that contain function pointers that are provided by the
-implementer, and architecture specific functions which have definitions selected
+implementer, and architecture-specific functions which have definitions selected
 at compile time.
 
 Classes
@@ -459,7 +459,7 @@ KUnit on non-UML architectures
 By default KUnit uses UML as a way to provide dependencies for code under test.
 Under most circumstances KUnit's usage of UML should be treated as an
 implementation detail of how KUnit works under the hood. Nevertheless, there
-are instances where being able to run architecture specific code or test
+are instances where being able to run architecture-specific code or test
 against real hardware is desirable. For these reasons KUnit supports running on
 other architectures.
 
@@ -599,7 +599,7 @@ writing normal KUnit tests. One special caveat is that you have to reset
 hardware state in between test cases; if this is not possible, you may only be
 able to run one test case per invocation.
 
-.. TODO(brendanhiggins at google.com): Add an actual example of an architecture
+.. TODO(brendanhiggins at google.com): Add an actual example of an architecture-
    dependent KUnit test.
 
 KUnit debugfs representation
commit 1f4dde57125b3d91b900e82ac33a196312be5c8e
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Wed Oct 28 10:42:18 2020 -0700

    KUnit: Docs: style: fix some Kconfig example issues
    
    Fix the Kconfig example to be closer to Kconfig coding style.
    
    Also add punctuation and a trailing slash ('/') to a sub-directory
    name -- this is how the text mostly appears in other Kconfig files.
    
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: David Gow <davidgow at google.com>
    Cc: linux-kselftest at vger.kernel.org
    Cc: kunit-dev at googlegroups.com
    Cc: Shuah Khan <shuah at kernel.org>
    Cc: Shuah Khan <skhan at linuxfoundation.org>
    Cc: Brendan Higgins <brendanhiggins at google.com>
    Reviewed-by: David Gow <davidgow at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/Documentation/dev-tools/kunit/style.rst b/Documentation/dev-tools/kunit/style.rst
index da1d6f0ed6bc..8dbcdc552606 100644
--- a/Documentation/dev-tools/kunit/style.rst
+++ b/Documentation/dev-tools/kunit/style.rst
@@ -175,17 +175,17 @@ An example Kconfig entry:
 
 .. code-block:: none
 
-        config FOO_KUNIT_TEST
-                tristate "KUnit test for foo" if !KUNIT_ALL_TESTS
-                depends on KUNIT
-                default KUNIT_ALL_TESTS
-                help
-                    This builds unit tests for foo.
+	config FOO_KUNIT_TEST
+		tristate "KUnit test for foo" if !KUNIT_ALL_TESTS
+		depends on KUNIT
+		default KUNIT_ALL_TESTS
+		help
+		  This builds unit tests for foo.
 
-                    For more information on KUnit and unit tests in general, please refer
-                    to the KUnit documentation in Documentation/dev-tools/kunit
+		  For more information on KUnit and unit tests in general, please refer
+		  to the KUnit documentation in Documentation/dev-tools/kunit/.
 
-                    If unsure, say N
+		  If unsure, say N.
 
 
 Test File and Module Names
commit f7766424cf15fd6e03e8230fb17d5612c5b76dbe
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Tue Oct 27 11:48:53 2020 -0700

    KUnit: Docs: fix a wording typo
    
    Fix a wording typo (keyboard glitch).
    
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: David Gow <davidgow at google.com>
    Cc: linux-kselftest at vger.kernel.org
    Cc: kunit-dev at googlegroups.com
    Cc: Shuah Khan <shuah at kernel.org>
    Cc: Shuah Khan <skhan at linuxfoundation.org>
    Cc: Brendan Higgins <brendanhiggins at google.com>
    Reviewed-by: David Gow <davidgow at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/Documentation/dev-tools/kunit/faq.rst b/Documentation/dev-tools/kunit/faq.rst
index 1628862e7024..8d5029ad210a 100644
--- a/Documentation/dev-tools/kunit/faq.rst
+++ b/Documentation/dev-tools/kunit/faq.rst
@@ -90,7 +90,7 @@ things to try.
    re-run kunit_tool.
 5. Try to run ``make ARCH=um defconfig`` before running ``kunit.py run``. This
    may help clean up any residual config items which could be causing problems.
-6. Finally, try running KUnit outside UML. KUnit and KUnit tests can run be
+6. Finally, try running KUnit outside UML. KUnit and KUnit tests can be
    built into any kernel, or can be built as a module and loaded at runtime.
    Doing so should allow you to determine if UML is causing the issue you're
    seeing. When tests are built-in, they will execute when the kernel boots, and
commit 128dc4bcc8c0c7c3bab4a3818a1ec608cccb017a
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Mon Oct 26 18:59:26 2020 +0200

    kunit: Do not pollute source directory with generated files (test.log)
    
    When --build_dir is provided use it and do not pollute source directory
    which even can be mounted over network or read-only.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Reviewed-by: Brendan Higgins <brendanhiggins at google.com>
    Tested-by: Brendan Higgins <brendanhiggins at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/kunit_kernel.py b/tools/testing/kunit/kunit_kernel.py
index 633a2efcfdbd..b4768fa03ce0 100644
--- a/tools/testing/kunit/kunit_kernel.py
+++ b/tools/testing/kunit/kunit_kernel.py
@@ -21,6 +21,7 @@ KCONFIG_PATH = '.config'
 KUNITCONFIG_PATH = '.kunitconfig'
 DEFAULT_KUNITCONFIG_PATH = 'arch/um/configs/kunit_defconfig'
 BROKEN_ALLCONFIG_PATH = 'tools/testing/kunit/configs/broken_on_uml.config'
+OUTFILE_PATH = 'test.log'
 
 class ConfigError(Exception):
 	"""Represents an error trying to configure the Linux kernel."""
@@ -89,11 +90,12 @@ class LinuxSourceTreeOperations(object):
 		except subprocess.CalledProcessError as e:
 			raise BuildError(e.output.decode())
 
-	def linux_bin(self, params, timeout, build_dir, outfile):
+	def linux_bin(self, params, timeout, build_dir):
 		"""Runs the Linux UML binary. Must be named 'linux'."""
 		linux_bin = './linux'
 		if build_dir:
 			linux_bin = os.path.join(build_dir, 'linux')
+		outfile = get_outfile_path(build_dir)
 		with open(outfile, 'w') as output:
 			process = subprocess.Popen([linux_bin] + params,
 						   stdout=output,
@@ -112,6 +114,12 @@ def get_kunitconfig_path(build_dir):
 		kunitconfig_path = os.path.join(build_dir, KUNITCONFIG_PATH)
 	return kunitconfig_path
 
+def get_outfile_path(build_dir):
+	outfile_path = OUTFILE_PATH
+	if build_dir:
+		outfile_path = os.path.join(build_dir, OUTFILE_PATH)
+	return outfile_path
+
 class LinuxSourceTree(object):
 	"""Represents a Linux kernel source tree with KUnit tests."""
 
@@ -192,8 +200,8 @@ class LinuxSourceTree(object):
 
 	def run_kernel(self, args=[], build_dir='', timeout=None):
 		args.extend(['mem=1G'])
-		outfile = 'test.log'
-		self._ops.linux_bin(args, timeout, build_dir, outfile)
+		self._ops.linux_bin(args, timeout, build_dir)
+		outfile = get_outfile_path(build_dir)
 		subprocess.call(['stty', 'sane'])
 		with open(outfile, 'r') as file:
 			for line in file:
commit fcdb0bc08ced274078f371e1e0fe6421a97fa9f2
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Mon Oct 26 18:59:25 2020 +0200

    kunit: Do not pollute source directory with generated files (.kunitconfig)
    
    When --build_dir is provided use it and do not pollute source directory
    which even can be mounted over network or read-only.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Reviewed-by: Brendan Higgins <brendanhiggins at google.com>
    Tested-by: Brendan Higgins <brendanhiggins at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/kunit.py b/tools/testing/kunit/kunit.py
index a6d5f219f714..d4f7846d0745 100755
--- a/tools/testing/kunit/kunit.py
+++ b/tools/testing/kunit/kunit.py
@@ -11,7 +11,6 @@ import argparse
 import sys
 import os
 import time
-import shutil
 
 from collections import namedtuple
 from enum import Enum, auto
@@ -44,11 +43,6 @@ class KunitStatus(Enum):
 	BUILD_FAILURE = auto()
 	TEST_FAILURE = auto()
 
-def create_default_kunitconfig():
-	if not os.path.exists(kunit_kernel.kunitconfig_path):
-		shutil.copyfile('arch/um/configs/kunit_defconfig',
-				kunit_kernel.kunitconfig_path)
-
 def get_kernel_root_path():
 	parts = sys.argv[0] if not __file__ else __file__
 	parts = os.path.realpath(parts).split('tools/testing/kunit')
@@ -61,7 +55,6 @@ def config_tests(linux: kunit_kernel.LinuxSourceTree,
 	kunit_parser.print_with_timestamp('Configuring KUnit Kernel ...')
 
 	config_start = time.time()
-	create_default_kunitconfig()
 	success = linux.build_reconfig(request.build_dir, request.make_options)
 	config_end = time.time()
 	if not success:
@@ -262,12 +255,12 @@ def main(argv, linux=None):
 		if not os.path.exists(cli_args.build_dir):
 			os.mkdir(cli_args.build_dir)
 
-		if not os.path.exists(kunit_kernel.kunitconfig_path):
-			create_default_kunitconfig()
-
 		if not linux:
 			linux = kunit_kernel.LinuxSourceTree()
 
+		linux.create_kunitconfig(cli_args.build_dir)
+		linux.read_kunitconfig(cli_args.build_dir)
+
 		request = KunitRequest(cli_args.raw_output,
 				       cli_args.timeout,
 				       cli_args.jobs,
@@ -283,12 +276,12 @@ def main(argv, linux=None):
 				not os.path.exists(cli_args.build_dir)):
 			os.mkdir(cli_args.build_dir)
 
-		if not os.path.exists(kunit_kernel.kunitconfig_path):
-			create_default_kunitconfig()
-
 		if not linux:
 			linux = kunit_kernel.LinuxSourceTree()
 
+		linux.create_kunitconfig(cli_args.build_dir)
+		linux.read_kunitconfig(cli_args.build_dir)
+
 		request = KunitConfigRequest(cli_args.build_dir,
 					     cli_args.make_options)
 		result = config_tests(linux, request)
@@ -301,6 +294,9 @@ def main(argv, linux=None):
 		if not linux:
 			linux = kunit_kernel.LinuxSourceTree()
 
+		linux.create_kunitconfig(cli_args.build_dir)
+		linux.read_kunitconfig(cli_args.build_dir)
+
 		request = KunitBuildRequest(cli_args.jobs,
 					    cli_args.build_dir,
 					    cli_args.alltests,
@@ -315,6 +311,9 @@ def main(argv, linux=None):
 		if not linux:
 			linux = kunit_kernel.LinuxSourceTree()
 
+		linux.create_kunitconfig(cli_args.build_dir)
+		linux.read_kunitconfig(cli_args.build_dir)
+
 		exec_request = KunitExecRequest(cli_args.timeout,
 						cli_args.build_dir,
 						cli_args.alltests)
diff --git a/tools/testing/kunit/kunit_kernel.py b/tools/testing/kunit/kunit_kernel.py
index b557b1e93f98..633a2efcfdbd 100644
--- a/tools/testing/kunit/kunit_kernel.py
+++ b/tools/testing/kunit/kunit_kernel.py
@@ -6,10 +6,10 @@
 # Author: Felix Guo <felixguoxiuping at gmail.com>
 # Author: Brendan Higgins <brendanhiggins at google.com>
 
-
 import logging
 import subprocess
 import os
+import shutil
 import signal
 
 from contextlib import ExitStack
@@ -18,7 +18,8 @@ import kunit_config
 import kunit_parser
 
 KCONFIG_PATH = '.config'
-kunitconfig_path = '.kunitconfig'
+KUNITCONFIG_PATH = '.kunitconfig'
+DEFAULT_KUNITCONFIG_PATH = 'arch/um/configs/kunit_defconfig'
 BROKEN_ALLCONFIG_PATH = 'tools/testing/kunit/configs/broken_on_uml.config'
 
 class ConfigError(Exception):
@@ -99,19 +100,22 @@ class LinuxSourceTreeOperations(object):
 						   stderr=subprocess.STDOUT)
 			process.wait(timeout)
 
-
 def get_kconfig_path(build_dir):
 	kconfig_path = KCONFIG_PATH
 	if build_dir:
 		kconfig_path = os.path.join(build_dir, KCONFIG_PATH)
 	return kconfig_path
 
+def get_kunitconfig_path(build_dir):
+	kunitconfig_path = KUNITCONFIG_PATH
+	if build_dir:
+		kunitconfig_path = os.path.join(build_dir, KUNITCONFIG_PATH)
+	return kunitconfig_path
+
 class LinuxSourceTree(object):
 	"""Represents a Linux kernel source tree with KUnit tests."""
 
 	def __init__(self):
-		self._kconfig = kunit_config.Kconfig()
-		self._kconfig.read_from_file(kunitconfig_path)
 		self._ops = LinuxSourceTreeOperations()
 		signal.signal(signal.SIGINT, self.signal_handler)
 
@@ -123,6 +127,16 @@ class LinuxSourceTree(object):
 			return False
 		return True
 
+	def create_kunitconfig(self, build_dir, defconfig=DEFAULT_KUNITCONFIG_PATH):
+		kunitconfig_path = get_kunitconfig_path(build_dir)
+		if not os.path.exists(kunitconfig_path):
+			shutil.copyfile(defconfig, kunitconfig_path)
+
+	def read_kunitconfig(self, build_dir):
+		kunitconfig_path = get_kunitconfig_path(build_dir)
+		self._kconfig = kunit_config.Kconfig()
+		self._kconfig.read_from_file(kunitconfig_path)
+
 	def validate_config(self, build_dir):
 		kconfig_path = get_kconfig_path(build_dir)
 		validated_kconfig = kunit_config.Kconfig()
commit b7e0b983ff13714d261883e89910b0755eb12169
Author: Daniel Latypov <dlatypov at google.com>
Date:   Wed Oct 21 15:07:52 2020 -0700

    kunit: tool: fix pre-existing python type annotation errors
    
    The code uses annotations, but they aren't accurate.
    Note that type checking in python is a separate process, running
    `kunit.py run` will not check and complain about invalid types at
    runtime.
    
    Fix pre-existing issues found by running a type checker
    $ mypy *.py
    
    All but one of these were returning `None` without denoting this
    properly (via `Optional[Type]`).
    
    Signed-off-by: Daniel Latypov <dlatypov at google.com>
    Reviewed-by: David Gow <davidgow at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/kunit_parser.py b/tools/testing/kunit/kunit_parser.py
index 84a1af2581f5..db0347baa428 100644
--- a/tools/testing/kunit/kunit_parser.py
+++ b/tools/testing/kunit/kunit_parser.py
@@ -12,7 +12,7 @@ from collections import namedtuple
 from datetime import datetime
 from enum import Enum, auto
 from functools import reduce
-from typing import List
+from typing import List, Optional, Tuple
 
 TestResult = namedtuple('TestResult', ['status','suites','log'])
 
@@ -151,7 +151,7 @@ def parse_diagnostic(lines: List[str], test_case: TestCase) -> bool:
 	else:
 		return False
 
-def parse_test_case(lines: List[str]) -> TestCase:
+def parse_test_case(lines: List[str]) -> Optional[TestCase]:
 	test_case = TestCase()
 	save_non_diagnositic(lines, test_case)
 	while parse_diagnostic(lines, test_case):
@@ -163,7 +163,7 @@ def parse_test_case(lines: List[str]) -> TestCase:
 
 SUBTEST_HEADER = re.compile(r'^[\s]+# Subtest: (.*)$')
 
-def parse_subtest_header(lines: List[str]) -> str:
+def parse_subtest_header(lines: List[str]) -> Optional[str]:
 	consume_non_diagnositic(lines)
 	if not lines:
 		return None
@@ -176,7 +176,7 @@ def parse_subtest_header(lines: List[str]) -> str:
 
 SUBTEST_PLAN = re.compile(r'[\s]+[0-9]+\.\.([0-9]+)')
 
-def parse_subtest_plan(lines: List[str]) -> int:
+def parse_subtest_plan(lines: List[str]) -> Optional[int]:
 	consume_non_diagnositic(lines)
 	match = SUBTEST_PLAN.match(lines[0])
 	if match:
@@ -230,7 +230,7 @@ def bubble_up_test_case_errors(test_suite: TestSuite) -> TestStatus:
 	max_test_case_status = bubble_up_errors(lambda x: x.status, test_suite.cases)
 	return max_status(max_test_case_status, test_suite.status)
 
-def parse_test_suite(lines: List[str], expected_suite_index: int) -> TestSuite:
+def parse_test_suite(lines: List[str], expected_suite_index: int) -> Optional[TestSuite]:
 	if not lines:
 		return None
 	consume_non_diagnositic(lines)
@@ -271,7 +271,7 @@ def parse_tap_header(lines: List[str]) -> bool:
 
 TEST_PLAN = re.compile(r'[0-9]+\.\.([0-9]+)')
 
-def parse_test_plan(lines: List[str]) -> int:
+def parse_test_plan(lines: List[str]) -> Optional[int]:
 	consume_non_diagnositic(lines)
 	match = TEST_PLAN.match(lines[0])
 	if match:
@@ -310,7 +310,7 @@ def parse_test_result(lines: List[str]) -> TestResult:
 	else:
 		return TestResult(TestStatus.NO_TESTS, [], lines)
 
-def print_and_count_results(test_result: TestResult) -> None:
+def print_and_count_results(test_result: TestResult) -> Tuple[int, int, int]:
 	total_tests = 0
 	failed_tests = 0
 	crashed_tests = 0
commit 3959d0a63b3202ea2aa12b3f6effd5400d773d31
Author: David Gow <davidgow at google.com>
Date:   Wed Oct 21 00:16:03 2020 -0700

    kunit: Fix kunit.py parse subcommand (use null build_dir)
    
    When JSON support was added in [1], the KunitParseRequest tuple was
    updated to contain a 'build_dir' field, but kunit.py parse doesn't
    accept --build_dir as an option. The code nevertheless tried to access
    it, resulting in this error:
    
    AttributeError: 'Namespace' object has no attribute 'build_dir'
    
    Given that the parser only uses the build_dir variable to set the
    'build_environment' json field, we set it to None (which gives the JSON
    'null') for now. Ultimately, we probably do want to be able to set this,
    but since it's new functionality which (for the parse subcommand) never
    worked, this is the quickest way of getting it back up and running.
    
    [1]: https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git/commit/?h=kunit-fixes&id=21a6d1780d5bbfca0ce9b8104ca6233502fcbf86
    
    Fixes: 21a6d1780d5b ("kunit: tool: allow generating test results in JSON")
    Signed-off-by: David Gow <davidgow at google.com>
    Reviewed-by: Brendan Higgins <brendanhiggins at google.com>
    Tested-by: Brendan Higgins <brendanhiggins at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/kunit.py b/tools/testing/kunit/kunit.py
index ebf5f5763dee..a6d5f219f714 100755
--- a/tools/testing/kunit/kunit.py
+++ b/tools/testing/kunit/kunit.py
@@ -337,7 +337,7 @@ def main(argv, linux=None):
 				kunit_output = f.read().splitlines()
 		request = KunitParseRequest(cli_args.raw_output,
 					    kunit_output,
-					    cli_args.build_dir,
+					    None,
 					    cli_args.json)
 		result = parse_tests(request)
 		if result.status != KunitStatus.SUCCESS:
commit c335b4f1f65012713832d988ec06512c7bda5c04
Author: Brendan Higgins <brendanhiggins at google.com>
Date:   Thu Nov 5 15:24:40 2020 -0800

    kunit: tool: unmark test_data as binary blobs
    
    The tools/testing/kunit/test_data/ directory was marked as binary
    because some of the test_data files cause checkpatch warnings. Fix this
    by dropping the .gitattributes file.
    
    Fixes: afc63da64f1e ("kunit: kunit_parser: make parser more robust")
    Signed-off-by: Brendan Higgins <brendanhiggins at google.com>
    Signed-off-by: Shuah Khan <skhan at linuxfoundation.org>

diff --git a/tools/testing/kunit/.gitattributes b/tools/testing/kunit/.gitattributes
deleted file mode 100644
index 5b7da1fc3b8f..000000000000
--- a/tools/testing/kunit/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-test_data/* binary
commit 41f71629b4c432f8dd47d70ace813be5f79d4d75
Author: Deepak R Varma <mh12gx2825 at gmail.com>
Date:   Thu Nov 5 23:29:28 2020 +0530

    drm/tegra: replace idr_init() by idr_init_base()
    
    idr_init() uses base 0 which is an invalid identifier for this driver.
    The new function idr_init_base allows IDR to set the ID lookup from
    base 1. This avoids all lookups that otherwise starts from 0 since
    0 is always unused.
    
    References: commit 6ce711f27500 ("idr: Make 1-based IDRs more efficient")
    
    Signed-off-by: Deepak R Varma <mh12gx2825 at gmail.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index ba9d1c3e7cac..e4baf07992a4 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -90,7 +90,7 @@ static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
 	if (!fpriv)
 		return -ENOMEM;
 
-	idr_init(&fpriv->contexts);
+	idr_init_base(&fpriv->contexts, 1);
 	mutex_init(&fpriv->lock);
 	filp->driver_priv = fpriv;
 
commit fe56d05ee6c87f6a1a8c7267affd92c9438249cc
Author: Sara Sharon <sara.sharon at intel.com>
Date:   Sat Nov 7 10:50:11 2020 +0200

    iwlwifi: mvm: fix kernel panic in case of assert during CSA
    
    During CSA, we briefly nullify the phy context, in __iwl_mvm_unassign_vif_chanctx.
    In case we have a FW assert right after it, it remains NULL though.
    We end up running into endless loop due to mac80211 trying repeatedly to
    move us to ASSOC state, and we keep returning -EINVAL. Later down the road
    we hit a kernel panic.
    
    Detect and avoid this endless loop.
    
    Signed-off-by: Sara Sharon <sara.sharon at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201107104557.d64de2c17bff.Iedd0d2afa20a2aacba5259a5cae31cb3a119a4eb@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 62e884f3e29e..b627e7da7ac9 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3080,7 +3080,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
 
 	/* this would be a mac80211 bug ... but don't crash */
 	if (WARN_ON_ONCE(!mvmvif->phy_ctxt))
-		return -EINVAL;
+		return test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status) ? 0 : -EINVAL;
 
 	/*
 	 * If we are in a STA removal flow and in DQA mode:
commit edb625208d84aef179e3f16590c1c582fc5fdae6
Author: Johannes Berg <johannes.berg at intel.com>
Date:   Sat Nov 7 10:50:10 2020 +0200

    iwlwifi: pcie: set LTR to avoid completion timeout
    
    On some platforms, the preset values aren't correct and then we may
    get a completion timeout in the firmware. Change the LTR configuration
    to avoid that. The firmware will do some more complex reinit of this
    later, but for the boot process we use ~250usec.
    
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201107104557.d83d591c05ba.I42885c9fb500bc08b9a4c07c4ff3d436cc7a3c84@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
index cb9e8e189a1a..1d48c7d7fffd 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
@@ -147,6 +147,16 @@
 #define CSR_MAC_SHADOW_REG_CTL2		(CSR_BASE + 0x0AC)
 #define CSR_MAC_SHADOW_REG_CTL2_RX_WAKE	0xFFFF
 
+/* LTR control (since IWL_DEVICE_FAMILY_22000) */
+#define CSR_LTR_LONG_VAL_AD			(CSR_BASE + 0x0D4)
+#define CSR_LTR_LONG_VAL_AD_NO_SNOOP_REQ	0x80000000
+#define CSR_LTR_LONG_VAL_AD_NO_SNOOP_SCALE	0x1c000000
+#define CSR_LTR_LONG_VAL_AD_NO_SNOOP_VAL	0x03ff0000
+#define CSR_LTR_LONG_VAL_AD_SNOOP_REQ		0x00008000
+#define CSR_LTR_LONG_VAL_AD_SNOOP_SCALE		0x00001c00
+#define CSR_LTR_LONG_VAL_AD_SNOOP_VAL		0x000003ff
+#define CSR_LTR_LONG_VAL_AD_SCALE_USEC		2
+
 /* GIO Chicken Bits (PCI Express bus link power management) */
 #define CSR_GIO_CHICKEN_BITS    (CSR_BASE+0x100)
 
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c
index a0352fa873d9..5512e3c630c3 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c
@@ -252,6 +252,26 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
 
 	iwl_set_bit(trans, CSR_CTXT_INFO_BOOT_CTRL,
 		    CSR_AUTO_FUNC_BOOT_ENA);
+
+	if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_AX210) {
+		/*
+		 * The firmware initializes this again later (to a smaller
+		 * value), but for the boot process initialize the LTR to
+		 * ~250 usec.
+		 */
+		u32 val = CSR_LTR_LONG_VAL_AD_NO_SNOOP_REQ |
+			  u32_encode_bits(CSR_LTR_LONG_VAL_AD_SCALE_USEC,
+					  CSR_LTR_LONG_VAL_AD_NO_SNOOP_SCALE) |
+			  u32_encode_bits(250,
+					  CSR_LTR_LONG_VAL_AD_NO_SNOOP_VAL) |
+			  CSR_LTR_LONG_VAL_AD_SNOOP_REQ |
+			  u32_encode_bits(CSR_LTR_LONG_VAL_AD_SCALE_USEC,
+					  CSR_LTR_LONG_VAL_AD_SNOOP_SCALE) |
+			  u32_encode_bits(250, CSR_LTR_LONG_VAL_AD_SNOOP_VAL);
+
+		iwl_write32(trans, CSR_LTR_LONG_VAL_AD, val);
+	}
+
 	if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
 		iwl_write_umac_prph(trans, UREG_CPU_INIT_RUN, 1);
 	else
commit 97cc16943f23078535fdbce4f6391b948b4ccc08
Author: Avraham Stern <avraham.stern at intel.com>
Date:   Sat Nov 7 10:50:09 2020 +0200

    iwlwifi: mvm: write queue_sync_state only for sync
    
    We use mvm->queue_sync_state to wait for synchronous queue sync
    messages, but if an async one happens inbetween we shouldn't
    clear mvm->queue_sync_state after sending the async one, that
    can run concurrently (at least from the CPU POV) with another
    synchronous queue sync.
    
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>
    Fixes: 3c514bf831ac ("iwlwifi: mvm: add a loose synchronization of the NSSN across Rx queues")
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201107104557.51a3148f2c14.I0772171dbaec87433a11513e9586d98b5d920b5f@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 688c1125e67b..62e884f3e29e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3127,6 +3127,9 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
 			goto out_unlock;
 		}
 
+		if (vif->type == NL80211_IFTYPE_STATION)
+			vif->bss_conf.he_support = sta->he_cap.has_he;
+
 		if (sta->tdls &&
 		    (vif->p2p ||
 		     iwl_mvm_tdls_sta_count(mvm, NULL) ==
commit 1cf260e3a75b87726ec609ad1b6b88f515749786
Author: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
Date:   Sat Nov 7 10:50:08 2020 +0200

    iwlwifi: mvm: properly cancel a session protection for P2P
    
    We need to feed the configuration id to remove  session protection
    properly.
    Remember the conf_id when we add the session protection so that we
    can give it back when we want to remove the session protection.
    While at it, slightly improve the kernel doc for the conf_id
    of the notification.
    
    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
    Fixes: fe959c7b2049 ("iwlwifi: mvm: use the new session protection command")
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201107104557.3642f730333d.I01a98ecde62096d00d171cf34ad775bf80cb0277@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h b/drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h
index a731f28e101a..53b438d709db 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h
@@ -8,7 +8,7 @@
  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
- * Copyright(c) 2018 - 2019 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 version 2 of the GNU General Public License as
@@ -31,7 +31,7 @@
  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
- * Copyright(c) 2018 - 2019 Intel Corporation
+ * Copyright(c) 2018 - 2020 Intel Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -421,12 +421,14 @@ struct iwl_hs20_roc_res {
  *	able to run the GO Negotiation. Will not be fragmented and not
  *	repetitive. Valid only on the P2P Device MAC. Only the duration will
  *	be taken into account.
+ * @SESSION_PROTECT_CONF_MAX_ID: not used
  */
 enum iwl_mvm_session_prot_conf_id {
 	SESSION_PROTECT_CONF_ASSOC,
 	SESSION_PROTECT_CONF_GO_CLIENT_ASSOC,
 	SESSION_PROTECT_CONF_P2P_DEVICE_DISCOV,
 	SESSION_PROTECT_CONF_P2P_GO_NEGOTIATION,
+	SESSION_PROTECT_CONF_MAX_ID,
 }; /* SESSION_PROTECTION_CONF_ID_E_VER_1 */
 
 /**
@@ -459,7 +461,7 @@ struct iwl_mvm_session_prot_cmd {
  * @mac_id: the mac id for which the session protection started / ended
  * @status: 1 means success, 0 means failure
  * @start: 1 means the session protection started, 0 means it ended
- * @conf_id: the configuration id of the session that started / eneded
+ * @conf_id: see &enum iwl_mvm_session_prot_conf_id
  *
  * Note that any session protection will always get two notifications: start
  * and end even the firmware could not schedule it.
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
index a9ebe69a6670..1db6d8d38822 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
@@ -641,11 +641,32 @@ void iwl_mvm_protect_session(struct iwl_mvm *mvm,
 	}
 }
 
+static void iwl_mvm_cancel_session_protection(struct iwl_mvm *mvm,
+					      struct iwl_mvm_vif *mvmvif)
+{
+	struct iwl_mvm_session_prot_cmd cmd = {
+		.id_and_color =
+			cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
+							mvmvif->color)),
+		.action = cpu_to_le32(FW_CTXT_ACTION_REMOVE),
+		.conf_id = cpu_to_le32(mvmvif->time_event_data.id),
+	};
+	int ret;
+
+	ret = iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(SESSION_PROTECTION_CMD,
+						   MAC_CONF_GROUP, 0),
+				   0, sizeof(cmd), &cmd);
+	if (ret)
+		IWL_ERR(mvm,
+			"Couldn't send the SESSION_PROTECTION_CMD: %d\n", ret);
+}
+
 static bool __iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
 					struct iwl_mvm_time_event_data *te_data,
 					u32 *uid)
 {
 	u32 id;
+	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
 
 	/*
 	 * It is possible that by the time we got to this point the time
@@ -663,14 +684,29 @@ static bool __iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
 	iwl_mvm_te_clear_data(mvm, te_data);
 	spin_unlock_bh(&mvm->time_event_lock);
 
-	/*
-	 * It is possible that by the time we try to remove it, the time event
-	 * has already ended and removed. In such a case there is no need to
-	 * send a removal command.
+	/* When session protection is supported, the te_data->id field
+	 * is reused to save session protection's configuration.
 	 */
-	if (id == TE_MAX) {
-		IWL_DEBUG_TE(mvm, "TE 0x%x has already ended\n", *uid);
+	if (fw_has_capa(&mvm->fw->ucode_capa,
+			IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) {
+		if (mvmvif && id < SESSION_PROTECT_CONF_MAX_ID) {
+			/* Session protection is still ongoing. Cancel it */
+			iwl_mvm_cancel_session_protection(mvm, mvmvif);
+			if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) {
+				set_bit(IWL_MVM_STATUS_NEED_FLUSH_P2P, &mvm->status);
+				iwl_mvm_roc_finished(mvm);
+			}
+		}
 		return false;
+	} else {
+		/* It is possible that by the time we try to remove it, the
+		 * time event has already ended and removed. In such a case
+		 * there is no need to send a removal command.
+		 */
+		if (id == TE_MAX) {
+			IWL_DEBUG_TE(mvm, "TE 0x%x has already ended\n", *uid);
+			return false;
+		}
 	}
 
 	return true;
@@ -771,6 +807,7 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
 	struct iwl_rx_packet *pkt = rxb_addr(rxb);
 	struct iwl_mvm_session_prot_notif *notif = (void *)pkt->data;
 	struct ieee80211_vif *vif;
+	struct iwl_mvm_vif *mvmvif;
 
 	rcu_read_lock();
 	vif = iwl_mvm_rcu_dereference_vif_id(mvm, le32_to_cpu(notif->mac_id),
@@ -779,9 +816,10 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
 	if (!vif)
 		goto out_unlock;
 
+	mvmvif = iwl_mvm_vif_from_mac80211(vif);
+
 	/* The vif is not a P2P_DEVICE, maintain its time_event_data */
 	if (vif->type != NL80211_IFTYPE_P2P_DEVICE) {
-		struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 		struct iwl_mvm_time_event_data *te_data =
 			&mvmvif->time_event_data;
 
@@ -816,10 +854,14 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
 
 	if (!le32_to_cpu(notif->status) || !le32_to_cpu(notif->start)) {
 		/* End TE, notify mac80211 */
+		mvmvif->time_event_data.id = SESSION_PROTECT_CONF_MAX_ID;
 		ieee80211_remain_on_channel_expired(mvm->hw);
 		set_bit(IWL_MVM_STATUS_NEED_FLUSH_P2P, &mvm->status);
 		iwl_mvm_roc_finished(mvm);
 	} else if (le32_to_cpu(notif->start)) {
+		if (WARN_ON(mvmvif->time_event_data.id !=
+				le32_to_cpu(notif->conf_id)))
+			goto out_unlock;
 		set_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status);
 		ieee80211_ready_on_channel(mvm->hw); /* Start TE */
 	}
@@ -845,20 +887,24 @@ iwl_mvm_start_p2p_roc_session_protection(struct iwl_mvm *mvm,
 
 	lockdep_assert_held(&mvm->mutex);
 
+	/* The time_event_data.id field is reused to save session
+	 * protection's configuration.
+	 */
 	switch (type) {
 	case IEEE80211_ROC_TYPE_NORMAL:
-		cmd.conf_id =
-			cpu_to_le32(SESSION_PROTECT_CONF_P2P_DEVICE_DISCOV);
+		mvmvif->time_event_data.id =
+			SESSION_PROTECT_CONF_P2P_DEVICE_DISCOV;
 		break;
 	case IEEE80211_ROC_TYPE_MGMT_TX:
-		cmd.conf_id =
-			cpu_to_le32(SESSION_PROTECT_CONF_P2P_GO_NEGOTIATION);
+		mvmvif->time_event_data.id =
+			SESSION_PROTECT_CONF_P2P_GO_NEGOTIATION;
 		break;
 	default:
 		WARN_ONCE(1, "Got an invalid ROC type\n");
 		return -EINVAL;
 	}
 
+	cmd.conf_id = cpu_to_le32(mvmvif->time_event_data.id);
 	return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(SESSION_PROTECTION_CMD,
 						    MAC_CONF_GROUP, 0),
 				    0, sizeof(cmd), &cmd);
@@ -960,25 +1006,6 @@ void iwl_mvm_cleanup_roc_te(struct iwl_mvm *mvm)
 		__iwl_mvm_remove_time_event(mvm, te_data, &uid);
 }
 
-static void iwl_mvm_cancel_session_protection(struct iwl_mvm *mvm,
-					      struct iwl_mvm_vif *mvmvif)
-{
-	struct iwl_mvm_session_prot_cmd cmd = {
-		.id_and_color =
-			cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
-							mvmvif->color)),
-		.action = cpu_to_le32(FW_CTXT_ACTION_REMOVE),
-	};
-	int ret;
-
-	ret = iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(SESSION_PROTECTION_CMD,
-						   MAC_CONF_GROUP, 0),
-				   0, sizeof(cmd), &cmd);
-	if (ret)
-		IWL_ERR(mvm,
-			"Couldn't send the SESSION_PROTECTION_CMD: %d\n", ret);
-}
-
 void iwl_mvm_stop_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
 {
 	struct iwl_mvm_vif *mvmvif;
@@ -1129,10 +1156,15 @@ void iwl_mvm_schedule_session_protection(struct iwl_mvm *mvm,
 			cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
 							mvmvif->color)),
 		.action = cpu_to_le32(FW_CTXT_ACTION_ADD),
-		.conf_id = cpu_to_le32(SESSION_PROTECT_CONF_ASSOC),
 		.duration_tu = cpu_to_le32(MSEC_TO_TU(duration)),
 	};
 
+	/* The time_event_data.id field is reused to save session
+	 * protection's configuration.
+	 */
+	mvmvif->time_event_data.id = SESSION_PROTECT_CONF_ASSOC;
+	cmd.conf_id = cpu_to_le32(mvmvif->time_event_data.id);
+
 	lockdep_assert_held(&mvm->mutex);
 
 	spin_lock_bh(&mvm->time_event_lock);
commit fb8d1b6e97980057b7ebed444b8950e57f268a67
Author: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
Date:   Sat Nov 7 10:50:07 2020 +0200

    iwlwifi: mvm: use the HOT_SPOT_CMD to cancel an AUX ROC
    
    The ROC that runs on the AUX ROC (meaning an ROC on the STA vif),
    was added with the HOT_SPOT_CMD firmware command and must be
    cancelled with that same command.
    
    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
    Fixes: fe959c7b2049 ("iwlwifi: mvm: use the new session protection command")
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201107104557.a317376154da.I44fa3637373ba4bd421cdff2cabc761bffc0735f@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
index 7fce79c1c114..a9ebe69a6670 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
@@ -988,10 +988,13 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
 			IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) {
 		mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
-		iwl_mvm_cancel_session_protection(mvm, mvmvif);
-
-		if (vif->type == NL80211_IFTYPE_P2P_DEVICE)
+		if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
+			iwl_mvm_cancel_session_protection(mvm, mvmvif);
 			set_bit(IWL_MVM_STATUS_NEED_FLUSH_P2P, &mvm->status);
+		} else {
+			iwl_mvm_remove_aux_roc_te(mvm, mvmvif,
+						  &mvmvif->time_event_data);
+		}
 
 		iwl_mvm_roc_finished(mvm);
 
commit c8a2e7a29702fe4626b7aa81149b7b7164e20606
Author: Mordechay Goodstein <mordechay.goodstein at intel.com>
Date:   Sat Nov 7 10:50:06 2020 +0200

    iwlwifi: sta: set max HE max A-MPDU according to HE capa
    
    Currently, our max tpt is limited to max HT A-MPDU for LB,
    and max VHT A-MPDU for HB. Configure HE exponent value correctly to
    achieve HE max A-MPDU, both on LB and HB.
    
    Signed-off-by: Mordechay Goodstein <mordechay.goodstein at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201107104557.4486852ebb56.I9eb0d028e31f183597fb90120e7d4ca87e0dd6cb@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/sta.h b/drivers/net/wireless/intel/iwlwifi/fw/api/sta.h
index d43e0d3f3a12..052413eef059 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/sta.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/sta.h
@@ -5,10 +5,9 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
- * Copyright(c) 2018 - 2019 Intel Corporation
+ * Copyright(c) 2012-2014, 2018 - 2020 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
@@ -28,10 +27,9 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
- * Copyright(c) 2018 - 2019 Intel Corporation
+ * Copyright(c) 2012-2014, 2018 - 2020 Intel Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -128,7 +126,9 @@ enum iwl_sta_flags {
 	STA_FLG_MAX_AGG_SIZE_256K	= (5 << STA_FLG_MAX_AGG_SIZE_SHIFT),
 	STA_FLG_MAX_AGG_SIZE_512K	= (6 << STA_FLG_MAX_AGG_SIZE_SHIFT),
 	STA_FLG_MAX_AGG_SIZE_1024K	= (7 << STA_FLG_MAX_AGG_SIZE_SHIFT),
-	STA_FLG_MAX_AGG_SIZE_MSK	= (7 << STA_FLG_MAX_AGG_SIZE_SHIFT),
+	STA_FLG_MAX_AGG_SIZE_2M		= (8 << STA_FLG_MAX_AGG_SIZE_SHIFT),
+	STA_FLG_MAX_AGG_SIZE_4M		= (9 << STA_FLG_MAX_AGG_SIZE_SHIFT),
+	STA_FLG_MAX_AGG_SIZE_MSK	= (0xf << STA_FLG_MAX_AGG_SIZE_SHIFT),
 
 	STA_FLG_AGG_MPDU_DENS_SHIFT	= 23,
 	STA_FLG_AGG_MPDU_DENS_2US	= (4 << STA_FLG_AGG_MPDU_DENS_SHIFT),
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 017537944fd0..799d8219463c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -196,6 +196,7 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
 		mpdu_dens = sta->ht_cap.ampdu_density;
 	}
 
+
 	if (sta->vht_cap.vht_supported) {
 		agg_size = sta->vht_cap.cap &
 			IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
@@ -205,6 +206,23 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
 		agg_size = sta->ht_cap.ampdu_factor;
 	}
 
+	/* D6.0 10.12.2 A-MPDU length limit rules
+	 * A STA indicates the maximum length of the A-MPDU preEOF padding
+	 * that it can receive in an HE PPDU in the Maximum A-MPDU Length
+	 * Exponent field in its HT Capabilities, VHT Capabilities,
+	 * and HE 6 GHz Band Capabilities elements (if present) and the
+	 * Maximum AMPDU Length Exponent Extension field in its HE
+	 * Capabilities element
+	 */
+	if (sta->he_cap.has_he)
+		agg_size += u8_get_bits(sta->he_cap.he_cap_elem.mac_cap_info[3],
+					IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
+
+	/* Limit to max A-MPDU supported by FW */
+	if (agg_size > (STA_FLG_MAX_AGG_SIZE_4M >> STA_FLG_MAX_AGG_SIZE_SHIFT))
+		agg_size = (STA_FLG_MAX_AGG_SIZE_4M >>
+			    STA_FLG_MAX_AGG_SIZE_SHIFT);
+
 	add_sta_cmd.station_flags |=
 		cpu_to_le32(agg_size << STA_FLG_MAX_AGG_SIZE_SHIFT);
 	add_sta_cmd.station_flags |=
commit eccc876724927ff3b9ff91f36f7b6b159e948f0c
Merge: e2f0c565ec70 77f6ab8b7768
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 10 10:33:55 2020 -0800

    Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
    
    Pull core dump fix from Al Viro:
     "Fix for multithreaded coredump playing fast and loose with getting
      registers of secondary threads; if a secondary gets caught in the
      middle of exit(2), the conditition it will be stopped in for dumper to
      examine might be unusual enough for things to go wrong.
    
      Quite a few architectures are fine with that, but some are not."
    
    * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
      don't dump the threads that had been already exiting when zapped.

commit c2fe61d8be491ff8188edaf22e838f819999146b
Author: Arvind Sankar <nivedita at alum.mit.edu>
Date:   Tue Nov 10 11:39:19 2020 -0500

    efi/x86: Free efi_pgd with free_pages()
    
    Commit
    
      d9e9a6418065 ("x86/mm/pti: Allocate a separate user PGD")
    
    changed the PGD allocation to allocate PGD_ALLOCATION_ORDER pages, so in
    the error path it should be freed using free_pages() rather than
    free_page().
    
    Commit
    
        06ace26f4e6f ("x86/efi: Free efi_pgd with free_pages()")
    
    fixed one instance of this, but missed another.
    
    Move the freeing out-of-line to avoid code duplication and fix this bug.
    
    Fixes: d9e9a6418065 ("x86/mm/pti: Allocate a separate user PGD")
    Link: https://lore.kernel.org/r/20201110163919.1134431-1-nivedita@alum.mit.edu
    Signed-off-by: Arvind Sankar <nivedita at alum.mit.edu>
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>

diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c
index 8f5759df7776..e1e8d4e3a213 100644
--- a/arch/x86/platform/efi/efi_64.c
+++ b/arch/x86/platform/efi/efi_64.c
@@ -78,28 +78,30 @@ int __init efi_alloc_page_tables(void)
 	gfp_mask = GFP_KERNEL | __GFP_ZERO;
 	efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER);
 	if (!efi_pgd)
-		return -ENOMEM;
+		goto fail;
 
 	pgd = efi_pgd + pgd_index(EFI_VA_END);
 	p4d = p4d_alloc(&init_mm, pgd, EFI_VA_END);
-	if (!p4d) {
-		free_page((unsigned long)efi_pgd);
-		return -ENOMEM;
-	}
+	if (!p4d)
+		goto free_pgd;
 
 	pud = pud_alloc(&init_mm, p4d, EFI_VA_END);
-	if (!pud) {
-		if (pgtable_l5_enabled())
-			free_page((unsigned long) pgd_page_vaddr(*pgd));
-		free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
-		return -ENOMEM;
-	}
+	if (!pud)
+		goto free_p4d;
 
 	efi_mm.pgd = efi_pgd;
 	mm_init_cpumask(&efi_mm);
 	init_new_context(NULL, &efi_mm);
 
 	return 0;
+
+free_p4d:
+	if (pgtable_l5_enabled())
+		free_page((unsigned long)pgd_page_vaddr(*pgd));
+free_pgd:
+	free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
+fail:
+	return -ENOMEM;
 }
 
 /*
commit e2f0c565ec70eb9e4d3b98deb5892af62de8b98d
Merge: 52d1998d09af 468600c6ec28
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 10 10:07:15 2020 -0800

    Merge tag 'for-5.10-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
    
    Pull btrfs fixes from David Sterba:
     "A handful of minor fixes and updates:
    
       - handle missing device replace item on mount (syzbot report)
    
       - fix space reservation calculation when finishing relocation
    
       - fix memory leak on error path in ref-verify (debugging feature)
    
       - fix potential overflow during defrag on 32bit arches
    
       - minor code update to silence smatch warning
    
       - minor error message updates"
    
    * tag 'for-5.10-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
      btrfs: ref-verify: fix memory leak in btrfs_ref_tree_mod
      btrfs: dev-replace: fail mount if we don't have replace item with target device
      btrfs: scrub: update message regarding read-only status
      btrfs: clean up NULL checks in qgroup_unreserve_range()
      btrfs: fix min reserved size calculation in merge_reloc_root
      btrfs: print the block rsv type when we fail our reservation
      btrfs: fix potential overflow in cluster_pages_for_defrag on 32bit arch

commit 52d1998d09af92d44ffce7454637dd3fd1afdc7d
Merge: 8bff39bfdc30 92cfcd030e4b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 10 10:05:37 2020 -0800

    Merge tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt
    
    Pull fscrypt fix from Eric Biggers:
     "Fix a regression where a new WARN_ON() was reachable when using
      FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32 on ext4, causing xfstest
      generic/602 to sometimes fail on ext4"
    
    * tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt:
      fscrypt: remove reachable WARN in fscrypt_setup_iv_ino_lblk_32_key()

commit 8bff39bfdc30c9bd6e152eb88a0bd6dd35bdd760
Merge: 407ab579637c 3e9fa9983b92
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Tue Nov 10 10:02:31 2020 -0800

    Merge branch 'turbostat' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
    
    Pull turbostat updates from Len Brown:
     "Update update to version 20.09.30, one kernel side fix"
    
    * 'turbostat' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux:
      tools/power turbostat: update version number
      powercap: restrict energy meter to root access
      tools/power turbostat: harden against cpu hotplug
      tools/power turbostat: adjust for temperature offset
      tools/power turbostat: Build with _FILE_OFFSET_BITS=64
      tools/power turbostat: Support AMD Family 19h
      tools/power turbostat: Remove empty columns for Jacobsville
      tools/power turbostat: Add a new GFXAMHz column that exposes gt_act_freq_mhz.
      tools/power x86_energy_perf_policy: Input/output error in a VM
      tools/power turbostat: Skip pc8, pc9, pc10 columns, if they are disabled
      tools/power turbostat: Support additional CPU model numbers
      tools/power turbostat: Fix output formatting for ACPI CST enumeration
      tools/power turbostat: Replace HTTP links with HTTPS ones: TURBOSTAT UTILITY
      tools/power turbostat: Use sched_getcpu() instead of hardcoded cpu 0
      tools/power turbostat: Enable accumulate RAPL display
      tools/power turbostat: Introduce functions to accumulate RAPL consumption
      tools/power turbostat: Make the energy variable to be 64 bit
      tools/power turbostat: Always print idle in the system configuration header
      tools/power turbostat: Print /dev/cpu_dma_latency

commit 38748bcb940e8b52beee19b0e5cfd740475a99e1
Author: Srinivas Pandruvada <srinivas.pandruvada at linux.intel.com>
Date:   Tue Nov 10 09:50:58 2020 -0800

    ACPI: DPTF: Support Alder Lake
    
    Add Alder Lake ACPI IDs for DPTF devices.
    
    Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada at linux.intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/dptf/dptf_pch_fivr.c b/drivers/acpi/dptf/dptf_pch_fivr.c
index 4c1992fce150..5fca18296bf6 100644
--- a/drivers/acpi/dptf/dptf_pch_fivr.c
+++ b/drivers/acpi/dptf/dptf_pch_fivr.c
@@ -106,6 +106,7 @@ static int pch_fivr_remove(struct platform_device *pdev)
 
 static const struct acpi_device_id pch_fivr_device_ids[] = {
 	{"INTC1045", 0},
+	{"INTC1049", 0},
 	{"", 0},
 };
 MODULE_DEVICE_TABLE(acpi, pch_fivr_device_ids);
diff --git a/drivers/acpi/dptf/dptf_power.c b/drivers/acpi/dptf/dptf_power.c
index 06741305fc77..a24d5d7aa117 100644
--- a/drivers/acpi/dptf/dptf_power.c
+++ b/drivers/acpi/dptf/dptf_power.c
@@ -229,6 +229,8 @@ static const struct acpi_device_id int3407_device_ids[] = {
 	{"INT3532", 0},
 	{"INTC1047", 0},
 	{"INTC1050", 0},
+	{"INTC1060", 0},
+	{"INTC1061", 0},
 	{"", 0},
 };
 MODULE_DEVICE_TABLE(acpi, int3407_device_ids);
diff --git a/drivers/acpi/dptf/int340x_thermal.c b/drivers/acpi/dptf/int340x_thermal.c
index 8d420c7e7178..d14025a85ce8 100644
--- a/drivers/acpi/dptf/int340x_thermal.c
+++ b/drivers/acpi/dptf/int340x_thermal.c
@@ -25,10 +25,16 @@ static const struct acpi_device_id int340x_thermal_device_ids[] = {
 	{"INT340A"},
 	{"INT340B"},
 	{"INTC1040"},
+	{"INTC1041"},
 	{"INTC1043"},
 	{"INTC1044"},
 	{"INTC1045"},
+	{"INTC1046"},
 	{"INTC1047"},
+	{"INTC1048"},
+	{"INTC1049"},
+	{"INTC1060"},
+	{"INTC1061"},
 	{""},
 };
 
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index 62873388b24f..48354f82fba6 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -27,6 +27,7 @@ static const struct acpi_device_id fan_device_ids[] = {
 	{"PNP0C0B", 0},
 	{"INT3404", 0},
 	{"INTC1044", 0},
+	{"INTC1048", 0},
 	{"", 0},
 };
 MODULE_DEVICE_TABLE(acpi, fan_device_ids);
commit 8d936bb13ce788c616084ab1a5754da3490a9f0c
Author: Flavio Suligoi <f.suligoi at asem.it>
Date:   Tue Nov 10 14:03:38 2020 +0100

    Documentation: ACPI: fix spelling mistakes
    
    Signed-off-by: Flavio Suligoi <f.suligoi at asem.it>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/Documentation/firmware-guide/acpi/acpi-lid.rst b/Documentation/firmware-guide/acpi/acpi-lid.rst
index 874ce0ed340d..71b9af13a048 100644
--- a/Documentation/firmware-guide/acpi/acpi-lid.rst
+++ b/Documentation/firmware-guide/acpi/acpi-lid.rst
@@ -19,9 +19,9 @@ report the "current" state of the lid as either "opened" or "closed".
 
 For most platforms, both the _LID method and the lid notifications are
 reliable. However, there are exceptions. In order to work with these
-exceptional buggy platforms, special restrictions and expections should be
+exceptional buggy platforms, special restrictions and exceptions should be
 taken into account. This document describes the restrictions and the
-expections of the Linux ACPI lid device driver.
+exceptions of the Linux ACPI lid device driver.
 
 
 Restrictions of the returning value of the _LID control method
@@ -46,7 +46,7 @@ state is changed to "closed". The "closed" notification is normally used to
 trigger some system power saving operations on Windows. Since it is fully
 tested, it is reliable from all AML tables.
 
-Expections for the userspace users of the ACPI lid device driver
+Exceptions for the userspace users of the ACPI lid device driver
 ================================================================
 
 The ACPI button driver exports the lid state to the userspace via the
@@ -100,7 +100,7 @@ use the following kernel parameter:
 C. button.lid_init_state=ignore:
    When this option is specified, the ACPI button driver never reports the
    initial lid state and there is a compensation mechanism implemented to
-   ensure that the reliable "closed" notifications can always be delievered
+   ensure that the reliable "closed" notifications can always be delivered
    to the userspace by always pairing "closed" input events with complement
    "opened" input events. But there is still no guarantee that the "opened"
    notifications can be delivered to the userspace when the lid is actually
diff --git a/Documentation/firmware-guide/acpi/method-tracing.rst b/Documentation/firmware-guide/acpi/method-tracing.rst
index 0aa7e2c5d32a..6ab6c0964042 100644
--- a/Documentation/firmware-guide/acpi/method-tracing.rst
+++ b/Documentation/firmware-guide/acpi/method-tracing.rst
@@ -98,7 +98,7 @@ subject to change::
    [    0.188903]   exdebug-0398 ex_trace_point        : Method End [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution.
 
 Developers can utilize these special log entries to track the AML
-interpretion, thus can aid issue debugging and performance tuning. Note
+interpretation, thus can aid issue debugging and performance tuning. Note
 that, as the "AML tracer" logs are implemented via ACPI_DEBUG_PRINT()
 macro, CONFIG_ACPI_DEBUG is also required to be enabled for enabling
 "AML tracer" logs.
commit 8d4d9c7b4333abccb3bf310d76ef7ea2edb9828f
Author: Colin Ian King <colin.king at canonical.com>
Date:   Thu Oct 29 15:11:03 2020 +0000

    sched/debug: Fix memory corruption caused by multiple small reads of flags
    
    Reading /proc/sys/kernel/sched_domain/cpu*/domain0/flags mutliple times
    with small reads causes oopses with slub corruption issues because the kfree is
    free'ing an offset from a previous allocation. Fix this by adding in a new
    pointer 'buf' for the allocation and kfree and use the temporary pointer tmp
    to handle memory copies of the buf offsets.
    
    Fixes: 5b9f8ff7b320 ("sched/debug: Output SD flag names rather than their values")
    Reported-by: Jeff Bastian <jbastian at redhat.com>
    Signed-off-by: Colin Ian King <colin.king at canonical.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Reviewed-by: Valentin Schneider <valentin.schneider at arm.com>
    Link: https://lkml.kernel.org/r/20201029151103.373410-1-colin.king@canonical.com

diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 0655524700d2..2357921580f9 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -251,7 +251,7 @@ static int sd_ctl_doflags(struct ctl_table *table, int write,
 	unsigned long flags = *(unsigned long *)table->data;
 	size_t data_size = 0;
 	size_t len = 0;
-	char *tmp;
+	char *tmp, *buf;
 	int idx;
 
 	if (write)
@@ -269,17 +269,17 @@ static int sd_ctl_doflags(struct ctl_table *table, int write,
 		return 0;
 	}
 
-	tmp = kcalloc(data_size + 1, sizeof(*tmp), GFP_KERNEL);
-	if (!tmp)
+	buf = kcalloc(data_size + 1, sizeof(*buf), GFP_KERNEL);
+	if (!buf)
 		return -ENOMEM;
 
 	for_each_set_bit(idx, &flags, __SD_FLAG_CNT) {
 		char *name = sd_flag_debug[idx].name;
 
-		len += snprintf(tmp + len, strlen(name) + 2, "%s ", name);
+		len += snprintf(buf + len, strlen(name) + 2, "%s ", name);
 	}
 
-	tmp += *ppos;
+	tmp = buf + *ppos;
 	len -= *ppos;
 
 	if (len > *lenp)
@@ -294,7 +294,7 @@ static int sd_ctl_doflags(struct ctl_table *table, int write,
 	*lenp = len;
 	*ppos += len;
 
-	kfree(tmp);
+	kfree(buf);
 
 	return 0;
 }
commit b4c9c9f15649c98a5b45408919d1ff4fd7f5531c
Author: Vincent Guittot <vincent.guittot at linaro.org>
Date:   Thu Oct 29 17:18:24 2020 +0100

    sched/fair: Prefer prev cpu in asymmetric wakeup path
    
    During fast wakeup path, scheduler always check whether local or prev
    cpus are good candidates for the task before looking for other cpus in
    the domain. With commit b7a331615d25 ("sched/fair: Add asymmetric CPU
    capacity wakeup scan") the heterogenous system gains a dedicated path
    but doesn't try to reuse prev cpu whenever possible. If the previous
    cpu is idle and belong to the LLC domain, we should check it 1st
    before looking for another cpu because it stays one of the best
    candidate and this also stabilizes task placement on the system.
    
    This change aligns asymmetric path behavior with symmetric one and reduces
    cases where the task migrates across all cpus of the sd_asym_cpucapacity
    domains at wakeup.
    
    This change does not impact normal EAS mode but only the overloaded case or
    when EAS is not used.
    
    - On hikey960 with performance governor (EAS disable)
    
    ./perf bench sched pipe -T -l 50000
                 mainline           w/ patch
    # migrations   999364                  0
    ops/sec        149313(+/-0.28%)   182587(+/- 0.40) +22%
    
    - On hikey with performance governor
    
    ./perf bench sched pipe -T -l 50000
                 mainline           w/ patch
    # migrations        0                  0
    ops/sec         47721(+/-0.76%)    47899(+/- 0.56) +0.4%
    
    According to test on hikey, the patch doesn't impact symmetric system
    compared to current implementation (only tested on arm64)
    
    Also read the uclamped value of task's utilization at most twice instead
    instead each time we compare task's utilization with cpu's capacity.
    
    Fixes: b7a331615d25 ("sched/fair: Add asymmetric CPU capacity wakeup scan")
    Signed-off-by: Vincent Guittot <vincent.guittot at linaro.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Tested-by: Dietmar Eggemann <dietmar.eggemann at arm.com>
    Reviewed-by: Valentin Schneider <valentin.schneider at arm.com>
    Link: https://lkml.kernel.org/r/20201029161824.26389-1-vincent.guittot@linaro.org

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 210b15f068a6..8e563cf2b5e7 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6172,21 +6172,21 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t
 static int
 select_idle_capacity(struct task_struct *p, struct sched_domain *sd, int target)
 {
-	unsigned long best_cap = 0;
+	unsigned long task_util, best_cap = 0;
 	int cpu, best_cpu = -1;
 	struct cpumask *cpus;
 
-	sync_entity_load_avg(&p->se);
-
 	cpus = this_cpu_cpumask_var_ptr(select_idle_mask);
 	cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr);
 
+	task_util = uclamp_task_util(p);
+
 	for_each_cpu_wrap(cpu, cpus, target) {
 		unsigned long cpu_cap = capacity_of(cpu);
 
 		if (!available_idle_cpu(cpu) && !sched_idle_cpu(cpu))
 			continue;
-		if (task_fits_capacity(p, cpu_cap))
+		if (fits_capacity(task_util, cpu_cap))
 			return cpu;
 
 		if (cpu_cap > best_cap) {
@@ -6198,44 +6198,42 @@ select_idle_capacity(struct task_struct *p, struct sched_domain *sd, int target)
 	return best_cpu;
 }
 
+static inline bool asym_fits_capacity(int task_util, int cpu)
+{
+	if (static_branch_unlikely(&sched_asym_cpucapacity))
+		return fits_capacity(task_util, capacity_of(cpu));
+
+	return true;
+}
+
 /*
  * Try and locate an idle core/thread in the LLC cache domain.
  */
 static int select_idle_sibling(struct task_struct *p, int prev, int target)
 {
 	struct sched_domain *sd;
+	unsigned long task_util;
 	int i, recent_used_cpu;
 
 	/*
-	 * For asymmetric CPU capacity systems, our domain of interest is
-	 * sd_asym_cpucapacity rather than sd_llc.
+	 * On asymmetric system, update task utilization because we will check
+	 * that the task fits with cpu's capacity.
 	 */
 	if (static_branch_unlikely(&sched_asym_cpucapacity)) {
-		sd = rcu_dereference(per_cpu(sd_asym_cpucapacity, target));
-		/*
-		 * On an asymmetric CPU capacity system where an exclusive
-		 * cpuset defines a symmetric island (i.e. one unique
-		 * capacity_orig value through the cpuset), the key will be set
-		 * but the CPUs within that cpuset will not have a domain with
-		 * SD_ASYM_CPUCAPACITY. These should follow the usual symmetric
-		 * capacity path.
-		 */
-		if (!sd)
-			goto symmetric;
-
-		i = select_idle_capacity(p, sd, target);
-		return ((unsigned)i < nr_cpumask_bits) ? i : target;
+		sync_entity_load_avg(&p->se);
+		task_util = uclamp_task_util(p);
 	}
 
-symmetric:
-	if (available_idle_cpu(target) || sched_idle_cpu(target))
+	if ((available_idle_cpu(target) || sched_idle_cpu(target)) &&
+	    asym_fits_capacity(task_util, target))
 		return target;
 
 	/*
 	 * If the previous CPU is cache affine and idle, don't be stupid:
 	 */
 	if (prev != target && cpus_share_cache(prev, target) &&
-	    (available_idle_cpu(prev) || sched_idle_cpu(prev)))
+	    (available_idle_cpu(prev) || sched_idle_cpu(prev)) &&
+	    asym_fits_capacity(task_util, prev))
 		return prev;
 
 	/*
@@ -6258,7 +6256,8 @@ symmetric:
 	    recent_used_cpu != target &&
 	    cpus_share_cache(recent_used_cpu, target) &&
 	    (available_idle_cpu(recent_used_cpu) || sched_idle_cpu(recent_used_cpu)) &&
-	    cpumask_test_cpu(p->recent_used_cpu, p->cpus_ptr)) {
+	    cpumask_test_cpu(p->recent_used_cpu, p->cpus_ptr) &&
+	    asym_fits_capacity(task_util, recent_used_cpu)) {
 		/*
 		 * Replace recent_used_cpu with prev as it is a potential
 		 * candidate for the next wake:
@@ -6267,6 +6266,26 @@ symmetric:
 		return recent_used_cpu;
 	}
 
+	/*
+	 * For asymmetric CPU capacity systems, our domain of interest is
+	 * sd_asym_cpucapacity rather than sd_llc.
+	 */
+	if (static_branch_unlikely(&sched_asym_cpucapacity)) {
+		sd = rcu_dereference(per_cpu(sd_asym_cpucapacity, target));
+		/*
+		 * On an asymmetric CPU capacity system where an exclusive
+		 * cpuset defines a symmetric island (i.e. one unique
+		 * capacity_orig value through the cpuset), the key will be set
+		 * but the CPUs within that cpuset will not have a domain with
+		 * SD_ASYM_CPUCAPACITY. These should follow the usual symmetric
+		 * capacity path.
+		 */
+		if (sd) {
+			i = select_idle_capacity(p, sd, target);
+			return ((unsigned)i < nr_cpumask_bits) ? i : target;
+		}
+	}
+
 	sd = rcu_dereference(per_cpu(sd_llc, target));
 	if (!sd)
 		return target;
commit 16b0a7a1a0af9db6e008fecd195fe4d6cb366d83
Author: Vincent Guittot <vincent.guittot at linaro.org>
Date:   Mon Nov 2 11:24:57 2020 +0100

    sched/fair: Ensure tasks spreading in LLC during LB
    
    schbench shows latency increase for 95 percentile above since:
      commit 0b0695f2b34a ("sched/fair: Rework load_balance()")
    
    Align the behavior of the load balancer with the wake up path, which tries
    to select an idle CPU which belongs to the LLC for a waking task.
    
    calculate_imbalance() will use nr_running instead of the spare
    capacity when CPUs share resources (ie cache) at the domain level. This
    will ensure a better spread of tasks on idle CPUs.
    
    Running schbench on a hikey (8cores arm64) shows the problem:
    
    tip/sched/core :
    schbench -m 2 -t 4 -s 10000 -c 1000000 -r 10
    Latency percentiles (usec)
            50.0th: 33
            75.0th: 45
            90.0th: 51
            95.0th: 4152
            *99.0th: 14288
            99.5th: 14288
            99.9th: 14288
            min=0, max=14276
    
    tip/sched/core + patch :
    schbench -m 2 -t 4 -s 10000 -c 1000000 -r 10
    Latency percentiles (usec)
            50.0th: 34
            75.0th: 47
            90.0th: 52
            95.0th: 78
            *99.0th: 94
            99.5th: 94
            99.9th: 94
            min=0, max=94
    
    Fixes: 0b0695f2b34a ("sched/fair: Rework load_balance()")
    Reported-by: Chris Mason <clm at fb.com>
    Suggested-by: Rik van Riel <riel at surriel.com>
    Signed-off-by: Vincent Guittot <vincent.guittot at linaro.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Reviewed-by: Rik van Riel <riel at surriel.com>
    Tested-by: Rik van Riel <riel at surriel.com>
    Link: https://lkml.kernel.org/r/20201102102457.28808-1-vincent.guittot@linaro.org

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index aa4c6227cd6d..210b15f068a6 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9031,7 +9031,8 @@ static inline void calculate_imbalance(struct lb_env *env, struct sd_lb_stats *s
 	 * emptying busiest.
 	 */
 	if (local->group_type == group_has_spare) {
-		if (busiest->group_type > group_fully_busy) {
+		if ((busiest->group_type > group_fully_busy) &&
+		    !(env->sd->flags & SD_SHARE_PKG_RESOURCES)) {
 			/*
 			 * If busiest is overloaded, try to fill spare
 			 * capacity. This might end up creating spare capacity
commit 1a8cfa24e21c2f154791f0cdd85fc28496918722
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 22:51:57 2020 +0100

    perf/x86/intel/uncore: Fix Add BW copypasta
    
    gcc -Wextra points out a duplicate initialization of one array
    member:
    
    arch/x86/events/intel/uncore_snb.c:478:37: warning: initialized field overwritten [-Woverride-init]
      478 |  [SNB_PCI_UNCORE_IMC_DATA_READS]  = { SNB_UNCORE_PCI_IMC_DATA_WRITES_BASE,
    
    The only sensible explanation is that a duplicate 'READS' was used
    instead of the correct 'WRITES', so change it back.
    
    Fixes: 24633d901ea4 ("perf/x86/intel/uncore: Add BW counters for GT, IA and IO breakdown")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201026215203.3893972-1-arnd@kernel.org

diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c
index 39e632ed6ca9..bbd1120ae161 100644
--- a/arch/x86/events/intel/uncore_snb.c
+++ b/arch/x86/events/intel/uncore_snb.c
@@ -475,7 +475,7 @@ enum perf_snb_uncore_imc_freerunning_types {
 static struct freerunning_counters snb_uncore_imc_freerunning[] = {
 	[SNB_PCI_UNCORE_IMC_DATA_READS]		= { SNB_UNCORE_PCI_IMC_DATA_READS_BASE,
 							0x0, 0x0, 1, 32 },
-	[SNB_PCI_UNCORE_IMC_DATA_READS]		= { SNB_UNCORE_PCI_IMC_DATA_WRITES_BASE,
+	[SNB_PCI_UNCORE_IMC_DATA_WRITES]	= { SNB_UNCORE_PCI_IMC_DATA_WRITES_BASE,
 							0x0, 0x0, 1, 32 },
 	[SNB_PCI_UNCORE_IMC_GT_REQUESTS]	= { SNB_UNCORE_PCI_IMC_GT_REQUESTS_BASE,
 							0x0, 0x0, 1, 32 },
commit d61fc96a37603384cd531622c1e89de1096b5123
Author: Boqun Feng <boqun.feng at gmail.com>
Date:   Mon Nov 2 13:37:41 2020 +0800

    lockdep: Avoid to modify chain keys in validate_chain()
    
    Chris Wilson reported a problem spotted by check_chain_key(): a chain
    key got changed in validate_chain() because we modify the ->read in
    validate_chain() to skip checks for dependency adding, and ->read is
    taken into calculation for chain key since commit f611e8cf98ec
    ("lockdep: Take read/write status in consideration when generate
    chainkey").
    
    Fix this by avoiding to modify ->read in validate_chain() based on two
    facts: a) since we now support recursive read lock detection, there is
    no need to skip checks for dependency adding for recursive readers, b)
    since we have a), there is only one case left (nest_lock) where we want
    to skip checks in validate_chain(), we simply remove the modification
    for ->read and rely on the return value of check_deadlock() to skip the
    dependency adding.
    
    Reported-by: Chris Wilson <chris at chris-wilson.co.uk>
    Signed-off-by: Boqun Feng <boqun.feng at gmail.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201102053743.450459-1-boqun.feng@gmail.com

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index b71ad8d9f1c9..d9fb9e19d2ed 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -2765,7 +2765,9 @@ print_deadlock_bug(struct task_struct *curr, struct held_lock *prev,
  * (Note that this has to be done separately, because the graph cannot
  * detect such classes of deadlocks.)
  *
- * Returns: 0 on deadlock detected, 1 on OK, 2 on recursive read
+ * Returns: 0 on deadlock detected, 1 on OK, 2 if another lock with the same
+ * lock class is held but nest_lock is also held, i.e. we rely on the
+ * nest_lock to avoid the deadlock.
  */
 static int
 check_deadlock(struct task_struct *curr, struct held_lock *next)
@@ -2788,7 +2790,7 @@ check_deadlock(struct task_struct *curr, struct held_lock *next)
 		 * lock class (i.e. read_lock(lock)+read_lock(lock)):
 		 */
 		if ((next->read == 2) && prev->read)
-			return 2;
+			continue;
 
 		/*
 		 * We're holding the nest_lock, which serializes this lock's
@@ -3592,16 +3594,13 @@ static int validate_chain(struct task_struct *curr,
 
 		if (!ret)
 			return 0;
-		/*
-		 * Mark recursive read, as we jump over it when
-		 * building dependencies (just like we jump over
-		 * trylock entries):
-		 */
-		if (ret == 2)
-			hlock->read = 2;
 		/*
 		 * Add dependency only if this lock is not the head
-		 * of the chain, and if it's not a secondary read-lock:
+		 * of the chain, and if the new lock introduces no more
+		 * lock dependency (because we already hold a lock with the
+		 * same lock class) nor deadlock (because the nest_lock
+		 * serializes nesting locks), see the comments for
+		 * check_deadlock().
 		 */
 		if (!chain_head && ret != 2) {
 			if (!check_prevs_add(curr, hlock))
commit 5c1d644c09dbc13b2dc652435786e42b05ac1bb7
Author: Marc Zyngier <maz at kernel.org>
Date:   Tue Oct 13 10:51:58 2020 +0100

    drm/tegra: sor: Ensure regulators are disabled on teardown
    
    The Tegra SOR driver uses the devm infrastructure to request regulators,
    but enables them without registering them with the infrastructure.
    
    This results in the following splat if probing fails for any odd resaon
    (such as dependencies not being available):
    
    [    8.974187] tegra-sor 15580000.sor: cannot get HDMI supply: -517
    [    9.414403] tegra-sor 15580000.sor: failed to probe HDMI: -517
    [    9.421240] ------------[ cut here ]------------
    [    9.425879] WARNING: CPU: 1 PID: 164 at drivers/regulator/core.c:2089 _regulator_put.part.0+0x16c/0x174
    [    9.435259] Modules linked in: tegra_drm(E+) cec(E) ahci_tegra(E) drm_kms_helper(E) drm(E) libahci_platform(E) libahci(E) max77620_regulator(E) xhci_tegra(E+) sdhci_tegra(E) xhci_hcd(E) libata(E) sdhci_pltfm(E) cqhci(E) fixed(E) usbcore(E) scsi_mod(E) sdhci(E) host1x(E)
    [    9.459211] CPU: 1 PID: 164 Comm: systemd-udevd Tainted: G S    D W   E     5.9.0-rc7-00298-gf6337624c4fe #1980
    [    9.469285] Hardware name: NVIDIA Jetson TX2 Developer Kit (DT)
    [    9.475202] pstate: 80000005 (Nzcv daif -PAN -UAO BTYPE=--)
    [    9.480784] pc : _regulator_put.part.0+0x16c/0x174
    [    9.485581] lr : regulator_put+0x44/0x60
    [    9.489501] sp : ffffffc011d837b0
    [    9.492814] x29: ffffffc011d837b0 x28: ffffff81dd085900
    [    9.498141] x27: ffffff81de1c8ec0 x26: ffffff81de1c8c10
    [    9.503464] x25: ffffff81dd085800 x24: ffffffc008f2c6b0
    [    9.508790] x23: ffffffc0117373f0 x22: 0000000000000005
    [    9.514101] x21: ffffff81dd085900 x20: ffffffc01172b098
    [    9.515822] ata1: SATA link down (SStatus 0 SControl 300)
    [    9.519426] x19: ffffff81dd085100 x18: 0000000000000030
    [    9.530122] x17: 0000000000000000 x16: 0000000000000000
    [    9.535453] x15: 0000000000000000 x14: 000000000000038f
    [    9.540777] x13: 0000000000000003 x12: 0000000000000040
    [    9.546105] x11: ffffff81eb800000 x10: 0000000000000ae0
    [    9.551417] x9 : ffffffc0106fea24 x8 : ffffff81de83e6c0
    [    9.556728] x7 : 0000000000000018 x6 : 00000000000003c3
    [    9.562064] x5 : 0000000000005660 x4 : 0000000000000000
    [    9.567392] x3 : ffffffc01172b388 x2 : ffffff81de83db80
    [    9.572702] x1 : 0000000000000000 x0 : 0000000000000001
    [    9.578034] Call trace:
    [    9.580494]  _regulator_put.part.0+0x16c/0x174
    [    9.584940]  regulator_put+0x44/0x60
    [    9.588522]  devm_regulator_release+0x20/0x2c
    [    9.592885]  release_nodes+0x1c8/0x2c0
    [    9.596636]  devres_release_all+0x44/0x6c
    [    9.600649]  really_probe+0x1ec/0x504
    [    9.604316]  driver_probe_device+0x100/0x170
    [    9.608589]  device_driver_attach+0xcc/0xd4
    [    9.612774]  __driver_attach+0xb0/0x17c
    [    9.616614]  bus_for_each_dev+0x7c/0xd4
    [    9.620450]  driver_attach+0x30/0x3c
    [    9.624027]  bus_add_driver+0x154/0x250
    [    9.627867]  driver_register+0x84/0x140
    [    9.631719]  __platform_register_drivers+0xa0/0x180
    [    9.636660]  host1x_drm_init+0x60/0x1000 [tegra_drm]
    [    9.641629]  do_one_initcall+0x54/0x2d0
    [    9.645490]  do_init_module+0x68/0x29c
    [    9.649244]  load_module+0x2178/0x26c0
    [    9.652997]  __do_sys_finit_module+0xb0/0x120
    [    9.657356]  __arm64_sys_finit_module+0x2c/0x40
    [    9.661902]  el0_svc_common.constprop.0+0x80/0x240
    [    9.666701]  do_el0_svc+0x30/0xa0
    [    9.670022]  el0_svc+0x18/0x50
    [    9.673081]  el0_sync_handler+0x90/0x318
    [    9.677006]  el0_sync+0x158/0x180
    [    9.680324] ---[ end trace 90f6c89d62d85ff6 ]---
    
    Instead, let's register a callback that will disable the regulators
    on teardown. This allows for the removal of the .remove callbacks,
    which are not needed anymore.
    
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
index a5b944dacb35..00656d8b98e2 100644
--- a/drivers/gpu/drm/tegra/sor.c
+++ b/drivers/gpu/drm/tegra/sor.c
@@ -397,7 +397,6 @@ struct tegra_sor;
 struct tegra_sor_ops {
 	const char *name;
 	int (*probe)(struct tegra_sor *sor);
-	int (*remove)(struct tegra_sor *sor);
 	void (*audio_enable)(struct tegra_sor *sor);
 	void (*audio_disable)(struct tegra_sor *sor);
 };
@@ -2942,6 +2941,24 @@ static const struct drm_encoder_helper_funcs tegra_sor_dp_helpers = {
 	.atomic_check = tegra_sor_encoder_atomic_check,
 };
 
+static void tegra_sor_disable_regulator(void *data)
+{
+	struct regulator *reg = data;
+
+	regulator_disable(reg);
+}
+
+static int tegra_sor_enable_regulator(struct tegra_sor *sor, struct regulator *reg)
+{
+	int err;
+
+	err = regulator_enable(reg);
+	if (err)
+		return err;
+
+	return devm_add_action_or_reset(sor->dev, tegra_sor_disable_regulator, reg);
+}
+
 static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
 {
 	int err;
@@ -2953,7 +2970,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
 		return PTR_ERR(sor->avdd_io_supply);
 	}
 
-	err = regulator_enable(sor->avdd_io_supply);
+	err = tegra_sor_enable_regulator(sor, sor->avdd_io_supply);
 	if (err < 0) {
 		dev_err(sor->dev, "failed to enable AVDD I/O supply: %d\n",
 			err);
@@ -2967,7 +2984,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
 		return PTR_ERR(sor->vdd_pll_supply);
 	}
 
-	err = regulator_enable(sor->vdd_pll_supply);
+	err = tegra_sor_enable_regulator(sor, sor->vdd_pll_supply);
 	if (err < 0) {
 		dev_err(sor->dev, "failed to enable VDD PLL supply: %d\n",
 			err);
@@ -2981,7 +2998,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
 		return PTR_ERR(sor->hdmi_supply);
 	}
 
-	err = regulator_enable(sor->hdmi_supply);
+	err = tegra_sor_enable_regulator(sor, sor->hdmi_supply);
 	if (err < 0) {
 		dev_err(sor->dev, "failed to enable HDMI supply: %d\n", err);
 		return err;
@@ -2992,19 +3009,9 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
 	return 0;
 }
 
-static int tegra_sor_hdmi_remove(struct tegra_sor *sor)
-{
-	regulator_disable(sor->hdmi_supply);
-	regulator_disable(sor->vdd_pll_supply);
-	regulator_disable(sor->avdd_io_supply);
-
-	return 0;
-}
-
 static const struct tegra_sor_ops tegra_sor_hdmi_ops = {
 	.name = "HDMI",
 	.probe = tegra_sor_hdmi_probe,
-	.remove = tegra_sor_hdmi_remove,
 	.audio_enable = tegra_sor_hdmi_audio_enable,
 	.audio_disable = tegra_sor_hdmi_audio_disable,
 };
@@ -3017,7 +3024,7 @@ static int tegra_sor_dp_probe(struct tegra_sor *sor)
 	if (IS_ERR(sor->avdd_io_supply))
 		return PTR_ERR(sor->avdd_io_supply);
 
-	err = regulator_enable(sor->avdd_io_supply);
+	err = tegra_sor_enable_regulator(sor, sor->avdd_io_supply);
 	if (err < 0)
 		return err;
 
@@ -3025,25 +3032,16 @@ static int tegra_sor_dp_probe(struct tegra_sor *sor)
 	if (IS_ERR(sor->vdd_pll_supply))
 		return PTR_ERR(sor->vdd_pll_supply);
 
-	err = regulator_enable(sor->vdd_pll_supply);
+	err = tegra_sor_enable_regulator(sor, sor->vdd_pll_supply);
 	if (err < 0)
 		return err;
 
 	return 0;
 }
 
-static int tegra_sor_dp_remove(struct tegra_sor *sor)
-{
-	regulator_disable(sor->vdd_pll_supply);
-	regulator_disable(sor->avdd_io_supply);
-
-	return 0;
-}
-
 static const struct tegra_sor_ops tegra_sor_dp_ops = {
 	.name = "DP",
 	.probe = tegra_sor_dp_probe,
-	.remove = tegra_sor_dp_remove,
 };
 
 static int tegra_sor_init(struct host1x_client *client)
@@ -3773,7 +3771,7 @@ static int tegra_sor_probe(struct platform_device *pdev)
 		if (err < 0) {
 			dev_err(&pdev->dev, "failed to probe %s: %d\n",
 				sor->ops->name, err);
-			goto output;
+			goto remove;
 		}
 	}
 
@@ -3954,9 +3952,6 @@ unregister:
 rpm_disable:
 	pm_runtime_disable(&pdev->dev);
 remove:
-	if (sor->ops && sor->ops->remove)
-		sor->ops->remove(sor);
-output:
 	tegra_output_remove(&sor->output);
 	return err;
 }
@@ -3975,12 +3970,6 @@ static int tegra_sor_remove(struct platform_device *pdev)
 
 	pm_runtime_disable(&pdev->dev);
 
-	if (sor->ops && sor->ops->remove) {
-		err = sor->ops->remove(sor);
-		if (err < 0)
-			dev_err(&pdev->dev, "failed to remove SOR: %d\n", err);
-	}
-
 	tegra_output_remove(&sor->output);
 
 	return 0;
commit fcb3a1ab79904d54499db77017793ccca665eb7e
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Tue Nov 10 18:27:40 2020 +0100

    cpufreq: intel_pstate: Take CPUFREQ_GOV_STRICT_TARGET into account
    
    Make intel_pstate take the new CPUFREQ_GOV_STRICT_TARGET governor
    flag into account when it operates in the passive mode with HWP
    enabled, so as to fix the "powersave" governor behavior in that
    case (currently, HWP is allowed to scale the performance all the
    way up to the policy max limit when the "powersave" governor is
    used, but it should be constrained to the policy min limit then).
    
    Fixes: f6ebbcf08f37 ("cpufreq: intel_pstate: Implement passive mode with HWP enabled")
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
    Acked-by: Viresh Kumar <viresh.kumar at linaro.org>
    Cc: 5.9+ <stable at vger.kernel.org> # 5.9+: 9a2a9ebc0a75 cpufreq: Introduce governor flags
    Cc: 5.9+ <stable at vger.kernel.org> # 5.9+: 218f66870181 cpufreq: Introduce CPUFREQ_GOV_STRICT_TARGET
    Cc: 5.9+ <stable at vger.kernel.org> # 5.9+: ea9364bbadf1 cpufreq: Add strict_target to struct cpufreq_policy

diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index b7a9779250aa..36a3ccfe6d3d 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -2527,7 +2527,7 @@ static void intel_cpufreq_trace(struct cpudata *cpu, unsigned int trace_type, in
 }
 
 static void intel_cpufreq_adjust_hwp(struct cpudata *cpu, u32 target_pstate,
-				     bool fast_switch)
+				     bool strict, bool fast_switch)
 {
 	u64 prev = READ_ONCE(cpu->hwp_req_cached), value = prev;
 
@@ -2539,7 +2539,7 @@ static void intel_cpufreq_adjust_hwp(struct cpudata *cpu, u32 target_pstate,
 	 * field in it, so opportunistically update the max too if needed.
 	 */
 	value &= ~HWP_MAX_PERF(~0L);
-	value |= HWP_MAX_PERF(cpu->max_perf_ratio);
+	value |= HWP_MAX_PERF(strict ? target_pstate : cpu->max_perf_ratio);
 
 	if (value == prev)
 		return;
@@ -2562,14 +2562,16 @@ static void intel_cpufreq_adjust_perf_ctl(struct cpudata *cpu,
 			      pstate_funcs.get_val(cpu, target_pstate));
 }
 
-static int intel_cpufreq_update_pstate(struct cpudata *cpu, int target_pstate,
-				       bool fast_switch)
+static int intel_cpufreq_update_pstate(struct cpufreq_policy *policy,
+				       int target_pstate, bool fast_switch)
 {
+	struct cpudata *cpu = all_cpu_data[policy->cpu];
 	int old_pstate = cpu->pstate.current_pstate;
 
 	target_pstate = intel_pstate_prepare_request(cpu, target_pstate);
 	if (hwp_active) {
-		intel_cpufreq_adjust_hwp(cpu, target_pstate, fast_switch);
+		intel_cpufreq_adjust_hwp(cpu, target_pstate,
+					 policy->strict_target, fast_switch);
 		cpu->pstate.current_pstate = target_pstate;
 	} else if (target_pstate != old_pstate) {
 		intel_cpufreq_adjust_perf_ctl(cpu, target_pstate, fast_switch);
@@ -2609,7 +2611,7 @@ static int intel_cpufreq_target(struct cpufreq_policy *policy,
 		break;
 	}
 
-	target_pstate = intel_cpufreq_update_pstate(cpu, target_pstate, false);
+	target_pstate = intel_cpufreq_update_pstate(policy, target_pstate, false);
 
 	freqs.new = target_pstate * cpu->pstate.scaling;
 
@@ -2628,7 +2630,7 @@ static unsigned int intel_cpufreq_fast_switch(struct cpufreq_policy *policy,
 
 	target_pstate = DIV_ROUND_UP(target_freq, cpu->pstate.scaling);
 
-	target_pstate = intel_cpufreq_update_pstate(cpu, target_pstate, true);
+	target_pstate = intel_cpufreq_update_pstate(policy, target_pstate, true);
 
 	return target_pstate * cpu->pstate.scaling;
 }
commit ea9364bbadf11f0c55802cf11387d74f524cee84
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Tue Nov 10 18:26:37 2020 +0100

    cpufreq: Add strict_target to struct cpufreq_policy
    
    Add a new field to be set when the CPUFREQ_GOV_STRICT_TARGET flag is
    set for the current governor to struct cpufreq_policy, so that the
    drivers needing to check CPUFREQ_GOV_STRICT_TARGET do not have to
    access the governor object during every frequency transition.
    
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
    Acked-by: Viresh Kumar <viresh.kumar at linaro.org>

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0252903f1b43..1e7e3f2ff09f 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -2280,6 +2280,8 @@ static int cpufreq_init_governor(struct cpufreq_policy *policy)
 		}
 	}
 
+	policy->strict_target = !!(policy->governor->flags & CPUFREQ_GOV_STRICT_TARGET);
+
 	return 0;
 }
 
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 6eb9a3b8ec7b..acbad3b36322 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -109,6 +109,12 @@ struct cpufreq_policy {
 	bool			fast_switch_possible;
 	bool			fast_switch_enabled;
 
+	/*
+	 * Set if the CPUFREQ_GOV_STRICT_TARGET flag is set for the current
+	 * governor.
+	 */
+	bool			strict_target;
+
 	/*
 	 * Preferred average time interval between consecutive invocations of
 	 * the driver to set the frequency for this policy.  To be set by the
commit 218f66870181bec7aaa6e3c72f346039c590c3c2
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Tue Nov 10 18:26:10 2020 +0100

    cpufreq: Introduce CPUFREQ_GOV_STRICT_TARGET
    
    Introduce a new governor flag, CPUFREQ_GOV_STRICT_TARGET, for the
    governors that want the target frequency to be set exactly to the
    given value without leaving any room for adjustments on the hardware
    side and set this flag for the powersave and performance governors.
    
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
    Acked-by: Viresh Kumar <viresh.kumar at linaro.org>

diff --git a/drivers/cpufreq/cpufreq_performance.c b/drivers/cpufreq/cpufreq_performance.c
index 71c1d9aba772..addd93f2a420 100644
--- a/drivers/cpufreq/cpufreq_performance.c
+++ b/drivers/cpufreq/cpufreq_performance.c
@@ -20,6 +20,7 @@ static void cpufreq_gov_performance_limits(struct cpufreq_policy *policy)
 static struct cpufreq_governor cpufreq_gov_performance = {
 	.name		= "performance",
 	.owner		= THIS_MODULE,
+	.flags		= CPUFREQ_GOV_STRICT_TARGET,
 	.limits		= cpufreq_gov_performance_limits,
 };
 
diff --git a/drivers/cpufreq/cpufreq_powersave.c b/drivers/cpufreq/cpufreq_powersave.c
index 7749522355b5..8d830d860e91 100644
--- a/drivers/cpufreq/cpufreq_powersave.c
+++ b/drivers/cpufreq/cpufreq_powersave.c
@@ -21,6 +21,7 @@ static struct cpufreq_governor cpufreq_gov_powersave = {
 	.name		= "powersave",
 	.limits		= cpufreq_gov_powersave_limits,
 	.owner		= THIS_MODULE,
+	.flags		= CPUFREQ_GOV_STRICT_TARGET,
 };
 
 MODULE_AUTHOR("Dominik Brodowski <linux at brodo.de>");
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 9bdfcf3c4748..6eb9a3b8ec7b 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -580,6 +580,9 @@ struct cpufreq_governor {
 /* For governors which change frequency dynamically by themselves */
 #define CPUFREQ_GOV_DYNAMIC_SWITCHING	BIT(0)
 
+/* For governors wanting the target frequency to be set exactly */
+#define CPUFREQ_GOV_STRICT_TARGET	BIT(1)
+
 
 /* Pass a target to the cpufreq driver */
 unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy,
commit 9a2a9ebc0a758d887ee06e067e9f7f0b36ff7574
Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Date:   Tue Nov 10 18:25:57 2020 +0100

    cpufreq: Introduce governor flags
    
    A new cpufreq governor flag will be added subsequently, so replace
    the bool dynamic_switching fleid in struct cpufreq_governor with a
    flags field and introduce CPUFREQ_GOV_DYNAMIC_SWITCHING to set for
    the "dynamic switching" governors instead of it.
    
    No intentional functional impact.
    
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
    Acked-by: Viresh Kumar <viresh.kumar at linaro.org>

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 336b5e94cbc8..0252903f1b43 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -2254,7 +2254,7 @@ static int cpufreq_init_governor(struct cpufreq_policy *policy)
 		return -EINVAL;
 
 	/* Platform doesn't want dynamic frequency switching ? */
-	if (policy->governor->dynamic_switching &&
+	if (policy->governor->flags & CPUFREQ_GOV_DYNAMIC_SWITCHING &&
 	    cpufreq_driver->flags & CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING) {
 		struct cpufreq_governor *gov = cpufreq_fallback_governor();
 
diff --git a/drivers/cpufreq/cpufreq_governor.h b/drivers/cpufreq/cpufreq_governor.h
index c56773c25757..bab8e6140377 100644
--- a/drivers/cpufreq/cpufreq_governor.h
+++ b/drivers/cpufreq/cpufreq_governor.h
@@ -156,7 +156,7 @@ void cpufreq_dbs_governor_limits(struct cpufreq_policy *policy);
 #define CPUFREQ_DBS_GOVERNOR_INITIALIZER(_name_)			\
 	{								\
 		.name = _name_,						\
-		.dynamic_switching = true,				\
+		.flags = CPUFREQ_GOV_DYNAMIC_SWITCHING,			\
 		.owner = THIS_MODULE,					\
 		.init = cpufreq_dbs_governor_init,			\
 		.exit = cpufreq_dbs_governor_exit,			\
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 1eaa04f1bae6..9bdfcf3c4748 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -570,12 +570,17 @@ struct cpufreq_governor {
 					 char *buf);
 	int	(*store_setspeed)	(struct cpufreq_policy *policy,
 					 unsigned int freq);
-	/* For governors which change frequency dynamically by themselves */
-	bool			dynamic_switching;
 	struct list_head	governor_list;
 	struct module		*owner;
+	u8			flags;
 };
 
+/* Governor flags */
+
+/* For governors which change frequency dynamically by themselves */
+#define CPUFREQ_GOV_DYNAMIC_SWITCHING	BIT(0)
+
+
 /* Pass a target to the cpufreq driver */
 unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy,
 					unsigned int target_freq);
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index d73bccde2720..97d318b0cd0c 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -881,7 +881,7 @@ static void sugov_limits(struct cpufreq_policy *policy)
 struct cpufreq_governor schedutil_gov = {
 	.name			= "schedutil",
 	.owner			= THIS_MODULE,
-	.dynamic_switching	= true,
+	.flags			= CPUFREQ_GOV_DYNAMIC_SWITCHING,
 	.init			= sugov_init,
 	.exit			= sugov_exit,
 	.start			= sugov_start,
commit c088a4985e5f6f6c2cbe5a6953357dfc30b7c57e
Author: Pi-Hsun Shih <pihsun at chromium.org>
Date:   Fri Nov 6 14:48:17 2020 +0800

    regulator: core: don't disable regulator if is_enabled return error.
    
    In regulator_late_cleanup when is_enabled failed, don't try to disable
    the regulator since it would likely to fail too and causing confusing
    error messages.
    
    Signed-off-by: Pi-Hsun Shih <pihsun at chromium.org>
    Link: https://lore.kernel.org/r/20201106064817.3290927-1-pihsun@chromium.org
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index a5ad553da8cd..70168f2a53ed 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -5843,13 +5843,14 @@ static int regulator_late_cleanup(struct device *dev, void *data)
 	if (rdev->use_count)
 		goto unlock;
 
-	/* If we can't read the status assume it's on. */
+	/* If we can't read the status assume it's always on. */
 	if (ops->is_enabled)
 		enabled = ops->is_enabled(rdev);
 	else
 		enabled = 1;
 
-	if (!enabled)
+	/* But if reading the status failed, assume that it's off. */
+	if (enabled <= 0)
 		goto unlock;
 
 	if (have_full_constraints()) {
commit 3e9fa9983b9297407c2448114d6d27782d5e2ef2
Author: Len Brown <len.brown at intel.com>
Date:   Wed Sep 30 21:04:05 2020 -0400

    tools/power turbostat: update version number
    
    goodbye summer...
    
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 74d2fc6fc78a..f3a1746f7f45 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -5712,7 +5712,7 @@ int get_and_dump_counters(void)
 }
 
 void print_version() {
-	fprintf(outf, "turbostat version 20.03.20"
+	fprintf(outf, "turbostat version 20.09.30"
 		" - Len Brown <lenb at kernel.org>\n");
 }
 
commit 949dd0104c496fa7c14991a23c03c62e44637e71
Author: Len Brown <len.brown at intel.com>
Date:   Tue Nov 10 13:00:00 2020 -0800

    powercap: restrict energy meter to root access
    
    Remove non-privileged user access to power data contained in
    /sys/class/powercap/intel-rapl*/*/energy_uj
    
    Non-privileged users currently have read access to power data and can
    use this data to form a security attack. Some privileged
    drivers/applications need read access to this data, but don't expose it
    to non-privileged users.
    
    For example, thermald uses this data to ensure that power management
    works correctly. Thus removing non-privileged access is preferred over
    completely disabling this power reporting capability with
    CONFIG_INTEL_RAPL=n.
    
    Fixes: 95677a9a3847 ("PowerCap: Fix mode for energy counter")
    
    Signed-off-by: Len Brown <len.brown at intel.com>
    Cc: stable at vger.kernel.org

diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c
index f808c5fa9838..3f0b8e2ef3d4 100644
--- a/drivers/powercap/powercap_sys.c
+++ b/drivers/powercap/powercap_sys.c
@@ -367,9 +367,9 @@ static void create_power_zone_common_attributes(
 					&dev_attr_max_energy_range_uj.attr;
 	if (power_zone->ops->get_energy_uj) {
 		if (power_zone->ops->reset_energy_uj)
-			dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUGO;
+			dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUSR;
 		else
-			dev_attr_energy_uj.attr.mode = S_IRUGO;
+			dev_attr_energy_uj.attr.mode = S_IRUSR;
 		power_zone->zone_dev_attrs[count++] =
 					&dev_attr_energy_uj.attr;
 	}
commit 2bd645b2d3f0bacadaa6037f067538e1cd4e42ef
Author: Christoph Hellwig <hch at lst.de>
Date:   Mon Nov 9 18:30:59 2020 +0100

    nbd: fix a block_device refcount leak in nbd_release
    
    bdget_disk needs to be paired with bdput to not leak a reference
    on the block device inode.
    
    Fixes: 08ba91ee6e2c ("nbd: Add the nbd NBD_DISCONNECT_ON_CLOSE config flag.")
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Josef Bacik <josef at toxicpanda.com>
    Signed-off-by: Jens Axboe <axboe at kernel.dk>

diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index c4f9ccf5cc2a..aaae9220f3a0 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1518,6 +1518,7 @@ static void nbd_release(struct gendisk *disk, fmode_t mode)
 	if (test_bit(NBD_RT_DISCONNECT_ON_CLOSE, &nbd->config->runtime_flags) &&
 			bdev->bd_openers == 0)
 		nbd_disconnect_and_put(nbd);
+	bdput(bdev);
 
 	nbd_config_put(nbd);
 	nbd_put(nbd);
commit b5214c605fc10c356c4bbb0c7fedef40a85e685c
Merge: e1777d099728 65c5a055b0d5
Author: Jens Axboe <axboe at kernel.dk>
Date:   Tue Nov 10 07:51:39 2020 -0700

    Merge tag 'nvme-5.10-2020-11-10' of git://git.infradead.org/nvme into block-5.10
    
    Pull NVMe fix from Christoph:
    
    "nvme fixes for 5.10:
    
     - don't clear the read-only bit on a revalidate (Sagi Grimberg)"
    
    * tag 'nvme-5.10-2020-11-10' of git://git.infradead.org/nvme:
      nvme: fix incorrect behavior when BLKROSET is called by the user

commit dadfab0fbf0173da6e24c8322b69083fef03033d
Merge: b41efeed507a f3c75e7a9349
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 10 15:35:41 2020 +0100

    Merge tag 'intel-pinctrl-v5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel into fixes
    
    intel-pinctrl for v5.10-2
    
    * Respect bias setting when comes from ACPI
    
    The following is an automated git shortlog grouped by driver:
    
    intel:
     -  Set default bias in case no particular value given
     -  Fix 2 kOhm bias which is 833 Ohm

commit b41efeed507addecb92e83dd444d86c1fbe38ae0
Author: Bjorn Andersson <bjorn.andersson at linaro.org>
Date:   Tue Oct 27 21:36:42 2020 -0700

    pinctrl: qcom: sm8250: Specify PDC map
    
    Specify the PDC mapping for SM8250, so that gpio interrupts are
    propertly mapped to the wakeup IRQs of the PDC.
    
    Fixes: 4e3ec9e407ad ("pinctrl: qcom: Add sm8250 pinctrl driver.")
    Signed-off-by: Bjorn Andersson <bjorn.andersson at linaro.org>
    Link: https://lore.kernel.org/r/20201028043642.1141723-1-bjorn.andersson@linaro.org
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/qcom/pinctrl-sm8250.c b/drivers/pinctrl/qcom/pinctrl-sm8250.c
index 826df0d637ea..af144e724bd9 100644
--- a/drivers/pinctrl/qcom/pinctrl-sm8250.c
+++ b/drivers/pinctrl/qcom/pinctrl-sm8250.c
@@ -1313,6 +1313,22 @@ static const struct msm_pingroup sm8250_groups[] = {
 	[183] = SDC_PINGROUP(sdc2_data, 0xb7000, 9, 0),
 };
 
+static const struct msm_gpio_wakeirq_map sm8250_pdc_map[] = {
+	{ 0, 79 }, { 1, 84 }, { 2, 80 }, { 3, 82 }, { 4, 107 }, { 7, 43 },
+	{ 11, 42 }, { 14, 44 }, { 15, 52 }, { 19, 67 }, { 23, 68 }, { 24, 105 },
+	{ 27, 92 }, { 28, 106 }, { 31, 69 }, { 35, 70 }, { 39, 37 },
+	{ 40, 108 }, { 43, 71 }, { 45, 72 }, { 47, 83 }, { 51, 74 }, { 55, 77 },
+	{ 59, 78 }, { 63, 75 }, { 64, 81 }, { 65, 87 }, { 66, 88 }, { 67, 89 },
+	{ 68, 54 }, { 70, 85 }, { 77, 46 }, { 80, 90 }, { 81, 91 }, { 83, 97 },
+	{ 84, 98 }, { 86, 99 }, { 87, 100 }, { 88, 101 }, { 89, 102 },
+	{ 92, 103 }, { 93, 104 }, { 100, 53 }, { 103, 47 }, { 104, 48 },
+	{ 108, 49 }, { 109, 94 }, { 110, 95 }, { 111, 96 }, { 112, 55 },
+	{ 113, 56 }, { 118, 50 }, { 121, 51 }, { 122, 57 }, { 123, 58 },
+	{ 124, 45 }, { 126, 59 }, { 128, 76 }, { 129, 86 }, { 132, 93 },
+	{ 133, 65 }, { 134, 66 }, { 136, 62 }, { 137, 63 }, { 138, 64 },
+	{ 142, 60 }, { 143, 61 }
+};
+
 static const struct msm_pinctrl_soc_data sm8250_pinctrl = {
 	.pins = sm8250_pins,
 	.npins = ARRAY_SIZE(sm8250_pins),
@@ -1323,6 +1339,8 @@ static const struct msm_pinctrl_soc_data sm8250_pinctrl = {
 	.ngpios = 181,
 	.tiles = sm8250_tiles,
 	.ntiles = ARRAY_SIZE(sm8250_tiles),
+	.wakeirq_map = sm8250_pdc_map,
+	.nwakeirq_map = ARRAY_SIZE(sm8250_pdc_map),
 };
 
 static int sm8250_pinctrl_probe(struct platform_device *pdev)
commit 71266d9d39366c9b24b866d811b3facaf837f13f
Author: Maulik Shah <mkshah at codeaurora.org>
Date:   Thu Nov 5 13:08:04 2020 +0530

    pinctrl: qcom: Move clearing pending IRQ to .irq_request_resources callback
    
    When GPIOs that are routed to PDC are used as output they can still latch
    the IRQ pending at GIC. As a result the spurious IRQ was handled when the
    client driver change the direction to input to starts using it as IRQ.
    
    Currently such erroneous latched IRQ are cleared with .irq_enable callback
    however if the driver continue to use GPIO as interrupt and invokes
    disable_irq() followed by enable_irq() then everytime during enable_irq()
    previously latched interrupt gets cleared.
    
    This can make edge IRQs not seen after enable_irq() if they had arrived
    after the driver has invoked disable_irq() and were pending at GIC.
    
    Move clearing erroneous IRQ to .irq_request_resources callback as this is
    the place where GPIO direction is changed as input and its locked as IRQ.
    
    While at this add a missing check to invoke msm_gpio_irq_clear_unmask()
    from .irq_enable callback only when GPIO is not routed to PDC.
    
    Fixes: e35a6ae0eb3a ("pinctrl/msm: Setup GPIO chip in hierarchy")
    Signed-off-by: Maulik Shah <mkshah at codeaurora.org>
    Link: https://lore.kernel.org/r/1604561884-10166-1-git-send-email-mkshah@codeaurora.org
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
index c4bcda90aac4..77a25bdf0da7 100644
--- a/drivers/pinctrl/qcom/pinctrl-msm.c
+++ b/drivers/pinctrl/qcom/pinctrl-msm.c
@@ -815,21 +815,14 @@ static void msm_gpio_irq_clear_unmask(struct irq_data *d, bool status_clear)
 
 static void msm_gpio_irq_enable(struct irq_data *d)
 {
-	/*
-	 * Clear the interrupt that may be pending before we enable
-	 * the line.
-	 * This is especially a problem with the GPIOs routed to the
-	 * PDC. These GPIOs are direct-connect interrupts to the GIC.
-	 * Disabling the interrupt line at the PDC does not prevent
-	 * the interrupt from being latched at the GIC. The state at
-	 * GIC needs to be cleared before enabling.
-	 */
-	if (d->parent_data) {
-		irq_chip_set_parent_state(d, IRQCHIP_STATE_PENDING, 0);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
+
+	if (d->parent_data)
 		irq_chip_enable_parent(d);
-	}
 
-	msm_gpio_irq_clear_unmask(d, true);
+	if (!test_bit(d->hwirq, pctrl->skip_wake_irqs))
+		msm_gpio_irq_clear_unmask(d, true);
 }
 
 static void msm_gpio_irq_disable(struct irq_data *d)
@@ -1104,6 +1097,19 @@ static int msm_gpio_irq_reqres(struct irq_data *d)
 		ret = -EINVAL;
 		goto out;
 	}
+
+	/*
+	 * Clear the interrupt that may be pending before we enable
+	 * the line.
+	 * This is especially a problem with the GPIOs routed to the
+	 * PDC. These GPIOs are direct-connect interrupts to the GIC.
+	 * Disabling the interrupt line at the PDC does not prevent
+	 * the interrupt from being latched at the GIC. The state at
+	 * GIC needs to be cleared before enabling.
+	 */
+	if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs))
+		irq_chip_set_parent_state(d, IRQCHIP_STATE_PENDING, 0);
+
 	return 0;
 out:
 	module_put(gc->owner);
commit c64a6a0d4a928c63e5bc3b485552a8903a506c36
Author: Coiby Xu <coiby.xu at gmail.com>
Date:   Fri Nov 6 07:19:10 2020 +0800

    pinctrl: amd: use higher precision for 512 RtcClk
    
    RTC is 32.768kHz thus 512 RtcClk equals 15625 usec. The documentation
    likely has dropped precision and that's why the driver mistakenly took
    the slightly deviated value.
    
    Cc: stable at vger.kernel.org
    Reported-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Suggested-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Suggested-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Coiby Xu <coiby.xu at gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Reviewed-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/linux-gpio/2f4706a1-502f-75f0-9596-cc25b4933b6c@redhat.com/
    Link: https://lore.kernel.org/r/20201105231912.69527-3-coiby.xu@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index d6b2b4bd337c..4aea3e05e8c6 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -156,7 +156,7 @@ static int amd_gpio_set_debounce(struct gpio_chip *gc, unsigned offset,
 			pin_reg |= BIT(DB_TMR_OUT_UNIT_OFF);
 			pin_reg &= ~BIT(DB_TMR_LARGE_OFF);
 		} else if (debounce < 250000) {
-			time = debounce / 15600;
+			time = debounce / 15625;
 			pin_reg |= time & DB_TMR_OUT_MASK;
 			pin_reg &= ~BIT(DB_TMR_OUT_UNIT_OFF);
 			pin_reg |= BIT(DB_TMR_LARGE_OFF);
commit 06abe8291bc31839950f7d0362d9979edc88a666
Author: Coiby Xu <coiby.xu at gmail.com>
Date:   Fri Nov 6 07:19:09 2020 +0800

    pinctrl: amd: fix incorrect way to disable debounce filter
    
    The correct way to disable debounce filter is to clear bit 5 and 6
    of the register.
    
    Cc: stable at vger.kerne.org
    Signed-off-by: Coiby Xu <coiby.xu at gmail.com>
    Reviewed-by: Hans de Goede <hdegoede at redhat.com>
    Cc: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/linux-gpio/df2c008b-e7b5-4fdd-42ea-4d1c62b52139@redhat.com/
    Link: https://lore.kernel.org/r/20201105231912.69527-2-coiby.xu@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index 9a760f5cd7ed..d6b2b4bd337c 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -166,14 +166,14 @@ static int amd_gpio_set_debounce(struct gpio_chip *gc, unsigned offset,
 			pin_reg |= BIT(DB_TMR_OUT_UNIT_OFF);
 			pin_reg |= BIT(DB_TMR_LARGE_OFF);
 		} else {
-			pin_reg &= ~DB_CNTRl_MASK;
+			pin_reg &= ~(DB_CNTRl_MASK << DB_CNTRL_OFF);
 			ret = -EINVAL;
 		}
 	} else {
 		pin_reg &= ~BIT(DB_TMR_OUT_UNIT_OFF);
 		pin_reg &= ~BIT(DB_TMR_LARGE_OFF);
 		pin_reg &= ~DB_TMR_OUT_MASK;
-		pin_reg &= ~DB_CNTRl_MASK;
+		pin_reg &= ~(DB_CNTRl_MASK << DB_CNTRL_OFF);
 	}
 	writel(pin_reg, gpio_dev->base + offset * 4);
 	raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
commit 45fe0b539bc9cf6a6832d0d60cb6eab1e5f56bd9
Merge: 7ffa08169849 10a2f11d3c9e
Author: Linus Walleij <linus.walleij at linaro.org>
Date:   Tue Nov 10 14:13:20 2020 +0100

    Merge tag 'gpio-fixes-for-v5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into fixes
    
    gpio fixes for v5.10-rc3
    
    - fix missing conversion to gpiolib irqchip in gpio-dwapb
    - fix bank properties for ast2600 variant in gpio-aspeed
    - make sysfs work again when the character device is disabled
    - fix interrupt handling in gpio-pcie-idio-24

commit 04e613ded8c26489b3e0f9101b44462f780d1a35
Author: Will Deacon <will at kernel.org>
Date:   Fri Nov 6 10:25:49 2020 +0000

    arm64: smp: Tell RCU about CPUs that fail to come online
    
    Commit ce3d31ad3cac ("arm64/smp: Move rcu_cpu_starting() earlier") ensured
    that RCU is informed early about incoming CPUs that might end up calling
    into printk() before they are online. However, if such a CPU fails the
    early CPU feature compatibility checks in check_local_cpu_capabilities(),
    then it will be powered off or parked without informing RCU, leading to
    an endless stream of stalls:
    
      | rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
      | rcu:        2-O...: (0 ticks this GP) idle=002/1/0x4000000000000000 softirq=0/0 fqs=2593
      | (detected by 0, t=5252 jiffies, g=9317, q=136)
      | Task dump for CPU 2:
      | task:swapper/2       state:R  running task     stack:    0 pid:    0 ppid:     1 flags:0x00000028
      | Call trace:
      | ret_from_fork+0x0/0x30
    
    Ensure that the dying CPU invokes rcu_report_dead() prior to being powered
    off or parked.
    
    Cc: Qian Cai <cai at redhat.com>
    Cc: "Paul E. McKenney" <paulmck at kernel.org>
    Reviewed-by: Paul E. McKenney <paulmck at kernel.org>
    Suggested-by: Qian Cai <cai at redhat.com>
    Link: https://lore.kernel.org/r/20201105222242.GA8842@willie-the-truck
    Link: https://lore.kernel.org/r/20201106103602.9849-3-will@kernel.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 09c96f57818c..18e9727d3f64 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -413,6 +413,7 @@ void cpu_die_early(void)
 
 	/* Mark this CPU absent */
 	set_cpu_present(cpu, 0);
+	rcu_report_dead(cpu);
 
 	if (IS_ENABLED(CONFIG_HOTPLUG_CPU)) {
 		update_cpu_boot_status(CPU_KILL_ME);
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 06895ef85d69..946e7c0c4cf7 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -4077,7 +4077,6 @@ void rcu_cpu_starting(unsigned int cpu)
 	smp_mb(); /* Ensure RCU read-side usage follows above initialization. */
 }
 
-#ifdef CONFIG_HOTPLUG_CPU
 /*
  * The outgoing function has no further need of RCU, so remove it from
  * the rcu_node tree's ->qsmaskinitnext bit masks.
@@ -4117,6 +4116,7 @@ void rcu_report_dead(unsigned int cpu)
 	rdp->cpu_started = false;
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
 /*
  * The outgoing CPU has just passed through the dying-idle state, and we
  * are being invoked from the CPU that was IPIed to continue the offline
commit 891deb87585017d526b67b59c15d38755b900fea
Author: Will Deacon <will at kernel.org>
Date:   Fri Nov 6 09:57:55 2020 +0000

    arm64: psci: Avoid printing in cpu_psci_cpu_die()
    
    cpu_psci_cpu_die() is called in the context of the dying CPU, which
    will no longer be online or tracked by RCU. It is therefore not generally
    safe to call printk() if the PSCI "cpu off" request fails, so remove the
    pr_crit() invocation.
    
    Cc: Qian Cai <cai at redhat.com>
    Cc: "Paul E. McKenney" <paulmck at kernel.org>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Link: https://lore.kernel.org/r/20201106103602.9849-2-will@kernel.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 43ae4e0c968f..62d2bda7adb8 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -66,7 +66,6 @@ static int cpu_psci_cpu_disable(unsigned int cpu)
 
 static void cpu_psci_cpu_die(unsigned int cpu)
 {
-	int ret;
 	/*
 	 * There are no known implementations of PSCI actually using the
 	 * power state field, pass a sensible default for now.
@@ -74,9 +73,7 @@ static void cpu_psci_cpu_die(unsigned int cpu)
 	u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
 		    PSCI_0_2_POWER_STATE_TYPE_SHIFT;
 
-	ret = psci_ops.cpu_off(state);
-
-	pr_crit("unable to power off CPU%u (%d)\n", cpu, ret);
+	psci_ops.cpu_off(state);
 }
 
 static int cpu_psci_cpu_kill(unsigned int cpu)
commit 85f0b2fc917f8de4bca02d169ef7d23dbfc29155
Author: Will Deacon <will at kernel.org>
Date:   Mon Nov 9 10:49:23 2020 +0000

    arm64: kexec_file: Fix sparse warning
    
    Sparse gets cross about us returning 0 from image_load(), which has a
    return type of 'void *':
    
    >> arch/arm64/kernel/kexec_image.c:130:16: sparse: sparse: Using plain integer as NULL pointer
    
    Return NULL instead, as we don't use the return value for anything if it
    does not indicate an error.
    
    Cc: Benjamin Gwin <bgwin at google.com>
    Reported-by: kernel test robot <lkp at intel.com>
    Fixes: 108aa503657e ("arm64: kexec_file: try more regions if loading segments fails")
    Link: https://lore.kernel.org/r/202011091736.T0zH8kaC-lkp@intel.com
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/kernel/kexec_image.c b/arch/arm64/kernel/kexec_image.c
index 66adee8b5fc8..9ec34690e255 100644
--- a/arch/arm64/kernel/kexec_image.c
+++ b/arch/arm64/kernel/kexec_image.c
@@ -127,7 +127,7 @@ static void *image_load(struct kimage *image,
 				kernel_segment->mem, kbuf.bufsz,
 				kernel_segment->memsz);
 
-	return 0;
+	return NULL;
 }
 
 #ifdef CONFIG_KEXEC_IMAGE_VERIFY_SIG
commit f969f03888b9438fdb227b6460d99ede5737326d
Author: Will Deacon <will at kernel.org>
Date:   Fri Nov 6 11:14:26 2020 +0000

    arm64: errata: Fix handling of 1418040 with late CPU onlining
    
    In a surprising turn of events, it transpires that CPU capabilities
    configured as ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE are never set as the
    result of late-onlining. Therefore our handling of erratum 1418040 does
    not get activated if it is not required by any of the boot CPUs, even
    though we allow late-onlining of an affected CPU.
    
    In order to get things working again, replace the cpus_have_const_cap()
    invocation with an explicit check for the current CPU using
    this_cpu_has_cap().
    
    Cc: Sai Prakash Ranjan <saiprakash.ranjan at codeaurora.org>
    Cc: Stephen Boyd <swboyd at chromium.org>
    Cc: Catalin Marinas <catalin.marinas at arm.com>
    Cc: Mark Rutland <mark.rutland at arm.com>
    Reviewed-by: Suzuki K Poulose <suzuki.poulose at arm.com>
    Acked-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201106114952.10032-1-will@kernel.org
    Signed-off-by: Will Deacon <will at kernel.org>

diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
index f7e7144af174..c59c16a6ea8b 100644
--- a/arch/arm64/include/asm/cpufeature.h
+++ b/arch/arm64/include/asm/cpufeature.h
@@ -268,6 +268,8 @@ extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
 /*
  * CPU feature detected at boot time based on feature of one or more CPUs.
  * All possible conflicts for a late CPU are ignored.
+ * NOTE: this means that a late CPU with the feature will *not* cause the
+ * capability to be advertised by cpus_have_*cap()!
  */
 #define ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE		\
 	(ARM64_CPUCAP_SCOPE_LOCAL_CPU		|	\
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 4784011cecac..a47a40ec6ad9 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -522,14 +522,13 @@ static void erratum_1418040_thread_switch(struct task_struct *prev,
 	bool prev32, next32;
 	u64 val;
 
-	if (!(IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040) &&
-	      cpus_have_const_cap(ARM64_WORKAROUND_1418040)))
+	if (!IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040))
 		return;
 
 	prev32 = is_compat_thread(task_thread_info(prev));
 	next32 = is_compat_thread(task_thread_info(next));
 
-	if (prev32 == next32)
+	if (prev32 == next32 || !this_cpu_has_cap(ARM64_WORKAROUND_1418040))
 		return;
 
 	val = read_sysreg(cntkctl_el1);
commit 03d80e042a8e3248163a38f74b43809f8079d652
Author: Wolfram Sang <wsa+renesas at sang-engineering.com>
Date:   Fri Nov 6 08:25:49 2020 +0100

    Revert "mmc: renesas_sdhi: workaround a regression when reinserting SD cards"
    
    This reverts commit db1af1e9712920f47b5dc6a995fca3eec05ea85e. It was
    only a workaround to hide a regression. We now have proper fixes.
    
    Signed-off-by: Wolfram Sang <wsa+renesas at sang-engineering.com>
    Tested-by: Niklas Söderlund <niklas.soderlund+renesas at ragnatech.se>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Link: https://lore.kernel.org/r/20201106072549.1495-4-wsa+renesas@sang-engineering.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 03c905a781a7..acb9c81a4e45 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -572,17 +572,6 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host)
 					     TMIO_MASK_INIT_RCAR2);
 }
 
-/*
- * This is a temporary workaround! This driver used 'hw_reset' wrongly and the
- * fix for that showed a regression. So, we mimic the old behaviour until the
- * proper solution is found.
- */
-static void renesas_sdhi_hw_reset(struct mmc_host *mmc)
-{
-	struct tmio_mmc_host *host = mmc_priv(mmc);
-	renesas_sdhi_reset(host);
-}
-
 #define SH_MOBILE_SDHI_MIN_TAP_ROW 3
 
 static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
@@ -1020,8 +1009,6 @@ int renesas_sdhi_probe(struct platform_device *pdev,
 		if (of_data && of_data->scc_offset) {
 			priv->scc_ctl = host->ctl + of_data->scc_offset;
 			host->reset = renesas_sdhi_reset;
-			host->ops.hw_reset = renesas_sdhi_hw_reset;
-			host->mmc->caps |= MMC_CAP_HW_RESET;
 		}
 	}
 
commit 24ce2d7b8beaede6a467640bfa7636e73d9b491e
Author: Wolfram Sang <wsa+renesas at sang-engineering.com>
Date:   Fri Nov 6 08:25:48 2020 +0100

    mmc: tmio: bring tuning HW to a sane state with MMC_POWER_OFF
    
    When powering off a card, we need to disable the tuning HW (like SCC for
    the Renesas SDHI) to get to a sane state and allow for re-tuning new
    cards. This was hidden before because we wrongly did that in hw_reset()
    before which was an unintended use of hw_reset(). Now that we corrected
    the use of hw_reset() meanwhile, we revealed this shortcoming and need
    to fix it properly by explicitly calling the downgrade callback.
    
    Fixes: 6e7d4de10890 ("mmc: renesas_sdhi: move wrong 'hw_reset' to 'reset'")
    Suggested-by: Takeshi Saito <takeshi.saito.xv at renesas.com>
    Reviewed-by: Takeshi Saito <takeshi.saito.xv at renesas.com>
    Signed-off-by: Wolfram Sang <wsa+renesas at sang-engineering.com>
    Tested-by: Niklas Söderlund <niklas.soderlund+renesas at ragnatech.se>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Link: https://lore.kernel.org/r/20201106072549.1495-3-wsa+renesas@sang-engineering.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c
index cfb53d7c63d7..cb4149fd12e0 100644
--- a/drivers/mmc/host/tmio_mmc_core.c
+++ b/drivers/mmc/host/tmio_mmc_core.c
@@ -927,6 +927,9 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	switch (ios->power_mode) {
 	case MMC_POWER_OFF:
 		tmio_mmc_power_off(host);
+		/* Downgrade ensures a sane state for tuning HW (e.g. SCC) */
+		if (host->mmc->ops->hs400_downgrade)
+			host->mmc->ops->hs400_downgrade(host->mmc);
 		host->set_clock(host, 0);
 		break;
 	case MMC_POWER_UP:
commit 1023e290ba567af0640f9a5bd878207a5dff6ed2
Author: Wolfram Sang <wsa+renesas at sang-engineering.com>
Date:   Fri Nov 6 08:25:47 2020 +0100

    mmc: tmio: when resetting, reset DMA controller, too
    
    When applying a revert, the assumption that DMA only needs to be cleared
    in specific cases was wrong. We want to reset the DMA controller every
    time the rest of the HW gets reset, too.
    
    Fixes: 34e3211e5492 ("Revert "mmc: tmio: fix reset operation"")
    Reported-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Signed-off-by: Wolfram Sang <wsa+renesas at sang-engineering.com>
    Tested-by: Niklas Söderlund <niklas.soderlund+renesas at ragnatech.se>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Link: https://lore.kernel.org/r/20201106072549.1495-2-wsa+renesas@sang-engineering.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c
index 2fce0518632d..cfb53d7c63d7 100644
--- a/drivers/mmc/host/tmio_mmc_core.c
+++ b/drivers/mmc/host/tmio_mmc_core.c
@@ -175,6 +175,8 @@ static void tmio_mmc_reset(struct tmio_mmc_host *host)
 	if (host->reset)
 		host->reset(host);
 
+	tmio_mmc_abort_dma(host);
+
 	if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
 		sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
 		sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
@@ -223,8 +225,6 @@ static void tmio_mmc_reset_work(struct work_struct *work)
 
 	/* Ready for new calls */
 	host->mrq = NULL;
-
-	tmio_mmc_abort_dma(host);
 	mmc_request_done(host->mmc, mrq);
 }
 
commit 29a25b9246f7f24203d30d59424cbe22bd905dfc
Author: Tony Lindgren <tony at atomide.com>
Date:   Mon Nov 9 17:40:13 2020 +0200

    dmaengine: ti: omap-dma: Block PM if SDMA is busy to fix audio
    
    We now use cpu_pm for saving and restoring device context for deeper SoC
    idle states. But for omap3, we must also block idle if SDMA is busy.
    
    If we don't block idle when SDMA is busy, we eventually end up saving and
    restoring SDMA register state on PER domain idle while SDMA is active and
    that causes at least audio playback to fail.
    
    Fixes: 4c74ecf79227 ("dmaengine: ti: omap-dma: Add device tree match data and use it for cpu_pm")
    Reported-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Signed-off-by: Tony Lindgren <tony at atomide.com>
    Tested-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Acked-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Link: https://lore.kernel.org/r/20201109154013.11950-1-tony@atomide.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/ti/omap-dma.c b/drivers/dma/ti/omap-dma.c
index c9fe5e3a6b55..268a08058714 100644
--- a/drivers/dma/ti/omap-dma.c
+++ b/drivers/dma/ti/omap-dma.c
@@ -1522,29 +1522,38 @@ static void omap_dma_free(struct omap_dmadev *od)
 	}
 }
 
+/* Currently used by omap2 & 3 to block deeper SoC idle states */
+static bool omap_dma_busy(struct omap_dmadev *od)
+{
+	struct omap_chan *c;
+	int lch = -1;
+
+	while (1) {
+		lch = find_next_bit(od->lch_bitmap, od->lch_count, lch + 1);
+		if (lch >= od->lch_count)
+			break;
+		c = od->lch_map[lch];
+		if (!c)
+			continue;
+		if (omap_dma_chan_read(c, CCR) & CCR_ENABLE)
+			return true;
+	}
+
+	return false;
+}
+
 /* Currently only used for omap2. For omap1, also a check for lcd_dma is needed */
 static int omap_dma_busy_notifier(struct notifier_block *nb,
 				  unsigned long cmd, void *v)
 {
 	struct omap_dmadev *od;
-	struct omap_chan *c;
-	int lch = -1;
 
 	od = container_of(nb, struct omap_dmadev, nb);
 
 	switch (cmd) {
 	case CPU_CLUSTER_PM_ENTER:
-		while (1) {
-			lch = find_next_bit(od->lch_bitmap, od->lch_count,
-					    lch + 1);
-			if (lch >= od->lch_count)
-				break;
-			c = od->lch_map[lch];
-			if (!c)
-				continue;
-			if (omap_dma_chan_read(c, CCR) & CCR_ENABLE)
-				return NOTIFY_BAD;
-		}
+		if (omap_dma_busy(od))
+			return NOTIFY_BAD;
 		break;
 	case CPU_CLUSTER_PM_ENTER_FAILED:
 	case CPU_CLUSTER_PM_EXIT:
@@ -1595,6 +1604,8 @@ static int omap_dma_context_notifier(struct notifier_block *nb,
 
 	switch (cmd) {
 	case CPU_CLUSTER_PM_ENTER:
+		if (omap_dma_busy(od))
+			return NOTIFY_BAD;
 		omap_dma_context_save(od);
 		break;
 	case CPU_CLUSTER_PM_ENTER_FAILED:
commit 71b053276a87ddfa40c8f236315d81543219bfb9
Author: Yangbo Lu <yangbo.lu at nxp.com>
Date:   Tue Nov 10 15:13:14 2020 +0800

    mmc: sdhci-of-esdhc: Handle pulse width detection erratum for more SoCs
    
    Apply erratum workaround of unreliable pulse width detection to
    more affected platforms (LX2160A Rev2.0 and LS1028A Rev1.0).
    
    Signed-off-by: Yangbo Lu <yangbo.lu at nxp.com>
    Fixes: 48e304cc1970 ("mmc: sdhci-of-esdhc: workaround for unreliable pulse width detection")
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201110071314.3868-1-yangbo.lu@nxp.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index bb094459196a..ab5ab969f711 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -1324,6 +1324,8 @@ static struct soc_device_attribute soc_fixup_sdhc_clkdivs[] = {
 
 static struct soc_device_attribute soc_unreliable_pulse_detection[] = {
 	{ .family = "QorIQ LX2160A", .revision = "1.0", },
+	{ .family = "QorIQ LX2160A", .revision = "2.0", },
+	{ .family = "QorIQ LS1028A", .revision = "1.0", },
 	{ },
 };
 
commit e8973201d9b281375b5a8c66093de5679423021a
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
Date:   Fri Nov 6 18:25:30 2020 +0900

    mmc: renesas_sdhi_core: Add missing tmio_mmc_host_free() at remove
    
    The commit 94b110aff867 ("mmc: tmio: add tmio_mmc_host_alloc/free()")
    added tmio_mmc_host_free(), but missed the function calling in
    the sh_mobile_sdhi_remove() at that time. So, fix it. Otherwise,
    we cannot rebind the sdhi/mmc devices when we use aliases of mmc.
    
    Fixes: 94b110aff867 ("mmc: tmio: add tmio_mmc_host_alloc/free()")
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
    Reviewed-by: Wolfram Sang <wsa+renesas at sang-engineering.com>
    Tested-by: Wolfram Sang <wsa+renesas at sang-engineering.com>
    Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas at ragnatech.se>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/1604654730-29914-1-git-send-email-yoshihiro.shimoda.uh@renesas.com
    Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>

diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 414314151d0a..03c905a781a7 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -1160,6 +1160,7 @@ int renesas_sdhi_remove(struct platform_device *pdev)
 
 	tmio_mmc_host_remove(host);
 	renesas_sdhi_clk_disable(host);
+	tmio_mmc_host_free(host);
 
 	return 0;
 }
commit 48f486e13ffdb49fbb9b38c21d0e108ed60ab1a2
Author: Yu Kuai <yukuai3 at huawei.com>
Date:   Tue Nov 10 09:14:43 2020 +0800

    net: xfrm: fix memory leak in xfrm_user_policy()
    
    if xfrm_get_translator() failed, xfrm_user_policy() return without
    freeing 'data', which is allocated in memdup_sockptr().
    
    Fixes: 96392ee5a13b ("xfrm/compat: Translate 32-bit user_policy from sockptr")
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Yu Kuai <yukuai3 at huawei.com>
    Signed-off-by: Steffen Klassert <steffen.klassert at secunet.com>

diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index a77da7aae6fe..2f1517827995 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -2382,8 +2382,10 @@ int xfrm_user_policy(struct sock *sk, int optname, sockptr_t optval, int optlen)
 	if (in_compat_syscall()) {
 		struct xfrm_translator *xtr = xfrm_get_translator();
 
-		if (!xtr)
+		if (!xtr) {
+			kfree(data);
 			return -EOPNOTSUPP;
+		}
 
 		err = xtr->xlate_user_policy_sockptr(&data, optlen);
 		xfrm_put_translator(xtr);
commit 368183029cc4055c571ed19ceaa49c35de996611
Merge: f8394f232b1e f6439c531d52
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Tue Nov 10 09:12:05 2020 +0100

    Merge tag 'thunderbolt-for-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt into usb-linus
    
    Mika writes:
    
    thunderbolt: Fixes for v5.10-rc4
    
    This includes two fixes for resource leaks that have been around for a
    while. Then two fixes for code that was added during v5.10 merge window
    and PCI IDs for Intel Tiger Lake-H.
    
    All these have been in linux-next without reported issues.
    
    * tag 'thunderbolt-for-v5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt:
      thunderbolt: Add support for Intel Tiger Lake-H
      thunderbolt: Only configure USB4 wake for lane 0 adapters
      thunderbolt: Add uaccess dependency to debugfs interface
      thunderbolt: Fix memory leak if ida_simple_get() fails in enumerate_services()
      thunderbolt: Add the missed ida_simple_remove() in ring_request_msix()

commit 642403e3599e80370f71ba7a8a8c8fa82e5f6706
Author: Colin Xu <colin.xu at intel.com>
Date:   Mon Nov 9 15:39:39 2020 +0800

    drm/i915/gvt: Temporarily disable vfio_edid for BXT/APL
    
    Some disply regs are not setup correctly during HPD for BXT/APL thus
    vfio_edid still not working. Temporarily disable the vfio_edid dynamic
    update until issue fixed.
    
    Acked-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Signed-off-by: Colin Xu <colin.xu at intel.com>
    Signed-off-by: Zhenyu Wang <zhenyuw at linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20201109073939.758302-1-colin.xu@intel.com

diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
index f6d7e33c7099..399582aeeefb 100644
--- a/drivers/gpu/drm/i915/gvt/vgpu.c
+++ b/drivers/gpu/drm/i915/gvt/vgpu.c
@@ -439,7 +439,8 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
 
 	if (IS_BROADWELL(dev_priv))
 		ret = intel_gvt_hypervisor_set_edid(vgpu, PORT_B);
-	else
+	/* FixMe: Re-enable APL/BXT once vfio_edid enabled */
+	else if (!IS_BROXTON(dev_priv))
 		ret = intel_gvt_hypervisor_set_edid(vgpu, PORT_D);
 	if (ret)
 		goto out_clean_sched_policy;
commit bc0230b6461c3c9105f94ff27394eafc632803e4
Merge: 4e0396c59559 ad37f77fd365
Author: Steffen Klassert <steffen.klassert at secunet.com>
Date:   Tue Nov 10 07:30:44 2020 +0100

    Merge branch 'xfrm/compat: syzbot-found fixes'
    
    Dmitry Safonov says:
    
    ====================
    v2: Added "Fixes" tags to the patches.
    
    WARN_ON() for XFRMA_UNSPEC translation which likely no-one except
    syzkaller uses; properly zerofy tail-padding for 64-bit attribute;
    don't use __GFP_ZERO as the memory is initialized during translation.
    ====================
    
    Signed-off-by: Steffen Klassert <steffen.klassert at secunet.com>

commit 33d0d843872c5ddbe28457a92fc6f2487315fb9f
Author: Fabio Estevam <festevam at gmail.com>
Date:   Thu Nov 5 18:13:20 2020 -0300

    ARM: dts: imx50-evk: Fix the chip select 1 IOMUX
    
    The SPI chip selects are represented as:
    
    cs-gpios = <&gpio4 11 GPIO_ACTIVE_LOW>, <&gpio4 13 GPIO_ACTIVE_LOW>;
    
    , which means that they are used in GPIO function instead of native
    SPI mode.
    
    Fix the IOMUX for the chip select 1 to use GPIO4_13 instead of
    the native CSPI_SSI function.
    
    Fixes: c605cbf5e135 ("ARM: dts: imx: add device tree support for Freescale imx50evk board")
    Signed-off-by: Fabio Estevam <festevam at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/boot/dts/imx50-evk.dts b/arch/arm/boot/dts/imx50-evk.dts
index 878e89c20190..4ea5c23f181b 100644
--- a/arch/arm/boot/dts/imx50-evk.dts
+++ b/arch/arm/boot/dts/imx50-evk.dts
@@ -59,7 +59,7 @@
 				MX50_PAD_CSPI_MISO__CSPI_MISO		0x00
 				MX50_PAD_CSPI_MOSI__CSPI_MOSI		0x00
 				MX50_PAD_CSPI_SS0__GPIO4_11		0xc4
-				MX50_PAD_ECSPI1_MOSI__CSPI_SS1		0xf4
+				MX50_PAD_ECSPI1_MOSI__GPIO4_13		0x84
 			>;
 		};
 
commit d19d2152ca055baf20339cfacbf039c2cfb8d936
Author: Lucas Stach <l.stach at pengutronix.de>
Date:   Thu Nov 5 18:06:12 2020 +0100

    arm64: dts: imx8mm: fix voltage for 1.6GHz CPU operating point
    
    The datasheet for both the industrial and consumer variant of the
    SoC lists a typical voltage of 0.95V for the 1.6GHz CPU operating
    point.
    
    Fixes: e85c9d0faa75 (arm64: dts: imx8mm: Add cpufreq properties)
    Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
    Reviewed-by: Fabio Estevam <festevam at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mm.dtsi b/arch/arm64/boot/dts/freescale/imx8mm.dtsi
index b83f400def8b..05ee062548e4 100644
--- a/arch/arm64/boot/dts/freescale/imx8mm.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mm.dtsi
@@ -129,7 +129,7 @@
 
 		opp-1600000000 {
 			opp-hz = /bits/ 64 <1600000000>;
-			opp-microvolt = <900000>;
+			opp-microvolt = <950000>;
 			opp-supported-hw = <0xc>, <0x7>;
 			clock-latency-ns = <150000>;
 			opp-suspend;
commit 989ef49bdf100cc772b3a8737089df36b1ab1e30
Author: Paolo Abeni <pabeni at redhat.com>
Date:   Sun Nov 8 19:49:59 2020 +0100

    mptcp: provide rmem[0] limit
    
    The mptcp proto struct currently does not provide the
    required limit for forward memory scheduling. Under
    pressure sk_rmem_schedule() will unconditionally try
    to use such field and will oops.
    
    Address the issue inheriting the tcp limit, as we already
    do for the wmem one.
    
    Fixes: 9c3f94e1681b ("mptcp: add missing memory scheduling in the rx path")
    Signed-off-by: Paolo Abeni <pabeni at redhat.com>
    Reviewed-by: Matthieu Baerts <matthieu.baerts at tessares.net>
    Link: https://lore.kernel.org/r/37af798bd46f402fb7c79f57ebbdd00614f5d7fa.1604861097.git.pabeni@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e7419fd15d84..88f2a7a0ccb8 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2467,6 +2467,7 @@ static struct proto mptcp_prot = {
 	.memory_pressure	= &tcp_memory_pressure,
 	.stream_memory_free	= mptcp_memory_free,
 	.sysctl_wmem_offset	= offsetof(struct net, ipv4.sysctl_tcp_wmem),
+	.sysctl_rmem_offset	= offsetof(struct net, ipv4.sysctl_tcp_rmem),
 	.sysctl_mem	= sysctl_tcp_mem,
 	.obj_size	= sizeof(struct mptcp_sock),
 	.slab_flags	= SLAB_TYPESAFE_BY_RCU,
commit 16eb0eb835c77c5e8824b8aa90b11b00ddc5c122
Author: Jonathan Neuschäfer <j.neuschaefer at gmx.net>
Date:   Sat Nov 7 23:08:21 2020 +0100

    docs: networking: phy: s/2.5 times faster/2.5 times as fast/
    
    2.5 times faster would be 3.5 Gbps (4.375 Gbaud after 8b/10b encoding).
    
    Signed-off-by: Jonathan Neuschäfer <j.neuschaefer at gmx.net>
    Link: https://lore.kernel.org/r/20201107220822.1291215-1-j.neuschaefer@gmx.net
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/Documentation/networking/phy.rst b/Documentation/networking/phy.rst
index 256106054c8c..b2f7ec794bc8 100644
--- a/Documentation/networking/phy.rst
+++ b/Documentation/networking/phy.rst
@@ -247,8 +247,8 @@ Some of the interface modes are described below:
     speeds (see below.)
 
 ``PHY_INTERFACE_MODE_2500BASEX``
-    This defines a variant of 1000BASE-X which is clocked 2.5 times faster,
-    than the 802.3 standard giving a fixed bit rate of 3.125Gbaud.
+    This defines a variant of 1000BASE-X which is clocked 2.5 times as fast
+    as the 802.3 standard, giving a fixed bit rate of 3.125Gbaud.
 
 ``PHY_INTERFACE_MODE_SGMII``
     This is used for Cisco SGMII, which is a modification of 1000BASE-X
commit 413691384a37fe27f43460226c4160e33140e638
Author: Alexander Lobakin <alobakin at pm.me>
Date:   Sun Nov 8 00:46:15 2020 +0000

    ethtool: netlink: add missing netdev_features_change() call
    
    After updating userspace Ethtool from 5.7 to 5.9, I noticed that
    NETDEV_FEAT_CHANGE is no more raised when changing netdev features
    through Ethtool.
    That's because the old Ethtool ioctl interface always calls
    netdev_features_change() at the end of user request processing to
    inform the kernel that our netdevice has some features changed, but
    the new Netlink interface does not. Instead, it just notifies itself
    with ETHTOOL_MSG_FEATURES_NTF.
    Replace this ethtool_notify() call with netdev_features_change(), so
    the kernel will be aware of any features changes, just like in case
    with the ioctl interface. This does not omit Ethtool notifications,
    as Ethtool itself listens to NETDEV_FEAT_CHANGE and drops
    ETHTOOL_MSG_FEATURES_NTF on it
    (net/ethtool/netlink.c:ethnl_netdev_event()).
    
    From v1 [1]:
    - dropped extra new line as advised by Jakub;
    - no functional changes.
    
    [1] https://lore.kernel.org/netdev/AlZXQ2o5uuTVHCfNGOiGgJ8vJ3KgO5YIWAnQjH0cDE@cp3-web-009.plabs.ch
    
    Fixes: 0980bfcd6954 ("ethtool: set netdev features with FEATURES_SET request")
    Signed-off-by: Alexander Lobakin <alobakin at pm.me>
    Reviewed-by: Michal Kubecek <mkubecek at suse.cz>
    Link: https://lore.kernel.org/r/ahA2YWXYICz5rbUSQqNG4roJ8OlJzzYQX7PTiG80@cp4-web-028.plabs.ch
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ethtool/features.c b/net/ethtool/features.c
index 8ee4cdbd6b82..1c9f4df273bd 100644
--- a/net/ethtool/features.c
+++ b/net/ethtool/features.c
@@ -280,7 +280,7 @@ int ethnl_set_features(struct sk_buff *skb, struct genl_info *info)
 					  active_diff_mask, compact);
 	}
 	if (mod)
-		ethtool_notify(dev, ETHTOOL_MSG_FEATURES_NTF, NULL);
+		netdev_features_change(dev);
 
 out_rtnl:
 	rtnl_unlock();
commit 77a2d673d5c9d1d359b5652ff75043273c5dea28
Author: Stefano Brivio <sbrivio at redhat.com>
Date:   Fri Nov 6 17:59:52 2020 +0100

    tunnels: Fix off-by-one in lower MTU bounds for ICMP/ICMPv6 replies
    
    Jianlin reports that a bridged IPv6 VXLAN endpoint, carrying IPv6
    packets over a link with a PMTU estimation of exactly 1350 bytes,
    won't trigger ICMPv6 Packet Too Big replies when the encapsulated
    datagrams exceed said PMTU value. VXLAN over IPv6 adds 70 bytes of
    overhead, so an ICMPv6 reply indicating 1280 bytes as inner MTU
    would be legitimate and expected.
    
    This comes from an off-by-one error I introduced in checks added
    as part of commit 4cb47a8644cc ("tunnels: PMTU discovery support
    for directly bridged IP packets"), whose purpose was to prevent
    sending ICMPv6 Packet Too Big messages with an MTU lower than the
    smallest permissible IPv6 link MTU, i.e. 1280 bytes.
    
    In iptunnel_pmtud_check_icmpv6(), avoid triggering a reply only if
    the advertised MTU would be less than, and not equal to, 1280 bytes.
    
    Also fix the analogous comparison for IPv4, that is, skip the ICMP
    reply only if the resulting MTU is strictly less than 576 bytes.
    
    This becomes apparent while running the net/pmtu.sh bridged VXLAN
    or GENEVE selftests with adjusted lower-link MTU values. Using
    e.g. GENEVE, setting ll_mtu to the values reported below, in the
    test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception() test
    function, we can see failures on the following tests:
    
                 test                | ll_mtu
      -------------------------------|--------
      pmtu_ipv4_br_geneve4_exception |   626
      pmtu_ipv6_br_geneve4_exception |  1330
      pmtu_ipv6_br_geneve6_exception |  1350
    
    owing to the different tunneling overheads implied by the
    corresponding configurations.
    
    Reported-by: Jianlin Shi <jishi at redhat.com>
    Fixes: 4cb47a8644cc ("tunnels: PMTU discovery support for directly bridged IP packets")
    Signed-off-by: Stefano Brivio <sbrivio at redhat.com>
    Link: https://lore.kernel.org/r/4f5fc2f33bfdf8409549fafd4f952b008bf04d63.1604681709.git.sbrivio@redhat.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c
index 25f1caf5abf9..e25be2d01a7a 100644
--- a/net/ipv4/ip_tunnel_core.c
+++ b/net/ipv4/ip_tunnel_core.c
@@ -263,7 +263,7 @@ static int iptunnel_pmtud_check_icmp(struct sk_buff *skb, int mtu)
 	const struct icmphdr *icmph = icmp_hdr(skb);
 	const struct iphdr *iph = ip_hdr(skb);
 
-	if (mtu <= 576 || iph->frag_off != htons(IP_DF))
+	if (mtu < 576 || iph->frag_off != htons(IP_DF))
 		return 0;
 
 	if (ipv4_is_lbcast(iph->daddr)  || ipv4_is_multicast(iph->daddr) ||
@@ -359,7 +359,7 @@ static int iptunnel_pmtud_check_icmpv6(struct sk_buff *skb, int mtu)
 	__be16 frag_off;
 	int offset;
 
-	if (mtu <= IPV6_MIN_MTU)
+	if (mtu < IPV6_MIN_MTU)
 		return 0;
 
 	if (stype == IPV6_ADDR_ANY || stype == IPV6_ADDR_MULTICAST ||
commit 8ef9ba4d666614497a057d09b0a6eafc1e34eadf
Author: Oliver Herms <oliver.peter.herms at gmail.com>
Date:   Tue Nov 3 11:41:33 2020 +0100

    IPv6: Set SIT tunnel hard_header_len to zero
    
    Due to the legacy usage of hard_header_len for SIT tunnels while
    already using infrastructure from net/ipv4/ip_tunnel.c the
    calculation of the path MTU in tnl_update_pmtu is incorrect.
    This leads to unnecessary creation of MTU exceptions for any
    flow going over a SIT tunnel.
    
    As SIT tunnels do not have a header themsevles other than their
    transport (L3, L2) headers we're leaving hard_header_len set to zero
    as tnl_update_pmtu is already taking care of the transport headers
    sizes.
    
    This will also help avoiding unnecessary IPv6 GC runs and spinlock
    contention seen when using SIT tunnels and for more than
    net.ipv6.route.gc_thresh flows.
    
    Fixes: c54419321455 ("GRE: Refactor GRE tunneling code.")
    Signed-off-by: Oliver Herms <oliver.peter.herms at gmail.com>
    Acked-by: Willem de Bruijn <willemb at google.com>
    Link: https://lore.kernel.org/r/20201103104133.GA1573211@tws
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 5e2c34c0ac97..5e7983cb6154 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -1128,7 +1128,6 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
 	if (tdev && !netif_is_l3_master(tdev)) {
 		int t_hlen = tunnel->hlen + sizeof(struct iphdr);
 
-		dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr);
 		dev->mtu = tdev->mtu - t_hlen;
 		if (dev->mtu < IPV6_MIN_MTU)
 			dev->mtu = IPV6_MIN_MTU;
@@ -1426,7 +1425,6 @@ static void ipip6_tunnel_setup(struct net_device *dev)
 	dev->priv_destructor	= ipip6_dev_free;
 
 	dev->type		= ARPHRD_SIT;
-	dev->hard_header_len	= LL_MAX_HEADER + t_hlen;
 	dev->mtu		= ETH_DATA_LEN - t_hlen;
 	dev->min_mtu		= IPV6_MIN_MTU;
 	dev->max_mtu		= IP6_MAX_MTU - t_hlen;
commit 407ab579637ced6dc32cfb2295afb7259cca4b22
Merge: 3552c3709c0e 6d6a18fdde8b
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 9 13:58:10 2020 -0800

    Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
    
    Pull kvm fixes from Paolo Bonzini:
     "ARM:
       - fix compilation error when PMD and PUD are folded
       - fix regression in reads-as-zero behaviour of ID_AA64ZFR0_EL1
       - add aarch64 get-reg-list test
    
      x86:
       - fix semantic conflict between two series merged for 5.10
       - fix (and test) enforcement of paravirtual cpuid features
    
      selftests:
       - various cleanups to memory management selftests
       - new selftests testcase for performance of dirty logging"
    
    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (30 commits)
      KVM: selftests: allow two iterations of dirty_log_perf_test
      KVM: selftests: Introduce the dirty log perf test
      KVM: selftests: Make the number of vcpus global
      KVM: selftests: Make the per vcpu memory size global
      KVM: selftests: Drop pointless vm_create wrapper
      KVM: selftests: Add wrfract to common guest code
      KVM: selftests: Simplify demand_paging_test with timespec_diff_now
      KVM: selftests: Remove address rounding in guest code
      KVM: selftests: Factor code out of demand_paging_test
      KVM: selftests: Use a single binary for dirty/clear log test
      KVM: selftests: Always clear dirty bitmap after iteration
      KVM: selftests: Add blessed SVE registers to get-reg-list
      KVM: selftests: Add aarch64 get-reg-list test
      selftests: kvm: test enforcement of paravirtual cpuid features
      selftests: kvm: Add exception handling to selftests
      selftests: kvm: Clear uc so UCALL_NONE is being properly reported
      selftests: kvm: Fix the segment descriptor layout to match the actual layout
      KVM: x86: handle MSR_IA32_DEBUGCTLMSR with report_ignored_msrs
      kvm: x86: request masterclock update any time guest uses different msr
      kvm: x86: ensure pv_cpuid.features is initialized when enabling cap
      ...

commit abbaa433de07076fb8ef524b77ce55d94bad5fc5
Author: Wang Qing <wangqing at vivo.com>
Date:   Sat Nov 7 15:45:44 2020 +0800

    bpf: Fix passing zero to PTR_ERR() in bpf_btf_printf_prepare
    
    There is a bug when passing zero to PTR_ERR() and return.
    Fix the smatch error.
    
    Fixes: c4d0bfb45068 ("bpf: Add bpf_snprintf_btf helper")
    Signed-off-by: Wang Qing <wangqing at vivo.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Yonghong Song <yhs at fb.com>
    Acked-by: John Fastabend <john.fastabend at gmail.com>
    Link: https://lore.kernel.org/bpf/1604735144-686-1-git-send-email-wangqing@vivo.com

diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 4517c8b66518..5113fd423cdf 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -1198,7 +1198,7 @@ static int bpf_btf_printf_prepare(struct btf_ptr *ptr, u32 btf_ptr_size,
 	*btf = bpf_get_btf_vmlinux();
 
 	if (IS_ERR_OR_NULL(*btf))
-		return PTR_ERR(*btf);
+		return IS_ERR(*btf) ? PTR_ERR(*btf) : -EINVAL;
 
 	if (ptr->type_id > 0)
 		*btf_id = ptr->type_id;
commit 197afc631413d96dc60acfc7970bdd4125d38cd3
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Fri Nov 6 16:02:51 2020 -0800

    libbpf: Don't attempt to load unused subprog as an entry-point BPF program
    
    If BPF code contains unused BPF subprogram and there are no other subprogram
    calls (which can realistically happen in real-world applications given
    sufficiently smart Clang code optimizations), libbpf will erroneously assume
    that subprograms are entry-point programs and will attempt to load them with
    UNSPEC program type.
    
    Fix by not relying on subcall instructions and rather detect it based on the
    structure of BPF object's sections.
    
    Fixes: 9a94f277c4fb ("tools: libbpf: restore the ability to load programs from .text section")
    Reported-by: Dmitrii Banshchikov <dbanschikov at fb.com>
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Yonghong Song <yhs at fb.com>
    Link: https://lore.kernel.org/bpf/20201107000251.256821-1-andrii@kernel.org

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 313034117070..28baee7ba1ca 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -560,8 +560,6 @@ bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog,
 		      const char *name, size_t sec_idx, const char *sec_name,
 		      size_t sec_off, void *insn_data, size_t insn_data_sz)
 {
-	int i;
-
 	if (insn_data_sz == 0 || insn_data_sz % BPF_INSN_SZ || sec_off % BPF_INSN_SZ) {
 		pr_warn("sec '%s': corrupted program '%s', offset %zu, size %zu\n",
 			sec_name, name, sec_off, insn_data_sz);
@@ -600,13 +598,6 @@ bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog,
 		goto errout;
 	memcpy(prog->insns, insn_data, insn_data_sz);
 
-	for (i = 0; i < prog->insns_cnt; i++) {
-		if (insn_is_subprog_call(&prog->insns[i])) {
-			obj->has_subcalls = true;
-			break;
-		}
-	}
-
 	return 0;
 errout:
 	pr_warn("sec '%s': failed to allocate memory for prog '%s'\n", sec_name, name);
@@ -3280,7 +3271,19 @@ bpf_object__find_program_by_title(const struct bpf_object *obj,
 static bool prog_is_subprog(const struct bpf_object *obj,
 			    const struct bpf_program *prog)
 {
-	return prog->sec_idx == obj->efile.text_shndx && obj->has_subcalls;
+	/* For legacy reasons, libbpf supports an entry-point BPF programs
+	 * without SEC() attribute, i.e., those in the .text section. But if
+	 * there are 2 or more such programs in the .text section, they all
+	 * must be subprograms called from entry-point BPF programs in
+	 * designated SEC()'tions, otherwise there is no way to distinguish
+	 * which of those programs should be loaded vs which are a subprogram.
+	 * Similarly, if there is a function/program in .text and at least one
+	 * other BPF program with custom SEC() attribute, then we just assume
+	 * .text programs are subprograms (even if they are not called from
+	 * other programs), because libbpf never explicitly supported mixing
+	 * SEC()-designated BPF programs and .text entry-point BPF programs.
+	 */
+	return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1;
 }
 
 struct bpf_program *
diff --git a/tools/testing/selftests/bpf/prog_tests/subprogs.c b/tools/testing/selftests/bpf/prog_tests/subprogs.c
index a00abf58c037..3f3d2ac4dd57 100644
--- a/tools/testing/selftests/bpf/prog_tests/subprogs.c
+++ b/tools/testing/selftests/bpf/prog_tests/subprogs.c
@@ -3,12 +3,14 @@
 #include <test_progs.h>
 #include <time.h>
 #include "test_subprogs.skel.h"
+#include "test_subprogs_unused.skel.h"
 
 static int duration;
 
 void test_subprogs(void)
 {
 	struct test_subprogs *skel;
+	struct test_subprogs_unused *skel2;
 	int err;
 
 	skel = test_subprogs__open_and_load();
@@ -26,6 +28,10 @@ void test_subprogs(void)
 	CHECK(skel->bss->res3 != 19, "res3", "got %d, exp %d\n", skel->bss->res3, 19);
 	CHECK(skel->bss->res4 != 36, "res4", "got %d, exp %d\n", skel->bss->res4, 36);
 
+	skel2 = test_subprogs_unused__open_and_load();
+	ASSERT_OK_PTR(skel2, "unused_progs_skel");
+	test_subprogs_unused__destroy(skel2);
+
 cleanup:
 	test_subprogs__destroy(skel);
 }
diff --git a/tools/testing/selftests/bpf/progs/test_subprogs_unused.c b/tools/testing/selftests/bpf/progs/test_subprogs_unused.c
new file mode 100644
index 000000000000..75d975f8cf90
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_subprogs_unused.c
@@ -0,0 +1,21 @@
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_core_read.h>
+
+const char LICENSE[] SEC("license") = "GPL";
+
+__attribute__((maybe_unused)) __noinline int unused1(int x)
+{
+	return x + 1;
+}
+
+static __attribute__((maybe_unused)) __noinline int unused2(int x)
+{
+	return x + 2;
+}
+
+SEC("raw_tp/sys_enter")
+int main_prog(void *ctx)
+{
+	return 0;
+}
commit 3552c3709c0e78144c11748718180441ac647ece
Merge: 91808cd6c243 ae2975046dbc
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 9 12:43:12 2020 -0800

    Merge tag 'nfsd-5.10-1' of git://linux-nfs.org/~bfields/linux
    
    Pull nfsd fixes from Bruce Fields:
     "This is mainly server-to-server copy and fallout from Chuck's 5.10 rpc
      refactoring"
    
    * tag 'nfsd-5.10-1' of git://linux-nfs.org/~bfields/linux:
      net/sunrpc: fix useless comparison in proc_do_xprt()
      net/sunrpc: return 0 on attempt to write to "transports"
      NFSD: fix missing refcount in nfsd4_copy by nfsd4_do_async_copy
      NFSD: Fix use-after-free warning when doing inter-server copy
      NFSD: MKNOD should return NFSERR_BADTYPE instead of NFSERR_INVAL
      SUNRPC: Fix general protection fault in trace_rpc_xdr_overflow()
      NFSD: NFSv3 PATHCONF Reply is improperly formed

commit 91808cd6c24359eee0c1eb7a06ea02dac358cbb5
Merge: df3319a548cd 05d5233df85e
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 9 12:36:58 2020 -0800

    Merge tag 'ext4_for_linus_cleanups' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
    
    Pull ext4 fixes and cleanups from Ted Ts'o:
     "More fixes and cleanups for the new fast_commit features, but also a
      few other miscellaneous bug fixes and a cleanup for the MAINTAINERS
      file"
    
    * tag 'ext4_for_linus_cleanups' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (28 commits)
      jbd2: fix up sparse warnings in checkpoint code
      ext4: fix sparse warnings in fast_commit code
      ext4: cleanup fast commit mount options
      jbd2: don't start fast commit on aborted journal
      ext4: make s_mount_flags modifications atomic
      ext4: issue fsdev cache flush before starting fast commit
      ext4: disable fast commit with data journalling
      ext4: fix inode dirty check in case of fast commits
      ext4: remove unnecessary fast commit calls from ext4_file_mmap
      ext4: mark buf dirty before submitting fast commit buffer
      ext4: fix code documentatioon
      ext4: dedpulicate the code to wait on inode that's being committed
      jbd2: don't read journal->j_commit_sequence without taking a lock
      jbd2: don't touch buffer state until it is filled
      jbd2: add todo for a fast commit performance optimization
      jbd2: don't pass tid to jbd2_fc_end_commit_fallback()
      jbd2: don't use state lock during commit path
      jbd2: drop jbd2_fc_init documentation
      ext4: clean up the JBD2 API that initializes fast commits
      jbd2: rename j_maxlen to j_total_len and add jbd2_journal_max_txn_bufs
      ...

commit df3319a548cdb3f3bcbaf03bbd02822e39a136c6
Merge: f8394f232b1e a30573b3cdc7
Author: Linus Torvalds <torvalds at linux-foundation.org>
Date:   Mon Nov 9 12:23:01 2020 -0800

    Merge tag 'erofs-for-5.10-rc4-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs
    
    Pull erofs fixes from Gao Xiang:
     "A week ago, Vladimir reported an issue that the kernel log would
      become polluted if the page allocation debug option is enabled. I also
      found this when I cleaned up magical page->mapping and originally
      planned to submit these all for 5.11 but it seems the impact can be
      noticed so submit the fix in advance.
    
      In addition, nl6720 also reported that atime is empty although EROFS
      has the only one on-disk timestamp as a practical consideration for
      now but it's better to derive it as what we did for the other
      timestamps.
    
      Summary:
    
       - fix setting up pcluster improperly for temporary pages
    
       - derive atime instead of leaving it empty"
    
    * tag 'erofs-for-5.10-rc4-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs:
      erofs: fix setting up pcluster for temporary pages
      erofs: derive atime instead of leaving it empty

commit 7daaa06357bf7f1874b62bb1ea9d66a51d4e567e
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Sat Nov 7 14:32:54 2020 +0100

    ACPI: button: Add DMI quirk for Medion Akoya E2228T
    
    The Medion Akoya E2228T's ACPI _LID implementation is quite broken,
    it has the same issues as the one from the Medion Akoya E2215T:
    
    1. For notifications it uses an ActiveLow Edge GpioInt, rather then
       an ActiveBoth one, meaning that the device is only notified when the
       lid is closed, not when it is opened.
    
    2. Matching with this its _LID method simply always returns 0 (closed)
    
    In order for the Linux LID code to work properly with this implementation,
    the lid_init_state selection needs to be set to ACPI_BUTTON_LID_INIT_OPEN,
    add a DMI quirk for this.
    
    While working on this I also found out that the MD60### part of the model
    number differs per country/batch while all of the E2215T and E2228T models
    have this issue, so also remove the " MD60198" part from the E2215T quirk.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 0761529cac05..0d93a5ef4d07 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -89,7 +89,18 @@ static const struct dmi_system_id dmi_lid_quirks[] = {
 		 */
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "E2215T MD60198"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "E2215T"),
+		},
+		.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
+	},
+	{
+		/*
+		 * Medion Akoya E2228T, notification of the LID device only
+		 * happens on close, not on open and _LID always returns closed.
+		 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "E2228T"),
 		},
 		.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
 	},
commit 9debfb81e7654fe7388a49f45bc4d789b94c1103
Author: Nick Desaulniers <ndesaulniers at google.com>
Date:   Sat Nov 7 00:49:39 2020 -0800

    ACPI: GED: fix -Wformat
    
    Clang is more aggressive about -Wformat warnings when the format flag
    specifies a type smaller than the parameter. It turns out that gsi is an
    int. Fixes:
    
    drivers/acpi/evged.c:105:48: warning: format specifies type 'unsigned
    char' but the argument has type 'unsigned int' [-Wformat]
    trigger == ACPI_EDGE_SENSITIVE ? 'E' : 'L', gsi);
                                                ^~~
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/378
    Fixes: ea6f3af4c5e6 ("ACPI: GED: add support for _Exx / _Lxx handler methods")
    Acked-by: Ard Biesheuvel <ardb at kernel.org>
    Signed-off-by: Nick Desaulniers <ndesaulniers at google.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/evged.c b/drivers/acpi/evged.c
index b1a7f8d6965e..fe6b6792c8bb 100644
--- a/drivers/acpi/evged.c
+++ b/drivers/acpi/evged.c
@@ -101,7 +101,7 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
 
 	switch (gsi) {
 	case 0 ... 255:
-		sprintf(ev_name, "_%c%02hhX",
+		sprintf(ev_name, "_%c%02X",
 			trigger == ACPI_EDGE_SENSITIVE ? 'E' : 'L', gsi);
 
 		if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
commit c6237b210ddc4f026a368172e957cbd3d5b5c78a
Author: Maximilian Luz <luzmaximilian at gmail.com>
Date:   Thu Nov 5 03:06:00 2020 +0100

    ACPI: Fix whitespace inconsistencies
    
    Replaces spaces with tabs where spaces have been (inconsistently) used
    for indentation and removes trailing whitespaces.
    
    Signed-off-by: Maximilian Luz <luzmaximilian at gmail.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
index bc96457c9e25..a322a7bd286b 100644
--- a/drivers/acpi/acpi_video.c
+++ b/drivers/acpi/acpi_video.c
@@ -578,7 +578,7 @@ acpi_video_bqc_value_to_level(struct acpi_video_device *device,
 				ACPI_VIDEO_FIRST_LEVEL - 1 - bqc_value;
 
 		level = device->brightness->levels[bqc_value +
-		                                   ACPI_VIDEO_FIRST_LEVEL];
+						   ACPI_VIDEO_FIRST_LEVEL];
 	} else {
 		level = bqc_value;
 	}
@@ -990,8 +990,8 @@ set_level:
 		goto out_free_levels;
 
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-	                  "found %d brightness levels\n",
-	                  br->count - ACPI_VIDEO_FIRST_LEVEL));
+			  "found %d brightness levels\n",
+			  br->count - ACPI_VIDEO_FIRST_LEVEL));
 	return 0;
 
 out_free_levels:
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index cab4af532f36..08ee1c7b12e0 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -987,7 +987,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume)
 	 */
 	if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
 	    (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
-            (battery->capacity_now <= battery->alarm)))
+	     (battery->capacity_now <= battery->alarm)))
 		acpi_pm_wakeup_event(&battery->device->dev);
 
 	return result;
diff --git a/drivers/acpi/event.c b/drivers/acpi/event.c
index 170643927044..92e59f45329b 100644
--- a/drivers/acpi/event.c
+++ b/drivers/acpi/event.c
@@ -31,7 +31,7 @@ int acpi_notifier_call_chain(struct acpi_device *dev, u32 type, u32 data)
 	event.type = type;
 	event.data = data;
 	return (blocking_notifier_call_chain(&acpi_chain_head, 0, (void *)&event)
-                        == NOTIFY_BAD) ? -EINVAL : 0;
+			== NOTIFY_BAD) ? -EINVAL : 0;
 }
 EXPORT_SYMBOL(acpi_notifier_call_chain);
 
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 43411a7457cd..e3638bafb941 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -134,7 +134,7 @@ int acpi_add_power_resource(acpi_handle handle);
 void acpi_power_add_remove_device(struct acpi_device *adev, bool add);
 int acpi_power_wakeup_list_init(struct list_head *list, int *system_level);
 int acpi_device_sleep_wake(struct acpi_device *dev,
-                           int enable, int sleep_state, int dev_state);
+			   int enable, int sleep_state, int dev_state);
 int acpi_power_get_inferred_state(struct acpi_device *device, int *state);
 int acpi_power_on_resources(struct acpi_device *device, int state);
 int acpi_power_transition(struct acpi_device *device, int state);
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 3a3c209ed3d3..442608220b5c 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -2175,10 +2175,10 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
  * these commands.
  */
 enum nfit_aux_cmds {
-        NFIT_CMD_TRANSLATE_SPA = 5,
-        NFIT_CMD_ARS_INJECT_SET = 7,
-        NFIT_CMD_ARS_INJECT_CLEAR = 8,
-        NFIT_CMD_ARS_INJECT_GET = 9,
+	NFIT_CMD_TRANSLATE_SPA = 5,
+	NFIT_CMD_ARS_INJECT_SET = 7,
+	NFIT_CMD_ARS_INJECT_CLEAR = 8,
+	NFIT_CMD_ARS_INJECT_GET = 9,
 };
 
 static void acpi_nfit_init_dsms(struct acpi_nfit_desc *acpi_desc)
@@ -2632,7 +2632,7 @@ static int acpi_nfit_blk_region_enable(struct nvdimm_bus *nvdimm_bus,
 	nfit_blk->bdw_offset = nfit_mem->bdw->offset;
 	mmio = &nfit_blk->mmio[BDW];
 	mmio->addr.base = devm_nvdimm_memremap(dev, nfit_mem->spa_bdw->address,
-                        nfit_mem->spa_bdw->length, nd_blk_memremap_flags(ndbr));
+			nfit_mem->spa_bdw->length, nd_blk_memremap_flags(ndbr));
 	if (!mmio->addr.base) {
 		dev_dbg(dev, "%s failed to map bdw\n",
 				nvdimm_name(nvdimm));
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index dea8a60e18a4..14ee631cb7cf 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -175,7 +175,7 @@ static int acpi_pci_irq_check_entry(acpi_handle handle, struct pci_dev *dev,
 	 * configure the IRQ assigned to this slot|dev|pin.  The 'source_index'
 	 * indicates which resource descriptor in the resource template (of
 	 * the link device) this interrupt is allocated from.
-	 * 
+	 *
 	 * NOTE: Don't query the Link Device for IRQ information at this time
 	 *       because Link Device enumeration may not have occurred yet
 	 *       (e.g. exists somewhere 'below' this _PRT entry in the ACPI
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 606da5d77ad3..fb4c5632a232 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -6,8 +6,8 @@
  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh at intel.com>
  *  Copyright (C) 2002       Dominik Brodowski <devel at brodo.de>
  *
- * TBD: 
- *      1. Support more than one IRQ resource entry per link device (index).
+ * TBD:
+ *	1. Support more than one IRQ resource entry per link device (index).
  *	2. Implement start/stop mechanism and use ACPI Bus Driver facilities
  *	   for IRQ management (e.g. start()->_SRS).
  */
@@ -249,8 +249,8 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
 		}
 	}
 
-	/* 
-	 * Query and parse _CRS to get the current IRQ assignment. 
+	/*
+	 * Query and parse _CRS to get the current IRQ assignment.
 	 */
 
 	status = acpi_walk_resources(link->device->handle, METHOD_NAME__CRS,
@@ -396,7 +396,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
 /*
  * "acpi_irq_balance" (default in APIC mode) enables ACPI to use PIC Interrupt
  * Link Devices to move the PIRQs around to minimize sharing.
- * 
+ *
  * "acpi_irq_nobalance" (default in PIC mode) tells ACPI not to move any PIC IRQs
  * that the BIOS has already set to active.  This is necessary because
  * ACPI has no automatic means of knowing what ISA IRQs are used.  Note that
@@ -414,7 +414,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
  *
  * Note that PCI IRQ routers have a list of possible IRQs,
  * which may not include the IRQs this table says are available.
- * 
+ *
  * Since this heuristic can't tell the difference between a link
  * that no device will attach to, vs. a link which may be shared
  * by multiple active devices -- it is not optimal.
diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
index 7ddd57abadd1..95f23acd5b80 100644
--- a/drivers/acpi/pci_mcfg.c
+++ b/drivers/acpi/pci_mcfg.c
@@ -173,7 +173,7 @@ static int pci_mcfg_quirk_matches(struct mcfg_fixup *f, u16 segment,
 {
 	if (!memcmp(f->oem_id, mcfg_oem_id, ACPI_OEM_ID_SIZE) &&
 	    !memcmp(f->oem_table_id, mcfg_oem_table_id,
-	            ACPI_OEM_TABLE_ID_SIZE) &&
+		    ACPI_OEM_TABLE_ID_SIZE) &&
 	    f->oem_revision == mcfg_oem_revision &&
 	    f->segment == segment &&
 	    resource_contains(&f->bus_range, bus_range))
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
index 837b875d075e..8048da85b7e0 100644
--- a/drivers/acpi/power.c
+++ b/drivers/acpi/power.c
@@ -13,7 +13,7 @@
  * 1. via "Device Specific (D-State) Control"
  * 2. via "Power Resource Control".
  * The code below deals with ACPI Power Resources control.
- * 
+ *
  * An ACPI "power resource object" represents a software controllable power
  * plane, clock plane, or other resource depended on by a device.
  *
@@ -645,7 +645,7 @@ int acpi_power_wakeup_list_init(struct list_head *list, int *system_level_p)
  * -ENODEV if the execution of either _DSW or _PSW has failed
  */
 int acpi_device_sleep_wake(struct acpi_device *dev,
-                           int enable, int sleep_state, int dev_state)
+			   int enable, int sleep_state, int dev_state)
 {
 	union acpi_object in_arg[3];
 	struct acpi_object_list arg_list = { 3, in_arg };
@@ -690,7 +690,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev,
 
 /*
  * Prepare a wakeup device, two steps (Ref ACPI 2.0:P229):
- * 1. Power on the power resources required for the wakeup device 
+ * 1. Power on the power resources required for the wakeup device
  * 2. Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
  *    State Wake) for the device, if present
  */
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
index 5909e8fa4013..b04a68950ff1 100644
--- a/drivers/acpi/processor_perflib.c
+++ b/drivers/acpi/processor_perflib.c
@@ -354,7 +354,7 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
 				  (u32) px->control, (u32) px->status));
 
 		/*
- 		 * Check that ACPI's u64 MHz will be valid as u32 KHz in cpufreq
+		 * Check that ACPI's u64 MHz will be valid as u32 KHz in cpufreq
 		 */
 		if (!px->core_frequency ||
 		    ((u32)(px->core_frequency * 1000) !=
@@ -627,7 +627,7 @@ int acpi_processor_preregister_performance(
 		goto err_ret;
 
 	/*
-	 * Now that we have _PSD data from all CPUs, lets setup P-state 
+	 * Now that we have _PSD data from all CPUs, lets setup P-state
 	 * domain info.
 	 */
 	for_each_possible_cpu(i) {
@@ -693,7 +693,7 @@ int acpi_processor_preregister_performance(
 			if (match_pdomain->domain != pdomain->domain)
 				continue;
 
-			match_pr->performance->shared_type = 
+			match_pr->performance->shared_type =
 					pr->performance->shared_type;
 			cpumask_copy(match_pr->performance->shared_cpu_map,
 				     pr->performance->shared_cpu_map);
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
index f158b8c30113..e6d9f4de2800 100644
--- a/drivers/acpi/sbs.c
+++ b/drivers/acpi/sbs.c
@@ -366,7 +366,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
 					 state_readers[i].mode,
 					 ACPI_SBS_BATTERY,
 					 state_readers[i].command,
-				         (u8 *)battery +
+					 (u8 *)battery +
 						state_readers[i].offset);
 		if (result)
 			goto end;
diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c
index 87b74e9015e5..53c2862c4c75 100644
--- a/drivers/acpi/sbshc.c
+++ b/drivers/acpi/sbshc.c
@@ -176,7 +176,7 @@ int acpi_smbus_write(struct acpi_smb_hc *hc, u8 protocol, u8 address,
 EXPORT_SYMBOL_GPL(acpi_smbus_write);
 
 int acpi_smbus_register_callback(struct acpi_smb_hc *hc,
-			         smbus_alarm_callback callback, void *context)
+				 smbus_alarm_callback callback, void *context)
 {
 	mutex_lock(&hc->lock);
 	hc->callback = callback;
diff --git a/drivers/acpi/sbshc.h b/drivers/acpi/sbshc.h
index c3522bb82792..695c390e2884 100644
--- a/drivers/acpi/sbshc.h
+++ b/drivers/acpi/sbshc.h
@@ -24,9 +24,9 @@ enum acpi_sbs_device_addr {
 typedef void (*smbus_alarm_callback)(void *context);
 
 extern int acpi_smbus_read(struct acpi_smb_hc *hc, u8 protocol, u8 address,
-	       u8 command, u8 * data);
+		u8 command, u8 *data);
 extern int acpi_smbus_write(struct acpi_smb_hc *hc, u8 protocol, u8 slave_address,
-		u8 command, u8 * data, u8 length);
+		u8 command, u8 *data, u8 length);
 extern int acpi_smbus_register_callback(struct acpi_smb_hc *hc,
-			         smbus_alarm_callback callback, void *context);
+		smbus_alarm_callback callback, void *context);
 extern int acpi_smbus_unregister_callback(struct acpi_smb_hc *hc);
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
index 3a032afd9d05..4f5463b2a217 100644
--- a/drivers/acpi/video_detect.c
+++ b/drivers/acpi/video_detect.c
@@ -178,14 +178,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
 		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
 		},
 	},
-        {
-         .callback = video_detect_force_video,
-         .ident = "ThinkPad X201T",
-         .matches = {
-                DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
-                DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201T"),
-                },
-        },
+	{
+	 .callback = video_detect_force_video,
+	 .ident = "ThinkPad X201T",
+	 .matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201T"),
+		},
+	},
 
 	/* The native backlight controls do not work on some older machines */
 	{
diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c
index f89dd9a99e6e..b02bf770aead 100644
--- a/drivers/acpi/wakeup.c
+++ b/drivers/acpi/wakeup.c
@@ -44,7 +44,7 @@ void acpi_enable_wakeup_devices(u8 sleep_state)
 		if (!dev->wakeup.flags.valid
 		    || sleep_state > (u32) dev->wakeup.sleep_state
 		    || !(device_may_wakeup(&dev->dev)
-		        || dev->wakeup.prepare_count))
+			 || dev->wakeup.prepare_count))
 			continue;
 
 		if (device_may_wakeup(&dev->dev))
@@ -69,7 +69,7 @@ void acpi_disable_wakeup_devices(u8 sleep_state)
 		if (!dev->wakeup.flags.valid
 		    || sleep_state > (u32) dev->wakeup.sleep_state
 		    || !(device_may_wakeup(&dev->dev)
-		        || dev->wakeup.prepare_count))
+			 || dev->wakeup.prepare_count))
 			continue;
 
 		acpi_set_gpe_wake_mask(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
commit c1e9735975c05d36ca97e9d39e9b06c3e0b3b0d7
Author: John Garry <john.garry at huawei.com>
Date:   Mon Nov 2 19:19:31 2020 +0800

    ACPI: scan: Fix acpi_dma_configure_id() kerneldoc name
    
    For some reason building with W=1 doesn't pick up on this, but the
    kerneldoc name for acpi_dma_configure_id() is not right, so fix it up.
    
    Signed-off-by: John Garry <john.garry at huawei.com>
    Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index a896e5e87c93..bc6a79e33220 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1453,7 +1453,7 @@ int acpi_dma_get_range(struct device *dev, u64 *dma_addr, u64 *offset,
 }
 
 /**
- * acpi_dma_configure - Set-up DMA configuration for the device.
+ * acpi_dma_configure_id - Set-up DMA configuration for the device.
  * @dev: The pointer to the device
  * @attr: device dma attributes
  * @input_id: input device id const value pointer
commit 8b31e972f9872e5a6a3348506b5b84353fecef58
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Thu Oct 29 21:32:43 2020 +0200

    Documentation: firmware-guide: gpio-properties: Clarify initial output state
    
    GpioIo() doesn't provide an explicit state for an output pin.
    Linux tries to be smart and uses a common sense based on other
    parameters. Document how it looks like in the code.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Reviewed-by: Mika Westerberg <mika.westerberg at linux.intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/Documentation/firmware-guide/acpi/gpio-properties.rst b/Documentation/firmware-guide/acpi/gpio-properties.rst
index 370fe46c6af9..59aad6138b6e 100644
--- a/Documentation/firmware-guide/acpi/gpio-properties.rst
+++ b/Documentation/firmware-guide/acpi/gpio-properties.rst
@@ -61,6 +61,29 @@ must be 0. GpioInt() resource has its own means of defining it.
 In our Bluetooth example the "reset-gpios" refers to the second GpioIo()
 resource, second pin in that resource with the GPIO number of 31.
 
+The GpioIo() resource unfortunately doesn't explicitly provide an initial
+state of the output pin which driver should use during its initialization.
+
+Linux tries to use common sense here and derives the state from the bias
+and polarity settings. The table below shows the expectations:
+
+=========  =============  ==============
+Pull Bias     Polarity     Requested...
+=========  =============  ==============
+Implicit     x            AS IS (assumed firmware configured for us)
+Explicit     x (no _DSD)  as Pull Bias (Up == High, Down == Low),
+                          assuming non-active (Polarity = !Pull Bias)
+Down         Low          as low, assuming active
+Down         High         as low, assuming non-active
+Up           Low          as high, assuming non-active
+Up           High         as high, assuming active
+=========  =============  ==============
+
+That said, for our above example the both GPIOs, since the bias setting
+is explicit and _DSD is present, will be treated as active with a high
+polarity and Linux will configure the pins in this state until a driver
+reprograms them differently.
+
 It is possible to leave holes in the array of GPIOs. This is useful in
 cases like with SPI host controllers where some chip selects may be
 implemented as GPIOs and some as native signals. For example a SPI host
commit 0d6c41cf801fd56b92f4359374667061d27a6472
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Thu Oct 29 21:32:42 2020 +0200

    Documentation: firmware-guide: gpio-properties: active_low only for GpioIo()
    
    It appears that people may misinterpret active_low field in _DSD
    for GpioInt() resource. Add a paragraph to clarify this.
    
    Reported-by: Ricardo Ribalda <ribalda at chromium.org>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Reviewed-by: Mika Westerberg <mika.westerberg at linux.intel.com>
    Reviewed-by: Ricardo Ribalda <ribalda at chromium.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/Documentation/firmware-guide/acpi/gpio-properties.rst b/Documentation/firmware-guide/acpi/gpio-properties.rst
index e6e65ceb2ca1..370fe46c6af9 100644
--- a/Documentation/firmware-guide/acpi/gpio-properties.rst
+++ b/Documentation/firmware-guide/acpi/gpio-properties.rst
@@ -55,6 +55,9 @@ Since ACPI GpioIo() resource does not have a field saying whether it is
 active low or high, the "active_low" argument can be used here.  Setting
 it to 1 marks the GPIO as active low.
 
+Note, active_low in _DSD does not make sense for GpioInt() resource and
+must be 0. GpioInt() resource has its own means of defining it.
+
 In our Bluetooth example the "reset-gpios" refers to the second GpioIo()
 resource, second pin in that resource with the GPIO number of 31.
 
commit 1bd3387979bff49cb3115c497895d78ffd5092e3
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Thu Oct 29 21:32:41 2020 +0200

    Documentation: firmware-guide: gpio-properties: Fix factual mistakes
    
    Fix factual mistakes and style issues in GPIO properties document.
    This converts IoRestriction from InputOnly to OutputOnly as pins
    in the example are used as outputs.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>

diff --git a/Documentation/firmware-guide/acpi/gpio-properties.rst b/Documentation/firmware-guide/acpi/gpio-properties.rst
index bb6d74f23ee0..e6e65ceb2ca1 100644
--- a/Documentation/firmware-guide/acpi/gpio-properties.rst
+++ b/Documentation/firmware-guide/acpi/gpio-properties.rst
@@ -20,9 +20,9 @@ index, like the ASL example below shows::
 
       Name (_CRS, ResourceTemplate ()
       {
-          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
+          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
                   "\\_SB.GPO0", 0, ResourceConsumer) {15}
-          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
+          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
                   "\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
       })
 
@@ -49,7 +49,7 @@ index
 pin
   Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
 active_low
-  If 1 the GPIO is marked as active_low.
+  If 1, the GPIO is marked as active_low.
 
 Since ACPI GpioIo() resource does not have a field saying whether it is
 active low or high, the "active_low" argument can be used here.  Setting
@@ -112,8 +112,8 @@ Example::
   Package () {
       "gpio-line-names",
       Package () {
-          "SPI0_CS_N", "EXP2_INT", "MUX6_IO", "UART0_RXD", "MUX7_IO",
-          "LVL_C_A1", "MUX0_IO", "SPI1_MISO"
+          "SPI0_CS_N", "EXP2_INT", "MUX6_IO", "UART0_RXD",
+          "MUX7_IO", "LVL_C_A1", "MUX0_IO", "SPI1_MISO",
       }
   }
 
@@ -137,7 +137,7 @@ to the GPIO lines it is going to use and provide the GPIO subsystem with a
 mapping between those names and the ACPI GPIO resources corresponding to them.
 
 To do that, the driver needs to define a mapping table as a NULL-terminated
-array of struct acpi_gpio_mapping objects that each contain a name, a pointer
+array of struct acpi_gpio_mapping objects that each contains a name, a pointer
 to an array of line data (struct acpi_gpio_params) objects and the size of that
 array.  Each struct acpi_gpio_params object consists of three fields,
 crs_entry_index, line_index, active_low, representing the index of the target
@@ -154,13 +154,14 @@ question would look like this::
   static const struct acpi_gpio_mapping bluetooth_acpi_gpios[] = {
     { "reset-gpios", &reset_gpio, 1 },
     { "shutdown-gpios", &shutdown_gpio, 1 },
-    { },
+    { }
   };
 
 Next, the mapping table needs to be passed as the second argument to
-acpi_dev_add_driver_gpios() that will register it with the ACPI device object
-pointed to by its first argument.  That should be done in the driver's .probe()
-routine.  On removal, the driver should unregister its GPIO mapping table by
+acpi_dev_add_driver_gpios() or its managed analogue that will
+register it with the ACPI device object pointed to by its first
+argument. That should be done in the driver's .probe() routine.
+On removal, the driver should unregister its GPIO mapping table by
 calling acpi_dev_remove_driver_gpios() on the ACPI device object where that
 table was previously registered.
 
@@ -191,12 +192,12 @@ The driver might expect to get the right GPIO when it does::
 but since there is no way to know the mapping between "reset" and
 the GpioIo() in _CRS desc will hold ERR_PTR(-ENOENT).
 
-The driver author can solve this by passing the mapping explictly
-(the recommended way and documented in the above chapter).
+The driver author can solve this by passing the mapping explicitly
+(this is the recommended way and it's documented in the above chapter).
 
 The ACPI GPIO mapping tables should not contaminate drivers that are not
 knowing about which exact device they are servicing on. It implies that
-the ACPI GPIO mapping tables are hardly linked to ACPI ID and certain
+the ACPI GPIO mapping tables are hardly linked to an ACPI ID and certain
 objects, as listed in the above chapter, of the device in question.
 
 Getting GPIO descriptor
@@ -229,5 +230,5 @@ Case 2 explicitly tells GPIO core to look for resources in _CRS.
 Be aware that gpiod_get_index() in cases 1 and 2, assuming that there
 are two versions of ACPI device description provided and no mapping is
 present in the driver, will return different resources. That's why a
-certain driver has to handle them carefully as explained in previous
+certain driver has to handle them carefully as explained in the previous
 chapter.
commit 092561f06702dd4fdd7fb74dd3a838f1818529b7
Author: Shin'ichiro Kawasaki <shinichiro.kawasaki at wdc.com>
Date:   Mon Nov 2 21:28:19 2020 +0900

    uio: Fix use-after-free in uio_unregister_device()
    
    Commit 8fd0e2a6df26 ("uio: free uio id after uio file node is freed")
    triggered KASAN use-after-free failure at deletion of TCM-user
    backstores [1].
    
    In uio_unregister_device(), struct uio_device *idev is passed to
    uio_free_minor() to refer idev->minor. However, before uio_free_minor()
    call, idev is already freed by uio_device_release() during call to
    device_unregister().
    
    To avoid reference to idev->minor after idev free, keep idev->minor
    value in a local variable. Also modify uio_free_minor() argument to
    receive the value.
    
    [1]
    BUG: KASAN: use-after-free in uio_unregister_device+0x166/0x190
    Read of size 4 at addr ffff888105196508 by task targetcli/49158
    
    CPU: 3 PID: 49158 Comm: targetcli Not tainted 5.10.0-rc1 #1
    Hardware name: Supermicro Super Server/X10SRL-F, BIOS 2.0 12/17/2015
    Call Trace:
     dump_stack+0xae/0xe5
     ? uio_unregister_device+0x166/0x190
     print_address_description.constprop.0+0x1c/0x210
     ? uio_unregister_device+0x166/0x190
     ? uio_unregister_device+0x166/0x190
     kasan_report.cold+0x37/0x7c
     ? kobject_put+0x80/0x410
     ? uio_unregister_device+0x166/0x190
     uio_unregister_device+0x166/0x190
     tcmu_destroy_device+0x1c4/0x280 [target_core_user]
     ? tcmu_release+0x90/0x90 [target_core_user]
     ? __mutex_unlock_slowpath+0xd6/0x5d0
     target_free_device+0xf3/0x2e0 [target_core_mod]
     config_item_cleanup+0xea/0x210
     configfs_rmdir+0x651/0x860
     ? detach_groups.isra.0+0x380/0x380
     vfs_rmdir.part.0+0xec/0x3a0
     ? __lookup_hash+0x20/0x150
     do_rmdir+0x252/0x320
     ? do_file_open_root+0x420/0x420
     ? strncpy_from_user+0xbc/0x2f0
     ? getname_flags.part.0+0x8e/0x450
     do_syscall_64+0x33/0x40
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x7f9e2bfc91fb
    Code: 73 01 c3 48 8b 0d 9d ec 0c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa b8 54 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 6d ec 0c 00 f7 d8 64 89 01 48
    RSP: 002b:00007ffdd2baafe8 EFLAGS: 00000246 ORIG_RAX: 0000000000000054
    RAX: ffffffffffffffda RBX: 00007f9e2beb44a0 RCX: 00007f9e2bfc91fb
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00007f9e1c20be90
    RBP: 00007ffdd2bab000 R08: 0000000000000000 R09: 00007f9e2bdf2440
    R10: 00007ffdd2baaf37 R11: 0000000000000246 R12: 00000000ffffff9c
    R13: 000055f9abb7e390 R14: 000055f9abcf9558 R15: 00007f9e2be7a780
    
    Allocated by task 34735:
     kasan_save_stack+0x1b/0x40
     __kasan_kmalloc.constprop.0+0xc2/0xd0
     __uio_register_device+0xeb/0xd40
     tcmu_configure_device+0x5a0/0xbc0 [target_core_user]
     target_configure_device+0x12f/0x760 [target_core_mod]
     target_dev_enable_store+0x32/0x50 [target_core_mod]
     configfs_write_file+0x2bb/0x450
     vfs_write+0x1ce/0x610
     ksys_write+0xe9/0x1b0
     do_syscall_64+0x33/0x40
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Freed by task 49158:
     kasan_save_stack+0x1b/0x40
     kasan_set_track+0x1c/0x30
     kasan_set_free_info+0x1b/0x30
     __kasan_slab_free+0x110/0x150
     slab_free_freelist_hook+0x5a/0x170
     kfree+0xc6/0x560
     device_release+0x9b/0x210
     kobject_put+0x13e/0x410
     uio_unregister_device+0xf9/0x190
     tcmu_destroy_device+0x1c4/0x280 [target_core_user]
     target_free_device+0xf3/0x2e0 [target_core_mod]
     config_item_cleanup+0xea/0x210
     configfs_rmdir+0x651/0x860
     vfs_rmdir.part.0+0xec/0x3a0
     do_rmdir+0x252/0x320
     do_syscall_64+0x33/0x40
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    The buggy address belongs to the object at ffff888105196000
     which belongs to the cache kmalloc-2k of size 2048
    The buggy address is located 1288 bytes inside of
     2048-byte region [ffff888105196000, ffff888105196800)
    The buggy address belongs to the page:
    page:0000000098e6ca81 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x105190
    head:0000000098e6ca81 order:3 compound_mapcount:0 compound_pincount:0
    flags: 0x17ffffc0010200(slab|head)
    raw: 0017ffffc0010200 dead000000000100 dead000000000122 ffff888100043040
    raw: 0000000000000000 0000000000080008 00000001ffffffff ffff88810eb55c01
    page dumped because: kasan: bad access detected
    page->mem_cgroup:ffff88810eb55c01
    
    Memory state around the buggy address:
     ffff888105196400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff888105196480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    >ffff888105196500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                          ^
     ffff888105196580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff888105196600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    
    Fixes: 8fd0e2a6df26 ("uio: free uio id after uio file node is freed")
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki at wdc.com>
    Link: https://lore.kernel.org/r/20201102122819.2346270-1-shinichiro.kawasaki@wdc.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 6dca744e39e9..be06f1a961c2 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -413,10 +413,10 @@ static int uio_get_minor(struct uio_device *idev)
 	return retval;
 }
 
-static void uio_free_minor(struct uio_device *idev)
+static void uio_free_minor(unsigned long minor)
 {
 	mutex_lock(&minor_lock);
-	idr_remove(&uio_idr, idev->minor);
+	idr_remove(&uio_idr, minor);
 	mutex_unlock(&minor_lock);
 }
 
@@ -990,7 +990,7 @@ err_request_irq:
 err_uio_dev_add_attributes:
 	device_del(&idev->dev);
 err_device_create:
-	uio_free_minor(idev);
+	uio_free_minor(idev->minor);
 	put_device(&idev->dev);
 	return ret;
 }
@@ -1042,11 +1042,13 @@ EXPORT_SYMBOL_GPL(__devm_uio_register_device);
 void uio_unregister_device(struct uio_info *info)
 {
 	struct uio_device *idev;
+	unsigned long minor;
 
 	if (!info || !info->uio_dev)
 		return;
 
 	idev = info->uio_dev;
+	minor = idev->minor;
 
 	mutex_lock(&idev->info_lock);
 	uio_dev_del_attributes(idev);
@@ -1062,7 +1064,7 @@ void uio_unregister_device(struct uio_info *info)
 
 	device_unregister(&idev->dev);
 
-	uio_free_minor(idev);
+	uio_free_minor(minor);
 
 	return;
 }
commit f3217d6f2f7a76b36a3326ad58c8897f4d5fbe31
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 16:54:36 2020 +0100

    firmware: xilinx: fix out-of-bounds access
    
    The zynqmp_pm_set_suspend_mode() and zynqmp_pm_get_trustzone_version()
    functions pass values as api_id into zynqmp_pm_invoke_fn
    that are beyond PM_API_MAX, resulting in an out-of-bounds access:
    
    drivers/firmware/xilinx/zynqmp.c: In function 'zynqmp_pm_set_suspend_mode':
    drivers/firmware/xilinx/zynqmp.c:150:24: warning: array subscript 2562 is above array bounds of 'u32[64]' {aka 'unsigned int[64]'} [-Warray-bounds]
      150 |  if (zynqmp_pm_features[api_id] != PM_FEATURE_UNCHECKED)
          |      ~~~~~~~~~~~~~~~~~~^~~~~~~~
    drivers/firmware/xilinx/zynqmp.c:28:12: note: while referencing 'zynqmp_pm_features'
       28 | static u32 zynqmp_pm_features[PM_API_MAX];
          |            ^~~~~~~~~~~~~~~~~~
    
    Replace the resulting undefined behavior with an error return.
    This may break some things that happen to work at the moment
    but seems better than randomly overwriting kernel data.
    
    I assume we need additional fixes for the two functions that now
    return an error.
    
    Fixes: 76582671eb5d ("firmware: xilinx: Add Zynqmp firmware driver")
    Fixes: e178df31cf41 ("firmware: xilinx: Implement ZynqMP power management APIs")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Link: https://lore.kernel.org/r/20201026155449.3703142-1-arnd@kernel.org
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c
index 8d1ff2454e2e..efb8a66efc68 100644
--- a/drivers/firmware/xilinx/zynqmp.c
+++ b/drivers/firmware/xilinx/zynqmp.c
@@ -147,6 +147,9 @@ static int zynqmp_pm_feature(u32 api_id)
 		return 0;
 
 	/* Return value if feature is already checked */
+	if (api_id > ARRAY_SIZE(zynqmp_pm_features))
+		return PM_FEATURE_INVALID;
+
 	if (zynqmp_pm_features[api_id] != PM_FEATURE_UNCHECKED)
 		return zynqmp_pm_features[api_id];
 
commit d9109fe0f30a1fba66b8623837fc3d3c1a031090
Author: Andra Paraschiv <andraprs at amazon.com>
Date:   Mon Nov 2 19:36:22 2020 +0200

    nitro_enclaves: Fixup type and simplify logic of the poll mask setup
    
    Update the assigned value of the poll result to be EPOLLHUP instead of
    POLLHUP to match the __poll_t type.
    
    While at it, simplify the logic of setting the mask result of the poll
    function.
    
    Reported-by: kernel test robot <lkp at intel.com>
    Reviewed-by: Alexander Graf <graf at amazon.com>
    Signed-off-by: Andra Paraschiv <andraprs at amazon.com>
    Link: https://lore.kernel.org/r/20201102173622.32169-1-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/virt/nitro_enclaves/ne_misc_dev.c b/drivers/virt/nitro_enclaves/ne_misc_dev.c
index f06622b48d69..f1964ea4b826 100644
--- a/drivers/virt/nitro_enclaves/ne_misc_dev.c
+++ b/drivers/virt/nitro_enclaves/ne_misc_dev.c
@@ -1505,10 +1505,8 @@ static __poll_t ne_enclave_poll(struct file *file, poll_table *wait)
 
 	poll_wait(file, &ne_enclave->eventq, wait);
 
-	if (!ne_enclave->has_event)
-		return mask;
-
-	mask = POLLHUP;
+	if (ne_enclave->has_event)
+		mask |= EPOLLHUP;
 
 	return mask;
 }
commit 3ed1cfb2cee4355ddef49489897bfe474daeeaec
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sun Nov 8 14:12:33 2020 +0100

    speakup ttyio: Do not schedule() in ttyio_in_nowait
    
    With the ltlk and spkout drivers, the index read function, i.e.
    in_nowait, is getting called from the read_all_doc mechanism, from
    the timer softirq:
    
    Call Trace:
     <IRQ>
     dump_stack+0x71/0x98
     dequeue_task_idle+0x1f/0x28
     __schedule+0x167/0x5d6
     ? trace_hardirqs_on+0x2e/0x3a
     ? usleep_range+0x7f/0x7f
     schedule+0x8a/0xae
     schedule_timeout+0xb1/0xea
     ? del_timer_sync+0x31/0x31
     do_wait_for_common+0xba/0x12b
     ? wake_up_q+0x45/0x45
     wait_for_common+0x37/0x50
     ttyio_in+0x2a/0x6b
     spk_ttyio_in_nowait+0xc/0x13
     spk_get_index_count+0x20/0x93
     cursor_done+0x1c6/0x4c6
     ? read_all_doc+0xb1/0xb1
     call_timer_fn+0x89/0x140
     run_timer_softirq+0x164/0x1a5
     ? read_all_doc+0xb1/0xb1
     ? hrtimer_forward+0x7b/0x87
     ? timerqueue_add+0x62/0x68
     ? enqueue_hrtimer+0x95/0x9f
     __do_softirq+0x181/0x31f
     irq_exit+0x6a/0x86
    smp_apic_timer_interrupt+0x15e/0x183
     apic_timer_interrupt+0xf/0x20
     </IRQ>
    
    We thus should not schedule() at all, even with timeout == 0, this
    crashes the kernel.  We can however use try_wait_for_completion()
    instead of wait_for_completion_timeout(0).
    
    Cc: stable at vger.kernel.org
    Reported-by: John Covici <covici at ccs.covici.com>
    Tested-by: John Covici <covici at ccs.covici.com>
    Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
    Link: https://lore.kernel.org/r/20201108131233.tadycr73sxlvodgo@function
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/accessibility/speakup/spk_ttyio.c b/drivers/accessibility/speakup/spk_ttyio.c
index a831ff64f8ba..ecc39983e946 100644
--- a/drivers/accessibility/speakup/spk_ttyio.c
+++ b/drivers/accessibility/speakup/spk_ttyio.c
@@ -298,11 +298,13 @@ static unsigned char ttyio_in(int timeout)
 	struct spk_ldisc_data *ldisc_data = speakup_tty->disc_data;
 	char rv;
 
-	if (wait_for_completion_timeout(&ldisc_data->completion,
+	if (!timeout) {
+		if (!try_wait_for_completion(&ldisc_data->completion))
+			return 0xff;
+	} else if (wait_for_completion_timeout(&ldisc_data->completion,
 					usecs_to_jiffies(timeout)) == 0) {
-		if (timeout)
-			pr_warn("spk_ttyio: timeout (%d)  while waiting for input\n",
-				timeout);
+		pr_warn("spk_ttyio: timeout (%d)  while waiting for input\n",
+			timeout);
 		return 0xff;
 	}
 
commit 640969a69ca4dd2ac025fe873c6bf25eba8f11b3
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sun Nov 8 00:33:10 2020 +0100

    speakup: Fix clearing selection in safe context
    
    speakup_cut() calls speakup_clear_selection() which calls console_lock.
    Problem is: speakup_cut() is called from a keyboard interrupt
    context. This would hang if speakup_cut is pressed while the console
    lock is unfortunately already held.
    
    We can however as well just defer calling clear_selection() until the
    already-deferred set_selection_kernel() call.
    
    This was spotted by the lock hardener:
    
     Possible unsafe locking scenario:\x0a
           CPU0
           ----
      lock(console_lock);
      <Interrupt>
        lock(console_lock);
    \x0a *** DEADLOCK ***\x0a
    [...]
    Call Trace:
     <IRQ>
     dump_stack+0xc2/0x11a
     print_usage_bug.cold+0x3e0/0x4b1
     mark_lock+0xd95/0x1390
     ? print_irq_inversion_bug+0xa0/0xa0
     __lock_acquire+0x21eb/0x5730
     ? __kasan_check_read+0x11/0x20
     ? check_chain_key+0x215/0x5e0
     ? register_lock_class+0x1580/0x1580
     ? lock_downgrade+0x7a0/0x7a0
     ? __rwlock_init+0x140/0x140
     lock_acquire+0x13f/0x370
     ? speakup_clear_selection+0xe/0x20 [speakup]
     console_lock+0x33/0x50
     ? speakup_clear_selection+0xe/0x20 [speakup]
     speakup_clear_selection+0xe/0x20 [speakup]
     speakup_cut+0x19e/0x4b0 [speakup]
     keyboard_notifier_call+0x1f04/0x4a40 [speakup]
     ? read_all_doc+0x240/0x240 [speakup]
     notifier_call_chain+0xbf/0x130
     __atomic_notifier_call_chain+0x80/0x130
     atomic_notifier_call_chain+0x16/0x20
     kbd_event+0x7d7/0x3b20
     ? k_pad+0x850/0x850
     ? sysrq_filter+0x450/0xd40
     input_to_handler+0x362/0x4b0
     ? rcu_read_lock_sched_held+0xe0/0xe0
     input_pass_values+0x408/0x5a0
     ? __rwlock_init+0x140/0x140
     ? lock_acquire+0x13f/0x370
     input_handle_event+0x70e/0x1380
     input_event+0x67/0x90
     atkbd_interrupt+0xe62/0x1d4e [atkbd]
     ? __kasan_check_write+0x14/0x20
     ? atkbd_event_work+0x130/0x130 [atkbd]
     ? _raw_spin_lock_irqsave+0x26/0x70
     serio_interrupt+0x93/0x120 [serio]
     i8042_interrupt+0x232/0x510 [i8042]
     ? rcu_read_lock_bh_held+0xd0/0xd0
     ? handle_irq_event+0xa5/0x13a
     ? i8042_remove+0x1f0/0x1f0 [i8042]
     __handle_irq_event_percpu+0xe6/0x6c0
     handle_irq_event_percpu+0x71/0x150
     ? __handle_irq_event_percpu+0x6c0/0x6c0
     ? __kasan_check_read+0x11/0x20
     ? do_raw_spin_unlock+0x5c/0x240
     handle_irq_event+0xad/0x13a
     handle_edge_irq+0x233/0xa90
     do_IRQ+0x10b/0x310
     common_interrupt+0xf/0xf
     </IRQ>
    
    Cc: stable at vger.kernel.org
    Reported-by: Jookia <contact at jookia.org>
    Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
    Link: https://lore.kernel.org/r/20201107233310.7iisvaozpiqj3yvy@function
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/accessibility/speakup/main.c b/drivers/accessibility/speakup/main.c
index be79b2135fac..48019660a096 100644
--- a/drivers/accessibility/speakup/main.c
+++ b/drivers/accessibility/speakup/main.c
@@ -357,7 +357,6 @@ static void speakup_cut(struct vc_data *vc)
 	mark_cut_flag = 0;
 	synth_printf("%s\n", spk_msg_get(MSG_CUT));
 
-	speakup_clear_selection();
 	ret = speakup_set_selection(tty);
 
 	switch (ret) {
diff --git a/drivers/accessibility/speakup/selection.c b/drivers/accessibility/speakup/selection.c
index 032f3264fba1..7df7afad5ab4 100644
--- a/drivers/accessibility/speakup/selection.c
+++ b/drivers/accessibility/speakup/selection.c
@@ -22,13 +22,6 @@ struct speakup_selection_work {
 	struct tty_struct *tty;
 };
 
-void speakup_clear_selection(void)
-{
-	console_lock();
-	clear_selection();
-	console_unlock();
-}
-
 static void __speakup_set_selection(struct work_struct *work)
 {
 	struct speakup_selection_work *ssw =
@@ -51,6 +44,10 @@ static void __speakup_set_selection(struct work_struct *work)
 		goto unref;
 	}
 
+	console_lock();
+	clear_selection();
+	console_unlock();
+
 	set_selection_kernel(&sel, tty);
 
 unref:
diff --git a/drivers/accessibility/speakup/speakup.h b/drivers/accessibility/speakup/speakup.h
index 74fe49c2c511..33594f5a7983 100644
--- a/drivers/accessibility/speakup/speakup.h
+++ b/drivers/accessibility/speakup/speakup.h
@@ -70,7 +70,6 @@ void spk_do_flush(void);
 void speakup_start_ttys(void);
 void synth_buffer_add(u16 ch);
 void synth_buffer_clear(void);
-void speakup_clear_selection(void);
 int speakup_set_selection(struct tty_struct *tty);
 void speakup_cancel_selection(void);
 int speakup_paste_selection(struct tty_struct *tty);
commit d7012df3c9aecdcfb50f7a2ebad766952fd1410e
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Mon Oct 12 18:06:46 2020 +0200

    speakup: Fix var_id_t values and thus keymap
    
    commit d97a9d7aea04 ("staging/speakup: Add inflection synth parameter")
    introduced a new "inflection" speakup parameter next to "pitch", but
    the values of the var_id_t enum are actually used by the keymap tables
    so we must not renumber them. The effect was that notably the volume
    control shortcut (speakup-1 or 2) was actually changing the inflection.
    
    This moves the INFLECTION value at the end of the var_id_t enum to
    fix back the enum values. This also adds a warning about it.
    
    Fixes: d97a9d7aea04 ("staging/speakup: Add inflection synth parameter")
    Cc: stable at vger.kernel.org
    Reported-by: Kirk Reiser <kirk at reisers.ca>
    Reported-by: Gregory Nowak <greg at gregn.net>
    Tested-by: Gregory Nowak <greg at gregn.net>
    Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
    Link: https://lore.kernel.org/r/20201012160646.qmdo4eqtj24hpch4@function
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/accessibility/speakup/spk_types.h b/drivers/accessibility/speakup/spk_types.h
index 7398f1196e10..91fca3033a45 100644
--- a/drivers/accessibility/speakup/spk_types.h
+++ b/drivers/accessibility/speakup/spk_types.h
@@ -32,6 +32,10 @@ enum {
 	E_NEW_DEFAULT,
 };
 
+/*
+ * Note: add new members at the end, speakupmap.h depends on the values of the
+ * enum starting from SPELL_DELAY (see inc_dec_var)
+ */
 enum var_id_t {
 	VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT,
 	KEYMAP, CHARS,
@@ -42,9 +46,9 @@ enum var_id_t {
 	SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO,
 	SPELL_DELAY, PUNC_LEVEL, READING_PUNC,
 	ATTRIB_BLEEP, BLEEPS,
-	RATE, PITCH, INFLECTION, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
+	RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
 	DIRECT, PAUSE,
-	CAPS_START, CAPS_STOP, CHARTAB,
+	CAPS_START, CAPS_STOP, CHARTAB, INFLECTION,
 	MAXVARS
 };
 
commit cadbaa039b99a6d5c26ce1c7f2fc0325943e605a
Author: Stephane Eranian <eranian at google.com>
Date:   Wed Oct 28 12:42:47 2020 -0700

    perf/x86/intel: Make anythread filter support conditional
    
    Starting with Arch Perfmon v5, the anythread filter on generic counters may be
    deprecated. The current kernel was exporting the any filter without checking.
    On Icelake, it means you could do cpu/event=0x3c,any/ even though the filter
    does not exist. This patch corrects the problem by relying on the CPUID 0xa leaf
    function to determine if anythread is supported or not as described in the
    Intel SDM Vol3b 18.2.5.1 AnyThread Deprecation section.
    
    Signed-off-by: Stephane Eranian <eranian at google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201028194247.3160610-1-eranian@google.com

diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index c37387c8212a..af457f8cb29d 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -4987,6 +4987,12 @@ __init int intel_pmu_init(void)
 
 	x86_add_quirk(intel_arch_events_quirk); /* Install first, so it runs last */
 
+	if (version >= 5) {
+		x86_pmu.intel_cap.anythread_deprecated = edx.split.anythread_deprecated;
+		if (x86_pmu.intel_cap.anythread_deprecated)
+			pr_cont(" AnyThread deprecated, ");
+	}
+
 	/*
 	 * Install the hw-cache-events table:
 	 */
@@ -5512,6 +5518,10 @@ __init int intel_pmu_init(void)
 	x86_pmu.intel_ctrl |=
 		((1LL << x86_pmu.num_counters_fixed)-1) << INTEL_PMC_IDX_FIXED;
 
+	/* AnyThread may be deprecated on arch perfmon v5 or later */
+	if (x86_pmu.intel_cap.anythread_deprecated)
+		x86_pmu.format_attrs = intel_arch_formats_attr;
+
 	if (x86_pmu.event_constraints) {
 		/*
 		 * event on fixed counter2 (REF_CYCLES) only works on this
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
index 1d1fe46552ba..6a8edfe59b09 100644
--- a/arch/x86/events/perf_event.h
+++ b/arch/x86/events/perf_event.h
@@ -585,6 +585,7 @@ union perf_capabilities {
 		u64     pebs_baseline:1;
 		u64	perf_metrics:1;
 		u64	pebs_output_pt_available:1;
+		u64	anythread_deprecated:1;
 	};
 	u64	capabilities;
 };
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h
index 6960cd6d1f23..b9a7fd0a27e2 100644
--- a/arch/x86/include/asm/perf_event.h
+++ b/arch/x86/include/asm/perf_event.h
@@ -137,7 +137,9 @@ union cpuid10_edx {
 	struct {
 		unsigned int num_counters_fixed:5;
 		unsigned int bit_width_fixed:8;
-		unsigned int reserved:19;
+		unsigned int reserved1:2;
+		unsigned int anythread_deprecated:1;
+		unsigned int reserved2:16;
 	} split;
 	unsigned int full;
 };
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 06a278b3701d..0752dec66e29 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -672,7 +672,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
 
 		edx.split.num_counters_fixed = min(cap.num_counters_fixed, MAX_FIXED_COUNTERS);
 		edx.split.bit_width_fixed = cap.bit_width_fixed;
-		edx.split.reserved = 0;
+		edx.split.anythread_deprecated = 1;
+		edx.split.reserved1 = 0;
+		edx.split.reserved2 = 0;
 
 		entry->eax = eax.full;
 		entry->ebx = cap.events_mask;
commit 1908dc911792067287458fdb0800f036f4f4e0f6
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Thu Oct 29 16:32:22 2020 +0100

    perf: Tweak perf_event_attr::exclusive semantics
    
    Currently perf_event_attr::exclusive can be used to ensure an
    event(group) is the sole group scheduled on the PMU. One consequence
    is that when you have a pinned event (say the watchdog) you can no
    longer have regular exclusive event(group)s.
    
    Inspired by the fact that !pinned events are considered less strict,
    allow !pinned,exclusive events to share the PMU with pinned,!exclusive
    events.
    
    Pinned,exclusive is still fully exclusive.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201029162902.105962225@infradead.org

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 00be48acdc36..dc568ca295bd 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2637,7 +2637,7 @@ static int group_can_go_on(struct perf_event *event,
 	 * If this group is exclusive and there are already
 	 * events on the CPU, it can't go on.
 	 */
-	if (event->attr.exclusive && cpuctx->active_oncpu)
+	if (event->attr.exclusive && !list_empty(get_event_list(event)))
 		return 0;
 	/*
 	 * Otherwise, try to add it if all previous groups were able
commit 2714c3962f304d031d5016c963c4b459337b0749
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Thu Oct 29 16:29:53 2020 +0100

    perf: Fix event multiplexing for exclusive groups
    
    Commit 9e6302056f80 ("perf: Use hrtimers for event multiplexing")
    placed the hrtimer (re)start call in the wrong place.  Instead of
    capturing all scheduling failures, it only considered the PMU failure.
    
    The result is that groups using perf_event_attr::exclusive are no
    longer rotated.
    
    Fixes: 9e6302056f80 ("perf: Use hrtimers for event multiplexing")
    Reported-by: Andi Kleen <ak at linux.intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201029162902.038667689@infradead.org

diff --git a/kernel/events/core.c b/kernel/events/core.c
index f0e526866a1c..00be48acdc36 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2612,7 +2612,6 @@ group_error:
 
 error:
 	pmu->cancel_txn(pmu);
-	perf_mux_hrtimer_restart(cpuctx);
 	return -EAGAIN;
 }
 
@@ -3672,6 +3671,7 @@ static int merge_sched_in(struct perf_event *event, void *data)
 
 		*can_add_hw = 0;
 		ctx->rotate_necessary = 1;
+		perf_mux_hrtimer_restart(cpuctx);
 	}
 
 	return 0;
commit 251ff2d49347793d348babcff745289b11910e96
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Thu Oct 29 16:29:15 2020 +0100

    perf: Simplify group_sched_in()
    
    Collate the error paths. Code duplication only leads to divergence and
    extra bugs.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201029162901.972161394@infradead.org

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 9a5736617a82..f0e526866a1c 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2580,11 +2580,8 @@ group_sched_in(struct perf_event *group_event,
 
 	pmu->start_txn(pmu, PERF_PMU_TXN_ADD);
 
-	if (event_sched_in(group_event, cpuctx, ctx)) {
-		pmu->cancel_txn(pmu);
-		perf_mux_hrtimer_restart(cpuctx);
-		return -EAGAIN;
-	}
+	if (event_sched_in(group_event, cpuctx, ctx))
+		goto error;
 
 	/*
 	 * Schedule in siblings as one group (if any):
@@ -2613,10 +2610,9 @@ group_error:
 	}
 	event_sched_out(group_event, cpuctx, ctx);
 
+error:
 	pmu->cancel_txn(pmu);
-
 	perf_mux_hrtimer_restart(cpuctx);
-
 	return -EAGAIN;
 }
 
commit 8c7855d82933bab7fa5e96f0e568fc125c2e1ab4
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Thu Oct 29 16:28:25 2020 +0100

    perf: Simplify group_sched_out()
    
    Since event_sched_out() clears cpuctx->exclusive upon removal of an
    exclusive event (and only group leaders can be exclusive), there is no
    point in group_sched_out() trying to do it too. It is impossible for
    cpuctx->exclusive to still be set here.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201029162901.904060564@infradead.org

diff --git a/kernel/events/core.c b/kernel/events/core.c
index d67c9cbb0f6a..9a5736617a82 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2312,9 +2312,6 @@ group_sched_out(struct perf_event *group_event,
 		event_sched_out(event, cpuctx, ctx);
 
 	perf_pmu_enable(ctx->pmu);
-
-	if (group_event->attr.exclusive)
-		cpuctx->exclusive = 0;
 }
 
 #define DETACH_GROUP	0x01UL
commit e506d1dac0edb2df82f2aa0582e814f9cd9aa07d
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Oct 30 12:15:06 2020 +0100

    perf/x86: Make dummy_iregs static
    
    Having pt_regs on-stack is unfortunate, it's 168 bytes. Since it isn't
    actually used, make it a static variable. This both gets if off the
    stack and ensures it gets 0 initialized, just in case someone does
    look at it.
    
    Reported-by: Steven Rostedt <rostedt at goodmis.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201030151955.324273677@infradead.org

diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index 276b29da732f..b47cc4226934 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1738,7 +1738,7 @@ __intel_pmu_pebs_event(struct perf_event *event,
 	struct x86_perf_regs perf_regs;
 	struct pt_regs *regs = &perf_regs.regs;
 	void *at = get_next_pebs_record_by_bit(base, top, bit);
-	struct pt_regs dummy_iregs;
+	static struct pt_regs dummy_iregs;
 
 	if (hwc->flags & PERF_X86_EVENT_AUTO_RELOAD) {
 		/*
commit 76a4efa80900fc40e0fdf243b42aec9fb8c35d24
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Oct 30 12:14:21 2020 +0100

    perf/arch: Remove perf_sample_data::regs_user_copy
    
    struct perf_sample_data lives on-stack, we should be careful about it's
    size. Furthermore, the pt_regs copy in there is only because x86_64 is a
    trainwreck, solve it differently.
    
    Reported-by: Thomas Gleixner <tglx at linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Tested-by: Steven Rostedt <rostedt at goodmis.org>
    Link: https://lkml.kernel.org/r/20201030151955.258178461@infradead.org

diff --git a/arch/arm/kernel/perf_regs.c b/arch/arm/kernel/perf_regs.c
index 05fe92aa7d98..0529f90395c9 100644
--- a/arch/arm/kernel/perf_regs.c
+++ b/arch/arm/kernel/perf_regs.c
@@ -32,8 +32,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c
index 94e8718e7229..f6f58e6265df 100644
--- a/arch/arm64/kernel/perf_regs.c
+++ b/arch/arm64/kernel/perf_regs.c
@@ -73,8 +73,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
diff --git a/arch/csky/kernel/perf_regs.c b/arch/csky/kernel/perf_regs.c
index eb32838b8210..09b7f88a2d6a 100644
--- a/arch/csky/kernel/perf_regs.c
+++ b/arch/csky/kernel/perf_regs.c
@@ -32,8 +32,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
diff --git a/arch/powerpc/perf/perf_regs.c b/arch/powerpc/perf/perf_regs.c
index 8e53f2fc3fe0..6f681b105eec 100644
--- a/arch/powerpc/perf/perf_regs.c
+++ b/arch/powerpc/perf/perf_regs.c
@@ -144,8 +144,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = (regs_user->regs) ? perf_reg_abi(current) :
diff --git a/arch/riscv/kernel/perf_regs.c b/arch/riscv/kernel/perf_regs.c
index 04a38fbeb9c7..fd304a248de6 100644
--- a/arch/riscv/kernel/perf_regs.c
+++ b/arch/riscv/kernel/perf_regs.c
@@ -36,8 +36,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
diff --git a/arch/s390/kernel/perf_regs.c b/arch/s390/kernel/perf_regs.c
index 4352a504f235..6e9e5d5e927e 100644
--- a/arch/s390/kernel/perf_regs.c
+++ b/arch/s390/kernel/perf_regs.c
@@ -53,8 +53,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	/*
 	 * Use the regs from the first interruption and let
diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index bb7e1132290b..f9e5352b3bef 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -101,8 +101,7 @@ u64 perf_reg_abi(struct task_struct *task)
 }
 
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
@@ -129,12 +128,20 @@ u64 perf_reg_abi(struct task_struct *task)
 		return PERF_SAMPLE_REGS_ABI_64;
 }
 
+static DEFINE_PER_CPU(struct pt_regs, nmi_user_regs);
+
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy)
+			struct pt_regs *regs)
 {
+	struct pt_regs *regs_user_copy = this_cpu_ptr(&nmi_user_regs);
 	struct pt_regs *user_regs = task_pt_regs(current);
 
+	if (!in_nmi()) {
+		regs_user->regs = user_regs;
+		regs_user->abi = perf_reg_abi(current);
+		return;
+	}
+
 	/*
 	 * If we're in an NMI that interrupted task_pt_regs setup, then
 	 * we can't sample user regs at all.  This check isn't really
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index b775ae0a8c87..96450f6fb1de 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1022,13 +1022,7 @@ struct perf_sample_data {
 	struct perf_callchain_entry	*callchain;
 	u64				aux_size;
 
-	/*
-	 * regs_user may point to task_pt_regs or to regs_user_copy, depending
-	 * on arch details.
-	 */
 	struct perf_regs		regs_user;
-	struct pt_regs			regs_user_copy;
-
 	struct perf_regs		regs_intr;
 	u64				stack_user_size;
 
diff --git a/include/linux/perf_regs.h b/include/linux/perf_regs.h
index 2d12e97d5e7b..f632c5725f16 100644
--- a/include/linux/perf_regs.h
+++ b/include/linux/perf_regs.h
@@ -20,8 +20,7 @@ u64 perf_reg_value(struct pt_regs *regs, int idx);
 int perf_reg_validate(u64 mask);
 u64 perf_reg_abi(struct task_struct *task);
 void perf_get_regs_user(struct perf_regs *regs_user,
-			struct pt_regs *regs,
-			struct pt_regs *regs_user_copy);
+			struct pt_regs *regs);
 #else
 
 #define PERF_REG_EXTENDED_MASK	0
@@ -42,8 +41,7 @@ static inline u64 perf_reg_abi(struct task_struct *task)
 }
 
 static inline void perf_get_regs_user(struct perf_regs *regs_user,
-				      struct pt_regs *regs,
-				      struct pt_regs *regs_user_copy)
+				      struct pt_regs *regs)
 {
 	regs_user->regs = task_pt_regs(current);
 	regs_user->abi = perf_reg_abi(current);
diff --git a/kernel/events/core.c b/kernel/events/core.c
index fc681c7c1e03..d67c9cbb0f6a 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6374,14 +6374,13 @@ perf_output_sample_regs(struct perf_output_handle *handle,
 }
 
 static void perf_sample_regs_user(struct perf_regs *regs_user,
-				  struct pt_regs *regs,
-				  struct pt_regs *regs_user_copy)
+				  struct pt_regs *regs)
 {
 	if (user_mode(regs)) {
 		regs_user->abi = perf_reg_abi(current);
 		regs_user->regs = regs;
 	} else if (!(current->flags & PF_KTHREAD)) {
-		perf_get_regs_user(regs_user, regs, regs_user_copy);
+		perf_get_regs_user(regs_user, regs);
 	} else {
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
 		regs_user->regs = NULL;
@@ -7083,8 +7082,7 @@ void perf_prepare_sample(struct perf_event_header *header,
 	}
 
 	if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER))
-		perf_sample_regs_user(&data->regs_user, regs,
-				      &data->regs_user_copy);
+		perf_sample_regs_user(&data->regs_user, regs);
 
 	if (sample_type & PERF_SAMPLE_REGS_USER) {
 		/* regs dump ABI info */
commit 09da9c81253dd8e43e0d2d7cea02de6f9f19499d
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Oct 30 13:43:16 2020 +0100

    perf: Optimize get_recursion_context()
    
      "Look ma, no branches!"
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Acked-by: Jesper Dangaard Brouer <brouer at redhat.com>
    Link: https://lkml.kernel.org/r/20201030151955.187580298@infradead.org

diff --git a/kernel/events/internal.h b/kernel/events/internal.h
index 402054e755f2..228801e20788 100644
--- a/kernel/events/internal.h
+++ b/kernel/events/internal.h
@@ -205,16 +205,12 @@ DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user)
 
 static inline int get_recursion_context(int *recursion)
 {
-	int rctx;
-
-	if (unlikely(in_nmi()))
-		rctx = 3;
-	else if (in_irq())
-		rctx = 2;
-	else if (in_serving_softirq())
-		rctx = 1;
-	else
-		rctx = 0;
+	unsigned int pc = preempt_count();
+	unsigned char rctx = 0;
+
+	rctx += !!(pc & (NMI_MASK));
+	rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK));
+	rctx += !!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET));
 
 	if (recursion[rctx])
 		return -1;
commit ce0f17fc93f63ee91428af10b7b2ddef38cd19e5
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Oct 30 12:49:45 2020 +0100

    perf: Fix get_recursion_context()
    
    One should use in_serving_softirq() to detect SoftIRQ context.
    
    Fixes: 96f6d4444302 ("perf_counter: avoid recursion")
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201030151955.120572175@infradead.org

diff --git a/kernel/events/internal.h b/kernel/events/internal.h
index fcbf5616a441..402054e755f2 100644
--- a/kernel/events/internal.h
+++ b/kernel/events/internal.h
@@ -211,7 +211,7 @@ static inline int get_recursion_context(int *recursion)
 		rctx = 3;
 	else if (in_irq())
 		rctx = 2;
-	else if (in_softirq())
+	else if (in_serving_softirq())
 		rctx = 1;
 	else
 		rctx = 0;
commit 9dfa9a5c9bae3417b87824e7ac73b00c10b6a874
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Oct 30 14:58:48 2020 +0100

    perf/x86: Reduce stack usage for x86_pmu::drain_pebs()
    
    intel_pmu_drain_pebs_*() is typically called from handle_pmi_common(),
    both have an on-stack struct perf_sample_data, which is *big*. Rewire
    things so that drain_pebs() can use the one handle_pmi_common() has.
    
    Reported-by: Thomas Gleixner <tglx at linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201030151955.054099690@infradead.org

diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index f1926e9f2143..c37387c8212a 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -2630,7 +2630,7 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)
 		u64 pebs_enabled = cpuc->pebs_enabled;
 
 		handled++;
-		x86_pmu.drain_pebs(regs);
+		x86_pmu.drain_pebs(regs, &data);
 		status &= x86_pmu.intel_ctrl | GLOBAL_STATUS_TRACE_TOPAPMI;
 
 		/*
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index cd2ae14a0a98..276b29da732f 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -670,7 +670,9 @@ unlock:
 
 static inline void intel_pmu_drain_pebs_buffer(void)
 {
-	x86_pmu.drain_pebs(NULL);
+	struct perf_sample_data data;
+
+	x86_pmu.drain_pebs(NULL, &data);
 }
 
 /*
@@ -1719,19 +1721,20 @@ intel_pmu_save_and_restart_reload(struct perf_event *event, int count)
 	return 0;
 }
 
-static void __intel_pmu_pebs_event(struct perf_event *event,
-				   struct pt_regs *iregs,
-				   void *base, void *top,
-				   int bit, int count,
-				   void (*setup_sample)(struct perf_event *,
-						struct pt_regs *,
-						void *,
-						struct perf_sample_data *,
-						struct pt_regs *))
+static __always_inline void
+__intel_pmu_pebs_event(struct perf_event *event,
+		       struct pt_regs *iregs,
+		       struct perf_sample_data *data,
+		       void *base, void *top,
+		       int bit, int count,
+		       void (*setup_sample)(struct perf_event *,
+					    struct pt_regs *,
+					    void *,
+					    struct perf_sample_data *,
+					    struct pt_regs *))
 {
 	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 	struct hw_perf_event *hwc = &event->hw;
-	struct perf_sample_data data;
 	struct x86_perf_regs perf_regs;
 	struct pt_regs *regs = &perf_regs.regs;
 	void *at = get_next_pebs_record_by_bit(base, top, bit);
@@ -1752,14 +1755,14 @@ static void __intel_pmu_pebs_event(struct perf_event *event,
 		iregs = &dummy_iregs;
 
 	while (count > 1) {
-		setup_sample(event, iregs, at, &data, regs);
-		perf_event_output(event, &data, regs);
+		setup_sample(event, iregs, at, data, regs);
+		perf_event_output(event, data, regs);
 		at += cpuc->pebs_record_size;
 		at = get_next_pebs_record_by_bit(at, top, bit);
 		count--;
 	}
 
-	setup_sample(event, iregs, at, &data, regs);
+	setup_sample(event, iregs, at, data, regs);
 	if (iregs == &dummy_iregs) {
 		/*
 		 * The PEBS records may be drained in the non-overflow context,
@@ -1767,18 +1770,18 @@ static void __intel_pmu_pebs_event(struct perf_event *event,
 		 * last record the same as other PEBS records, and doesn't
 		 * invoke the generic overflow handler.
 		 */
-		perf_event_output(event, &data, regs);
+		perf_event_output(event, data, regs);
 	} else {
 		/*
 		 * All but the last records are processed.
 		 * The last one is left to be able to call the overflow handler.
 		 */
-		if (perf_event_overflow(event, &data, regs))
+		if (perf_event_overflow(event, data, regs))
 			x86_pmu_stop(event, 0);
 	}
 }
 
-static void intel_pmu_drain_pebs_core(struct pt_regs *iregs)
+static void intel_pmu_drain_pebs_core(struct pt_regs *iregs, struct perf_sample_data *data)
 {
 	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 	struct debug_store *ds = cpuc->ds;
@@ -1812,7 +1815,7 @@ static void intel_pmu_drain_pebs_core(struct pt_regs *iregs)
 		return;
 	}
 
-	__intel_pmu_pebs_event(event, iregs, at, top, 0, n,
+	__intel_pmu_pebs_event(event, iregs, data, at, top, 0, n,
 			       setup_pebs_fixed_sample_data);
 }
 
@@ -1835,7 +1838,7 @@ static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, int
 	}
 }
 
-static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs)
+static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs, struct perf_sample_data *data)
 {
 	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 	struct debug_store *ds = cpuc->ds;
@@ -1942,14 +1945,14 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs)
 		}
 
 		if (counts[bit]) {
-			__intel_pmu_pebs_event(event, iregs, base,
+			__intel_pmu_pebs_event(event, iregs, data, base,
 					       top, bit, counts[bit],
 					       setup_pebs_fixed_sample_data);
 		}
 	}
 }
 
-static void intel_pmu_drain_pebs_icl(struct pt_regs *iregs)
+static void intel_pmu_drain_pebs_icl(struct pt_regs *iregs, struct perf_sample_data *data)
 {
 	short counts[INTEL_PMC_IDX_FIXED + MAX_FIXED_PEBS_EVENTS] = {};
 	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
@@ -1997,7 +2000,7 @@ static void intel_pmu_drain_pebs_icl(struct pt_regs *iregs)
 		if (WARN_ON_ONCE(!event->attr.precise_ip))
 			continue;
 
-		__intel_pmu_pebs_event(event, iregs, base,
+		__intel_pmu_pebs_event(event, iregs, data, base,
 				       top, bit, counts[bit],
 				       setup_pebs_adaptive_sample_data);
 	}
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
index ee2b9b9fc2a5..1d1fe46552ba 100644
--- a/arch/x86/events/perf_event.h
+++ b/arch/x86/events/perf_event.h
@@ -727,7 +727,7 @@ struct x86_pmu {
 	int		pebs_record_size;
 	int		pebs_buffer_size;
 	int		max_pebs_events;
-	void		(*drain_pebs)(struct pt_regs *regs);
+	void		(*drain_pebs)(struct pt_regs *regs, struct perf_sample_data *data);
 	struct event_constraint *pebs_constraints;
 	void		(*pebs_aliases)(struct perf_event *event);
 	unsigned long	large_pebs_flags;
commit 267fb27352b6fc9fdbad753127a239f75618ecbc
Author: Peter Zijlstra <peterz at infradead.org>
Date:   Fri Oct 30 15:50:32 2020 +0100

    perf: Reduce stack usage of perf_output_begin()
    
    __perf_output_begin() has an on-stack struct perf_sample_data in the
    unlikely case it needs to generate a LOST record. However, every call
    to perf_output_begin() must already have a perf_sample_data on-stack.
    
    Reported-by: Thomas Gleixner <tglx at linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Link: https://lkml.kernel.org/r/20201030151954.985416146@infradead.org

diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c
index 9ed4fcccf8a9..7b25548ec42b 100644
--- a/arch/powerpc/perf/imc-pmu.c
+++ b/arch/powerpc/perf/imc-pmu.c
@@ -1336,7 +1336,7 @@ static void dump_trace_imc_data(struct perf_event *event)
 			/* If this is a valid record, create the sample */
 			struct perf_output_handle handle;
 
-			if (perf_output_begin(&handle, event, header.size))
+			if (perf_output_begin(&handle, &data, event, header.size))
 				return;
 
 			perf_output_sample(&handle, &header, &data, event);
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
index 4f9e4626df55..00255ae3979d 100644
--- a/arch/s390/kernel/perf_cpum_sf.c
+++ b/arch/s390/kernel/perf_cpum_sf.c
@@ -672,7 +672,7 @@ static void cpumsf_output_event_pid(struct perf_event *event,
 	rcu_read_lock();
 
 	perf_prepare_sample(&header, data, event, regs);
-	if (perf_output_begin(&handle, event, header.size))
+	if (perf_output_begin(&handle, data, event, header.size))
 		goto out;
 
 	/* Update the process ID (see also kernel/events/core.c) */
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index 404315df1e16..cd2ae14a0a98 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -642,8 +642,8 @@ int intel_pmu_drain_bts_buffer(void)
 	rcu_read_lock();
 	perf_prepare_sample(&header, &data, event, &regs);
 
-	if (perf_output_begin(&handle, event, header.size *
-			      (top - base - skip)))
+	if (perf_output_begin(&handle, &data, event,
+			      header.size * (top - base - skip)))
 		goto unlock;
 
 	for (at = base; at < top; at++) {
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 0c19d279b97f..b775ae0a8c87 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1400,11 +1400,14 @@ perf_event_addr_filters(struct perf_event *event)
 extern void perf_event_addr_filters_sync(struct perf_event *event);
 
 extern int perf_output_begin(struct perf_output_handle *handle,
+			     struct perf_sample_data *data,
 			     struct perf_event *event, unsigned int size);
 extern int perf_output_begin_forward(struct perf_output_handle *handle,
-				    struct perf_event *event,
-				    unsigned int size);
+				     struct perf_sample_data *data,
+				     struct perf_event *event,
+				     unsigned int size);
 extern int perf_output_begin_backward(struct perf_output_handle *handle,
+				      struct perf_sample_data *data,
 				      struct perf_event *event,
 				      unsigned int size);
 
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 5a29ab09e72d..fc681c7c1e03 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7186,6 +7186,7 @@ __perf_event_output(struct perf_event *event,
 		    struct perf_sample_data *data,
 		    struct pt_regs *regs,
 		    int (*output_begin)(struct perf_output_handle *,
+					struct perf_sample_data *,
 					struct perf_event *,
 					unsigned int))
 {
@@ -7198,7 +7199,7 @@ __perf_event_output(struct perf_event *event,
 
 	perf_prepare_sample(&header, data, event, regs);
 
-	err = output_begin(&handle, event, header.size);
+	err = output_begin(&handle, data, event, header.size);
 	if (err)
 		goto exit;
 
@@ -7264,7 +7265,7 @@ perf_event_read_event(struct perf_event *event,
 	int ret;
 
 	perf_event_header__init_id(&read_event.header, &sample, event);
-	ret = perf_output_begin(&handle, event, read_event.header.size);
+	ret = perf_output_begin(&handle, &sample, event, read_event.header.size);
 	if (ret)
 		return;
 
@@ -7533,7 +7534,7 @@ static void perf_event_task_output(struct perf_event *event,
 
 	perf_event_header__init_id(&task_event->event_id.header, &sample, event);
 
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				task_event->event_id.header.size);
 	if (ret)
 		goto out;
@@ -7636,7 +7637,7 @@ static void perf_event_comm_output(struct perf_event *event,
 		return;
 
 	perf_event_header__init_id(&comm_event->event_id.header, &sample, event);
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				comm_event->event_id.header.size);
 
 	if (ret)
@@ -7736,7 +7737,7 @@ static void perf_event_namespaces_output(struct perf_event *event,
 
 	perf_event_header__init_id(&namespaces_event->event_id.header,
 				   &sample, event);
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				namespaces_event->event_id.header.size);
 	if (ret)
 		goto out;
@@ -7863,7 +7864,7 @@ static void perf_event_cgroup_output(struct perf_event *event, void *data)
 
 	perf_event_header__init_id(&cgroup_event->event_id.header,
 				   &sample, event);
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				cgroup_event->event_id.header.size);
 	if (ret)
 		goto out;
@@ -7989,7 +7990,7 @@ static void perf_event_mmap_output(struct perf_event *event,
 	}
 
 	perf_event_header__init_id(&mmap_event->event_id.header, &sample, event);
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				mmap_event->event_id.header.size);
 	if (ret)
 		goto out;
@@ -8299,7 +8300,7 @@ void perf_event_aux_event(struct perf_event *event, unsigned long head,
 	int ret;
 
 	perf_event_header__init_id(&rec.header, &sample, event);
-	ret = perf_output_begin(&handle, event, rec.header.size);
+	ret = perf_output_begin(&handle, &sample, event, rec.header.size);
 
 	if (ret)
 		return;
@@ -8333,7 +8334,7 @@ void perf_log_lost_samples(struct perf_event *event, u64 lost)
 
 	perf_event_header__init_id(&lost_samples_event.header, &sample, event);
 
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				lost_samples_event.header.size);
 	if (ret)
 		return;
@@ -8388,7 +8389,7 @@ static void perf_event_switch_output(struct perf_event *event, void *data)
 
 	perf_event_header__init_id(&se->event_id.header, &sample, event);
 
-	ret = perf_output_begin(&handle, event, se->event_id.header.size);
+	ret = perf_output_begin(&handle, &sample, event, se->event_id.header.size);
 	if (ret)
 		return;
 
@@ -8463,7 +8464,7 @@ static void perf_log_throttle(struct perf_event *event, int enable)
 
 	perf_event_header__init_id(&throttle_event.header, &sample, event);
 
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				throttle_event.header.size);
 	if (ret)
 		return;
@@ -8506,7 +8507,7 @@ static void perf_event_ksymbol_output(struct perf_event *event, void *data)
 
 	perf_event_header__init_id(&ksymbol_event->event_id.header,
 				   &sample, event);
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, &sample, event,
 				ksymbol_event->event_id.header.size);
 	if (ret)
 		return;
@@ -8596,7 +8597,7 @@ static void perf_event_bpf_output(struct perf_event *event, void *data)
 
 	perf_event_header__init_id(&bpf_event->event_id.header,
 				   &sample, event);
-	ret = perf_output_begin(&handle, event,
+	ret = perf_output_begin(&handle, data, event,
 				bpf_event->event_id.header.size);
 	if (ret)
 		return;
@@ -8705,7 +8706,8 @@ static void perf_event_text_poke_output(struct perf_event *event, void *data)
 
 	perf_event_header__init_id(&text_poke_event->event_id.header, &sample, event);
 
-	ret = perf_output_begin(&handle, event, text_poke_event->event_id.header.size);
+	ret = perf_output_begin(&handle, &sample, event,
+				text_poke_event->event_id.header.size);
 	if (ret)
 		return;
 
@@ -8786,7 +8788,7 @@ static void perf_log_itrace_start(struct perf_event *event)
 	rec.tid	= perf_event_tid(event, current);
 
 	perf_event_header__init_id(&rec.header, &sample, event);
-	ret = perf_output_begin(&handle, event, rec.header.size);
+	ret = perf_output_begin(&handle, &sample, event, rec.header.size);
 
 	if (ret)
 		return;
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index 192b8abc6330..ef91ae75ca56 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -147,6 +147,7 @@ ring_buffer_has_space(unsigned long head, unsigned long tail,
 
 static __always_inline int
 __perf_output_begin(struct perf_output_handle *handle,
+		    struct perf_sample_data *data,
 		    struct perf_event *event, unsigned int size,
 		    bool backward)
 {
@@ -237,18 +238,16 @@ __perf_output_begin(struct perf_output_handle *handle,
 	handle->size = (1UL << page_shift) - offset;
 
 	if (unlikely(have_lost)) {
-		struct perf_sample_data sample_data;
-
 		lost_event.header.size = sizeof(lost_event);
 		lost_event.header.type = PERF_RECORD_LOST;
 		lost_event.header.misc = 0;
 		lost_event.id          = event->id;
 		lost_event.lost        = local_xchg(&rb->lost, 0);
 
-		perf_event_header__init_id(&lost_event.header,
-					   &sample_data, event);
+		/* XXX mostly redundant; @data is already fully initializes */
+		perf_event_header__init_id(&lost_event.header, data, event);
 		perf_output_put(handle, lost_event);
-		perf_event__output_id_sample(event, handle, &sample_data);
+		perf_event__output_id_sample(event, handle, data);
 	}
 
 	return 0;
@@ -263,22 +262,25 @@ out:
 }
 
 int perf_output_begin_forward(struct perf_output_handle *handle,
-			     struct perf_event *event, unsigned int size)
+			      struct perf_sample_data *data,
+			      struct perf_event *event, unsigned int size)
 {
-	return __perf_output_begin(handle, event, size, false);
+	return __perf_output_begin(handle, data, event, size, false);
 }
 
 int perf_output_begin_backward(struct perf_output_handle *handle,
+			       struct perf_sample_data *data,
 			       struct perf_event *event, unsigned int size)
 {
-	return __perf_output_begin(handle, event, size, true);
+	return __perf_output_begin(handle, data, event, size, true);
 }
 
 int perf_output_begin(struct perf_output_handle *handle,
+		      struct perf_sample_data *data,
 		      struct perf_event *event, unsigned int size)
 {
 
-	return __perf_output_begin(handle, event, size,
+	return __perf_output_begin(handle, data, event, size,
 				   unlikely(is_write_backward(event)));
 }
 
commit 9d516aa82b7d4fbe7f6303348697960ba03a530b
Author: Alexander Lobakin <alobakin at pm.me>
Date:   Wed Nov 4 15:31:36 2020 +0000

    virtio: virtio_console: fix DMA memory allocation for rproc serial
    
    Since commit 086d08725d34 ("remoteproc: create vdev subdevice with
    specific dma memory pool"), every remoteproc has a DMA subdevice
    ("remoteprocX#vdevYbuffer") for each virtio device, which inherits
    DMA capabilities from the corresponding platform device. This allowed
    to associate different DMA pools with each vdev, and required from
    virtio drivers to perform DMA operations with the parent device
    (vdev->dev.parent) instead of grandparent (vdev->dev.parent->parent).
    
    virtio_rpmsg_bus was already changed in the same merge cycle with
    commit d999b622fcfb ("rpmsg: virtio: allocate buffer from parent"),
    but virtio_console did not. In fact, operations using the grandparent
    worked fine while the grandparent was the platform device, but since
    commit c774ad010873 ("remoteproc: Fix and restore the parenting
    hierarchy for vdev") this was changed, and now the grandparent device
    is the remoteproc device without any DMA capabilities.
    So, starting v5.8-rc1 the following warning is observed:
    
    [    2.483925] ------------[ cut here ]------------
    [    2.489148] WARNING: CPU: 3 PID: 101 at kernel/dma/mapping.c:427 0x80e7eee8
    [    2.489152] Modules linked in: virtio_console(+)
    [    2.503737]  virtio_rpmsg_bus rpmsg_core
    [    2.508903]
    [    2.528898] <Other modules, stack and call trace here>
    [    2.913043]
    [    2.914907] ---[ end trace 93ac8746beab612c ]---
    [    2.920102] virtio-ports vport1p0: Error allocating inbufs
    
    kernel/dma/mapping.c:427 is:
    
    WARN_ON_ONCE(!dev->coherent_dma_mask);
    
    obviously because the grandparent now is remoteproc dev without any
    DMA caps:
    
    [    3.104943] Parent: remoteproc0#vdev1buffer, grandparent: remoteproc0
    
    Fix this the same way as it was for virtio_rpmsg_bus, using just the
    parent device (vdev->dev.parent, "remoteprocX#vdevYbuffer") for DMA
    operations.
    This also allows now to reserve DMA pools/buffers for rproc serial
    via Device Tree.
    
    Fixes: c774ad010873 ("remoteproc: Fix and restore the parenting hierarchy for vdev")
    Cc: stable at vger.kernel.org # 5.1+
    Reviewed-by: Mathieu Poirier <mathieu.poirier at linaro.org>
    Acked-by: Jason Wang <jasowang at redhat.com>
    Signed-off-by: Alexander Lobakin <alobakin at pm.me>
    Date: Thu, 5 Nov 2020 11:10:24 +0800
    Link: https://lore.kernel.org/r/AOKowLclCbOCKxyiJ71WeNyuAAj2q8EUtxrXbyky5E@cp7-web-042.plabs.ch
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index a2da8f768b94..1836cc56e357 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -435,12 +435,12 @@ static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size
 		/*
 		 * Allocate DMA memory from ancestor. When a virtio
 		 * device is created by remoteproc, the DMA memory is
-		 * associated with the grandparent device:
-		 * vdev => rproc => platform-dev.
+		 * associated with the parent device:
+		 * virtioY => remoteprocX#vdevYbuffer.
 		 */
-		if (!vdev->dev.parent || !vdev->dev.parent->parent)
+		buf->dev = vdev->dev.parent;
+		if (!buf->dev)
 			goto free_buf;
-		buf->dev = vdev->dev.parent->parent;
 
 		/* Increase device refcnt to avoid freeing it */
 		get_device(buf->dev);
commit 65c5a055b0d567b7e7639d942c0605da9cc54c5e
Author: Sagi Grimberg <sagi at grimberg.me>
Date:   Mon Nov 9 02:57:34 2020 -0800

    nvme: fix incorrect behavior when BLKROSET is called by the user
    
    The offending commit breaks BLKROSET ioctl because a device
    revalidation will blindly override BLKROSET setting. Hence,
    we remove the disk rw setting in case NVME_NS_ATTR_RO is cleared
    from by the controller.
    
    Fixes: 1293477f4f32 ("nvme: set gendisk read only based on nsattr")
    Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
    Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 40ca71b29bb9..9b01afcb7777 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2060,8 +2060,6 @@ static void nvme_update_disk_info(struct gendisk *disk,
 
 	if (id->nsattr & NVME_NS_ATTR_RO)
 		set_disk_ro(disk, true);
-	else
-		set_disk_ro(disk, false);
 }
 
 static inline bool nvme_first_scan(struct gendisk *disk)
commit 6d6a18fdde8b86b919b740ad629153de432d12a8
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Mon Nov 9 09:45:17 2020 -0500

    KVM: selftests: allow two iterations of dirty_log_perf_test
    
    Even though one iteration is not enough for the dirty log performance
    test (due to the cost of building page tables, zeroing memory etc.)
    two is okay and it is the default.  Without this patch,
    "./dirty_log_perf_test" without any further arguments fails.
    
    Cc: Ben Gardon <bgardon at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c
index cda7b000b1bc..85c9b8f73142 100644
--- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
@@ -359,7 +359,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	TEST_ASSERT(iterations > 2, "Iterations must be greater than two");
+	TEST_ASSERT(iterations >= 2, "The test should have at least two iterations");
 
 	pr_info("Test iterations: %"PRIu64"\n",	iterations);
 
commit 06ad8d339524bf94b89859047822c31df6ace239
Author: Thomas Zimmermann <tzimmermann at suse.de>
Date:   Thu Nov 5 20:02:56 2020 +0100

    drm/gma500: Fix out-of-bounds access to struct drm_device.vblank[]
    
    The gma500 driver expects 3 pipelines in several it's IRQ functions.
    Accessing struct drm_device.vblank[], this fails with devices that only
    have 2 pipelines. An example KASAN report is shown below.
    
      [   62.267688] ==================================================================
      [   62.268856] BUG: KASAN: slab-out-of-bounds in psb_irq_postinstall+0x250/0x3c0 [gma500_gfx]
      [   62.269450] Read of size 1 at addr ffff8880012bc6d0 by task systemd-udevd/285
      [   62.269949]
      [   62.270192] CPU: 0 PID: 285 Comm: systemd-udevd Tainted: G            E     5.10.0-rc1-1-default+ #572
      [   62.270807] Hardware name:  /DN2800MT, BIOS MTCDT10N.86A.0164.2012.1213.1024 12/13/2012
      [   62.271366] Call Trace:
      [   62.271705]  dump_stack+0xae/0xe5
      [   62.272180]  print_address_description.constprop.0+0x17/0xf0
      [   62.272987]  ? psb_irq_postinstall+0x250/0x3c0 [gma500_gfx]
      [   62.273474]  __kasan_report.cold+0x20/0x38
      [   62.273989]  ? psb_irq_postinstall+0x250/0x3c0 [gma500_gfx]
      [   62.274460]  kasan_report+0x3a/0x50
      [   62.274891]  psb_irq_postinstall+0x250/0x3c0 [gma500_gfx]
      [   62.275380]  drm_irq_install+0x131/0x1f0
      <...>
      [   62.300751] Allocated by task 285:
      [   62.301223]  kasan_save_stack+0x1b/0x40
      [   62.301731]  __kasan_kmalloc.constprop.0+0xbf/0xd0
      [   62.302293]  drmm_kmalloc+0x55/0x100
      [   62.302773]  drm_vblank_init+0x77/0x210
    
    Resolve the issue by only handling vblank entries up to the number of
    CRTCs.
    
    I'm adding a Fixes tag for reference, although the bug has been present
    since the driver's initial commit.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
    Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
    Fixes: 5c49fd3aa0ab ("gma500: Add the core DRM files and headers")
    Cc: Alan Cox <alan at linux.intel.com>
    Cc: Dave Airlie <airlied at redhat.com>
    Cc: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
    Cc: dri-devel at lists.freedesktop.org
    Cc: stable at vger.kernel.org#v3.3+
    Link: https://patchwork.freedesktop.org/patch/msgid/20201105190256.3893-1-tzimmermann@suse.de

diff --git a/drivers/gpu/drm/gma500/psb_irq.c b/drivers/gpu/drm/gma500/psb_irq.c
index 15eb3770d817..361e3a0c5ab6 100644
--- a/drivers/gpu/drm/gma500/psb_irq.c
+++ b/drivers/gpu/drm/gma500/psb_irq.c
@@ -347,6 +347,7 @@ int psb_irq_postinstall(struct drm_device *dev)
 {
 	struct drm_psb_private *dev_priv = dev->dev_private;
 	unsigned long irqflags;
+	unsigned int i;
 
 	spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
@@ -359,20 +360,12 @@ int psb_irq_postinstall(struct drm_device *dev)
 	PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	if (dev->vblank[0].enabled)
-		psb_enable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
-	else
-		psb_disable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
-
-	if (dev->vblank[1].enabled)
-		psb_enable_pipestat(dev_priv, 1, PIPE_VBLANK_INTERRUPT_ENABLE);
-	else
-		psb_disable_pipestat(dev_priv, 1, PIPE_VBLANK_INTERRUPT_ENABLE);
-
-	if (dev->vblank[2].enabled)
-		psb_enable_pipestat(dev_priv, 2, PIPE_VBLANK_INTERRUPT_ENABLE);
-	else
-		psb_disable_pipestat(dev_priv, 2, PIPE_VBLANK_INTERRUPT_ENABLE);
+	for (i = 0; i < dev->num_crtcs; ++i) {
+		if (dev->vblank[i].enabled)
+			psb_enable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
+		else
+			psb_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
+	}
 
 	if (dev_priv->ops->hotplug_enable)
 		dev_priv->ops->hotplug_enable(dev, true);
@@ -385,6 +378,7 @@ void psb_irq_uninstall(struct drm_device *dev)
 {
 	struct drm_psb_private *dev_priv = dev->dev_private;
 	unsigned long irqflags;
+	unsigned int i;
 
 	spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
@@ -393,14 +387,10 @@ void psb_irq_uninstall(struct drm_device *dev)
 
 	PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-	if (dev->vblank[0].enabled)
-		psb_disable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
-
-	if (dev->vblank[1].enabled)
-		psb_disable_pipestat(dev_priv, 1, PIPE_VBLANK_INTERRUPT_ENABLE);
-
-	if (dev->vblank[2].enabled)
-		psb_disable_pipestat(dev_priv, 2, PIPE_VBLANK_INTERRUPT_ENABLE);
+	for (i = 0; i < dev->num_crtcs; ++i) {
+		if (dev->vblank[i].enabled)
+			psb_disable_pipestat(dev_priv, i, PIPE_VBLANK_INTERRUPT_ENABLE);
+	}
 
 	dev_priv->vdc_irq_mask &= _PSB_IRQ_SGX_FLAG |
 				  _PSB_IRQ_MSVDX_FLAG |
commit 7372e79c9eb9d7034e498721eb2861ae4fdbc618
Author: Amir Goldstein <amir73il at gmail.com>
Date:   Sun Nov 8 12:59:06 2020 +0200

    fanotify: fix logic of reporting name info with watched parent
    
    The victim inode's parent and name info is required when an event
    needs to be delivered to a group interested in filename info OR
    when the inode's parent is interested in an event on its children.
    
    Let us call the first condition 'parent_needed' and the second
    condition 'parent_interested'.
    
    In fsnotify_parent(), the condition where the inode's parent is
    interested in some events on its children, but not necessarily
    interested the specific event is called 'parent_watched'.
    
    fsnotify_parent() tests the condition (!parent_watched && !parent_needed)
    for sending the event without parent and name info, which is correct.
    
    It then wrongly assumes that parent_watched implies !parent_needed
    and tests the condition (parent_watched && !parent_interested)
    for sending the event without parent and name info, which is wrong,
    because parent may still be needed by some group.
    
    For example, after initializing a group with FAN_REPORT_DFID_NAME and
    adding a FAN_MARK_MOUNT with FAN_OPEN mask, open events on non-directory
    children of "testdir" are delivered with file name info.
    
    After adding another mark to the same group on the parent "testdir"
    with FAN_CLOSE|FAN_EVENT_ON_CHILD mask, open events on non-directory
    children of "testdir" are no longer delivered with file name info.
    
    Fix the logic and use auxiliary variables to clarify the conditions.
    
    Fixes: 9b93f33105f5 ("fsnotify: send event with parent/name info to sb/mount/non-dir marks")
    Cc: stable at vger.kernel.org#v5.9
    Link: https://lore.kernel.org/r/20201108105906.8493-1-amir73il@gmail.com
    Signed-off-by: Amir Goldstein <amir73il at gmail.com>
    Signed-off-by: Jan Kara <jack at suse.cz>

diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c
index a960ec3a569a..8d3ad5ef2925 100644
--- a/fs/notify/fsnotify.c
+++ b/fs/notify/fsnotify.c
@@ -178,6 +178,7 @@ int __fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data,
 	struct inode *inode = d_inode(dentry);
 	struct dentry *parent;
 	bool parent_watched = dentry->d_flags & DCACHE_FSNOTIFY_PARENT_WATCHED;
+	bool parent_needed, parent_interested;
 	__u32 p_mask;
 	struct inode *p_inode = NULL;
 	struct name_snapshot name;
@@ -193,7 +194,8 @@ int __fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data,
 		return 0;
 
 	parent = NULL;
-	if (!parent_watched && !fsnotify_event_needs_parent(inode, mnt, mask))
+	parent_needed = fsnotify_event_needs_parent(inode, mnt, mask);
+	if (!parent_watched && !parent_needed)
 		goto notify;
 
 	/* Does parent inode care about events on children? */
@@ -205,17 +207,17 @@ int __fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data,
 
 	/*
 	 * Include parent/name in notification either if some notification
-	 * groups require parent info (!parent_watched case) or the parent is
-	 * interested in this event.
+	 * groups require parent info or the parent is interested in this event.
 	 */
-	if (!parent_watched || (mask & p_mask & ALL_FSNOTIFY_EVENTS)) {
+	parent_interested = mask & p_mask & ALL_FSNOTIFY_EVENTS;
+	if (parent_needed || parent_interested) {
 		/* When notifying parent, child should be passed as data */
 		WARN_ON_ONCE(inode != fsnotify_data_inode(data, data_type));
 
 		/* Notify both parent and child with child name info */
 		take_dentry_name_snapshot(&name, dentry);
 		file_name = &name.name;
-		if (parent_watched)
+		if (parent_interested)
 			mask |= FS_EVENT_ON_CHILD;
 	}
 
commit 65cae18882f943215d0505ddc7e70495877308e6
Author: Brian Masney <bmasney at redhat.com>
Date:   Fri Nov 6 20:11:19 2020 -0500

    x86/xen: don't unbind uninitialized lock_kicker_irq
    
    When booting a hyperthreaded system with the kernel parameter
    'mitigations=auto,nosmt', the following warning occurs:
    
        WARNING: CPU: 0 PID: 1 at drivers/xen/events/events_base.c:1112 unbind_from_irqhandler+0x4e/0x60
        ...
        Hardware name: Xen HVM domU, BIOS 4.2.amazon 08/24/2006
        ...
        Call Trace:
         xen_uninit_lock_cpu+0x28/0x62
         xen_hvm_cpu_die+0x21/0x30
         takedown_cpu+0x9c/0xe0
         ? trace_suspend_resume+0x60/0x60
         cpuhp_invoke_callback+0x9a/0x530
         _cpu_up+0x11a/0x130
         cpu_up+0x7e/0xc0
         bringup_nonboot_cpus+0x48/0x50
         smp_init+0x26/0x79
         kernel_init_freeable+0xea/0x229
         ? rest_init+0xaa/0xaa
         kernel_init+0xa/0x106
         ret_from_fork+0x35/0x40
    
    The secondary CPUs are not activated with the nosmt mitigations and only
    the primary thread on each CPU core is used. In this situation,
    xen_hvm_smp_prepare_cpus(), and more importantly xen_init_lock_cpu(), is
    not called, so the lock_kicker_irq is not initialized for the secondary
    CPUs. Let's fix this by exiting early in xen_uninit_lock_cpu() if the
    irq is not set to avoid the warning from above for each secondary CPU.
    
    Signed-off-by: Brian Masney <bmasney at redhat.com>
    Link: https://lore.kernel.org/r/20201107011119.631442-1-bmasney@redhat.com
    Reviewed-by: Juergen Gross <jgross at suse.com>
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky at oracle.com>

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 799f4eba0a62..043c73dfd2c9 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -93,10 +93,20 @@ void xen_init_lock_cpu(int cpu)
 
 void xen_uninit_lock_cpu(int cpu)
 {
+	int irq;
+
 	if (!xen_pvspin)
 		return;
 
-	unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
+	/*
+	 * When booting the kernel with 'mitigations=auto,nosmt', the secondary
+	 * CPUs are not activated, and lock_kicker_irq is not initialized.
+	 */
+	irq = per_cpu(lock_kicker_irq, cpu);
+	if (irq == -1)
+		return;
+
+	unbind_from_irqhandler(irq, NULL);
 	per_cpu(lock_kicker_irq, cpu) = -1;
 	kfree(per_cpu(irq_name, cpu));
 	per_cpu(irq_name, cpu) = NULL;
commit f4c7fa39415da6db1fa0bc26162ac23a0fbae8bb
Author: Marek Vasut <marex at denx.de>
Date:   Thu Oct 29 20:46:52 2020 +0100

    ARM: dts: stm32: Keep VDDA LDO1 always on on DHCOM
    
    The VDDA LDO1 PMIC output supplies the analog VDDA input of the
    STM32MP1 on DHCOM, keep it always on, otherwise there could be
    leakage through the SoC.
    
    Fixes: 34e0c7847dcf ("ARM: dts: stm32: Add DH Electronics DHCOM STM32MP1 SoM and PDK2 board")
    Signed-off-by: Marek Vasut <marex at denx.de>
    Cc: Alexandre Torgue <alexandre.torgue at st.com>
    Cc: Maxime Coquelin <mcoquelin.stm32 at gmail.com>
    Cc: Patrice Chotard <patrice.chotard at st.com>
    Cc: Patrick Delaunay <patrick.delaunay at st.com>
    Cc: linux-stm32 at st-md-mailman.stormreply.com
    To: linux-arm-kernel at lists.infradead.org
    Signed-off-by: Alexandre Torgue <alexandre.torgue at st.com>

diff --git a/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi b/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
index c89ebfaa115d..f796a6150313 100644
--- a/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
@@ -203,6 +203,7 @@
 
 			vdda: ldo1 {
 				regulator-name = "vdda";
+				regulator-always-on;
 				regulator-min-microvolt = <2900000>;
 				regulator-max-microvolt = <2900000>;
 				interrupts = <IT_CURLIM_LDO1 0>;
commit e5ace7f62695656ef8a66ad5a4c3edd055894876
Author: Marek Vasut <marex at denx.de>
Date:   Thu Sep 24 01:25:35 2020 +0200

    ARM: dts: stm32: Enable thermal sensor support on stm32mp15xx-dhcor
    
    Enable STM32 Digital Thermal Sensor driver for stm32mp15xx-dhcor SoMs.
    
    Fixes: 94cafe1b6482 ("ARM: dts: stm32: Add Avenger96 devicetree support based on STM32MP157A")
    Signed-off-by: Marek Vasut <marex at denx.de>
    Cc: Alexandre Torgue <alexandre.torgue at st.com>
    Cc: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
    Cc: linux-stm32 at st-md-mailman.stormreply.com
    To: linux-arm-kernel at lists.infradead.org
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
    Signed-off-by: Alexandre Torgue <alexandre.torgue at st.com>

diff --git a/arch/arm/boot/dts/stm32mp15xx-dhcor-som.dtsi b/arch/arm/boot/dts/stm32mp15xx-dhcor-som.dtsi
index 04fbb324a541..803eb8bc9c85 100644
--- a/arch/arm/boot/dts/stm32mp15xx-dhcor-som.dtsi
+++ b/arch/arm/boot/dts/stm32mp15xx-dhcor-som.dtsi
@@ -21,6 +21,10 @@
 	};
 };
 
+&dts {
+	status = "okay";
+};
+
 &i2c4 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&i2c4_pins_a>;
commit cb7ff314e1d9f3d6c62fa2c392e41174721ed0b3
Author: Jon Hunter <jonathanh at nvidia.com>
Date:   Fri Nov 6 09:14:20 2020 +0000

    drm/tegra: sor: Don't warn on probe deferral
    
    Deferred probe is an expected return value for tegra_output_probe().
    Given that the driver deals with it properly, there's no need to output
    a warning that may potentially confuse users.
    
    Signed-off-by: Jon Hunter <jonathanh at nvidia.com>
    Signed-off-by: Thierry Reding <treding at nvidia.com>

diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
index e88a17c2937f..a5b944dacb35 100644
--- a/drivers/gpu/drm/tegra/sor.c
+++ b/drivers/gpu/drm/tegra/sor.c
@@ -3764,10 +3764,9 @@ static int tegra_sor_probe(struct platform_device *pdev)
 		return err;
 
 	err = tegra_output_probe(&sor->output);
-	if (err < 0) {
-		dev_err(&pdev->dev, "failed to probe output: %d\n", err);
-		return err;
-	}
+	if (err < 0)
+		return dev_err_probe(&pdev->dev, err,
+				     "failed to probe output\n");
 
 	if (sor->ops && sor->ops->probe) {
 		err = sor->ops->probe(sor);
commit 1e106aa3509b86738769775969822ffc1ec21bf4
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Nov 6 11:52:05 2020 +0300

    futex: Don't enable IRQs unconditionally in put_pi_state()
    
    The exit_pi_state_list() function calls put_pi_state() with IRQs disabled
    and is not expecting that IRQs will be enabled inside the function.
    
    Use the _irqsave() variant so that IRQs are restored to the original state
    instead of being enabled unconditionally.
    
    Fixes: 153fbd1226fb ("futex: Fix more put_pi_state() vs. exit_pi_state_list() races")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
    Acked-by: Peter Zijlstra (Intel) <peterz at infradead.org>
    Cc: stable at vger.kernel.org
    Link: https://lore.kernel.org/r/20201106085205.GA1159983@mwanda

diff --git a/kernel/futex.c b/kernel/futex.c
index ac328874f6e5..00259c7e288e 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -788,8 +788,9 @@ static void put_pi_state(struct futex_pi_state *pi_state)
 	 */
 	if (pi_state->owner) {
 		struct task_struct *owner;
+		unsigned long flags;
 
-		raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
+		raw_spin_lock_irqsave(&pi_state->pi_mutex.wait_lock, flags);
 		owner = pi_state->owner;
 		if (owner) {
 			raw_spin_lock(&owner->pi_lock);
@@ -797,7 +798,7 @@ static void put_pi_state(struct futex_pi_state *pi_state)
 			raw_spin_unlock(&owner->pi_lock);
 		}
 		rt_mutex_proxy_unlock(&pi_state->pi_mutex, owner);
-		raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+		raw_spin_unlock_irqrestore(&pi_state->pi_mutex.wait_lock, flags);
 	}
 
 	if (current->pi_state_cache) {
commit 1f3d7fc279b1a299bb8b1b225d80309a2062ab8a
Author: Marek Vasut <marex at denx.de>
Date:   Thu Oct 29 20:46:17 2020 +0100

    ARM: dts: stm32: Define VIO regulator supply on DHCOM
    
    The VIO regulator is supplied by PMIC Buck3, describe this in the DT.
    
    Fixes: 34e0c7847dcf ("ARM: dts: stm32: Add DH Electronics DHCOM STM32MP1 SoM and PDK2 board")
    Signed-off-by: Marek Vasut <marex at denx.de>
    Cc: Alexandre Torgue <alexandre.torgue at st.com>
    Cc: Maxime Coquelin <mcoquelin.stm32 at gmail.com>
    Cc: Patrice Chotard <patrice.chotard at st.com>
    Cc: Patrick Delaunay <patrick.delaunay at st.com>
    Cc: linux-stm32 at st-md-mailman.stormreply.com
    To: linux-arm-kernel at lists.infradead.org
    Signed-off-by: Alexandre Torgue <alexandre.torgue at st.com>

diff --git a/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi b/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
index b4b52cf634af..c89ebfaa115d 100644
--- a/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
@@ -68,6 +68,7 @@
 		gpio = <&gpiog 3 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 		regulator-boot-on;
+		vin-supply = <&vdd>;
 	};
 };
 
commit 7e5f3155dcbb4d724386b30cc232002d9b9d81f5
Author: Marek Vasut <marex at denx.de>
Date:   Wed Oct 28 21:46:17 2020 +0100

    ARM: dts: stm32: Fix LED5 on STM32MP1 DHCOM PDK2
    
    On the prototype DHCOM, the LED5 was connected to pin PG2 of the
    STM32MP15xx, however on the production SoM this was changed to pin
    PC6. Update the connection in the DT.
    
    Fixes: 81d5fc719798 ("ARM: dts: stm32: Add GPIO LEDs for STM32MP1 DHCOM PDK2")
    Signed-off-by: Marek Vasut <marex at denx.de>
    Cc: Alexandre Torgue <alexandre.torgue at st.com>
    Cc: Maxime Coquelin <mcoquelin.stm32 at gmail.com>
    Cc: Patrice Chotard <patrice.chotard at st.com>
    Cc: Patrick Delaunay <patrick.delaunay at st.com>
    Cc: linux-stm32 at st-md-mailman.stormreply.com
    To: linux-arm-kernel at lists.infradead.org
    Signed-off-by: Alexandre Torgue <alexandre.torgue at st.com>

diff --git a/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi b/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
index 9a0a59678097..8456f172d4b1 100644
--- a/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
+++ b/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
@@ -82,7 +82,7 @@
 
 		led-0 {
 			label = "green:led5";
-			gpios = <&gpiog 2 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpioc 6 GPIO_ACTIVE_HIGH>;
 			default-state = "off";
 		};
 
commit 52d9edbe6efc5042cf57fae6a25d07572ddf398b
Author: Marek Vasut <marex at denx.de>
Date:   Thu Oct 8 21:35:38 2020 +0200

    ARM: dts: stm32: Fix TA3-GPIO-C key on STM32MP1 DHCOM PDK2
    
    On the prototype DHCOM, the TA3-GPIO-C button was connected to pin PI11 of
    the STM32MP15xx, however on the production SoM this was changed to pin PG0
    to free up the IRQ line 11 for LAN8710i PHY IRQ. Update the connection in
    the DT. Since the IRQ line 0 is used for PMIC as well and cannot be shared
    with the button, make the button polled.
    
    Fixes: 87cabf9405cb ("ARM: dts: stm32: Add GPIO keys for STM32MP1 DHCOM PDK2")
    Signed-off-by: Marek Vasut <marex at denx.de>
    Cc: Alexandre Torgue <alexandre.torgue at st.com>
    Cc: Maxime Coquelin <mcoquelin.stm32 at gmail.com>
    Cc: Patrice Chotard <patrice.chotard at st.com>
    Cc: Patrick Delaunay <patrick.delaunay at st.com>
    Cc: linux-stm32 at st-md-mailman.stormreply.com
    To: linux-arm-kernel at lists.infradead.org
    Signed-off-by: Alexandre Torgue <alexandre.torgue at st.com>

diff --git a/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi b/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
index 5dff24e39af8..9a0a59678097 100644
--- a/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
+++ b/arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
@@ -46,6 +46,16 @@
 			linux,code = <KEY_A>;
 			gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;
 		};
+
+		/*
+		 * The EXTi IRQ line 0 is shared with PMIC,
+		 * so mark this as polled GPIO key.
+		 */
+		button-2 {
+			label = "TA3-GPIO-C";
+			linux,code = <KEY_C>;
+			gpios = <&gpiog 0 GPIO_ACTIVE_LOW>;
+		};
 	};
 
 	gpio-keys {
@@ -59,13 +69,6 @@
 			wakeup-source;
 		};
 
-		button-2 {
-			label = "TA3-GPIO-C";
-			linux,code = <KEY_C>;
-			gpios = <&gpioi 11 GPIO_ACTIVE_LOW>;
-			wakeup-source;
-		};
-
 		button-3 {
 			label = "TA4-GPIO-D";
 			linux,code = <KEY_D>;
commit 96d5d884f78306206d745d856aad322becd100c3
Author: Matthew Murrian <matthew.murrian at goctsi.com>
Date:   Wed Nov 4 12:30:06 2020 +0530

    dmaengine: xilinx_dma: Fix SG capability check for MCDMA
    
    The SG capability is inherently present with Multichannel DMA operation.
    The register used to check for this capability with other DMA driver types
    is not defined for MCDMA.
    
    Fixes: 6ccd692bfb7f ("dmaengine: xilinx_dma: Add Xilinx AXI MCDMA Engine driver support")
    Signed-off-by: Matthew Murrian <matthew.murrian at goctsi.com>
    Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey at xilinx.com>
    Link: https://lore.kernel.org/r/1604473206-32573-4-git-send-email-radhey.shyam.pandey@xilinx.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
index 9fd924cf2337..22faea653ea8 100644
--- a/drivers/dma/xilinx/xilinx_dma.c
+++ b/drivers/dma/xilinx/xilinx_dma.c
@@ -2855,10 +2855,11 @@ static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev,
 		chan->stop_transfer = xilinx_dma_stop_transfer;
 	}
 
-	/* check if SG is enabled (only for AXIDMA and CDMA) */
+	/* check if SG is enabled (only for AXIDMA, AXIMCDMA, and CDMA) */
 	if (xdev->dma_config->dmatype != XDMA_TYPE_VDMA) {
-		if (dma_ctrl_read(chan, XILINX_DMA_REG_DMASR) &
-		    XILINX_DMA_DMASR_SG_MASK)
+		if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA ||
+		    dma_ctrl_read(chan, XILINX_DMA_REG_DMASR) &
+			    XILINX_DMA_DMASR_SG_MASK)
 			chan->has_sg = true;
 		dev_dbg(chan->dev, "ch %d: SG %s\n", chan->id,
 			chan->has_sg ? "enabled" : "disabled");
commit c8ae7932997d0cc92d016829138074c7520248e5
Author: Matthew Murrian <matthew.murrian at goctsi.com>
Date:   Wed Nov 4 12:30:05 2020 +0530

    dmaengine: xilinx_dma: Fix usage of xilinx_aximcdma_tx_segment
    
    Several code sections incorrectly use struct xilinx_axidma_tx_segment
    instead of struct xilinx_aximcdma_tx_segment when operating as
    Multichannel DMA. As their structures are similar, this just works.
    
    Fixes: 6ccd692bfb7f ("dmaengine: xilinx_dma: Add Xilinx AXI MCDMA Engine driver support")
    Signed-off-by: Matthew Murrian <matthew.murrian at goctsi.com>
    Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey at xilinx.com>
    Link: https://lore.kernel.org/r/1604473206-32573-3-git-send-email-radhey.shyam.pandey@xilinx.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
index d858d540b88a..9fd924cf2337 100644
--- a/drivers/dma/xilinx/xilinx_dma.c
+++ b/drivers/dma/xilinx/xilinx_dma.c
@@ -948,8 +948,10 @@ static u32 xilinx_dma_get_residue(struct xilinx_dma_chan *chan,
 {
 	struct xilinx_cdma_tx_segment *cdma_seg;
 	struct xilinx_axidma_tx_segment *axidma_seg;
+	struct xilinx_aximcdma_tx_segment *aximcdma_seg;
 	struct xilinx_cdma_desc_hw *cdma_hw;
 	struct xilinx_axidma_desc_hw *axidma_hw;
+	struct xilinx_aximcdma_desc_hw *aximcdma_hw;
 	struct list_head *entry;
 	u32 residue = 0;
 
@@ -961,13 +963,23 @@ static u32 xilinx_dma_get_residue(struct xilinx_dma_chan *chan,
 			cdma_hw = &cdma_seg->hw;
 			residue += (cdma_hw->control - cdma_hw->status) &
 				   chan->xdev->max_buffer_len;
-		} else {
+		} else if (chan->xdev->dma_config->dmatype ==
+			   XDMA_TYPE_AXIDMA) {
 			axidma_seg = list_entry(entry,
 						struct xilinx_axidma_tx_segment,
 						node);
 			axidma_hw = &axidma_seg->hw;
 			residue += (axidma_hw->control - axidma_hw->status) &
 				   chan->xdev->max_buffer_len;
+		} else {
+			aximcdma_seg =
+				list_entry(entry,
+					   struct xilinx_aximcdma_tx_segment,
+					   node);
+			aximcdma_hw = &aximcdma_seg->hw;
+			residue +=
+				(aximcdma_hw->control - aximcdma_hw->status) &
+				chan->xdev->max_buffer_len;
 		}
 	}
 
@@ -1135,7 +1147,7 @@ static int xilinx_dma_alloc_chan_resources(struct dma_chan *dchan)
 			upper_32_bits(chan->seg_p + sizeof(*chan->seg_mv) *
 				((i + 1) % XILINX_DMA_NUM_DESCS));
 			chan->seg_mv[i].phys = chan->seg_p +
-				sizeof(*chan->seg_v) * i;
+				sizeof(*chan->seg_mv) * i;
 			list_add_tail(&chan->seg_mv[i].node,
 				      &chan->free_seg_list);
 		}
@@ -1560,7 +1572,7 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan)
 static void xilinx_mcdma_start_transfer(struct xilinx_dma_chan *chan)
 {
 	struct xilinx_dma_tx_descriptor *head_desc, *tail_desc;
-	struct xilinx_axidma_tx_segment *tail_segment;
+	struct xilinx_aximcdma_tx_segment *tail_segment;
 	u32 reg;
 
 	/*
@@ -1582,7 +1594,7 @@ static void xilinx_mcdma_start_transfer(struct xilinx_dma_chan *chan)
 	tail_desc = list_last_entry(&chan->pending_list,
 				    struct xilinx_dma_tx_descriptor, node);
 	tail_segment = list_last_entry(&tail_desc->segments,
-				       struct xilinx_axidma_tx_segment, node);
+				       struct xilinx_aximcdma_tx_segment, node);
 
 	reg = dma_ctrl_read(chan, XILINX_MCDMA_CHAN_CR_OFFSET(chan->tdest));
 
@@ -1864,6 +1876,7 @@ static void append_desc_queue(struct xilinx_dma_chan *chan,
 	struct xilinx_vdma_tx_segment *tail_segment;
 	struct xilinx_dma_tx_descriptor *tail_desc;
 	struct xilinx_axidma_tx_segment *axidma_tail_segment;
+	struct xilinx_aximcdma_tx_segment *aximcdma_tail_segment;
 	struct xilinx_cdma_tx_segment *cdma_tail_segment;
 
 	if (list_empty(&chan->pending_list))
@@ -1885,11 +1898,17 @@ static void append_desc_queue(struct xilinx_dma_chan *chan,
 						struct xilinx_cdma_tx_segment,
 						node);
 		cdma_tail_segment->hw.next_desc = (u32)desc->async_tx.phys;
-	} else {
+	} else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) {
 		axidma_tail_segment = list_last_entry(&tail_desc->segments,
 					       struct xilinx_axidma_tx_segment,
 					       node);
 		axidma_tail_segment->hw.next_desc = (u32)desc->async_tx.phys;
+	} else {
+		aximcdma_tail_segment =
+			list_last_entry(&tail_desc->segments,
+					struct xilinx_aximcdma_tx_segment,
+					node);
+		aximcdma_tail_segment->hw.next_desc = (u32)desc->async_tx.phys;
 	}
 
 	/*
commit 0ba2df09f1500d3f27398a3382b86d39c3e6abe2
Author: Marc Ferland <ferlandm at amotus.ca>
Date:   Wed Nov 4 12:30:04 2020 +0530

    dmaengine: xilinx_dma: use readl_poll_timeout_atomic variant
    
    The xilinx_dma_poll_timeout macro is sometimes called while holding a
    spinlock (see xilinx_dma_issue_pending() for an example) this means we
    shouldn't sleep when polling the dma channel registers. To address it
    in xilinx poll timeout macro use readl_poll_timeout_atomic instead of
    readl_poll_timeout variant.
    
    Signed-off-by: Marc Ferland <ferlandm at amotus.ca>
    Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey at xilinx.com>
    Link: https://lore.kernel.org/r/1604473206-32573-2-git-send-email-radhey.shyam.pandey@xilinx.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
index ecff35402860..d858d540b88a 100644
--- a/drivers/dma/xilinx/xilinx_dma.c
+++ b/drivers/dma/xilinx/xilinx_dma.c
@@ -517,8 +517,8 @@ struct xilinx_dma_device {
 #define to_dma_tx_descriptor(tx) \
 	container_of(tx, struct xilinx_dma_tx_descriptor, async_tx)
 #define xilinx_dma_poll_timeout(chan, reg, val, cond, delay_us, timeout_us) \
-	readl_poll_timeout(chan->xdev->regs + chan->ctrl_offset + reg, val, \
-			   cond, delay_us, timeout_us)
+	readl_poll_timeout_atomic(chan->xdev->regs + chan->ctrl_offset + reg, \
+				  val, cond, delay_us, timeout_us)
 
 /* IO accessors */
 static inline u32 dma_read(struct xilinx_dma_chan *chan, u32 reg)
commit f59ee399de4a8ca4d7d19cdcabb4b63e94867f09
Author: Chris Ye <lzye at google.com>
Date:   Sun Nov 1 11:34:52 2020 -0800

    HID: add HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE for Gamevice devices
    
    Kernel 5.4 introduces HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE, devices need to
    be set explicitly with this flag.
    
    Signed-off-by: Chris Ye <lzye at google.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 28ecd635edc1..af361cd04bf0 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -445,6 +445,10 @@
 #define USB_VENDOR_ID_FRUCTEL	0x25B6
 #define USB_DEVICE_ID_GAMETEL_MT_MODE	0x0002
 
+#define USB_VENDOR_ID_GAMEVICE	0x27F8
+#define USB_DEVICE_ID_GAMEVICE_GV186	0x0BBE
+#define USB_DEVICE_ID_GAMEVICE_KISHI	0x0BBF
+
 #define USB_VENDOR_ID_GAMERON		0x0810
 #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR	0x0001
 #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR	0x0002
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index b154e11d43bf..bf7ecab5d9e5 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -85,6 +85,10 @@ static const struct hid_device_id hid_quirks[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_FUTABA, USB_DEVICE_ID_LED_DISPLAY), HID_QUIRK_NO_INIT_REPORTS },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR), HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD), HID_QUIRK_MULTI_INPUT },
+	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_GAMEVICE, USB_DEVICE_ID_GAMEVICE_GV186),
+		HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMEVICE, USB_DEVICE_ID_GAMEVICE_KISHI),
+		HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
commit 7de8bfaa095fcbc2db2952d4b561be102a41c2a6
Author: Lad Prabhakar <prabhakar.mahadev-lad.rj at bp.renesas.com>
Date:   Wed Nov 4 10:55:08 2020 +0000

    arm64: dts: renesas: r8a774e1: Add missing audio_clk_b
    
    Add audio_clk_b configured as 0 Hz, this will be overridden by the
    boards providing the audio clock.
    
    Fixes: 8183a7938cfec ("arm64: dts: renesas: r8a774e1: Add audio support")
    Reported-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu at toshiba.co.jp>
    Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj at bp.renesas.com>
    Link: https://lore.kernel.org/r/20201104105508.21197-1-prabhakar.mahadev-lad.rj@bp.renesas.com
    Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>

diff --git a/arch/arm64/boot/dts/renesas/r8a774e1.dtsi b/arch/arm64/boot/dts/renesas/r8a774e1.dtsi
index 9cbf963aa068..c29643442e91 100644
--- a/arch/arm64/boot/dts/renesas/r8a774e1.dtsi
+++ b/arch/arm64/boot/dts/renesas/r8a774e1.dtsi
@@ -28,6 +28,12 @@
 		clock-frequency = <0>;
 	};
 
+	audio_clk_b: audio_clk_b {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <0>;
+	};
+
 	audio_clk_c: audio_clk_c {
 		compatible = "fixed-clock";
 		#clock-cells = <0>;
commit ce9dfafe29bed86fe3cda330ac6072ce84e1ff81
Author: Heiko Carstens <hca at linux.ibm.com>
Date:   Tue Nov 3 16:55:43 2020 +0100

    s390: fix system call exit path
    
    The system call exit path is running with interrupts enabled while
    checking for TIF/PIF/CIF bits which require special handling. If all
    bits have been checked interrupts are disabled and the kernel exits to
    user space.
    The problem is that after checking all bits and before interrupts are
    disabled bits can be set already again, due to interrupt handling.
    
    This means that the kernel can exit to user space with some
    TIF/PIF/CIF bits set, which should never happen. E.g. TIF_NEED_RESCHED
    might be set, which might lead to additional latencies, since that bit
    will only be recognized with next exit to user space.
    
    Fix this by checking the corresponding bits only when interrupts are
    disabled.
    
    Fixes: 0b0ed657fe00 ("s390: remove critical section cleanup from entry.S")
    Cc: <stable at vger.kernel.org> # 5.8
    Acked-by: Sven Schnelle <svens at linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca at linux.ibm.com>

diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 86235919c2d1..5346545b9860 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -422,6 +422,7 @@ ENTRY(system_call)
 #endif
 	LOCKDEP_SYS_EXIT
 .Lsysc_tif:
+	DISABLE_INTS
 	TSTMSK	__PT_FLAGS(%r11),_PIF_WORK
 	jnz	.Lsysc_work
 	TSTMSK	__TI_flags(%r12),_TIF_WORK
@@ -444,6 +445,7 @@ ENTRY(system_call)
 # One of the work bits is on. Find out which one.
 #
 .Lsysc_work:
+	ENABLE_INTS
 	TSTMSK	__TI_flags(%r12),_TIF_NEED_RESCHED
 	jo	.Lsysc_reschedule
 	TSTMSK	__PT_FLAGS(%r11),_PIF_SYSCALL_RESTART
commit be353be27874f40837327d9a39e3ad2149ab66d3
Author: Rijo Thomas <Rijo-john.Thomas at amd.com>
Date:   Wed Nov 4 11:56:10 2020 +0530

    tee: amdtee: synchronize access to shm list
    
    Synchronize access to shm or shared memory buffer list to prevent
    race conditions due to concurrent updates to shared shm list by
    multiple threads.
    
    Fixes: 757cc3e9ff1d ("tee: add AMD-TEE driver")
    Reviewed-by: Devaraj Rangasamy <Devaraj.Rangasamy at amd.com>
    Signed-off-by: Rijo Thomas <Rijo-john.Thomas at amd.com>
    Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>

diff --git a/drivers/tee/amdtee/amdtee_private.h b/drivers/tee/amdtee/amdtee_private.h
index 97df16a17285..337c8d82f74e 100644
--- a/drivers/tee/amdtee/amdtee_private.h
+++ b/drivers/tee/amdtee/amdtee_private.h
@@ -70,6 +70,7 @@ struct amdtee_session {
 struct amdtee_context_data {
 	struct list_head sess_list;
 	struct list_head shm_list;
+	struct mutex shm_mutex;   /* synchronizes access to @shm_list */
 };
 
 struct amdtee_driver_data {
diff --git a/drivers/tee/amdtee/core.c b/drivers/tee/amdtee/core.c
index ce61c68ec58c..8a6a8f30bb42 100644
--- a/drivers/tee/amdtee/core.c
+++ b/drivers/tee/amdtee/core.c
@@ -42,6 +42,7 @@ static int amdtee_open(struct tee_context *ctx)
 
 	INIT_LIST_HEAD(&ctxdata->sess_list);
 	INIT_LIST_HEAD(&ctxdata->shm_list);
+	mutex_init(&ctxdata->shm_mutex);
 
 	ctx->data = ctxdata;
 	return 0;
@@ -85,6 +86,7 @@ static void amdtee_release(struct tee_context *ctx)
 		list_del(&sess->list_node);
 		release_session(sess);
 	}
+	mutex_destroy(&ctxdata->shm_mutex);
 	kfree(ctxdata);
 
 	ctx->data = NULL;
@@ -155,11 +157,13 @@ u32 get_buffer_id(struct tee_shm *shm)
 	struct amdtee_shm_data *shmdata;
 	u32 buf_id = 0;
 
+	mutex_lock(&ctxdata->shm_mutex);
 	list_for_each_entry(shmdata, &ctxdata->shm_list, shm_node)
 		if (shmdata->kaddr == shm->kaddr) {
 			buf_id = shmdata->buf_id;
 			break;
 		}
+	mutex_unlock(&ctxdata->shm_mutex);
 
 	return buf_id;
 }
@@ -364,7 +368,9 @@ int amdtee_map_shmem(struct tee_shm *shm)
 	shmnode->kaddr = shm->kaddr;
 	shmnode->buf_id = buf_id;
 	ctxdata = shm->ctx->data;
+	mutex_lock(&ctxdata->shm_mutex);
 	list_add(&shmnode->shm_node, &ctxdata->shm_list);
+	mutex_unlock(&ctxdata->shm_mutex);
 
 	pr_debug("buf_id :[%x] kaddr[%p]\n", shmnode->buf_id, shmnode->kaddr);
 
@@ -385,12 +391,14 @@ void amdtee_unmap_shmem(struct tee_shm *shm)
 	handle_unmap_shmem(buf_id);
 
 	ctxdata = shm->ctx->data;
+	mutex_lock(&ctxdata->shm_mutex);
 	list_for_each_entry(shmnode, &ctxdata->shm_list, shm_node)
 		if (buf_id == shmnode->buf_id) {
 			list_del(&shmnode->shm_node);
 			kfree(shmnode);
 			break;
 		}
+	mutex_unlock(&ctxdata->shm_mutex);
 }
 
 int amdtee_invoke_func(struct tee_context *ctx,
commit ff1f855804cdbbb6db7b9b6df6cab783d1a40d66
Author: Rijo Thomas <Rijo-john.Thomas at amd.com>
Date:   Wed Nov 4 11:56:09 2020 +0530

    tee: amdtee: fix memory leak due to reset of global shm list
    
    The driver maintains a list of shared memory buffers along with their
    mapped buffer id's in a global linked list. These buffers need to be
    unmapped after use by the user-space client.
    
    The global shared memory list is initialized to zero entries in the
    function amdtee_open(). This clearing of list entries can be a source
    for memory leak on secure side if the global linked list previously
    held some mapped buffer entries allocated from another TEE context.
    
    Fix potential memory leak issue by moving global shared memory list
    to AMD-TEE driver context data structure.
    
    Fixes: 757cc3e9ff1d ("tee: add AMD-TEE driver")
    Reviewed-by: Devaraj Rangasamy <Devaraj.Rangasamy at amd.com>
    Signed-off-by: Rijo Thomas <Rijo-john.Thomas at amd.com>
    Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>

diff --git a/drivers/tee/amdtee/amdtee_private.h b/drivers/tee/amdtee/amdtee_private.h
index d7f798c3394b..97df16a17285 100644
--- a/drivers/tee/amdtee/amdtee_private.h
+++ b/drivers/tee/amdtee/amdtee_private.h
@@ -64,9 +64,12 @@ struct amdtee_session {
 /**
  * struct amdtee_context_data - AMD-TEE driver context data
  * @sess_list:    Keeps track of sessions opened in current TEE context
+ * @shm_list:     Keeps track of buffers allocated and mapped in current TEE
+ *                context
  */
 struct amdtee_context_data {
 	struct list_head sess_list;
+	struct list_head shm_list;
 };
 
 struct amdtee_driver_data {
@@ -89,10 +92,6 @@ struct amdtee_shm_data {
 	u32     buf_id;
 };
 
-struct amdtee_shm_context {
-	struct list_head shmdata_list;
-};
-
 #define LOWER_TWO_BYTE_MASK	0x0000FFFF
 
 /**
diff --git a/drivers/tee/amdtee/core.c b/drivers/tee/amdtee/core.c
index 27b4cd77d0db..ce61c68ec58c 100644
--- a/drivers/tee/amdtee/core.c
+++ b/drivers/tee/amdtee/core.c
@@ -20,7 +20,6 @@
 
 static struct amdtee_driver_data *drv_data;
 static DEFINE_MUTEX(session_list_mutex);
-static struct amdtee_shm_context shmctx;
 
 static void amdtee_get_version(struct tee_device *teedev,
 			       struct tee_ioctl_version_data *vers)
@@ -42,7 +41,7 @@ static int amdtee_open(struct tee_context *ctx)
 		return -ENOMEM;
 
 	INIT_LIST_HEAD(&ctxdata->sess_list);
-	INIT_LIST_HEAD(&shmctx.shmdata_list);
+	INIT_LIST_HEAD(&ctxdata->shm_list);
 
 	ctx->data = ctxdata;
 	return 0;
@@ -152,10 +151,11 @@ static struct amdtee_session *find_session(struct amdtee_context_data *ctxdata,
 
 u32 get_buffer_id(struct tee_shm *shm)
 {
-	u32 buf_id = 0;
+	struct amdtee_context_data *ctxdata = shm->ctx->data;
 	struct amdtee_shm_data *shmdata;
+	u32 buf_id = 0;
 
-	list_for_each_entry(shmdata, &shmctx.shmdata_list, shm_node)
+	list_for_each_entry(shmdata, &ctxdata->shm_list, shm_node)
 		if (shmdata->kaddr == shm->kaddr) {
 			buf_id = shmdata->buf_id;
 			break;
@@ -333,8 +333,9 @@ int amdtee_close_session(struct tee_context *ctx, u32 session)
 
 int amdtee_map_shmem(struct tee_shm *shm)
 {
-	struct shmem_desc shmem;
+	struct amdtee_context_data *ctxdata;
 	struct amdtee_shm_data *shmnode;
+	struct shmem_desc shmem;
 	int rc, count;
 	u32 buf_id;
 
@@ -362,7 +363,8 @@ int amdtee_map_shmem(struct tee_shm *shm)
 
 	shmnode->kaddr = shm->kaddr;
 	shmnode->buf_id = buf_id;
-	list_add(&shmnode->shm_node, &shmctx.shmdata_list);
+	ctxdata = shm->ctx->data;
+	list_add(&shmnode->shm_node, &ctxdata->shm_list);
 
 	pr_debug("buf_id :[%x] kaddr[%p]\n", shmnode->buf_id, shmnode->kaddr);
 
@@ -371,6 +373,7 @@ int amdtee_map_shmem(struct tee_shm *shm)
 
 void amdtee_unmap_shmem(struct tee_shm *shm)
 {
+	struct amdtee_context_data *ctxdata;
 	struct amdtee_shm_data *shmnode;
 	u32 buf_id;
 
@@ -381,7 +384,8 @@ void amdtee_unmap_shmem(struct tee_shm *shm)
 	/* Unmap the shared memory from TEE */
 	handle_unmap_shmem(buf_id);
 
-	list_for_each_entry(shmnode, &shmctx.shmdata_list, shm_node)
+	ctxdata = shm->ctx->data;
+	list_for_each_entry(shmnode, &ctxdata->shm_list, shm_node)
 		if (buf_id == shmnode->buf_id) {
 			list_del(&shmnode->shm_node);
 			kfree(shmnode);
commit 34a280831384d7e58327ff0e82e18db8e788107c
Author: Olaf Hering <olaf at aepfle.de>
Date:   Fri Nov 6 19:39:41 2020 +0100

    video: hyperv_fb: include vmalloc.h
    
    hvfb_getmem uses vzalloc, therefore vmalloc.h should be included.
    
    Fixes commit d21987d709e807ba7bbf47044deb56a3c02e8be4 ("video: hyperv:
    hyperv_fb: Support deferred IO for Hyper-V frame buffer driver")
    
    Signed-off-by: Olaf Hering <olaf at aepfle.de>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201106183941.9751-1-olaf@aepfle.de

diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
index e36fb1a0ecdb..5bc86f481a78 100644
--- a/drivers/video/fbdev/hyperv_fb.c
+++ b/drivers/video/fbdev/hyperv_fb.c
@@ -47,6 +47,7 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/vmalloc.h>
 #include <linux/init.h>
 #include <linux/completion.h>
 #include <linux/fb.h>
commit ad37f77fd3659e87fd9833a83692e0e4eba0f5cd
Author: Dmitry Safonov <dima at arista.com>
Date:   Mon Nov 2 16:14:47 2020 +0000

    xfrm/compat: Don't allocate memory with __GFP_ZERO
    
    32-bit to 64-bit messages translator zerofies needed paddings in the
    translation, the rest is the actual payload.
    Don't allocate zero pages as they are not needed.
    
    Fixes: 5106f4a8acff ("xfrm/compat: Add 32=>64-bit messages translator")
    Signed-off-by: Dmitry Safonov <dima at arista.com>
    Signed-off-by: Steffen Klassert <steffen.klassert at secunet.com>

diff --git a/net/xfrm/xfrm_compat.c b/net/xfrm/xfrm_compat.c
index 556e9f33b815..d8e8a11ca845 100644
--- a/net/xfrm/xfrm_compat.c
+++ b/net/xfrm/xfrm_compat.c
@@ -564,7 +564,7 @@ static struct nlmsghdr *xfrm_user_rcv_msg_compat(const struct nlmsghdr *h32,
 		return NULL;
 
 	len += NLMSG_HDRLEN;
-	h64 = kvmalloc(len, GFP_KERNEL | __GFP_ZERO);
+	h64 = kvmalloc(len, GFP_KERNEL);
 	if (!h64)
 		return ERR_PTR(-ENOMEM);
 
commit d1949d045fd67eab8a32a579a8c1ab1681330854
Author: Dmitry Safonov <dima at arista.com>
Date:   Mon Nov 2 16:14:46 2020 +0000

    xfrm/compat: memset(0) 64-bit padding at right place
    
    32-bit messages translated by xfrm_compat can have attributes attached.
    For all, but XFRMA_SA, XFRMA_POLICY the size of payload is the same
    in 32-bit UABI and 64-bit UABI. For XFRMA_SA (struct xfrm_usersa_info)
    and XFRMA_POLICY (struct xfrm_userpolicy_info) it's only tail-padding
    that is present in 64-bit payload, but not in 32-bit.
    The proper size for destination nlattr is already calculated by
    xfrm_user_rcv_calculate_len64() and allocated with kvmalloc().
    
    xfrm_attr_cpy32() copies 32-bit copy_len into 64-bit attribute
    translated payload, zero-filling possible padding for SA/POLICY.
    Due to a typo, *pos already has 64-bit payload size, in a result next
    memset(0) is called on the memory after the translated attribute, not on
    the tail-padding of it.
    
    Fixes: 5106f4a8acff ("xfrm/compat: Add 32=>64-bit messages translator")
    Reported-by: syzbot+c43831072e7df506a646 at syzkaller.appspotmail.com
    Signed-off-by: Dmitry Safonov <dima at arista.com>
    Signed-off-by: Steffen Klassert <steffen.klassert at secunet.com>

diff --git a/net/xfrm/xfrm_compat.c b/net/xfrm/xfrm_compat.c
index 17edbf935e35..556e9f33b815 100644
--- a/net/xfrm/xfrm_compat.c
+++ b/net/xfrm/xfrm_compat.c
@@ -388,7 +388,7 @@ static int xfrm_attr_cpy32(void *dst, size_t *pos, const struct nlattr *src,
 
 	memcpy(nla, src, nla_attr_size(copy_len));
 	nla->nla_len = nla_attr_size(payload);
-	*pos += nla_attr_size(payload);
+	*pos += nla_attr_size(copy_len);
 	nlmsg->nlmsg_len += nla->nla_len;
 
 	memset(dst + *pos, 0, payload - copy_len);
commit dbd7ae5154d5fff7e84a9f3010bb06499017ef29
Author: Dmitry Safonov <dima at arista.com>
Date:   Mon Nov 2 16:14:45 2020 +0000

    xfrm/compat: Translate by copying XFRMA_UNSPEC attribute
    
    xfrm_xlate32() translates 64-bit message provided by kernel to be sent
    for 32-bit listener (acknowledge or monitor). Translator code doesn't
    expect XFRMA_UNSPEC attribute as it doesn't know its payload.
    Kernel never attaches such attribute, but a user can.
    
    I've searched if any opensource does it and the answer is no.
    Nothing on github and google finds only tfcproject that has such code
    commented-out.
    
    What will happen if a user sends a netlink message with XFRMA_UNSPEC
    attribute? Ipsec code ignores this attribute. But if there is a
    monitor-process or 32-bit user requested ack - kernel will try to
    translate such message and will hit WARN_ONCE() in xfrm_xlate64_attr().
    
    Deal with XFRMA_UNSPEC by copying the attribute payload with
    xfrm_nla_cpy(). In result, the default switch-case in xfrm_xlate64_attr()
    becomes an unused code. Leave those 3 lines in case a new xfrm attribute
    will be added.
    
    Fixes: 5461fc0c8d9f ("xfrm/compat: Add 64=>32-bit messages translator")
    Reported-by: syzbot+a7e701c8385bd8543074 at syzkaller.appspotmail.com
    Signed-off-by: Dmitry Safonov <dima at arista.com>
    Signed-off-by: Steffen Klassert <steffen.klassert at secunet.com>

diff --git a/net/xfrm/xfrm_compat.c b/net/xfrm/xfrm_compat.c
index e28f0c9ecd6a..17edbf935e35 100644
--- a/net/xfrm/xfrm_compat.c
+++ b/net/xfrm/xfrm_compat.c
@@ -234,6 +234,7 @@ static int xfrm_xlate64_attr(struct sk_buff *dst, const struct nlattr *src)
 	case XFRMA_PAD:
 		/* Ignore */
 		return 0;
+	case XFRMA_UNSPEC:
 	case XFRMA_ALG_AUTH:
 	case XFRMA_ALG_CRYPT:
 	case XFRMA_ALG_COMP:
commit 77e70d351db7de07a46ac49b87a6c3c7a60fca7e
Author: Dmitry Torokhov <dmitry.torokhov at gmail.com>
Date:   Mon Oct 26 13:36:17 2020 -0700

    Input: sunkbd - avoid use-after-free in teardown paths
    
    We need to make sure we cancel the reinit work before we tear down the
    driver structures.
    
    Reported-by: Bodong Zhao <nopitydays at gmail.com>
    Tested-by: Bodong Zhao <nopitydays at gmail.com>
    Cc: stable at vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c
index 27126e621eb6..d450f11b98a7 100644
--- a/drivers/input/keyboard/sunkbd.c
+++ b/drivers/input/keyboard/sunkbd.c
@@ -99,7 +99,8 @@ static irqreturn_t sunkbd_interrupt(struct serio *serio,
 	switch (data) {
 
 	case SUNKBD_RET_RESET:
-		schedule_work(&sunkbd->tq);
+		if (sunkbd->enabled)
+			schedule_work(&sunkbd->tq);
 		sunkbd->reset = -1;
 		break;
 
@@ -200,16 +201,12 @@ static int sunkbd_initialize(struct sunkbd *sunkbd)
 }
 
 /*
- * sunkbd_reinit() sets leds and beeps to a state the computer remembers they
- * were in.
+ * sunkbd_set_leds_beeps() sets leds and beeps to a state the computer remembers
+ * they were in.
  */
 
-static void sunkbd_reinit(struct work_struct *work)
+static void sunkbd_set_leds_beeps(struct sunkbd *sunkbd)
 {
-	struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq);
-
-	wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ);
-
 	serio_write(sunkbd->serio, SUNKBD_CMD_SETLED);
 	serio_write(sunkbd->serio,
 		(!!test_bit(LED_CAPSL,   sunkbd->dev->led) << 3) |
@@ -222,11 +219,39 @@ static void sunkbd_reinit(struct work_struct *work)
 		SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd));
 }
 
+
+/*
+ * sunkbd_reinit() wait for the keyboard reset to complete and restores state
+ * of leds and beeps.
+ */
+
+static void sunkbd_reinit(struct work_struct *work)
+{
+	struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq);
+
+	/*
+	 * It is OK that we check sunkbd->enabled without pausing serio,
+	 * as we only want to catch true->false transition that will
+	 * happen once and we will be woken up for it.
+	 */
+	wait_event_interruptible_timeout(sunkbd->wait,
+					 sunkbd->reset >= 0 || !sunkbd->enabled,
+					 HZ);
+
+	if (sunkbd->reset >= 0 && sunkbd->enabled)
+		sunkbd_set_leds_beeps(sunkbd);
+}
+
 static void sunkbd_enable(struct sunkbd *sunkbd, bool enable)
 {
 	serio_pause_rx(sunkbd->serio);
 	sunkbd->enabled = enable;
 	serio_continue_rx(sunkbd->serio);
+
+	if (!enable) {
+		wake_up_interruptible(&sunkbd->wait);
+		cancel_work_sync(&sunkbd->tq);
+	}
 }
 
 /*
commit ae2975046dbc65855c217fe6fbd5b33140c5ff18
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Nov 6 15:50:39 2020 -0500

    net/sunrpc: fix useless comparison in proc_do_xprt()
    
    In the original code, the "if (*lenp < 0)" check didn't work because
    "*lenp" is unsigned.  Fortunately, the memory_read_from_buffer() call
    will never fail in this context so it doesn't affect runtime.
    
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c
index 5c9f5bca4d99..3aad6ef18504 100644
--- a/net/sunrpc/sysctl.c
+++ b/net/sunrpc/sysctl.c
@@ -63,19 +63,20 @@ static int proc_do_xprt(struct ctl_table *table, int write,
 			void *buffer, size_t *lenp, loff_t *ppos)
 {
 	char tmpbuf[256];
-	size_t len;
+	ssize_t len;
 
 	if (write || *ppos) {
 		*lenp = 0;
 		return 0;
 	}
 	len = svc_print_xprts(tmpbuf, sizeof(tmpbuf));
-	*lenp = memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
+	len = memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
 
-	if (*lenp < 0) {
+	if (len < 0) {
 		*lenp = 0;
 		return -EINVAL;
 	}
+	*lenp = len;
 	return 0;
 }
 
commit 44a146a44f656fc03d368c1b9248d29a128cd053
Author: Necip Fazil Yildiran <fazilyildiran at gmail.com>
Date:   Tue Nov 3 01:35:24 2020 +0300

    iio: light: fix kconfig dependency bug for VCNL4035
    
    When VCNL4035 is enabled and IIO_BUFFER is disabled, it results in the
    following Kbuild warning:
    
    WARNING: unmet direct dependencies detected for IIO_TRIGGERED_BUFFER
      Depends on [n]: IIO [=y] && IIO_BUFFER [=n]
      Selected by [y]:
      - VCNL4035 [=y] && IIO [=y] && I2C [=y]
    
    The reason is that VCNL4035 selects IIO_TRIGGERED_BUFFER without depending
    on or selecting IIO_BUFFER while IIO_TRIGGERED_BUFFER depends on
    IIO_BUFFER. This can also fail building the kernel.
    
    Honor the kconfig dependency to remove unmet direct dependency warnings
    and avoid any potential build failures.
    
    Fixes: 55707294c4eb ("iio: light: Add support for vishay vcnl4035")
    Signed-off-by: Necip Fazil Yildiran <fazilyildiran at gmail.com>
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=209883
    Link: https://lore.kernel.org/r/20201102223523.572461-1-fazilyildiran@gmail.com
    Cc: <stable at vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig
index cade6dc0305b..33ad4dd0b5c7 100644
--- a/drivers/iio/light/Kconfig
+++ b/drivers/iio/light/Kconfig
@@ -544,6 +544,7 @@ config VCNL4000
 
 config VCNL4035
 	tristate "VCNL4035 combined ALS and proximity sensor"
+	select IIO_BUFFER
 	select IIO_TRIGGERED_BUFFER
 	select REGMAP_I2C
 	depends on I2C
commit 6d6aa2907d59ddd3c0ebb2b93e1ddc84e474485b
Author: Paul Cercueil <paul at crapouillou.net>
Date:   Tue Nov 3 20:12:38 2020 +0000

    iio/adc: ingenic: Fix AUX/VBAT readings when touchscreen is used
    
    When the command feature of the ADC is used, it is possible to program
    the ADC, and specify at each step what input should be processed, and in
    comparison to what reference.
    
    This broke the AUX and battery readings when the touchscreen was
    enabled, most likely because the CMD feature would change the VREF all
    the time.
    
    Now, when AUX or battery are read, we temporarily disable the CMD
    feature, which means that we won't get touchscreen readings in that time
    frame. But it now gives correct values for AUX / battery, and the
    touchscreen isn't disabled for long enough to be an actual issue.
    
    Fixes: b96952f498db ("IIO: Ingenic JZ47xx: Add touchscreen mode.")
    Signed-off-by: Paul Cercueil <paul at crapouillou.net>
    Acked-by: Artur Rojek <contact at artur-rojek.eu>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201103201238.161083-1-paul@crapouillou.net
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/adc/ingenic-adc.c b/drivers/iio/adc/ingenic-adc.c
index 973e84deebea..1aafbe2cfe67 100644
--- a/drivers/iio/adc/ingenic-adc.c
+++ b/drivers/iio/adc/ingenic-adc.c
@@ -177,13 +177,12 @@ static void ingenic_adc_set_config(struct ingenic_adc *adc,
 	mutex_unlock(&adc->lock);
 }
 
-static void ingenic_adc_enable(struct ingenic_adc *adc,
-			       int engine,
-			       bool enabled)
+static void ingenic_adc_enable_unlocked(struct ingenic_adc *adc,
+					int engine,
+					bool enabled)
 {
 	u8 val;
 
-	mutex_lock(&adc->lock);
 	val = readb(adc->base + JZ_ADC_REG_ENABLE);
 
 	if (enabled)
@@ -192,20 +191,41 @@ static void ingenic_adc_enable(struct ingenic_adc *adc,
 		val &= ~BIT(engine);
 
 	writeb(val, adc->base + JZ_ADC_REG_ENABLE);
+}
+
+static void ingenic_adc_enable(struct ingenic_adc *adc,
+			       int engine,
+			       bool enabled)
+{
+	mutex_lock(&adc->lock);
+	ingenic_adc_enable_unlocked(adc, engine, enabled);
 	mutex_unlock(&adc->lock);
 }
 
 static int ingenic_adc_capture(struct ingenic_adc *adc,
 			       int engine)
 {
+	u32 cfg;
 	u8 val;
 	int ret;
 
-	ingenic_adc_enable(adc, engine, true);
+	/*
+	 * Disable CMD_SEL temporarily, because it causes wrong VBAT readings,
+	 * probably due to the switch of VREF. We must keep the lock here to
+	 * avoid races with the buffer enable/disable functions.
+	 */
+	mutex_lock(&adc->lock);
+	cfg = readl(adc->base + JZ_ADC_REG_CFG);
+	writel(cfg & ~JZ_ADC_REG_CFG_CMD_SEL, adc->base + JZ_ADC_REG_CFG);
+
+	ingenic_adc_enable_unlocked(adc, engine, true);
 	ret = readb_poll_timeout(adc->base + JZ_ADC_REG_ENABLE, val,
 				 !(val & BIT(engine)), 250, 1000);
 	if (ret)
-		ingenic_adc_enable(adc, engine, false);
+		ingenic_adc_enable_unlocked(adc, engine, false);
+
+	writel(cfg, adc->base + JZ_ADC_REG_CFG);
+	mutex_unlock(&adc->lock);
 
 	return ret;
 }
commit c91ebcc578e09783cfa4d85c1b437790f140f29a
Author: Paul Cercueil <paul at crapouillou.net>
Date:   Wed Nov 4 19:28:43 2020 +0000

    iio/adc: ingenic: Fix battery VREF for JZ4770 SoC
    
    The reference voltage for the battery is clearly marked as 1.2V in the
    programming manual. With this fixed, the battery channel now returns
    correct values.
    
    Fixes: a515d6488505 ("IIO: Ingenic JZ47xx: Add support for JZ4770 SoC ADC.")
    Signed-off-by: Paul Cercueil <paul at crapouillou.net>
    Acked-by: Artur Rojek <contact at artur-rojek.eu>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201104192843.67187-1-paul@crapouillou.net
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/adc/ingenic-adc.c b/drivers/iio/adc/ingenic-adc.c
index 92b25083e23f..973e84deebea 100644
--- a/drivers/iio/adc/ingenic-adc.c
+++ b/drivers/iio/adc/ingenic-adc.c
@@ -71,7 +71,7 @@
 #define JZ4725B_ADC_BATTERY_HIGH_VREF_BITS	10
 #define JZ4740_ADC_BATTERY_HIGH_VREF		(7500 * 0.986)
 #define JZ4740_ADC_BATTERY_HIGH_VREF_BITS	12
-#define JZ4770_ADC_BATTERY_VREF			6600
+#define JZ4770_ADC_BATTERY_VREF			1200
 #define JZ4770_ADC_BATTERY_VREF_BITS		12
 
 #define JZ_ADC_IRQ_AUX			BIT(0)
commit 4fd94ec7d566ee2f0b52111cc6d26dd311f8a7c3
Author: Ben Gardon <bgardon at google.com>
Date:   Tue Oct 27 16:37:33 2020 -0700

    KVM: selftests: Introduce the dirty log perf test
    
    The dirty log perf test will time verious dirty logging operations
    (enabling dirty logging, dirtying memory, getting the dirty log,
    clearing the dirty log, and disabling dirty logging) in order to
    quantify dirty logging performance. This test can be used to inform
    future performance improvements to KVM's dirty logging infrastructure.
    
    This series was tested by running the following invocations on an Intel
    Skylake machine:
    dirty_log_perf_test -b 20m -i 100 -v 64
    dirty_log_perf_test -b 20g -i 5 -v 4
    dirty_log_perf_test -b 4g -i 5 -v 32
    demand_paging_test -b 20m -v 64
    demand_paging_test -b 20g -v 4
    demand_paging_test -b 4g -v 32
    All behaved as expected.
    
    Signed-off-by: Ben Gardon <bgardon at google.com>
    Message-Id: <20201027233733.1484855-6-bgardon at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
index ea1692d43411..7a2c242b7152 100644
--- a/tools/testing/selftests/kvm/.gitignore
+++ b/tools/testing/selftests/kvm/.gitignore
@@ -27,6 +27,7 @@
 /clear_dirty_log_test
 /demand_paging_test
 /dirty_log_test
+/dirty_log_perf_test
 /kvm_create_max_vcpus
 /set_memory_region_test
 /steal_time
diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index c8af04dccf7f..3d14ef77755e 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -61,6 +61,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test
 TEST_GEN_PROGS_x86_64 += x86_64/user_msr_test
 TEST_GEN_PROGS_x86_64 += demand_paging_test
 TEST_GEN_PROGS_x86_64 += dirty_log_test
+TEST_GEN_PROGS_x86_64 += dirty_log_perf_test
 TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
 TEST_GEN_PROGS_x86_64 += set_memory_region_test
 TEST_GEN_PROGS_x86_64 += steal_time
diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c
new file mode 100644
index 000000000000..cda7b000b1bc
--- /dev/null
+++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
@@ -0,0 +1,376 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * KVM dirty page logging performance test
+ *
+ * Based on dirty_log_test.c
+ *
+ * Copyright (C) 2018, Red Hat, Inc.
+ * Copyright (C) 2020, Google, Inc.
+ */
+
+#define _GNU_SOURCE /* for program_invocation_name */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <pthread.h>
+#include <linux/bitmap.h>
+#include <linux/bitops.h>
+
+#include "kvm_util.h"
+#include "perf_test_util.h"
+#include "processor.h"
+#include "test_util.h"
+
+/* How many host loops to run by default (one KVM_GET_DIRTY_LOG for each loop)*/
+#define TEST_HOST_LOOP_N		2UL
+
+/* Host variables */
+static bool host_quit;
+static uint64_t iteration;
+static uint64_t vcpu_last_completed_iteration[MAX_VCPUS];
+
+static void *vcpu_worker(void *data)
+{
+	int ret;
+	struct kvm_vm *vm = perf_test_args.vm;
+	uint64_t pages_count = 0;
+	struct kvm_run *run;
+	struct timespec start;
+	struct timespec ts_diff;
+	struct timespec total = (struct timespec){0};
+	struct timespec avg;
+	struct vcpu_args *vcpu_args = (struct vcpu_args *)data;
+	int vcpu_id = vcpu_args->vcpu_id;
+
+	vcpu_args_set(vm, vcpu_id, 1, vcpu_id);
+	run = vcpu_state(vm, vcpu_id);
+
+	while (!READ_ONCE(host_quit)) {
+		uint64_t current_iteration = READ_ONCE(iteration);
+
+		clock_gettime(CLOCK_MONOTONIC, &start);
+		ret = _vcpu_run(vm, vcpu_id);
+		ts_diff = timespec_diff_now(start);
+
+		TEST_ASSERT(ret == 0, "vcpu_run failed: %d\n", ret);
+		TEST_ASSERT(get_ucall(vm, vcpu_id, NULL) == UCALL_SYNC,
+			    "Invalid guest sync status: exit_reason=%s\n",
+			    exit_reason_str(run->exit_reason));
+
+		pr_debug("Got sync event from vCPU %d\n", vcpu_id);
+		vcpu_last_completed_iteration[vcpu_id] = current_iteration;
+		pr_debug("vCPU %d updated last completed iteration to %lu\n",
+			 vcpu_id, vcpu_last_completed_iteration[vcpu_id]);
+
+		if (current_iteration) {
+			pages_count += vcpu_args->pages;
+			total = timespec_add(total, ts_diff);
+			pr_debug("vCPU %d iteration %lu dirty memory time: %ld.%.9lds\n",
+				vcpu_id, current_iteration, ts_diff.tv_sec,
+				ts_diff.tv_nsec);
+		} else {
+			pr_debug("vCPU %d iteration %lu populate memory time: %ld.%.9lds\n",
+				vcpu_id, current_iteration, ts_diff.tv_sec,
+				ts_diff.tv_nsec);
+		}
+
+		while (current_iteration == READ_ONCE(iteration) &&
+		       !READ_ONCE(host_quit)) {}
+	}
+
+	avg = timespec_div(total, vcpu_last_completed_iteration[vcpu_id]);
+	pr_debug("\nvCPU %d dirtied 0x%lx pages over %lu iterations in %ld.%.9lds. (Avg %ld.%.9lds/iteration)\n",
+		vcpu_id, pages_count, vcpu_last_completed_iteration[vcpu_id],
+		total.tv_sec, total.tv_nsec, avg.tv_sec, avg.tv_nsec);
+
+	return NULL;
+}
+
+#ifdef USE_CLEAR_DIRTY_LOG
+static u64 dirty_log_manual_caps;
+#endif
+
+static void run_test(enum vm_guest_mode mode, unsigned long iterations,
+		     uint64_t phys_offset, int wr_fract)
+{
+	pthread_t *vcpu_threads;
+	struct kvm_vm *vm;
+	unsigned long *bmap;
+	uint64_t guest_num_pages;
+	uint64_t host_num_pages;
+	int vcpu_id;
+	struct timespec start;
+	struct timespec ts_diff;
+	struct timespec get_dirty_log_total = (struct timespec){0};
+	struct timespec vcpu_dirty_total = (struct timespec){0};
+	struct timespec avg;
+#ifdef USE_CLEAR_DIRTY_LOG
+	struct kvm_enable_cap cap = {};
+	struct timespec clear_dirty_log_total = (struct timespec){0};
+#endif
+
+	vm = create_vm(mode, nr_vcpus, guest_percpu_mem_size);
+
+	perf_test_args.wr_fract = wr_fract;
+
+	guest_num_pages = (nr_vcpus * guest_percpu_mem_size) >> vm_get_page_shift(vm);
+	guest_num_pages = vm_adjust_num_guest_pages(mode, guest_num_pages);
+	host_num_pages = vm_num_host_pages(mode, guest_num_pages);
+	bmap = bitmap_alloc(host_num_pages);
+
+#ifdef USE_CLEAR_DIRTY_LOG
+	cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2;
+	cap.args[0] = dirty_log_manual_caps;
+	vm_enable_cap(vm, &cap);
+#endif
+
+	vcpu_threads = malloc(nr_vcpus * sizeof(*vcpu_threads));
+	TEST_ASSERT(vcpu_threads, "Memory allocation failed");
+
+	add_vcpus(vm, nr_vcpus, guest_percpu_mem_size);
+
+	sync_global_to_guest(vm, perf_test_args);
+
+	/* Start the iterations */
+	iteration = 0;
+	host_quit = false;
+
+	clock_gettime(CLOCK_MONOTONIC, &start);
+	for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
+		pthread_create(&vcpu_threads[vcpu_id], NULL, vcpu_worker,
+			       &perf_test_args.vcpu_args[vcpu_id]);
+	}
+
+	/* Allow the vCPU to populate memory */
+	pr_debug("Starting iteration %lu - Populating\n", iteration);
+	while (READ_ONCE(vcpu_last_completed_iteration[vcpu_id]) != iteration)
+		pr_debug("Waiting for vcpu_last_completed_iteration == %lu\n",
+			iteration);
+
+	ts_diff = timespec_diff_now(start);
+	pr_info("Populate memory time: %ld.%.9lds\n",
+		ts_diff.tv_sec, ts_diff.tv_nsec);
+
+	/* Enable dirty logging */
+	clock_gettime(CLOCK_MONOTONIC, &start);
+	vm_mem_region_set_flags(vm, TEST_MEM_SLOT_INDEX,
+				KVM_MEM_LOG_DIRTY_PAGES);
+	ts_diff = timespec_diff_now(start);
+	pr_info("Enabling dirty logging time: %ld.%.9lds\n\n",
+		ts_diff.tv_sec, ts_diff.tv_nsec);
+
+	while (iteration < iterations) {
+		/*
+		 * Incrementing the iteration number will start the vCPUs
+		 * dirtying memory again.
+		 */
+		clock_gettime(CLOCK_MONOTONIC, &start);
+		iteration++;
+
+		pr_debug("Starting iteration %lu\n", iteration);
+		for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
+			while (READ_ONCE(vcpu_last_completed_iteration[vcpu_id]) != iteration)
+				pr_debug("Waiting for vCPU %d vcpu_last_completed_iteration == %lu\n",
+					 vcpu_id, iteration);
+		}
+
+		ts_diff = timespec_diff_now(start);
+		vcpu_dirty_total = timespec_add(vcpu_dirty_total, ts_diff);
+		pr_info("Iteration %lu dirty memory time: %ld.%.9lds\n",
+			iteration, ts_diff.tv_sec, ts_diff.tv_nsec);
+
+		clock_gettime(CLOCK_MONOTONIC, &start);
+		kvm_vm_get_dirty_log(vm, TEST_MEM_SLOT_INDEX, bmap);
+
+		ts_diff = timespec_diff_now(start);
+		get_dirty_log_total = timespec_add(get_dirty_log_total,
+						   ts_diff);
+		pr_info("Iteration %lu get dirty log time: %ld.%.9lds\n",
+			iteration, ts_diff.tv_sec, ts_diff.tv_nsec);
+
+#ifdef USE_CLEAR_DIRTY_LOG
+		clock_gettime(CLOCK_MONOTONIC, &start);
+		kvm_vm_clear_dirty_log(vm, TEST_MEM_SLOT_INDEX, bmap, 0,
+				       host_num_pages);
+
+		ts_diff = timespec_diff_now(start);
+		clear_dirty_log_total = timespec_add(clear_dirty_log_total,
+						     ts_diff);
+		pr_info("Iteration %lu clear dirty log time: %ld.%.9lds\n",
+			iteration, ts_diff.tv_sec, ts_diff.tv_nsec);
+#endif
+	}
+
+	/* Tell the vcpu thread to quit */
+	host_quit = true;
+	for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++)
+		pthread_join(vcpu_threads[vcpu_id], NULL);
+
+	/* Disable dirty logging */
+	clock_gettime(CLOCK_MONOTONIC, &start);
+	vm_mem_region_set_flags(vm, TEST_MEM_SLOT_INDEX, 0);
+	ts_diff = timespec_diff_now(start);
+	pr_info("Disabling dirty logging time: %ld.%.9lds\n",
+		ts_diff.tv_sec, ts_diff.tv_nsec);
+
+	avg = timespec_div(get_dirty_log_total, iterations);
+	pr_info("Get dirty log over %lu iterations took %ld.%.9lds. (Avg %ld.%.9lds/iteration)\n",
+		iterations, get_dirty_log_total.tv_sec,
+		get_dirty_log_total.tv_nsec, avg.tv_sec, avg.tv_nsec);
+
+#ifdef USE_CLEAR_DIRTY_LOG
+	avg = timespec_div(clear_dirty_log_total, iterations);
+	pr_info("Clear dirty log over %lu iterations took %ld.%.9lds. (Avg %ld.%.9lds/iteration)\n",
+		iterations, clear_dirty_log_total.tv_sec,
+		clear_dirty_log_total.tv_nsec, avg.tv_sec, avg.tv_nsec);
+#endif
+
+	free(bmap);
+	free(vcpu_threads);
+	ucall_uninit(vm);
+	kvm_vm_free(vm);
+}
+
+struct guest_mode {
+	bool supported;
+	bool enabled;
+};
+static struct guest_mode guest_modes[NUM_VM_MODES];
+
+#define guest_mode_init(mode, supported, enabled) ({ \
+	guest_modes[mode] = (struct guest_mode){ supported, enabled }; \
+})
+
+static void help(char *name)
+{
+	int i;
+
+	puts("");
+	printf("usage: %s [-h] [-i iterations] [-p offset] "
+	       "[-m mode] [-b vcpu bytes] [-v vcpus]\n", name);
+	puts("");
+	printf(" -i: specify iteration counts (default: %"PRIu64")\n",
+	       TEST_HOST_LOOP_N);
+	printf(" -p: specify guest physical test memory offset\n"
+	       "     Warning: a low offset can conflict with the loaded test code.\n");
+	printf(" -m: specify the guest mode ID to test "
+	       "(default: test all supported modes)\n"
+	       "     This option may be used multiple times.\n"
+	       "     Guest mode IDs:\n");
+	for (i = 0; i < NUM_VM_MODES; ++i) {
+		printf("         %d:    %s%s\n", i, vm_guest_mode_string(i),
+		       guest_modes[i].supported ? " (supported)" : "");
+	}
+	printf(" -b: specify the size of the memory region which should be\n"
+	       "     dirtied by each vCPU. e.g. 10M or 3G.\n"
+	       "     (default: 1G)\n");
+	printf(" -f: specify the fraction of pages which should be written to\n"
+	       "     as opposed to simply read, in the form\n"
+	       "     1/<fraction of pages to write>.\n"
+	       "     (default: 1 i.e. all pages are written to.)\n");
+	printf(" -v: specify the number of vCPUs to run.\n");
+	puts("");
+	exit(0);
+}
+
+int main(int argc, char *argv[])
+{
+	unsigned long iterations = TEST_HOST_LOOP_N;
+	bool mode_selected = false;
+	uint64_t phys_offset = 0;
+	unsigned int mode;
+	int opt, i;
+	int wr_fract = 1;
+
+#ifdef USE_CLEAR_DIRTY_LOG
+	dirty_log_manual_caps =
+		kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
+	if (!dirty_log_manual_caps) {
+		print_skip("KVM_CLEAR_DIRTY_LOG not available");
+		exit(KSFT_SKIP);
+	}
+	dirty_log_manual_caps &= (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |
+				  KVM_DIRTY_LOG_INITIALLY_SET);
+#endif
+
+#ifdef __x86_64__
+	guest_mode_init(VM_MODE_PXXV48_4K, true, true);
+#endif
+#ifdef __aarch64__
+	guest_mode_init(VM_MODE_P40V48_4K, true, true);
+	guest_mode_init(VM_MODE_P40V48_64K, true, true);
+
+	{
+		unsigned int limit = kvm_check_cap(KVM_CAP_ARM_VM_IPA_SIZE);
+
+		if (limit >= 52)
+			guest_mode_init(VM_MODE_P52V48_64K, true, true);
+		if (limit >= 48) {
+			guest_mode_init(VM_MODE_P48V48_4K, true, true);
+			guest_mode_init(VM_MODE_P48V48_64K, true, true);
+		}
+	}
+#endif
+#ifdef __s390x__
+	guest_mode_init(VM_MODE_P40V48_4K, true, true);
+#endif
+
+	while ((opt = getopt(argc, argv, "hi:p:m:b:f:v:")) != -1) {
+		switch (opt) {
+		case 'i':
+			iterations = strtol(optarg, NULL, 10);
+			break;
+		case 'p':
+			phys_offset = strtoull(optarg, NULL, 0);
+			break;
+		case 'm':
+			if (!mode_selected) {
+				for (i = 0; i < NUM_VM_MODES; ++i)
+					guest_modes[i].enabled = false;
+				mode_selected = true;
+			}
+			mode = strtoul(optarg, NULL, 10);
+			TEST_ASSERT(mode < NUM_VM_MODES,
+				    "Guest mode ID %d too big", mode);
+			guest_modes[mode].enabled = true;
+			break;
+		case 'b':
+			guest_percpu_mem_size = parse_size(optarg);
+			break;
+		case 'f':
+			wr_fract = atoi(optarg);
+			TEST_ASSERT(wr_fract >= 1,
+				    "Write fraction cannot be less than one");
+			break;
+		case 'v':
+			nr_vcpus = atoi(optarg);
+			TEST_ASSERT(nr_vcpus > 0,
+				    "Must have a positive number of vCPUs");
+			TEST_ASSERT(nr_vcpus <= MAX_VCPUS,
+				    "This test does not currently support\n"
+				    "more than %d vCPUs.", MAX_VCPUS);
+			break;
+		case 'h':
+		default:
+			help(argv[0]);
+			break;
+		}
+	}
+
+	TEST_ASSERT(iterations > 2, "Iterations must be greater than two");
+
+	pr_info("Test iterations: %"PRIu64"\n",	iterations);
+
+	for (i = 0; i < NUM_VM_MODES; ++i) {
+		if (!guest_modes[i].enabled)
+			continue;
+		TEST_ASSERT(guest_modes[i].supported,
+			    "Guest mode ID %d (%s) not supported.",
+			    i, vm_guest_mode_string(i));
+		run_test(i, iterations, phys_offset, wr_fract);
+	}
+
+	return 0;
+}
diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
index 05eeb5d2bfc4..2618052057b1 100644
--- a/tools/testing/selftests/kvm/include/perf_test_util.h
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -76,16 +76,18 @@ static void guest_code(uint32_t vcpu_id)
 	gva = vcpu_args->gva;
 	pages = vcpu_args->pages;
 
-	for (i = 0; i < pages; i++) {
-		uint64_t addr = gva + (i * perf_test_args.guest_page_size);
+	while (true) {
+		for (i = 0; i < pages; i++) {
+			uint64_t addr = gva + (i * perf_test_args.guest_page_size);
 
-		if (i % perf_test_args.wr_fract == 0)
-			*(uint64_t *)addr = 0x0123456789ABCDEF;
-		else
-			READ_ONCE(*(uint64_t *)addr);
-	}
+			if (i % perf_test_args.wr_fract == 0)
+				*(uint64_t *)addr = 0x0123456789ABCDEF;
+			else
+				READ_ONCE(*(uint64_t *)addr);
+		}
 
-	GUEST_SYNC(1);
+		GUEST_SYNC(1);
+	}
 }
 
 static struct kvm_vm *create_vm(enum vm_guest_mode mode, int vcpus,
diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
index 1cc036ddb0c5..ffffa560436b 100644
--- a/tools/testing/selftests/kvm/include/test_util.h
+++ b/tools/testing/selftests/kvm/include/test_util.h
@@ -65,5 +65,6 @@ struct timespec timespec_add_ns(struct timespec ts, int64_t ns);
 struct timespec timespec_add(struct timespec ts1, struct timespec ts2);
 struct timespec timespec_sub(struct timespec ts1, struct timespec ts2);
 struct timespec timespec_diff_now(struct timespec start);
+struct timespec timespec_div(struct timespec ts, int divisor);
 
 #endif /* SELFTEST_KVM_TEST_UTIL_H */
diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
index 1a46c2c48c7c..8e04c0b1608e 100644
--- a/tools/testing/selftests/kvm/lib/test_util.c
+++ b/tools/testing/selftests/kvm/lib/test_util.c
@@ -92,6 +92,13 @@ struct timespec timespec_diff_now(struct timespec start)
 	return timespec_sub(end, start);
 }
 
+struct timespec timespec_div(struct timespec ts, int divisor)
+{
+	int64_t ns = timespec_to_ns(ts) / divisor;
+
+	return timespec_add_ns((struct timespec){0}, ns);
+}
+
 void print_skip(const char *fmt, ...)
 {
 	va_list ap;
commit 3be18630954672b889186e7be9b631f00134e954
Author: Andrew Jones <drjones at redhat.com>
Date:   Wed Nov 4 22:23:53 2020 +0100

    KVM: selftests: Make the number of vcpus global
    
    We also check the input number of vcpus against the maximum supported.
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Message-Id: <20201104212357.171559-8-drjones at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index 33acd954a298..3d96a7bfaff3 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -249,7 +249,7 @@ static int setup_demand_paging(struct kvm_vm *vm,
 }
 
 static void run_test(enum vm_guest_mode mode, bool use_uffd,
-		     useconds_t uffd_delay, int vcpus)
+		     useconds_t uffd_delay)
 {
 	pthread_t *vcpu_threads;
 	pthread_t *uffd_handler_threads = NULL;
@@ -261,7 +261,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	int vcpu_id;
 	int r;
 
-	vm = create_vm(mode, vcpus, guest_percpu_mem_size);
+	vm = create_vm(mode, nr_vcpus, guest_percpu_mem_size);
 
 	perf_test_args.wr_fract = 1;
 
@@ -270,23 +270,23 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 		    "Failed to allocate buffer for guest data pattern");
 	memset(guest_data_prototype, 0xAB, perf_test_args.host_page_size);
 
-	vcpu_threads = malloc(vcpus * sizeof(*vcpu_threads));
+	vcpu_threads = malloc(nr_vcpus * sizeof(*vcpu_threads));
 	TEST_ASSERT(vcpu_threads, "Memory allocation failed");
 
-	add_vcpus(vm, vcpus, guest_percpu_mem_size);
+	add_vcpus(vm, nr_vcpus, guest_percpu_mem_size);
 
 	if (use_uffd) {
 		uffd_handler_threads =
-			malloc(vcpus * sizeof(*uffd_handler_threads));
+			malloc(nr_vcpus * sizeof(*uffd_handler_threads));
 		TEST_ASSERT(uffd_handler_threads, "Memory allocation failed");
 
-		uffd_args = malloc(vcpus * sizeof(*uffd_args));
+		uffd_args = malloc(nr_vcpus * sizeof(*uffd_args));
 		TEST_ASSERT(uffd_args, "Memory allocation failed");
 
-		pipefds = malloc(sizeof(int) * vcpus * 2);
+		pipefds = malloc(sizeof(int) * nr_vcpus * 2);
 		TEST_ASSERT(pipefds, "Unable to allocate memory for pipefd");
 
-		for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
+		for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
 			vm_paddr_t vcpu_gpa;
 			void *vcpu_hva;
 
@@ -322,7 +322,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 
 	clock_gettime(CLOCK_MONOTONIC, &start);
 
-	for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
+	for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
 		pthread_create(&vcpu_threads[vcpu_id], NULL, vcpu_worker,
 			       &perf_test_args.vcpu_args[vcpu_id]);
 	}
@@ -330,7 +330,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	pr_info("Started all vCPUs\n");
 
 	/* Wait for the vcpu threads to quit */
-	for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
+	for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
 		pthread_join(vcpu_threads[vcpu_id], NULL);
 		PER_VCPU_DEBUG("Joined thread for vCPU %d\n", vcpu_id);
 	}
@@ -343,7 +343,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 		char c;
 
 		/* Tell the user fault fd handler threads to quit */
-		for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
+		for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
 			r = write(pipefds[vcpu_id * 2 + 1], &c, 1);
 			TEST_ASSERT(r == 1, "Unable to write to pipefd");
 
@@ -354,7 +354,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	pr_info("Total guest execution time: %ld.%.9lds\n",
 		ts_diff.tv_sec, ts_diff.tv_nsec);
 	pr_info("Overall demand paging rate: %f pgs/sec\n",
-		perf_test_args.vcpu_args[0].pages * vcpus /
+		perf_test_args.vcpu_args[0].pages * nr_vcpus /
 		((double)ts_diff.tv_sec + (double)ts_diff.tv_nsec / 100000000.0));
 
 	ucall_uninit(vm);
@@ -409,8 +409,8 @@ static void help(char *name)
 
 int main(int argc, char *argv[])
 {
+	int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
 	bool mode_selected = false;
-	int vcpus = 1;
 	unsigned int mode;
 	int opt, i;
 	bool use_uffd = false;
@@ -462,12 +462,9 @@ int main(int argc, char *argv[])
 			guest_percpu_mem_size = parse_size(optarg);
 			break;
 		case 'v':
-			vcpus = atoi(optarg);
-			TEST_ASSERT(vcpus > 0,
-				    "Must have a positive number of vCPUs");
-			TEST_ASSERT(vcpus <= MAX_VCPUS,
-				    "This test does not currently support\n"
-				    "more than %d vCPUs.", MAX_VCPUS);
+			nr_vcpus = atoi(optarg);
+			TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
+				    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
 			break;
 		case 'h':
 		default:
@@ -482,7 +479,7 @@ int main(int argc, char *argv[])
 		TEST_ASSERT(guest_modes[i].supported,
 			    "Guest mode ID %d (%s) not supported.",
 			    i, vm_guest_mode_string(i));
-		run_test(i, use_uffd, uffd_delay, vcpus);
+		run_test(i, use_uffd, uffd_delay);
 	}
 
 	return 0;
diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
index 840dc2a19ce1..05eeb5d2bfc4 100644
--- a/tools/testing/selftests/kvm/include/perf_test_util.h
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -37,6 +37,9 @@ static uint64_t guest_test_phys_mem;
 static uint64_t guest_test_virt_mem = DEFAULT_GUEST_TEST_MEM;
 static uint64_t guest_percpu_mem_size = DEFAULT_PER_VCPU_MEM_SIZE;
 
+/* Number of VCPUs for the test */
+static int nr_vcpus = 1;
+
 struct vcpu_args {
 	uint64_t gva;
 	uint64_t pages;
commit 6769155fece2100506e22161945712afae61769f
Author: Andrew Jones <drjones at redhat.com>
Date:   Wed Nov 4 22:23:52 2020 +0100

    KVM: selftests: Make the per vcpu memory size global
    
    Rename vcpu_memory_bytes to something with "percpu" in it
    in order to be less ambiguous. Also make it global to
    simplify things.
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Message-Id: <20201104212357.171559-7-drjones at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index 47defc65aeda..33acd954a298 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -27,8 +27,6 @@
 
 #ifdef __NR_userfaultfd
 
-#define DEFAULT_GUEST_TEST_MEM_SIZE (1 << 30) /* 1G */
-
 #ifdef PRINT_PER_PAGE_UPDATES
 #define PER_PAGE_DEBUG(...) printf(__VA_ARGS__)
 #else
@@ -251,8 +249,7 @@ static int setup_demand_paging(struct kvm_vm *vm,
 }
 
 static void run_test(enum vm_guest_mode mode, bool use_uffd,
-		     useconds_t uffd_delay, int vcpus,
-		     uint64_t vcpu_memory_bytes)
+		     useconds_t uffd_delay, int vcpus)
 {
 	pthread_t *vcpu_threads;
 	pthread_t *uffd_handler_threads = NULL;
@@ -264,7 +261,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	int vcpu_id;
 	int r;
 
-	vm = create_vm(mode, vcpus, vcpu_memory_bytes);
+	vm = create_vm(mode, vcpus, guest_percpu_mem_size);
 
 	perf_test_args.wr_fract = 1;
 
@@ -276,7 +273,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	vcpu_threads = malloc(vcpus * sizeof(*vcpu_threads));
 	TEST_ASSERT(vcpu_threads, "Memory allocation failed");
 
-	add_vcpus(vm, vcpus, vcpu_memory_bytes);
+	add_vcpus(vm, vcpus, guest_percpu_mem_size);
 
 	if (use_uffd) {
 		uffd_handler_threads =
@@ -293,9 +290,9 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 			vm_paddr_t vcpu_gpa;
 			void *vcpu_hva;
 
-			vcpu_gpa = guest_test_phys_mem + (vcpu_id * vcpu_memory_bytes);
+			vcpu_gpa = guest_test_phys_mem + (vcpu_id * guest_percpu_mem_size);
 			PER_VCPU_DEBUG("Added VCPU %d with test mem gpa [%lx, %lx)\n",
-				       vcpu_id, vcpu_gpa, vcpu_gpa + vcpu_memory_bytes);
+				       vcpu_id, vcpu_gpa, vcpu_gpa + guest_percpu_mem_size);
 
 			/* Cache the HVA pointer of the region */
 			vcpu_hva = addr_gpa2hva(vm, vcpu_gpa);
@@ -312,7 +309,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 						&uffd_handler_threads[vcpu_id],
 						pipefds[vcpu_id * 2],
 						uffd_delay, &uffd_args[vcpu_id],
-						vcpu_hva, vcpu_memory_bytes);
+						vcpu_hva, guest_percpu_mem_size);
 			if (r < 0)
 				exit(-r);
 		}
@@ -413,7 +410,6 @@ static void help(char *name)
 int main(int argc, char *argv[])
 {
 	bool mode_selected = false;
-	uint64_t vcpu_memory_bytes = DEFAULT_GUEST_TEST_MEM_SIZE;
 	int vcpus = 1;
 	unsigned int mode;
 	int opt, i;
@@ -463,7 +459,7 @@ int main(int argc, char *argv[])
 				    "A negative UFFD delay is not supported.");
 			break;
 		case 'b':
-			vcpu_memory_bytes = parse_size(optarg);
+			guest_percpu_mem_size = parse_size(optarg);
 			break;
 		case 'v':
 			vcpus = atoi(optarg);
@@ -486,7 +482,7 @@ int main(int argc, char *argv[])
 		TEST_ASSERT(guest_modes[i].supported,
 			    "Guest mode ID %d (%s) not supported.",
 			    i, vm_guest_mode_string(i));
-		run_test(i, use_uffd, uffd_delay, vcpus, vcpu_memory_bytes);
+		run_test(i, use_uffd, uffd_delay, vcpus);
 	}
 
 	return 0;
diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
index 8e053e9dc7ea..840dc2a19ce1 100644
--- a/tools/testing/selftests/kvm/include/perf_test_util.h
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -21,6 +21,8 @@
 /* Default guest test virtual memory offset */
 #define DEFAULT_GUEST_TEST_MEM		0xc0000000
 
+#define DEFAULT_PER_VCPU_MEM_SIZE	(1 << 30) /* 1G */
+
 /*
  * Guest physical memory offset of the testing memory slot.
  * This will be set to the topmost valid physical address minus
@@ -33,6 +35,7 @@ static uint64_t guest_test_phys_mem;
  * Must not conflict with identity mapped test code.
  */
 static uint64_t guest_test_virt_mem = DEFAULT_GUEST_TEST_MEM;
+static uint64_t guest_percpu_mem_size = DEFAULT_PER_VCPU_MEM_SIZE;
 
 struct vcpu_args {
 	uint64_t gva;
commit f663132d1e09166db419afb9832d463e0a79f3d5
Author: Andrew Jones <drjones at redhat.com>
Date:   Wed Nov 4 22:23:48 2020 +0100

    KVM: selftests: Drop pointless vm_create wrapper
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Message-Id: <20201104212357.171559-3-drjones at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index 139ccb550618..54da9cc20db4 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -362,7 +362,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
 
 	pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode));
 
-	vm = _vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
+	vm = vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
 	kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
 #ifdef __x86_64__
 	vm_create_irqchip(vm);
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index feb949a92055..7d29aa786959 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -68,7 +68,6 @@ int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
 void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size);
 
 struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
-struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
 void kvm_vm_free(struct kvm_vm *vmp);
 void kvm_vm_restart(struct kvm_vm *vmp, int perm);
 void kvm_vm_release(struct kvm_vm *vmp);
diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
index 1716300469c0..8e053e9dc7ea 100644
--- a/tools/testing/selftests/kvm/include/perf_test_util.h
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -105,7 +105,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, int vcpus,
 
 	pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode));
 
-	vm = _vm_create(mode, pages, O_RDWR);
+	vm = vm_create(mode, pages, O_RDWR);
 	kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
 #ifdef __x86_64__
 	vm_create_irqchip(vm);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 7669cb7c86e3..126c6727a6b0 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -180,7 +180,7 @@ _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params)
  * descriptor to control the created VM is created with the permissions
  * given by perm (e.g. O_RDWR).
  */
-struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
+struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
 {
 	struct kvm_vm *vm;
 
@@ -271,11 +271,6 @@ struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
 	return vm;
 }
 
-struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
-{
-	return _vm_create(mode, phy_pages, perm);
-}
-
 /*
  * VM Restart
  *
commit 92ab4b9a22cfea9b0d353e86024208040c10e807
Author: Ben Gardon <bgardon at google.com>
Date:   Tue Oct 27 16:37:32 2020 -0700

    KVM: selftests: Add wrfract to common guest code
    
    Wrfract will be used by the dirty logging perf test introduced later in
    this series to dirty memory sparsely.
    
    This series was tested by running the following invocations on an Intel
    Skylake machine:
    dirty_log_perf_test -b 20m -i 100 -v 64
    dirty_log_perf_test -b 20g -i 5 -v 4
    dirty_log_perf_test -b 4g -i 5 -v 32
    demand_paging_test -b 20m -v 64
    demand_paging_test -b 20g -v 4
    demand_paging_test -b 4g -v 32
    All behaved as expected.
    
    Signed-off-by: Ben Gardon <bgardon at google.com>
    Message-Id: <20201027233733.1484855-5-bgardon at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index 7de6feb00076..47defc65aeda 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -266,6 +266,8 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 
 	vm = create_vm(mode, vcpus, vcpu_memory_bytes);
 
+	perf_test_args.wr_fract = 1;
+
 	guest_data_prototype = malloc(perf_test_args.host_page_size);
 	TEST_ASSERT(guest_data_prototype,
 		    "Failed to allocate buffer for guest data pattern");
diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
index 838f946700f0..1716300469c0 100644
--- a/tools/testing/selftests/kvm/include/perf_test_util.h
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -46,6 +46,7 @@ struct perf_test_args {
 	struct kvm_vm *vm;
 	uint64_t host_page_size;
 	uint64_t guest_page_size;
+	int wr_fract;
 
 	struct vcpu_args vcpu_args[MAX_VCPUS];
 };
@@ -72,7 +73,10 @@ static void guest_code(uint32_t vcpu_id)
 	for (i = 0; i < pages; i++) {
 		uint64_t addr = gva + (i * perf_test_args.guest_page_size);
 
-		*(uint64_t *)addr = 0x0123456789ABCDEF;
+		if (i % perf_test_args.wr_fract == 0)
+			*(uint64_t *)addr = 0x0123456789ABCDEF;
+		else
+			READ_ONCE(*(uint64_t *)addr);
 	}
 
 	GUEST_SYNC(1);
commit 1eafbd27edb5098ed6b6bc404c35d56c78beb0fd
Author: Ben Gardon <bgardon at google.com>
Date:   Tue Oct 27 16:37:31 2020 -0700

    KVM: selftests: Simplify demand_paging_test with timespec_diff_now
    
    Add a helper function to get the current time and return the time since
    a given start time. Use that function to simplify the timekeeping in the
    demand paging test.
    
    This series was tested by running the following invocations on an Intel
    Skylake machine:
    dirty_log_perf_test -b 20m -i 100 -v 64
    dirty_log_perf_test -b 20g -i 5 -v 4
    dirty_log_perf_test -b 4g -i 5 -v 32
    demand_paging_test -b 20m -v 64
    demand_paging_test -b 20g -v 4
    demand_paging_test -b 4g -v 32
    All behaved as expected.
    
    Signed-off-by: Ben Gardon <bgardon at google.com>
    Message-Id: <20201027233733.1484855-4-bgardon at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index 4251e98ceb69..7de6feb00076 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -50,7 +50,8 @@ static void *vcpu_worker(void *data)
 	int vcpu_id = vcpu_args->vcpu_id;
 	struct kvm_vm *vm = perf_test_args.vm;
 	struct kvm_run *run;
-	struct timespec start, end, ts_diff;
+	struct timespec start;
+	struct timespec ts_diff;
 
 	vcpu_args_set(vm, vcpu_id, 1, vcpu_id);
 	run = vcpu_state(vm, vcpu_id);
@@ -66,8 +67,7 @@ static void *vcpu_worker(void *data)
 			    exit_reason_str(run->exit_reason));
 	}
 
-	clock_gettime(CLOCK_MONOTONIC, &end);
-	ts_diff = timespec_sub(end, start);
+	ts_diff = timespec_diff_now(start);
 	PER_VCPU_DEBUG("vCPU %d execution time: %ld.%.9lds\n", vcpu_id,
 		       ts_diff.tv_sec, ts_diff.tv_nsec);
 
@@ -78,7 +78,7 @@ static int handle_uffd_page_request(int uffd, uint64_t addr)
 {
 	pid_t tid;
 	struct timespec start;
-	struct timespec end;
+	struct timespec ts_diff;
 	struct uffdio_copy copy;
 	int r;
 
@@ -98,10 +98,10 @@ static int handle_uffd_page_request(int uffd, uint64_t addr)
 		return r;
 	}
 
-	clock_gettime(CLOCK_MONOTONIC, &end);
+	ts_diff = timespec_diff_now(start);
 
 	PER_PAGE_DEBUG("UFFDIO_COPY %d \t%ld ns\n", tid,
-		       timespec_to_ns(timespec_sub(end, start)));
+		       timespec_to_ns(ts_diff));
 	PER_PAGE_DEBUG("Paged in %ld bytes at 0x%lx from thread %d\n",
 		       perf_test_args.host_page_size, addr, tid);
 
@@ -123,7 +123,8 @@ static void *uffd_handler_thread_fn(void *arg)
 	int pipefd = uffd_args->pipefd;
 	useconds_t delay = uffd_args->delay;
 	int64_t pages = 0;
-	struct timespec start, end, ts_diff;
+	struct timespec start;
+	struct timespec ts_diff;
 
 	clock_gettime(CLOCK_MONOTONIC, &start);
 	while (!quit_uffd_thread) {
@@ -192,8 +193,7 @@ static void *uffd_handler_thread_fn(void *arg)
 		pages++;
 	}
 
-	clock_gettime(CLOCK_MONOTONIC, &end);
-	ts_diff = timespec_sub(end, start);
+	ts_diff = timespec_diff_now(start);
 	PER_VCPU_DEBUG("userfaulted %ld pages over %ld.%.9lds. (%f/sec)\n",
 		       pages, ts_diff.tv_sec, ts_diff.tv_nsec,
 		       pages / ((double)ts_diff.tv_sec + (double)ts_diff.tv_nsec / 100000000.0));
@@ -257,7 +257,8 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	pthread_t *vcpu_threads;
 	pthread_t *uffd_handler_threads = NULL;
 	struct uffd_handler_args *uffd_args = NULL;
-	struct timespec start, end, ts_diff;
+	struct timespec start;
+	struct timespec ts_diff;
 	int *pipefds = NULL;
 	struct kvm_vm *vm;
 	int vcpu_id;
@@ -335,9 +336,9 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 		PER_VCPU_DEBUG("Joined thread for vCPU %d\n", vcpu_id);
 	}
 
-	pr_info("All vCPU threads joined\n");
+	ts_diff = timespec_diff_now(start);
 
-	clock_gettime(CLOCK_MONOTONIC, &end);
+	pr_info("All vCPU threads joined\n");
 
 	if (use_uffd) {
 		char c;
@@ -351,7 +352,6 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 		}
 	}
 
-	ts_diff = timespec_sub(end, start);
 	pr_info("Total guest execution time: %ld.%.9lds\n",
 		ts_diff.tv_sec, ts_diff.tv_nsec);
 	pr_info("Overall demand paging rate: %f pgs/sec\n",
diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
index 5eb01bf51b86..1cc036ddb0c5 100644
--- a/tools/testing/selftests/kvm/include/test_util.h
+++ b/tools/testing/selftests/kvm/include/test_util.h
@@ -64,5 +64,6 @@ int64_t timespec_to_ns(struct timespec ts);
 struct timespec timespec_add_ns(struct timespec ts, int64_t ns);
 struct timespec timespec_add(struct timespec ts1, struct timespec ts2);
 struct timespec timespec_sub(struct timespec ts1, struct timespec ts2);
+struct timespec timespec_diff_now(struct timespec start);
 
 #endif /* SELFTEST_KVM_TEST_UTIL_H */
diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
index 689e97c27ee2..1a46c2c48c7c 100644
--- a/tools/testing/selftests/kvm/lib/test_util.c
+++ b/tools/testing/selftests/kvm/lib/test_util.c
@@ -4,10 +4,13 @@
  *
  * Copyright (C) 2020, Google LLC.
  */
-#include <stdlib.h>
+
+#include <assert.h>
 #include <ctype.h>
 #include <limits.h>
-#include <assert.h>
+#include <stdlib.h>
+#include <time.h>
+
 #include "test_util.h"
 
 /*
@@ -81,6 +84,14 @@ struct timespec timespec_sub(struct timespec ts1, struct timespec ts2)
 	return timespec_add_ns((struct timespec){0}, ns1 - ns2);
 }
 
+struct timespec timespec_diff_now(struct timespec start)
+{
+	struct timespec end;
+
+	clock_gettime(CLOCK_MONOTONIC, &end);
+	return timespec_sub(end, start);
+}
+
 void print_skip(const char *fmt, ...)
 {
 	va_list ap;
commit 2fe5149bdfbf3c2cdfafd2b5b496252d45ca1f78
Author: Ben Gardon <bgardon at google.com>
Date:   Tue Oct 27 16:37:30 2020 -0700

    KVM: selftests: Remove address rounding in guest code
    
    Rounding the address the guest writes to a host page boundary
    will only have an effect if the host page size is larger than the guest
    page size, but in that case the guest write would still go to the same
    host page. There's no reason to round the address down, so remove the
    rounding to simplify the demand paging test.
    
    This series was tested by running the following invocations on an Intel
    Skylake machine:
    dirty_log_perf_test -b 20m -i 100 -v 64
    dirty_log_perf_test -b 20g -i 5 -v 4
    dirty_log_perf_test -b 4g -i 5 -v 32
    demand_paging_test -b 20m -v 64
    demand_paging_test -b 20g -v 4
    demand_paging_test -b 4g -v 32
    All behaved as expected.
    
    Signed-off-by: Ben Gardon <bgardon at google.com>
    Message-Id: <20201027233733.1484855-3-bgardon at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
index f71f0858a1f2..838f946700f0 100644
--- a/tools/testing/selftests/kvm/include/perf_test_util.h
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -72,7 +72,6 @@ static void guest_code(uint32_t vcpu_id)
 	for (i = 0; i < pages; i++) {
 		uint64_t addr = gva + (i * perf_test_args.guest_page_size);
 
-		addr &= ~(perf_test_args.host_page_size - 1);
 		*(uint64_t *)addr = 0x0123456789ABCDEF;
 	}
 
commit 4b5d12b0e21cc9f9f00201819844fcafb020ffad
Author: Ben Gardon <bgardon at google.com>
Date:   Tue Oct 27 16:37:29 2020 -0700

    KVM: selftests: Factor code out of demand_paging_test
    
    Much of the code in demand_paging_test can be reused by other, similar
    multi-vCPU-memory-touching-perfromance-tests. Factor that common code
    out for reuse.
    
    No functional change expected.
    
    This series was tested by running the following invocations on an Intel
    Skylake machine:
    dirty_log_perf_test -b 20m -i 100 -v 64
    dirty_log_perf_test -b 20g -i 5 -v 4
    dirty_log_perf_test -b 4g -i 5 -v 32
    demand_paging_test -b 20m -v 64
    demand_paging_test -b 20g -v 4
    demand_paging_test -b 4g -v 32
    All behaved as expected.
    
    Signed-off-by: Ben Gardon <bgardon at google.com>
    Message-Id: <20201027233733.1484855-2-bgardon at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index 360cd3ea4cd6..4251e98ceb69 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -21,18 +21,12 @@
 #include <linux/bitops.h>
 #include <linux/userfaultfd.h>
 
-#include "test_util.h"
-#include "kvm_util.h"
+#include "perf_test_util.h"
 #include "processor.h"
+#include "test_util.h"
 
 #ifdef __NR_userfaultfd
 
-/* The memory slot index demand page */
-#define TEST_MEM_SLOT_INDEX		1
-
-/* Default guest test virtual memory offset */
-#define DEFAULT_GUEST_TEST_MEM		0xc0000000
-
 #define DEFAULT_GUEST_TEST_MEM_SIZE (1 << 30) /* 1G */
 
 #ifdef PRINT_PER_PAGE_UPDATES
@@ -47,75 +41,14 @@
 #define PER_VCPU_DEBUG(...) _no_printf(__VA_ARGS__)
 #endif
 
-#define MAX_VCPUS 512
-
-/*
- * Guest/Host shared variables. Ensure addr_gva2hva() and/or
- * sync_global_to/from_guest() are used when accessing from
- * the host. READ/WRITE_ONCE() should also be used with anything
- * that may change.
- */
-static uint64_t host_page_size;
-static uint64_t guest_page_size;
-
 static char *guest_data_prototype;
 
-/*
- * Guest physical memory offset of the testing memory slot.
- * This will be set to the topmost valid physical address minus
- * the test memory size.
- */
-static uint64_t guest_test_phys_mem;
-
-/*
- * Guest virtual memory offset of the testing memory slot.
- * Must not conflict with identity mapped test code.
- */
-static uint64_t guest_test_virt_mem = DEFAULT_GUEST_TEST_MEM;
-
-struct vcpu_args {
-	uint64_t gva;
-	uint64_t pages;
-
-	/* Only used by the host userspace part of the vCPU thread */
-	int vcpu_id;
-	struct kvm_vm *vm;
-};
-
-static struct vcpu_args vcpu_args[MAX_VCPUS];
-
-/*
- * Continuously write to the first 8 bytes of each page in the demand paging
- * memory region.
- */
-static void guest_code(uint32_t vcpu_id)
-{
-	uint64_t gva;
-	uint64_t pages;
-	int i;
-
-	/* Make sure vCPU args data structure is not corrupt. */
-	GUEST_ASSERT(vcpu_args[vcpu_id].vcpu_id == vcpu_id);
-
-	gva = vcpu_args[vcpu_id].gva;
-	pages = vcpu_args[vcpu_id].pages;
-
-	for (i = 0; i < pages; i++) {
-		uint64_t addr = gva + (i * guest_page_size);
-
-		addr &= ~(host_page_size - 1);
-		*(uint64_t *)addr = 0x0123456789ABCDEF;
-	}
-
-	GUEST_SYNC(1);
-}
-
 static void *vcpu_worker(void *data)
 {
 	int ret;
-	struct vcpu_args *args = (struct vcpu_args *)data;
-	struct kvm_vm *vm = args->vm;
-	int vcpu_id = args->vcpu_id;
+	struct vcpu_args *vcpu_args = (struct vcpu_args *)data;
+	int vcpu_id = vcpu_args->vcpu_id;
+	struct kvm_vm *vm = perf_test_args.vm;
 	struct kvm_run *run;
 	struct timespec start, end, ts_diff;
 
@@ -141,39 +74,6 @@ static void *vcpu_worker(void *data)
 	return NULL;
 }
 
-#define PAGE_SHIFT_4K  12
-#define PTES_PER_4K_PT 512
-
-static struct kvm_vm *create_vm(enum vm_guest_mode mode, int vcpus,
-				uint64_t vcpu_memory_bytes)
-{
-	struct kvm_vm *vm;
-	uint64_t pages = DEFAULT_GUEST_PHY_PAGES;
-
-	/* Account for a few pages per-vCPU for stacks */
-	pages += DEFAULT_STACK_PGS * vcpus;
-
-	/*
-	 * Reserve twice the ammount of memory needed to map the test region and
-	 * the page table / stacks region, at 4k, for page tables. Do the
-	 * calculation with 4K page size: the smallest of all archs. (e.g., 64K
-	 * page size guest will need even less memory for page tables).
-	 */
-	pages += (2 * pages) / PTES_PER_4K_PT;
-	pages += ((2 * vcpus * vcpu_memory_bytes) >> PAGE_SHIFT_4K) /
-		 PTES_PER_4K_PT;
-	pages = vm_adjust_num_guest_pages(mode, pages);
-
-	pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode));
-
-	vm = _vm_create(mode, pages, O_RDWR);
-	kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
-#ifdef __x86_64__
-	vm_create_irqchip(vm);
-#endif
-	return vm;
-}
-
 static int handle_uffd_page_request(int uffd, uint64_t addr)
 {
 	pid_t tid;
@@ -186,7 +86,7 @@ static int handle_uffd_page_request(int uffd, uint64_t addr)
 
 	copy.src = (uint64_t)guest_data_prototype;
 	copy.dst = addr;
-	copy.len = host_page_size;
+	copy.len = perf_test_args.host_page_size;
 	copy.mode = 0;
 
 	clock_gettime(CLOCK_MONOTONIC, &start);
@@ -203,7 +103,7 @@ static int handle_uffd_page_request(int uffd, uint64_t addr)
 	PER_PAGE_DEBUG("UFFDIO_COPY %d \t%ld ns\n", tid,
 		       timespec_to_ns(timespec_sub(end, start)));
 	PER_PAGE_DEBUG("Paged in %ld bytes at 0x%lx from thread %d\n",
-		       host_page_size, addr, tid);
+		       perf_test_args.host_page_size, addr, tid);
 
 	return 0;
 }
@@ -360,64 +260,21 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	struct timespec start, end, ts_diff;
 	int *pipefds = NULL;
 	struct kvm_vm *vm;
-	uint64_t guest_num_pages;
 	int vcpu_id;
 	int r;
 
 	vm = create_vm(mode, vcpus, vcpu_memory_bytes);
 
-	guest_page_size = vm_get_page_size(vm);
-
-	TEST_ASSERT(vcpu_memory_bytes % guest_page_size == 0,
-		    "Guest memory size is not guest page size aligned.");
-
-	guest_num_pages = (vcpus * vcpu_memory_bytes) / guest_page_size;
-	guest_num_pages = vm_adjust_num_guest_pages(mode, guest_num_pages);
-
-	/*
-	 * If there should be more memory in the guest test region than there
-	 * can be pages in the guest, it will definitely cause problems.
-	 */
-	TEST_ASSERT(guest_num_pages < vm_get_max_gfn(vm),
-		    "Requested more guest memory than address space allows.\n"
-		    "    guest pages: %lx max gfn: %x vcpus: %d wss: %lx]\n",
-		    guest_num_pages, vm_get_max_gfn(vm), vcpus,
-		    vcpu_memory_bytes);
-
-	host_page_size = getpagesize();
-	TEST_ASSERT(vcpu_memory_bytes % host_page_size == 0,
-		    "Guest memory size is not host page size aligned.");
-
-	guest_test_phys_mem = (vm_get_max_gfn(vm) - guest_num_pages) *
-			      guest_page_size;
-	guest_test_phys_mem &= ~(host_page_size - 1);
-
-#ifdef __s390x__
-	/* Align to 1M (segment size) */
-	guest_test_phys_mem &= ~((1 << 20) - 1);
-#endif
-
-	pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem);
-
-	/* Add an extra memory slot for testing demand paging */
-	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
-				    guest_test_phys_mem,
-				    TEST_MEM_SLOT_INDEX,
-				    guest_num_pages, 0);
-
-	/* Do mapping for the demand paging memory slot */
-	virt_map(vm, guest_test_virt_mem, guest_test_phys_mem, guest_num_pages, 0);
-
-	ucall_init(vm, NULL);
-
-	guest_data_prototype = malloc(host_page_size);
+	guest_data_prototype = malloc(perf_test_args.host_page_size);
 	TEST_ASSERT(guest_data_prototype,
 		    "Failed to allocate buffer for guest data pattern");
-	memset(guest_data_prototype, 0xAB, host_page_size);
+	memset(guest_data_prototype, 0xAB, perf_test_args.host_page_size);
 
 	vcpu_threads = malloc(vcpus * sizeof(*vcpu_threads));
 	TEST_ASSERT(vcpu_threads, "Memory allocation failed");
 
+	add_vcpus(vm, vcpus, vcpu_memory_bytes);
+
 	if (use_uffd) {
 		uffd_handler_threads =
 			malloc(vcpus * sizeof(*uffd_handler_threads));
@@ -428,22 +285,18 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 
 		pipefds = malloc(sizeof(int) * vcpus * 2);
 		TEST_ASSERT(pipefds, "Unable to allocate memory for pipefd");
-	}
 
-	for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
-		vm_paddr_t vcpu_gpa;
-		void *vcpu_hva;
-
-		vm_vcpu_add_default(vm, vcpu_id, guest_code);
+		for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
+			vm_paddr_t vcpu_gpa;
+			void *vcpu_hva;
 
-		vcpu_gpa = guest_test_phys_mem + (vcpu_id * vcpu_memory_bytes);
-		PER_VCPU_DEBUG("Added VCPU %d with test mem gpa [%lx, %lx)\n",
-			       vcpu_id, vcpu_gpa, vcpu_gpa + vcpu_memory_bytes);
+			vcpu_gpa = guest_test_phys_mem + (vcpu_id * vcpu_memory_bytes);
+			PER_VCPU_DEBUG("Added VCPU %d with test mem gpa [%lx, %lx)\n",
+				       vcpu_id, vcpu_gpa, vcpu_gpa + vcpu_memory_bytes);
 
-		/* Cache the HVA pointer of the region */
-		vcpu_hva = addr_gpa2hva(vm, vcpu_gpa);
+			/* Cache the HVA pointer of the region */
+			vcpu_hva = addr_gpa2hva(vm, vcpu_gpa);
 
-		if (use_uffd) {
 			/*
 			 * Set up user fault fd to handle demand paging
 			 * requests.
@@ -460,22 +313,10 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 			if (r < 0)
 				exit(-r);
 		}
-
-#ifdef __x86_64__
-		vcpu_set_cpuid(vm, vcpu_id, kvm_get_supported_cpuid());
-#endif
-
-		vcpu_args[vcpu_id].vm = vm;
-		vcpu_args[vcpu_id].vcpu_id = vcpu_id;
-		vcpu_args[vcpu_id].gva = guest_test_virt_mem +
-					 (vcpu_id * vcpu_memory_bytes);
-		vcpu_args[vcpu_id].pages = vcpu_memory_bytes / guest_page_size;
 	}
 
 	/* Export the shared variables to the guest */
-	sync_global_to_guest(vm, host_page_size);
-	sync_global_to_guest(vm, guest_page_size);
-	sync_global_to_guest(vm, vcpu_args);
+	sync_global_to_guest(vm, perf_test_args);
 
 	pr_info("Finished creating vCPUs and starting uffd threads\n");
 
@@ -483,7 +324,7 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 
 	for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
 		pthread_create(&vcpu_threads[vcpu_id], NULL, vcpu_worker,
-			       &vcpu_args[vcpu_id]);
+			       &perf_test_args.vcpu_args[vcpu_id]);
 	}
 
 	pr_info("Started all vCPUs\n");
@@ -514,7 +355,8 @@ static void run_test(enum vm_guest_mode mode, bool use_uffd,
 	pr_info("Total guest execution time: %ld.%.9lds\n",
 		ts_diff.tv_sec, ts_diff.tv_nsec);
 	pr_info("Overall demand paging rate: %f pgs/sec\n",
-		guest_num_pages / ((double)ts_diff.tv_sec + (double)ts_diff.tv_nsec / 100000000.0));
+		perf_test_args.vcpu_args[0].pages * vcpus /
+		((double)ts_diff.tv_sec + (double)ts_diff.tv_nsec / 100000000.0));
 
 	ucall_uninit(vm);
 	kvm_vm_free(vm);
diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h
new file mode 100644
index 000000000000..f71f0858a1f2
--- /dev/null
+++ b/tools/testing/selftests/kvm/include/perf_test_util.h
@@ -0,0 +1,187 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * tools/testing/selftests/kvm/include/perf_test_util.h
+ *
+ * Copyright (C) 2020, Google LLC.
+ */
+
+#ifndef SELFTEST_KVM_PERF_TEST_UTIL_H
+#define SELFTEST_KVM_PERF_TEST_UTIL_H
+
+#include "kvm_util.h"
+#include "processor.h"
+
+#define MAX_VCPUS 512
+
+#define PAGE_SHIFT_4K  12
+#define PTES_PER_4K_PT 512
+
+#define TEST_MEM_SLOT_INDEX		1
+
+/* Default guest test virtual memory offset */
+#define DEFAULT_GUEST_TEST_MEM		0xc0000000
+
+/*
+ * Guest physical memory offset of the testing memory slot.
+ * This will be set to the topmost valid physical address minus
+ * the test memory size.
+ */
+static uint64_t guest_test_phys_mem;
+
+/*
+ * Guest virtual memory offset of the testing memory slot.
+ * Must not conflict with identity mapped test code.
+ */
+static uint64_t guest_test_virt_mem = DEFAULT_GUEST_TEST_MEM;
+
+struct vcpu_args {
+	uint64_t gva;
+	uint64_t pages;
+
+	/* Only used by the host userspace part of the vCPU thread */
+	int vcpu_id;
+};
+
+struct perf_test_args {
+	struct kvm_vm *vm;
+	uint64_t host_page_size;
+	uint64_t guest_page_size;
+
+	struct vcpu_args vcpu_args[MAX_VCPUS];
+};
+
+static struct perf_test_args perf_test_args;
+
+/*
+ * Continuously write to the first 8 bytes of each page in the
+ * specified region.
+ */
+static void guest_code(uint32_t vcpu_id)
+{
+	struct vcpu_args *vcpu_args = &perf_test_args.vcpu_args[vcpu_id];
+	uint64_t gva;
+	uint64_t pages;
+	int i;
+
+	/* Make sure vCPU args data structure is not corrupt. */
+	GUEST_ASSERT(vcpu_args->vcpu_id == vcpu_id);
+
+	gva = vcpu_args->gva;
+	pages = vcpu_args->pages;
+
+	for (i = 0; i < pages; i++) {
+		uint64_t addr = gva + (i * perf_test_args.guest_page_size);
+
+		addr &= ~(perf_test_args.host_page_size - 1);
+		*(uint64_t *)addr = 0x0123456789ABCDEF;
+	}
+
+	GUEST_SYNC(1);
+}
+
+static struct kvm_vm *create_vm(enum vm_guest_mode mode, int vcpus,
+				uint64_t vcpu_memory_bytes)
+{
+	struct kvm_vm *vm;
+	uint64_t pages = DEFAULT_GUEST_PHY_PAGES;
+	uint64_t guest_num_pages;
+
+	/* Account for a few pages per-vCPU for stacks */
+	pages += DEFAULT_STACK_PGS * vcpus;
+
+	/*
+	 * Reserve twice the ammount of memory needed to map the test region and
+	 * the page table / stacks region, at 4k, for page tables. Do the
+	 * calculation with 4K page size: the smallest of all archs. (e.g., 64K
+	 * page size guest will need even less memory for page tables).
+	 */
+	pages += (2 * pages) / PTES_PER_4K_PT;
+	pages += ((2 * vcpus * vcpu_memory_bytes) >> PAGE_SHIFT_4K) /
+		 PTES_PER_4K_PT;
+	pages = vm_adjust_num_guest_pages(mode, pages);
+
+	pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode));
+
+	vm = _vm_create(mode, pages, O_RDWR);
+	kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
+#ifdef __x86_64__
+	vm_create_irqchip(vm);
+#endif
+
+	perf_test_args.vm = vm;
+	perf_test_args.guest_page_size = vm_get_page_size(vm);
+	perf_test_args.host_page_size = getpagesize();
+
+	TEST_ASSERT(vcpu_memory_bytes % perf_test_args.guest_page_size == 0,
+		    "Guest memory size is not guest page size aligned.");
+
+	guest_num_pages = (vcpus * vcpu_memory_bytes) /
+			  perf_test_args.guest_page_size;
+	guest_num_pages = vm_adjust_num_guest_pages(mode, guest_num_pages);
+
+	/*
+	 * If there should be more memory in the guest test region than there
+	 * can be pages in the guest, it will definitely cause problems.
+	 */
+	TEST_ASSERT(guest_num_pages < vm_get_max_gfn(vm),
+		    "Requested more guest memory than address space allows.\n"
+		    "    guest pages: %lx max gfn: %x vcpus: %d wss: %lx]\n",
+		    guest_num_pages, vm_get_max_gfn(vm), vcpus,
+		    vcpu_memory_bytes);
+
+	TEST_ASSERT(vcpu_memory_bytes % perf_test_args.host_page_size == 0,
+		    "Guest memory size is not host page size aligned.");
+
+	guest_test_phys_mem = (vm_get_max_gfn(vm) - guest_num_pages) *
+			      perf_test_args.guest_page_size;
+	guest_test_phys_mem &= ~(perf_test_args.host_page_size - 1);
+
+#ifdef __s390x__
+	/* Align to 1M (segment size) */
+	guest_test_phys_mem &= ~((1 << 20) - 1);
+#endif
+
+	pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem);
+
+	/* Add an extra memory slot for testing */
+	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
+				    guest_test_phys_mem,
+				    TEST_MEM_SLOT_INDEX,
+				    guest_num_pages, 0);
+
+	/* Do mapping for the demand paging memory slot */
+	virt_map(vm, guest_test_virt_mem, guest_test_phys_mem, guest_num_pages, 0);
+
+	ucall_init(vm, NULL);
+
+	return vm;
+}
+
+static void add_vcpus(struct kvm_vm *vm, int vcpus, uint64_t vcpu_memory_bytes)
+{
+	vm_paddr_t vcpu_gpa;
+	struct vcpu_args *vcpu_args;
+	int vcpu_id;
+
+	for (vcpu_id = 0; vcpu_id < vcpus; vcpu_id++) {
+		vcpu_args = &perf_test_args.vcpu_args[vcpu_id];
+
+		vm_vcpu_add_default(vm, vcpu_id, guest_code);
+
+#ifdef __x86_64__
+		vcpu_set_cpuid(vm, vcpu_id, kvm_get_supported_cpuid());
+#endif
+
+		vcpu_args->vcpu_id = vcpu_id;
+		vcpu_args->gva = guest_test_virt_mem +
+				 (vcpu_id * vcpu_memory_bytes);
+		vcpu_args->pages = vcpu_memory_bytes /
+				   perf_test_args.guest_page_size;
+
+		vcpu_gpa = guest_test_phys_mem + (vcpu_id * vcpu_memory_bytes);
+		pr_debug("Added VCPU %d with test mem gpa [%lx, %lx)\n",
+			 vcpu_id, vcpu_gpa, vcpu_gpa + vcpu_memory_bytes);
+	}
+}
+
+#endif /* SELFTEST_KVM_PERF_TEST_UTIL_H */
commit afdb1960071935cfd5c1908691a34cc6e36931f7
Author: Peter Xu <peterx at redhat.com>
Date:   Wed Sep 30 21:22:33 2020 -0400

    KVM: selftests: Use a single binary for dirty/clear log test
    
    Remove the clear_dirty_log test, instead merge it into the existing
    dirty_log_test.  It should be cleaner to use this single binary to do
    both tests, also it's a preparation for the upcoming dirty ring test.
    
    The default behavior will run all the modes in sequence.
    
    Reviewed-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Peter Xu <peterx at redhat.com>
    Message-Id: <20201001012233.6013-1-peterx at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index 2b0d7d325e2a..c8af04dccf7f 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -59,7 +59,6 @@ TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
 TEST_GEN_PROGS_x86_64 += x86_64/debug_regs
 TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test
 TEST_GEN_PROGS_x86_64 += x86_64/user_msr_test
-TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
 TEST_GEN_PROGS_x86_64 += demand_paging_test
 TEST_GEN_PROGS_x86_64 += dirty_log_test
 TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
@@ -68,7 +67,6 @@ TEST_GEN_PROGS_x86_64 += steal_time
 
 TEST_GEN_PROGS_aarch64 += aarch64/get-reg-list
 TEST_GEN_PROGS_aarch64 += aarch64/get-reg-list-sve
-TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
 TEST_GEN_PROGS_aarch64 += demand_paging_test
 TEST_GEN_PROGS_aarch64 += dirty_log_test
 TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus
diff --git a/tools/testing/selftests/kvm/clear_dirty_log_test.c b/tools/testing/selftests/kvm/clear_dirty_log_test.c
deleted file mode 100644
index 11672ec6f74e..000000000000
--- a/tools/testing/selftests/kvm/clear_dirty_log_test.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#define USE_CLEAR_DIRTY_LOG
-#define KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE (1 << 0)
-#define KVM_DIRTY_LOG_INITIALLY_SET         (1 << 1)
-#define KVM_DIRTY_LOG_MANUAL_CAPS   (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE | \
-		KVM_DIRTY_LOG_INITIALLY_SET)
-#include "dirty_log_test.c"
diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index 6a8275a22861..139ccb550618 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -128,6 +128,78 @@ static uint64_t host_dirty_count;
 static uint64_t host_clear_count;
 static uint64_t host_track_next_count;
 
+enum log_mode_t {
+	/* Only use KVM_GET_DIRTY_LOG for logging */
+	LOG_MODE_DIRTY_LOG = 0,
+
+	/* Use both KVM_[GET|CLEAR]_DIRTY_LOG for logging */
+	LOG_MODE_CLEAR_LOG = 1,
+
+	LOG_MODE_NUM,
+
+	/* Run all supported modes */
+	LOG_MODE_ALL = LOG_MODE_NUM,
+};
+
+/* Mode of logging to test.  Default is to run all supported modes */
+static enum log_mode_t host_log_mode_option = LOG_MODE_ALL;
+/* Logging mode for current run */
+static enum log_mode_t host_log_mode;
+
+static bool clear_log_supported(void)
+{
+	return kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
+}
+
+static void clear_log_create_vm_done(struct kvm_vm *vm)
+{
+	struct kvm_enable_cap cap = {};
+	u64 manual_caps;
+
+	manual_caps = kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
+	TEST_ASSERT(manual_caps, "MANUAL_CAPS is zero!");
+	manual_caps &= (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |
+			KVM_DIRTY_LOG_INITIALLY_SET);
+	cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2;
+	cap.args[0] = manual_caps;
+	vm_enable_cap(vm, &cap);
+}
+
+static void dirty_log_collect_dirty_pages(struct kvm_vm *vm, int slot,
+					  void *bitmap, uint32_t num_pages)
+{
+	kvm_vm_get_dirty_log(vm, slot, bitmap);
+}
+
+static void clear_log_collect_dirty_pages(struct kvm_vm *vm, int slot,
+					  void *bitmap, uint32_t num_pages)
+{
+	kvm_vm_get_dirty_log(vm, slot, bitmap);
+	kvm_vm_clear_dirty_log(vm, slot, bitmap, 0, num_pages);
+}
+
+struct log_mode {
+	const char *name;
+	/* Return true if this mode is supported, otherwise false */
+	bool (*supported)(void);
+	/* Hook when the vm creation is done (before vcpu creation) */
+	void (*create_vm_done)(struct kvm_vm *vm);
+	/* Hook to collect the dirty pages into the bitmap provided */
+	void (*collect_dirty_pages) (struct kvm_vm *vm, int slot,
+				     void *bitmap, uint32_t num_pages);
+} log_modes[LOG_MODE_NUM] = {
+	{
+		.name = "dirty-log",
+		.collect_dirty_pages = dirty_log_collect_dirty_pages,
+	},
+	{
+		.name = "clear-log",
+		.supported = clear_log_supported,
+		.create_vm_done = clear_log_create_vm_done,
+		.collect_dirty_pages = clear_log_collect_dirty_pages,
+	},
+};
+
 /*
  * We use this bitmap to track some pages that should have its dirty
  * bit set in the _next_ iteration.  For example, if we detected the
@@ -137,6 +209,44 @@ static uint64_t host_track_next_count;
  */
 static unsigned long *host_bmap_track;
 
+static void log_modes_dump(void)
+{
+	int i;
+
+	printf("all");
+	for (i = 0; i < LOG_MODE_NUM; i++)
+		printf(", %s", log_modes[i].name);
+	printf("\n");
+}
+
+static bool log_mode_supported(void)
+{
+	struct log_mode *mode = &log_modes[host_log_mode];
+
+	if (mode->supported)
+		return mode->supported();
+
+	return true;
+}
+
+static void log_mode_create_vm_done(struct kvm_vm *vm)
+{
+	struct log_mode *mode = &log_modes[host_log_mode];
+
+	if (mode->create_vm_done)
+		mode->create_vm_done(vm);
+}
+
+static void log_mode_collect_dirty_pages(struct kvm_vm *vm, int slot,
+					 void *bitmap, uint32_t num_pages)
+{
+	struct log_mode *mode = &log_modes[host_log_mode];
+
+	TEST_ASSERT(mode->collect_dirty_pages != NULL,
+		    "collect_dirty_pages() is required for any log mode!");
+	mode->collect_dirty_pages(vm, slot, bitmap, num_pages);
+}
+
 static void generate_random_array(uint64_t *guest_array, uint64_t size)
 {
 	uint64_t i;
@@ -257,6 +367,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
 #ifdef __x86_64__
 	vm_create_irqchip(vm);
 #endif
+	log_mode_create_vm_done(vm);
 	vm_vcpu_add_default(vm, vcpuid, guest_code);
 	return vm;
 }
@@ -264,10 +375,6 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
 #define DIRTY_MEM_BITS 30 /* 1G */
 #define PAGE_SHIFT_4K  12
 
-#ifdef USE_CLEAR_DIRTY_LOG
-static u64 dirty_log_manual_caps;
-#endif
-
 static void run_test(enum vm_guest_mode mode, unsigned long iterations,
 		     unsigned long interval, uint64_t phys_offset)
 {
@@ -275,6 +382,12 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
 	struct kvm_vm *vm;
 	unsigned long *bmap;
 
+	if (!log_mode_supported()) {
+		print_skip("Log mode '%s' not supported",
+			   log_modes[host_log_mode].name);
+		return;
+	}
+
 	/*
 	 * We reserve page table for 2 times of extra dirty mem which
 	 * will definitely cover the original (1G+) test range.  Here
@@ -317,14 +430,6 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
 	bmap = bitmap_alloc(host_num_pages);
 	host_bmap_track = bitmap_alloc(host_num_pages);
 
-#ifdef USE_CLEAR_DIRTY_LOG
-	struct kvm_enable_cap cap = {};
-
-	cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2;
-	cap.args[0] = dirty_log_manual_caps;
-	vm_enable_cap(vm, &cap);
-#endif
-
 	/* Add an extra memory slot for testing dirty logging */
 	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
 				    guest_test_phys_mem,
@@ -362,11 +467,8 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
 	while (iteration < iterations) {
 		/* Give the vcpu thread some time to dirty some pages */
 		usleep(interval * 1000);
-		kvm_vm_get_dirty_log(vm, TEST_MEM_SLOT_INDEX, bmap);
-#ifdef USE_CLEAR_DIRTY_LOG
-		kvm_vm_clear_dirty_log(vm, TEST_MEM_SLOT_INDEX, bmap, 0,
-				       host_num_pages);
-#endif
+		log_mode_collect_dirty_pages(vm, TEST_MEM_SLOT_INDEX,
+					     bmap, host_num_pages);
 		vm_dirty_log_verify(mode, bmap);
 		iteration++;
 		sync_global_to_guest(vm, iteration);
@@ -410,6 +512,9 @@ static void help(char *name)
 	       TEST_HOST_LOOP_INTERVAL);
 	printf(" -p: specify guest physical test memory offset\n"
 	       "     Warning: a low offset can conflict with the loaded test code.\n");
+	printf(" -M: specify the host logging mode "
+	       "(default: run all log modes).  Supported modes: \n\t");
+	log_modes_dump();
 	printf(" -m: specify the guest mode ID to test "
 	       "(default: test all supported modes)\n"
 	       "     This option may be used multiple times.\n"
@@ -429,18 +534,7 @@ int main(int argc, char *argv[])
 	bool mode_selected = false;
 	uint64_t phys_offset = 0;
 	unsigned int mode;
-	int opt, i;
-
-#ifdef USE_CLEAR_DIRTY_LOG
-	dirty_log_manual_caps =
-		kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
-	if (!dirty_log_manual_caps) {
-		print_skip("KVM_CLEAR_DIRTY_LOG not available");
-		exit(KSFT_SKIP);
-	}
-	dirty_log_manual_caps &= (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |
-				  KVM_DIRTY_LOG_INITIALLY_SET);
-#endif
+	int opt, i, j;
 
 #ifdef __x86_64__
 	guest_mode_init(VM_MODE_PXXV48_4K, true, true);
@@ -464,7 +558,7 @@ int main(int argc, char *argv[])
 	guest_mode_init(VM_MODE_P40V48_4K, true, true);
 #endif
 
-	while ((opt = getopt(argc, argv, "hi:I:p:m:")) != -1) {
+	while ((opt = getopt(argc, argv, "hi:I:p:m:M:")) != -1) {
 		switch (opt) {
 		case 'i':
 			iterations = strtol(optarg, NULL, 10);
@@ -486,6 +580,26 @@ int main(int argc, char *argv[])
 				    "Guest mode ID %d too big", mode);
 			guest_modes[mode].enabled = true;
 			break;
+		case 'M':
+			if (!strcmp(optarg, "all")) {
+				host_log_mode_option = LOG_MODE_ALL;
+				break;
+			}
+			for (i = 0; i < LOG_MODE_NUM; i++) {
+				if (!strcmp(optarg, log_modes[i].name)) {
+					pr_info("Setting log mode to: '%s'\n",
+						optarg);
+					host_log_mode_option = i;
+					break;
+				}
+			}
+			if (i == LOG_MODE_NUM) {
+				printf("Log mode '%s' invalid. Please choose "
+				       "from: ", optarg);
+				log_modes_dump();
+				exit(1);
+			}
+			break;
 		case 'h':
 		default:
 			help(argv[0]);
@@ -507,7 +621,18 @@ int main(int argc, char *argv[])
 		TEST_ASSERT(guest_modes[i].supported,
 			    "Guest mode ID %d (%s) not supported.",
 			    i, vm_guest_mode_string(i));
-		run_test(i, iterations, interval, phys_offset);
+		if (host_log_mode_option == LOG_MODE_ALL) {
+			/* Run each log mode */
+			for (j = 0; j < LOG_MODE_NUM; j++) {
+				pr_info("Testing Log Mode '%s'\n",
+					log_modes[j].name);
+				host_log_mode = j;
+				run_test(i, iterations, interval, phys_offset);
+			}
+		} else {
+			host_log_mode = host_log_mode_option;
+			run_test(i, iterations, interval, phys_offset);
+		}
 	}
 
 	return 0;
commit 3031e0288e60f09533339e61117b83099a6e126e
Author: Peter Xu <peterx at redhat.com>
Date:   Wed Sep 30 21:22:28 2020 -0400

    KVM: selftests: Always clear dirty bitmap after iteration
    
    We used not to clear the dirty bitmap before because KVM_GET_DIRTY_LOG
    would overwrite it the next time it copies the dirty log onto it.
    In the upcoming dirty ring tests we'll start to fetch dirty pages from
    a ring buffer, so no one is going to clear the dirty bitmap for us.
    
    Reviewed-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Peter Xu <peterx at redhat.com>
    Message-Id: <20201001012228.5916-1-peterx at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index 752ec158ac59..6a8275a22861 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -195,7 +195,7 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap)
 				    page);
 		}
 
-		if (test_bit_le(page, bmap)) {
+		if (test_and_clear_bit_le(page, bmap)) {
 			host_dirty_count++;
 			/*
 			 * If the bit is set, the value written onto
commit 31d212959179015bc07f3af4e890cadd26e01ee0
Author: Andrew Jones <drjones at redhat.com>
Date:   Thu Oct 29 21:17:03 2020 +0100

    KVM: selftests: Add blessed SVE registers to get-reg-list
    
    Add support for the SVE registers to get-reg-list and create a
    new test, get-reg-list-sve, which tests them when running on a
    machine with SVE support.
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Message-Id: <20201029201703.102716-5-drjones at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
index 2034765862a2..ea1692d43411 100644
--- a/tools/testing/selftests/kvm/.gitignore
+++ b/tools/testing/selftests/kvm/.gitignore
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 /aarch64/get-reg-list
+/aarch64/get-reg-list-sve
 /s390x/memop
 /s390x/resets
 /s390x/sync_regs_test
diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index 771455ae4a1b..2b0d7d325e2a 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -67,6 +67,7 @@ TEST_GEN_PROGS_x86_64 += set_memory_region_test
 TEST_GEN_PROGS_x86_64 += steal_time
 
 TEST_GEN_PROGS_aarch64 += aarch64/get-reg-list
+TEST_GEN_PROGS_aarch64 += aarch64/get-reg-list-sve
 TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
 TEST_GEN_PROGS_aarch64 += demand_paging_test
 TEST_GEN_PROGS_aarch64 += dirty_log_test
diff --git a/tools/testing/selftests/kvm/aarch64/get-reg-list-sve.c b/tools/testing/selftests/kvm/aarch64/get-reg-list-sve.c
new file mode 100644
index 000000000000..efba76682b4b
--- /dev/null
+++ b/tools/testing/selftests/kvm/aarch64/get-reg-list-sve.c
@@ -0,0 +1,3 @@
+// SPDX-License-Identifier: GPL-2.0
+#define REG_LIST_SVE
+#include "get-reg-list.c"
diff --git a/tools/testing/selftests/kvm/aarch64/get-reg-list.c b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
index 3ff097f6886e..33218a395d9f 100644
--- a/tools/testing/selftests/kvm/aarch64/get-reg-list.c
+++ b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
@@ -29,6 +29,13 @@
 #include <string.h>
 #include "kvm_util.h"
 #include "test_util.h"
+#include "processor.h"
+
+#ifdef REG_LIST_SVE
+#define reg_list_sve() (true)
+#else
+#define reg_list_sve() (false)
+#endif
 
 #define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_COPROC_MASK)
 
@@ -46,8 +53,9 @@
 
 static struct kvm_reg_list *reg_list;
 
-static __u64 blessed_reg[];
-static __u64 blessed_n;
+static __u64 base_regs[], vregs[], sve_regs[], rejects_set[];
+static __u64 base_regs_n, vregs_n, sve_regs_n, rejects_set_n;
+static __u64 *blessed_reg, blessed_n;
 
 static bool find_reg(__u64 regs[], __u64 nr_regs, __u64 reg)
 {
@@ -119,6 +127,40 @@ static const char *core_id_to_str(__u64 id)
 	return NULL;
 }
 
+static const char *sve_id_to_str(__u64 id)
+{
+	__u64 sve_off, n, i;
+
+	if (id == KVM_REG_ARM64_SVE_VLS)
+		return "KVM_REG_ARM64_SVE_VLS";
+
+	sve_off = id & ~(REG_MASK | ((1ULL << 5) - 1));
+	i = id & (KVM_ARM64_SVE_MAX_SLICES - 1);
+
+	TEST_ASSERT(i == 0, "Currently we don't expect slice > 0, reg id 0x%llx", id);
+
+	switch (sve_off) {
+	case KVM_REG_ARM64_SVE_ZREG_BASE ...
+	     KVM_REG_ARM64_SVE_ZREG_BASE + (1ULL << 5) * KVM_ARM64_SVE_NUM_ZREGS - 1:
+		n = (id >> 5) & (KVM_ARM64_SVE_NUM_ZREGS - 1);
+		TEST_ASSERT(id == KVM_REG_ARM64_SVE_ZREG(n, 0),
+			    "Unexpected bits set in SVE ZREG id: 0x%llx", id);
+		return str_with_index("KVM_REG_ARM64_SVE_ZREG(##, 0)", n);
+	case KVM_REG_ARM64_SVE_PREG_BASE ...
+	     KVM_REG_ARM64_SVE_PREG_BASE + (1ULL << 5) * KVM_ARM64_SVE_NUM_PREGS - 1:
+		n = (id >> 5) & (KVM_ARM64_SVE_NUM_PREGS - 1);
+		TEST_ASSERT(id == KVM_REG_ARM64_SVE_PREG(n, 0),
+			    "Unexpected bits set in SVE PREG id: 0x%llx", id);
+		return str_with_index("KVM_REG_ARM64_SVE_PREG(##, 0)", n);
+	case KVM_REG_ARM64_SVE_FFR_BASE:
+		TEST_ASSERT(id == KVM_REG_ARM64_SVE_FFR(0),
+			    "Unexpected bits set in SVE FFR id: 0x%llx", id);
+		return "KVM_REG_ARM64_SVE_FFR(0)";
+	}
+
+	return NULL;
+}
+
 static void print_reg(__u64 id)
 {
 	unsigned op0, op1, crn, crm, op2;
@@ -186,7 +228,10 @@ static void print_reg(__u64 id)
 		printf("\tKVM_REG_ARM_FW_REG(%lld),\n", id & 0xffff);
 		break;
 	case KVM_REG_ARM64_SVE:
-		TEST_FAIL("KVM_REG_ARM64_SVE is an unexpected coproc type in reg id: 0x%llx", id);
+		if (reg_list_sve())
+			printf("\t%s,\n", sve_id_to_str(id));
+		else
+			TEST_FAIL("KVM_REG_ARM64_SVE is an unexpected coproc type in reg id: 0x%llx", id);
 		break;
 	default:
 		TEST_FAIL("Unexpected coproc type: 0x%llx in reg id: 0x%llx",
@@ -251,12 +296,40 @@ static void core_reg_fixup(void)
 	reg_list = tmp;
 }
 
+static void prepare_vcpu_init(struct kvm_vcpu_init *init)
+{
+	if (reg_list_sve())
+		init->features[0] |= 1 << KVM_ARM_VCPU_SVE;
+}
+
+static void finalize_vcpu(struct kvm_vm *vm, uint32_t vcpuid)
+{
+	int feature;
+
+	if (reg_list_sve()) {
+		feature = KVM_ARM_VCPU_SVE;
+		vcpu_ioctl(vm, vcpuid, KVM_ARM_VCPU_FINALIZE, &feature);
+	}
+}
+
+static void check_supported(void)
+{
+	if (reg_list_sve() && !kvm_check_cap(KVM_CAP_ARM_SVE)) {
+		fprintf(stderr, "SVE not available, skipping tests\n");
+		exit(KSFT_SKIP);
+	}
+}
+
 int main(int ac, char **av)
 {
+	struct kvm_vcpu_init init = { .target = -1, };
 	int new_regs = 0, missing_regs = 0, i;
-	int failed_get = 0, failed_set = 0;
+	int failed_get = 0, failed_set = 0, failed_reject = 0;
 	bool print_list = false, fixup_core_regs = false;
 	struct kvm_vm *vm;
+	__u64 *vec_regs;
+
+	check_supported();
 
 	for (i = 1; i < ac; ++i) {
 		if (strcmp(av[i], "--core-reg-fixup") == 0)
@@ -267,7 +340,11 @@ int main(int ac, char **av)
 			fprintf(stderr, "Ignoring unknown option: %s\n", av[i]);
 	}
 
-	vm = vm_create_default(0, 0, NULL);
+	vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR);
+	prepare_vcpu_init(&init);
+	aarch64_vcpu_add_default(vm, 0, &init, NULL);
+	finalize_vcpu(vm, 0);
+
 	reg_list = vcpu_get_reg_list(vm, 0);
 
 	if (fixup_core_regs)
@@ -307,6 +384,18 @@ int main(int ac, char **av)
 			++failed_get;
 		}
 
+		/* rejects_set registers are rejected after KVM_ARM_VCPU_FINALIZE */
+		if (find_reg(rejects_set, rejects_set_n, reg.id)) {
+			ret = _vcpu_ioctl(vm, 0, KVM_SET_ONE_REG, &reg);
+			if (ret != -1 || errno != EPERM) {
+				printf("Failed to reject (ret=%d, errno=%d) ", ret, errno);
+				print_reg(reg.id);
+				putchar('\n');
+				++failed_reject;
+			}
+			continue;
+		}
+
 		ret = _vcpu_ioctl(vm, 0, KVM_SET_ONE_REG, &reg);
 		if (ret) {
 			puts("Failed to set ");
@@ -316,6 +405,20 @@ int main(int ac, char **av)
 		}
 	}
 
+	if (reg_list_sve()) {
+		blessed_n = base_regs_n + sve_regs_n;
+		vec_regs = sve_regs;
+	} else {
+		blessed_n = base_regs_n + vregs_n;
+		vec_regs = vregs;
+	}
+
+	blessed_reg = calloc(blessed_n, sizeof(__u64));
+	for (i = 0; i < base_regs_n; ++i)
+		blessed_reg[i] = base_regs[i];
+	for (i = 0; i < blessed_n - base_regs_n; ++i)
+		blessed_reg[base_regs_n + i] = vec_regs[i];
+
 	for_each_new_reg(i)
 		++new_regs;
 
@@ -344,9 +447,10 @@ int main(int ac, char **av)
 		putchar('\n');
 	}
 
-	TEST_ASSERT(!missing_regs && !failed_get && !failed_set,
-		    "There are %d missing registers; %d registers failed get; %d registers failed set",
-		    missing_regs, failed_get, failed_set);
+	TEST_ASSERT(!missing_regs && !failed_get && !failed_set && !failed_reject,
+		    "There are %d missing registers; "
+		    "%d registers failed get; %d registers failed set; %d registers failed reject",
+		    missing_regs, failed_get, failed_set, failed_reject);
 
 	return 0;
 }
@@ -355,7 +459,7 @@ int main(int ac, char **av)
  * The current blessed list was primed with the output of kernel version
  * v4.15 with --core-reg-fixup and then later updated with new registers.
  */
-static __u64 blessed_reg[] = {
+static __u64 base_regs[] = {
 	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[0]),
 	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[1]),
 	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[2]),
@@ -397,38 +501,6 @@ static __u64 blessed_reg[] = {
 	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[2]),
 	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[3]),
 	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[4]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[1]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[2]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[3]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[4]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[5]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[6]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[7]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[8]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[9]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[10]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[11]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[12]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[13]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[14]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[15]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[16]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[17]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[18]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[19]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[20]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[21]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[22]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[23]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[24]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[25]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[26]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[27]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[28]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[29]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[30]),
-	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]),
 	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpsr),
 	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpcr),
 	KVM_REG_ARM_FW_REG(0),
@@ -668,4 +740,102 @@ static __u64 blessed_reg[] = {
 	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 1,
 	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 2,
 };
-static __u64 blessed_n = ARRAY_SIZE(blessed_reg);
+static __u64 base_regs_n = ARRAY_SIZE(base_regs);
+
+static __u64 vregs[] = {
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[1]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[2]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[3]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[4]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[5]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[6]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[7]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[8]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[9]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[10]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[11]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[12]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[13]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[14]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[15]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[16]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[17]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[18]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[19]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[20]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[21]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[22]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[23]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[24]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[25]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[26]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[27]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[28]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[29]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[30]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]),
+};
+static __u64 vregs_n = ARRAY_SIZE(vregs);
+
+static __u64 sve_regs[] = {
+	KVM_REG_ARM64_SVE_VLS,
+	KVM_REG_ARM64_SVE_ZREG(0, 0),
+	KVM_REG_ARM64_SVE_ZREG(1, 0),
+	KVM_REG_ARM64_SVE_ZREG(2, 0),
+	KVM_REG_ARM64_SVE_ZREG(3, 0),
+	KVM_REG_ARM64_SVE_ZREG(4, 0),
+	KVM_REG_ARM64_SVE_ZREG(5, 0),
+	KVM_REG_ARM64_SVE_ZREG(6, 0),
+	KVM_REG_ARM64_SVE_ZREG(7, 0),
+	KVM_REG_ARM64_SVE_ZREG(8, 0),
+	KVM_REG_ARM64_SVE_ZREG(9, 0),
+	KVM_REG_ARM64_SVE_ZREG(10, 0),
+	KVM_REG_ARM64_SVE_ZREG(11, 0),
+	KVM_REG_ARM64_SVE_ZREG(12, 0),
+	KVM_REG_ARM64_SVE_ZREG(13, 0),
+	KVM_REG_ARM64_SVE_ZREG(14, 0),
+	KVM_REG_ARM64_SVE_ZREG(15, 0),
+	KVM_REG_ARM64_SVE_ZREG(16, 0),
+	KVM_REG_ARM64_SVE_ZREG(17, 0),
+	KVM_REG_ARM64_SVE_ZREG(18, 0),
+	KVM_REG_ARM64_SVE_ZREG(19, 0),
+	KVM_REG_ARM64_SVE_ZREG(20, 0),
+	KVM_REG_ARM64_SVE_ZREG(21, 0),
+	KVM_REG_ARM64_SVE_ZREG(22, 0),
+	KVM_REG_ARM64_SVE_ZREG(23, 0),
+	KVM_REG_ARM64_SVE_ZREG(24, 0),
+	KVM_REG_ARM64_SVE_ZREG(25, 0),
+	KVM_REG_ARM64_SVE_ZREG(26, 0),
+	KVM_REG_ARM64_SVE_ZREG(27, 0),
+	KVM_REG_ARM64_SVE_ZREG(28, 0),
+	KVM_REG_ARM64_SVE_ZREG(29, 0),
+	KVM_REG_ARM64_SVE_ZREG(30, 0),
+	KVM_REG_ARM64_SVE_ZREG(31, 0),
+	KVM_REG_ARM64_SVE_PREG(0, 0),
+	KVM_REG_ARM64_SVE_PREG(1, 0),
+	KVM_REG_ARM64_SVE_PREG(2, 0),
+	KVM_REG_ARM64_SVE_PREG(3, 0),
+	KVM_REG_ARM64_SVE_PREG(4, 0),
+	KVM_REG_ARM64_SVE_PREG(5, 0),
+	KVM_REG_ARM64_SVE_PREG(6, 0),
+	KVM_REG_ARM64_SVE_PREG(7, 0),
+	KVM_REG_ARM64_SVE_PREG(8, 0),
+	KVM_REG_ARM64_SVE_PREG(9, 0),
+	KVM_REG_ARM64_SVE_PREG(10, 0),
+	KVM_REG_ARM64_SVE_PREG(11, 0),
+	KVM_REG_ARM64_SVE_PREG(12, 0),
+	KVM_REG_ARM64_SVE_PREG(13, 0),
+	KVM_REG_ARM64_SVE_PREG(14, 0),
+	KVM_REG_ARM64_SVE_PREG(15, 0),
+	KVM_REG_ARM64_SVE_FFR(0),
+	ARM64_SYS_REG(3, 0, 1, 2, 0),   /* ZCR_EL1 */
+};
+static __u64 sve_regs_n = ARRAY_SIZE(sve_regs);
+
+static __u64 rejects_set[] = {
+#ifdef REG_LIST_SVE
+	KVM_REG_ARM64_SVE_VLS,
+#endif
+};
+static __u64 rejects_set_n = ARRAY_SIZE(rejects_set);
commit fd02029a9e019e941835e110651486e2d77d3f84
Author: Andrew Jones <drjones at redhat.com>
Date:   Thu Oct 29 21:17:01 2020 +0100

    KVM: selftests: Add aarch64 get-reg-list test
    
    Check for KVM_GET_REG_LIST regressions. The blessed list was
    created by running on v4.15 with the --core-reg-fixup option.
    The following script was also used in order to annotate system
    registers with their names when possible. When new system
    registers are added the names can just be added manually using
    the same grep.
    
    while read reg; do
            if [[ ! $reg =~ ARM64_SYS_REG ]]; then
                    printf "\t$reg\n"
                    continue
            fi
            encoding=$(echo "$reg" | sed "s/ARM64_SYS_REG(//;s/),//")
            if ! name=$(grep "$encoding" ../../../../arch/arm64/include/asm/sysreg.h); then
                    printf "\t$reg\n"
                    continue
            fi
            name=$(echo "$name" | sed "s/.*SYS_//;s/[\t ]*sys_reg($encoding)$//")
            printf "\t$reg\t/* $name */\n"
    done < <(aarch64/get-reg-list --core-reg-fixup --list)
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Message-Id: <20201029201703.102716-3-drjones at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
index 22973aa75eda..2034765862a2 100644
--- a/tools/testing/selftests/kvm/.gitignore
+++ b/tools/testing/selftests/kvm/.gitignore
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0-only
+/aarch64/get-reg-list
 /s390x/memop
 /s390x/resets
 /s390x/sync_regs_test
diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index 44ca6badb544..771455ae4a1b 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -66,6 +66,7 @@ TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
 TEST_GEN_PROGS_x86_64 += set_memory_region_test
 TEST_GEN_PROGS_x86_64 += steal_time
 
+TEST_GEN_PROGS_aarch64 += aarch64/get-reg-list
 TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
 TEST_GEN_PROGS_aarch64 += demand_paging_test
 TEST_GEN_PROGS_aarch64 += dirty_log_test
diff --git a/tools/testing/selftests/kvm/aarch64/get-reg-list.c b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
new file mode 100644
index 000000000000..3ff097f6886e
--- /dev/null
+++ b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
@@ -0,0 +1,671 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Check for KVM_GET_REG_LIST regressions.
+ *
+ * Copyright (C) 2020, Red Hat, Inc.
+ *
+ * When attempting to migrate from a host with an older kernel to a host
+ * with a newer kernel we allow the newer kernel on the destination to
+ * list new registers with get-reg-list. We assume they'll be unused, at
+ * least until the guest reboots, and so they're relatively harmless.
+ * However, if the destination host with the newer kernel is missing
+ * registers which the source host with the older kernel has, then that's
+ * a regression in get-reg-list. This test checks for that regression by
+ * checking the current list against a blessed list. We should never have
+ * missing registers, but if new ones appear then they can probably be
+ * added to the blessed list. A completely new blessed list can be created
+ * by running the test with the --list command line argument.
+ *
+ * Note, the blessed list should be created from the oldest possible
+ * kernel. We can't go older than v4.15, though, because that's the first
+ * release to expose the ID system registers in KVM_GET_REG_LIST, see
+ * commit 93390c0a1b20 ("arm64: KVM: Hide unsupported AArch64 CPU features
+ * from guests"). Also, one must use the --core-reg-fixup command line
+ * option when running on an older kernel that doesn't include df205b5c6328
+ * ("KVM: arm64: Filter out invalid core register IDs in KVM_GET_REG_LIST")
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "kvm_util.h"
+#include "test_util.h"
+
+#define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_COPROC_MASK)
+
+#define for_each_reg(i)								\
+	for ((i) = 0; (i) < reg_list->n; ++(i))
+
+#define for_each_missing_reg(i)							\
+	for ((i) = 0; (i) < blessed_n; ++(i))					\
+		if (!find_reg(reg_list->reg, reg_list->n, blessed_reg[i]))
+
+#define for_each_new_reg(i)							\
+	for ((i) = 0; (i) < reg_list->n; ++(i))					\
+		if (!find_reg(blessed_reg, blessed_n, reg_list->reg[i]))
+
+
+static struct kvm_reg_list *reg_list;
+
+static __u64 blessed_reg[];
+static __u64 blessed_n;
+
+static bool find_reg(__u64 regs[], __u64 nr_regs, __u64 reg)
+{
+	int i;
+
+	for (i = 0; i < nr_regs; ++i)
+		if (reg == regs[i])
+			return true;
+	return false;
+}
+
+static const char *str_with_index(const char *template, __u64 index)
+{
+	char *str, *p;
+	int n;
+
+	str = strdup(template);
+	p = strstr(str, "##");
+	n = sprintf(p, "%lld", index);
+	strcat(p + n, strstr(template, "##") + 2);
+
+	return (const char *)str;
+}
+
+#define CORE_REGS_XX_NR_WORDS	2
+#define CORE_SPSR_XX_NR_WORDS	2
+#define CORE_FPREGS_XX_NR_WORDS	4
+
+static const char *core_id_to_str(__u64 id)
+{
+	__u64 core_off = id & ~REG_MASK, idx;
+
+	/*
+	 * core_off is the offset into struct kvm_regs
+	 */
+	switch (core_off) {
+	case KVM_REG_ARM_CORE_REG(regs.regs[0]) ...
+	     KVM_REG_ARM_CORE_REG(regs.regs[30]):
+		idx = (core_off - KVM_REG_ARM_CORE_REG(regs.regs[0])) / CORE_REGS_XX_NR_WORDS;
+		TEST_ASSERT(idx < 31, "Unexpected regs.regs index: %lld", idx);
+		return str_with_index("KVM_REG_ARM_CORE_REG(regs.regs[##])", idx);
+	case KVM_REG_ARM_CORE_REG(regs.sp):
+		return "KVM_REG_ARM_CORE_REG(regs.sp)";
+	case KVM_REG_ARM_CORE_REG(regs.pc):
+		return "KVM_REG_ARM_CORE_REG(regs.pc)";
+	case KVM_REG_ARM_CORE_REG(regs.pstate):
+		return "KVM_REG_ARM_CORE_REG(regs.pstate)";
+	case KVM_REG_ARM_CORE_REG(sp_el1):
+		return "KVM_REG_ARM_CORE_REG(sp_el1)";
+	case KVM_REG_ARM_CORE_REG(elr_el1):
+		return "KVM_REG_ARM_CORE_REG(elr_el1)";
+	case KVM_REG_ARM_CORE_REG(spsr[0]) ...
+	     KVM_REG_ARM_CORE_REG(spsr[KVM_NR_SPSR - 1]):
+		idx = (core_off - KVM_REG_ARM_CORE_REG(spsr[0])) / CORE_SPSR_XX_NR_WORDS;
+		TEST_ASSERT(idx < KVM_NR_SPSR, "Unexpected spsr index: %lld", idx);
+		return str_with_index("KVM_REG_ARM_CORE_REG(spsr[##])", idx);
+	case KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]) ...
+	     KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]):
+		idx = (core_off - KVM_REG_ARM_CORE_REG(fp_regs.vregs[0])) / CORE_FPREGS_XX_NR_WORDS;
+		TEST_ASSERT(idx < 32, "Unexpected fp_regs.vregs index: %lld", idx);
+		return str_with_index("KVM_REG_ARM_CORE_REG(fp_regs.vregs[##])", idx);
+	case KVM_REG_ARM_CORE_REG(fp_regs.fpsr):
+		return "KVM_REG_ARM_CORE_REG(fp_regs.fpsr)";
+	case KVM_REG_ARM_CORE_REG(fp_regs.fpcr):
+		return "KVM_REG_ARM_CORE_REG(fp_regs.fpcr)";
+	}
+
+	TEST_FAIL("Unknown core reg id: 0x%llx", id);
+	return NULL;
+}
+
+static void print_reg(__u64 id)
+{
+	unsigned op0, op1, crn, crm, op2;
+	const char *reg_size = NULL;
+
+	TEST_ASSERT((id & KVM_REG_ARCH_MASK) == KVM_REG_ARM64,
+		    "KVM_REG_ARM64 missing in reg id: 0x%llx", id);
+
+	switch (id & KVM_REG_SIZE_MASK) {
+	case KVM_REG_SIZE_U8:
+		reg_size = "KVM_REG_SIZE_U8";
+		break;
+	case KVM_REG_SIZE_U16:
+		reg_size = "KVM_REG_SIZE_U16";
+		break;
+	case KVM_REG_SIZE_U32:
+		reg_size = "KVM_REG_SIZE_U32";
+		break;
+	case KVM_REG_SIZE_U64:
+		reg_size = "KVM_REG_SIZE_U64";
+		break;
+	case KVM_REG_SIZE_U128:
+		reg_size = "KVM_REG_SIZE_U128";
+		break;
+	case KVM_REG_SIZE_U256:
+		reg_size = "KVM_REG_SIZE_U256";
+		break;
+	case KVM_REG_SIZE_U512:
+		reg_size = "KVM_REG_SIZE_U512";
+		break;
+	case KVM_REG_SIZE_U1024:
+		reg_size = "KVM_REG_SIZE_U1024";
+		break;
+	case KVM_REG_SIZE_U2048:
+		reg_size = "KVM_REG_SIZE_U2048";
+		break;
+	default:
+		TEST_FAIL("Unexpected reg size: 0x%llx in reg id: 0x%llx",
+			  (id & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT, id);
+	}
+
+	switch (id & KVM_REG_ARM_COPROC_MASK) {
+	case KVM_REG_ARM_CORE:
+		printf("\tKVM_REG_ARM64 | %s | KVM_REG_ARM_CORE | %s,\n", reg_size, core_id_to_str(id));
+		break;
+	case KVM_REG_ARM_DEMUX:
+		TEST_ASSERT(!(id & ~(REG_MASK | KVM_REG_ARM_DEMUX_ID_MASK | KVM_REG_ARM_DEMUX_VAL_MASK)),
+			    "Unexpected bits set in DEMUX reg id: 0x%llx", id);
+		printf("\tKVM_REG_ARM64 | %s | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | %lld,\n",
+		       reg_size, id & KVM_REG_ARM_DEMUX_VAL_MASK);
+		break;
+	case KVM_REG_ARM64_SYSREG:
+		op0 = (id & KVM_REG_ARM64_SYSREG_OP0_MASK) >> KVM_REG_ARM64_SYSREG_OP0_SHIFT;
+		op1 = (id & KVM_REG_ARM64_SYSREG_OP1_MASK) >> KVM_REG_ARM64_SYSREG_OP1_SHIFT;
+		crn = (id & KVM_REG_ARM64_SYSREG_CRN_MASK) >> KVM_REG_ARM64_SYSREG_CRN_SHIFT;
+		crm = (id & KVM_REG_ARM64_SYSREG_CRM_MASK) >> KVM_REG_ARM64_SYSREG_CRM_SHIFT;
+		op2 = (id & KVM_REG_ARM64_SYSREG_OP2_MASK) >> KVM_REG_ARM64_SYSREG_OP2_SHIFT;
+		TEST_ASSERT(id == ARM64_SYS_REG(op0, op1, crn, crm, op2),
+			    "Unexpected bits set in SYSREG reg id: 0x%llx", id);
+		printf("\tARM64_SYS_REG(%d, %d, %d, %d, %d),\n", op0, op1, crn, crm, op2);
+		break;
+	case KVM_REG_ARM_FW:
+		TEST_ASSERT(id == KVM_REG_ARM_FW_REG(id & 0xffff),
+			    "Unexpected bits set in FW reg id: 0x%llx", id);
+		printf("\tKVM_REG_ARM_FW_REG(%lld),\n", id & 0xffff);
+		break;
+	case KVM_REG_ARM64_SVE:
+		TEST_FAIL("KVM_REG_ARM64_SVE is an unexpected coproc type in reg id: 0x%llx", id);
+		break;
+	default:
+		TEST_FAIL("Unexpected coproc type: 0x%llx in reg id: 0x%llx",
+			  (id & KVM_REG_ARM_COPROC_MASK) >> KVM_REG_ARM_COPROC_SHIFT, id);
+	}
+}
+
+/*
+ * Older kernels listed each 32-bit word of CORE registers separately.
+ * For 64 and 128-bit registers we need to ignore the extra words. We
+ * also need to fixup the sizes, because the older kernels stated all
+ * registers were 64-bit, even when they weren't.
+ */
+static void core_reg_fixup(void)
+{
+	struct kvm_reg_list *tmp;
+	__u64 id, core_off;
+	int i;
+
+	tmp = calloc(1, sizeof(*tmp) + reg_list->n * sizeof(__u64));
+
+	for (i = 0; i < reg_list->n; ++i) {
+		id = reg_list->reg[i];
+
+		if ((id & KVM_REG_ARM_COPROC_MASK) != KVM_REG_ARM_CORE) {
+			tmp->reg[tmp->n++] = id;
+			continue;
+		}
+
+		core_off = id & ~REG_MASK;
+
+		switch (core_off) {
+		case 0x52: case 0xd2: case 0xd6:
+			/*
+			 * These offsets are pointing at padding.
+			 * We need to ignore them too.
+			 */
+			continue;
+		case KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]) ...
+		     KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]):
+			if (core_off & 3)
+				continue;
+			id &= ~KVM_REG_SIZE_MASK;
+			id |= KVM_REG_SIZE_U128;
+			tmp->reg[tmp->n++] = id;
+			continue;
+		case KVM_REG_ARM_CORE_REG(fp_regs.fpsr):
+		case KVM_REG_ARM_CORE_REG(fp_regs.fpcr):
+			id &= ~KVM_REG_SIZE_MASK;
+			id |= KVM_REG_SIZE_U32;
+			tmp->reg[tmp->n++] = id;
+			continue;
+		default:
+			if (core_off & 1)
+				continue;
+			tmp->reg[tmp->n++] = id;
+			break;
+		}
+	}
+
+	free(reg_list);
+	reg_list = tmp;
+}
+
+int main(int ac, char **av)
+{
+	int new_regs = 0, missing_regs = 0, i;
+	int failed_get = 0, failed_set = 0;
+	bool print_list = false, fixup_core_regs = false;
+	struct kvm_vm *vm;
+
+	for (i = 1; i < ac; ++i) {
+		if (strcmp(av[i], "--core-reg-fixup") == 0)
+			fixup_core_regs = true;
+		else if (strcmp(av[i], "--list") == 0)
+			print_list = true;
+		else
+			fprintf(stderr, "Ignoring unknown option: %s\n", av[i]);
+	}
+
+	vm = vm_create_default(0, 0, NULL);
+	reg_list = vcpu_get_reg_list(vm, 0);
+
+	if (fixup_core_regs)
+		core_reg_fixup();
+
+	if (print_list) {
+		putchar('\n');
+		for_each_reg(i)
+			print_reg(reg_list->reg[i]);
+		putchar('\n');
+		return 0;
+	}
+
+	/*
+	 * We only test that we can get the register and then write back the
+	 * same value. Some registers may allow other values to be written
+	 * back, but others only allow some bits to be changed, and at least
+	 * for ID registers set will fail if the value does not exactly match
+	 * what was returned by get. If registers that allow other values to
+	 * be written need to have the other values tested, then we should
+	 * create a new set of tests for those in a new independent test
+	 * executable.
+	 */
+	for_each_reg(i) {
+		uint8_t addr[2048 / 8];
+		struct kvm_one_reg reg = {
+			.id = reg_list->reg[i],
+			.addr = (__u64)&addr,
+		};
+		int ret;
+
+		ret = _vcpu_ioctl(vm, 0, KVM_GET_ONE_REG, &reg);
+		if (ret) {
+			puts("Failed to get ");
+			print_reg(reg.id);
+			putchar('\n');
+			++failed_get;
+		}
+
+		ret = _vcpu_ioctl(vm, 0, KVM_SET_ONE_REG, &reg);
+		if (ret) {
+			puts("Failed to set ");
+			print_reg(reg.id);
+			putchar('\n');
+			++failed_set;
+		}
+	}
+
+	for_each_new_reg(i)
+		++new_regs;
+
+	for_each_missing_reg(i)
+		++missing_regs;
+
+	if (new_regs || missing_regs) {
+		printf("Number blessed registers: %5lld\n", blessed_n);
+		printf("Number registers:         %5lld\n", reg_list->n);
+	}
+
+	if (new_regs) {
+		printf("\nThere are %d new registers.\n"
+		       "Consider adding them to the blessed reg "
+		       "list with the following lines:\n\n", new_regs);
+		for_each_new_reg(i)
+			print_reg(reg_list->reg[i]);
+		putchar('\n');
+	}
+
+	if (missing_regs) {
+		printf("\nThere are %d missing registers.\n"
+		       "The following lines are missing registers:\n\n", missing_regs);
+		for_each_missing_reg(i)
+			print_reg(blessed_reg[i]);
+		putchar('\n');
+	}
+
+	TEST_ASSERT(!missing_regs && !failed_get && !failed_set,
+		    "There are %d missing registers; %d registers failed get; %d registers failed set",
+		    missing_regs, failed_get, failed_set);
+
+	return 0;
+}
+
+/*
+ * The current blessed list was primed with the output of kernel version
+ * v4.15 with --core-reg-fixup and then later updated with new registers.
+ */
+static __u64 blessed_reg[] = {
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[0]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[1]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[2]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[3]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[4]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[5]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[6]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[7]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[8]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[9]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[10]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[11]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[12]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[13]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[14]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[15]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[16]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[17]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[18]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[19]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[20]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[21]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[22]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[23]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[24]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[25]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[26]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[27]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[28]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[29]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[30]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.sp),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.pc),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.pstate),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(sp_el1),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(elr_el1),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[0]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[1]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[2]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[3]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[4]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[1]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[2]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[3]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[4]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[5]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[6]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[7]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[8]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[9]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[10]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[11]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[12]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[13]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[14]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[15]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[16]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[17]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[18]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[19]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[20]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[21]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[22]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[23]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[24]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[25]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[26]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[27]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[28]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[29]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[30]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpsr),
+	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpcr),
+	KVM_REG_ARM_FW_REG(0),
+	KVM_REG_ARM_FW_REG(1),
+	KVM_REG_ARM_FW_REG(2),
+	ARM64_SYS_REG(3, 3, 14, 3, 1),	/* CNTV_CTL_EL0 */
+	ARM64_SYS_REG(3, 3, 14, 3, 2),	/* CNTV_CVAL_EL0 */
+	ARM64_SYS_REG(3, 3, 14, 0, 2),
+	ARM64_SYS_REG(3, 0, 0, 0, 0),	/* MIDR_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 0, 6),	/* REVIDR_EL1 */
+	ARM64_SYS_REG(3, 1, 0, 0, 1),	/* CLIDR_EL1 */
+	ARM64_SYS_REG(3, 1, 0, 0, 7),	/* AIDR_EL1 */
+	ARM64_SYS_REG(3, 3, 0, 0, 1),	/* CTR_EL0 */
+	ARM64_SYS_REG(2, 0, 0, 0, 4),
+	ARM64_SYS_REG(2, 0, 0, 0, 5),
+	ARM64_SYS_REG(2, 0, 0, 0, 6),
+	ARM64_SYS_REG(2, 0, 0, 0, 7),
+	ARM64_SYS_REG(2, 0, 0, 1, 4),
+	ARM64_SYS_REG(2, 0, 0, 1, 5),
+	ARM64_SYS_REG(2, 0, 0, 1, 6),
+	ARM64_SYS_REG(2, 0, 0, 1, 7),
+	ARM64_SYS_REG(2, 0, 0, 2, 0),	/* MDCCINT_EL1 */
+	ARM64_SYS_REG(2, 0, 0, 2, 2),	/* MDSCR_EL1 */
+	ARM64_SYS_REG(2, 0, 0, 2, 4),
+	ARM64_SYS_REG(2, 0, 0, 2, 5),
+	ARM64_SYS_REG(2, 0, 0, 2, 6),
+	ARM64_SYS_REG(2, 0, 0, 2, 7),
+	ARM64_SYS_REG(2, 0, 0, 3, 4),
+	ARM64_SYS_REG(2, 0, 0, 3, 5),
+	ARM64_SYS_REG(2, 0, 0, 3, 6),
+	ARM64_SYS_REG(2, 0, 0, 3, 7),
+	ARM64_SYS_REG(2, 0, 0, 4, 4),
+	ARM64_SYS_REG(2, 0, 0, 4, 5),
+	ARM64_SYS_REG(2, 0, 0, 4, 6),
+	ARM64_SYS_REG(2, 0, 0, 4, 7),
+	ARM64_SYS_REG(2, 0, 0, 5, 4),
+	ARM64_SYS_REG(2, 0, 0, 5, 5),
+	ARM64_SYS_REG(2, 0, 0, 5, 6),
+	ARM64_SYS_REG(2, 0, 0, 5, 7),
+	ARM64_SYS_REG(2, 0, 0, 6, 4),
+	ARM64_SYS_REG(2, 0, 0, 6, 5),
+	ARM64_SYS_REG(2, 0, 0, 6, 6),
+	ARM64_SYS_REG(2, 0, 0, 6, 7),
+	ARM64_SYS_REG(2, 0, 0, 7, 4),
+	ARM64_SYS_REG(2, 0, 0, 7, 5),
+	ARM64_SYS_REG(2, 0, 0, 7, 6),
+	ARM64_SYS_REG(2, 0, 0, 7, 7),
+	ARM64_SYS_REG(2, 0, 0, 8, 4),
+	ARM64_SYS_REG(2, 0, 0, 8, 5),
+	ARM64_SYS_REG(2, 0, 0, 8, 6),
+	ARM64_SYS_REG(2, 0, 0, 8, 7),
+	ARM64_SYS_REG(2, 0, 0, 9, 4),
+	ARM64_SYS_REG(2, 0, 0, 9, 5),
+	ARM64_SYS_REG(2, 0, 0, 9, 6),
+	ARM64_SYS_REG(2, 0, 0, 9, 7),
+	ARM64_SYS_REG(2, 0, 0, 10, 4),
+	ARM64_SYS_REG(2, 0, 0, 10, 5),
+	ARM64_SYS_REG(2, 0, 0, 10, 6),
+	ARM64_SYS_REG(2, 0, 0, 10, 7),
+	ARM64_SYS_REG(2, 0, 0, 11, 4),
+	ARM64_SYS_REG(2, 0, 0, 11, 5),
+	ARM64_SYS_REG(2, 0, 0, 11, 6),
+	ARM64_SYS_REG(2, 0, 0, 11, 7),
+	ARM64_SYS_REG(2, 0, 0, 12, 4),
+	ARM64_SYS_REG(2, 0, 0, 12, 5),
+	ARM64_SYS_REG(2, 0, 0, 12, 6),
+	ARM64_SYS_REG(2, 0, 0, 12, 7),
+	ARM64_SYS_REG(2, 0, 0, 13, 4),
+	ARM64_SYS_REG(2, 0, 0, 13, 5),
+	ARM64_SYS_REG(2, 0, 0, 13, 6),
+	ARM64_SYS_REG(2, 0, 0, 13, 7),
+	ARM64_SYS_REG(2, 0, 0, 14, 4),
+	ARM64_SYS_REG(2, 0, 0, 14, 5),
+	ARM64_SYS_REG(2, 0, 0, 14, 6),
+	ARM64_SYS_REG(2, 0, 0, 14, 7),
+	ARM64_SYS_REG(2, 0, 0, 15, 4),
+	ARM64_SYS_REG(2, 0, 0, 15, 5),
+	ARM64_SYS_REG(2, 0, 0, 15, 6),
+	ARM64_SYS_REG(2, 0, 0, 15, 7),
+	ARM64_SYS_REG(2, 4, 0, 7, 0),	/* DBGVCR32_EL2 */
+	ARM64_SYS_REG(3, 0, 0, 0, 5),	/* MPIDR_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 0),	/* ID_PFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 1),	/* ID_PFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 2),	/* ID_DFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 3),	/* ID_AFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 4),	/* ID_MMFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 5),	/* ID_MMFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 6),	/* ID_MMFR2_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 1, 7),	/* ID_MMFR3_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 0),	/* ID_ISAR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 1),	/* ID_ISAR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 2),	/* ID_ISAR2_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 3),	/* ID_ISAR3_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 4),	/* ID_ISAR4_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 5),	/* ID_ISAR5_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 6),	/* ID_MMFR4_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 2, 7),	/* ID_ISAR6_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 0),	/* MVFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 1),	/* MVFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 2),	/* MVFR2_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 3),
+	ARM64_SYS_REG(3, 0, 0, 3, 4),	/* ID_PFR2_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 5),	/* ID_DFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 6),	/* ID_MMFR5_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 3, 7),
+	ARM64_SYS_REG(3, 0, 0, 4, 0),	/* ID_AA64PFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 4, 1),	/* ID_AA64PFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 4, 2),
+	ARM64_SYS_REG(3, 0, 0, 4, 3),
+	ARM64_SYS_REG(3, 0, 0, 4, 4),	/* ID_AA64ZFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 4, 5),
+	ARM64_SYS_REG(3, 0, 0, 4, 6),
+	ARM64_SYS_REG(3, 0, 0, 4, 7),
+	ARM64_SYS_REG(3, 0, 0, 5, 0),	/* ID_AA64DFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 5, 1),	/* ID_AA64DFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 5, 2),
+	ARM64_SYS_REG(3, 0, 0, 5, 3),
+	ARM64_SYS_REG(3, 0, 0, 5, 4),	/* ID_AA64AFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 5, 5),	/* ID_AA64AFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 5, 6),
+	ARM64_SYS_REG(3, 0, 0, 5, 7),
+	ARM64_SYS_REG(3, 0, 0, 6, 0),	/* ID_AA64ISAR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 6, 1),	/* ID_AA64ISAR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 6, 2),
+	ARM64_SYS_REG(3, 0, 0, 6, 3),
+	ARM64_SYS_REG(3, 0, 0, 6, 4),
+	ARM64_SYS_REG(3, 0, 0, 6, 5),
+	ARM64_SYS_REG(3, 0, 0, 6, 6),
+	ARM64_SYS_REG(3, 0, 0, 6, 7),
+	ARM64_SYS_REG(3, 0, 0, 7, 0),	/* ID_AA64MMFR0_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 7, 1),	/* ID_AA64MMFR1_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 7, 2),	/* ID_AA64MMFR2_EL1 */
+	ARM64_SYS_REG(3, 0, 0, 7, 3),
+	ARM64_SYS_REG(3, 0, 0, 7, 4),
+	ARM64_SYS_REG(3, 0, 0, 7, 5),
+	ARM64_SYS_REG(3, 0, 0, 7, 6),
+	ARM64_SYS_REG(3, 0, 0, 7, 7),
+	ARM64_SYS_REG(3, 0, 1, 0, 0),	/* SCTLR_EL1 */
+	ARM64_SYS_REG(3, 0, 1, 0, 1),	/* ACTLR_EL1 */
+	ARM64_SYS_REG(3, 0, 1, 0, 2),	/* CPACR_EL1 */
+	ARM64_SYS_REG(3, 0, 2, 0, 0),	/* TTBR0_EL1 */
+	ARM64_SYS_REG(3, 0, 2, 0, 1),	/* TTBR1_EL1 */
+	ARM64_SYS_REG(3, 0, 2, 0, 2),	/* TCR_EL1 */
+	ARM64_SYS_REG(3, 0, 5, 1, 0),	/* AFSR0_EL1 */
+	ARM64_SYS_REG(3, 0, 5, 1, 1),	/* AFSR1_EL1 */
+	ARM64_SYS_REG(3, 0, 5, 2, 0),	/* ESR_EL1 */
+	ARM64_SYS_REG(3, 0, 6, 0, 0),	/* FAR_EL1 */
+	ARM64_SYS_REG(3, 0, 7, 4, 0),	/* PAR_EL1 */
+	ARM64_SYS_REG(3, 0, 9, 14, 1),	/* PMINTENSET_EL1 */
+	ARM64_SYS_REG(3, 0, 9, 14, 2),	/* PMINTENCLR_EL1 */
+	ARM64_SYS_REG(3, 0, 10, 2, 0),	/* MAIR_EL1 */
+	ARM64_SYS_REG(3, 0, 10, 3, 0),	/* AMAIR_EL1 */
+	ARM64_SYS_REG(3, 0, 12, 0, 0),	/* VBAR_EL1 */
+	ARM64_SYS_REG(3, 0, 12, 1, 1),	/* DISR_EL1 */
+	ARM64_SYS_REG(3, 0, 13, 0, 1),	/* CONTEXTIDR_EL1 */
+	ARM64_SYS_REG(3, 0, 13, 0, 4),	/* TPIDR_EL1 */
+	ARM64_SYS_REG(3, 0, 14, 1, 0),	/* CNTKCTL_EL1 */
+	ARM64_SYS_REG(3, 2, 0, 0, 0),	/* CSSELR_EL1 */
+	ARM64_SYS_REG(3, 3, 9, 12, 0),	/* PMCR_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 12, 1),	/* PMCNTENSET_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 12, 2),	/* PMCNTENCLR_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 12, 3),	/* PMOVSCLR_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 12, 4),	/* PMSWINC_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 12, 5),	/* PMSELR_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 13, 0),	/* PMCCNTR_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 14, 0),	/* PMUSERENR_EL0 */
+	ARM64_SYS_REG(3, 3, 9, 14, 3),	/* PMOVSSET_EL0 */
+	ARM64_SYS_REG(3, 3, 13, 0, 2),	/* TPIDR_EL0 */
+	ARM64_SYS_REG(3, 3, 13, 0, 3),	/* TPIDRRO_EL0 */
+	ARM64_SYS_REG(3, 3, 14, 8, 0),
+	ARM64_SYS_REG(3, 3, 14, 8, 1),
+	ARM64_SYS_REG(3, 3, 14, 8, 2),
+	ARM64_SYS_REG(3, 3, 14, 8, 3),
+	ARM64_SYS_REG(3, 3, 14, 8, 4),
+	ARM64_SYS_REG(3, 3, 14, 8, 5),
+	ARM64_SYS_REG(3, 3, 14, 8, 6),
+	ARM64_SYS_REG(3, 3, 14, 8, 7),
+	ARM64_SYS_REG(3, 3, 14, 9, 0),
+	ARM64_SYS_REG(3, 3, 14, 9, 1),
+	ARM64_SYS_REG(3, 3, 14, 9, 2),
+	ARM64_SYS_REG(3, 3, 14, 9, 3),
+	ARM64_SYS_REG(3, 3, 14, 9, 4),
+	ARM64_SYS_REG(3, 3, 14, 9, 5),
+	ARM64_SYS_REG(3, 3, 14, 9, 6),
+	ARM64_SYS_REG(3, 3, 14, 9, 7),
+	ARM64_SYS_REG(3, 3, 14, 10, 0),
+	ARM64_SYS_REG(3, 3, 14, 10, 1),
+	ARM64_SYS_REG(3, 3, 14, 10, 2),
+	ARM64_SYS_REG(3, 3, 14, 10, 3),
+	ARM64_SYS_REG(3, 3, 14, 10, 4),
+	ARM64_SYS_REG(3, 3, 14, 10, 5),
+	ARM64_SYS_REG(3, 3, 14, 10, 6),
+	ARM64_SYS_REG(3, 3, 14, 10, 7),
+	ARM64_SYS_REG(3, 3, 14, 11, 0),
+	ARM64_SYS_REG(3, 3, 14, 11, 1),
+	ARM64_SYS_REG(3, 3, 14, 11, 2),
+	ARM64_SYS_REG(3, 3, 14, 11, 3),
+	ARM64_SYS_REG(3, 3, 14, 11, 4),
+	ARM64_SYS_REG(3, 3, 14, 11, 5),
+	ARM64_SYS_REG(3, 3, 14, 11, 6),
+	ARM64_SYS_REG(3, 3, 14, 12, 0),
+	ARM64_SYS_REG(3, 3, 14, 12, 1),
+	ARM64_SYS_REG(3, 3, 14, 12, 2),
+	ARM64_SYS_REG(3, 3, 14, 12, 3),
+	ARM64_SYS_REG(3, 3, 14, 12, 4),
+	ARM64_SYS_REG(3, 3, 14, 12, 5),
+	ARM64_SYS_REG(3, 3, 14, 12, 6),
+	ARM64_SYS_REG(3, 3, 14, 12, 7),
+	ARM64_SYS_REG(3, 3, 14, 13, 0),
+	ARM64_SYS_REG(3, 3, 14, 13, 1),
+	ARM64_SYS_REG(3, 3, 14, 13, 2),
+	ARM64_SYS_REG(3, 3, 14, 13, 3),
+	ARM64_SYS_REG(3, 3, 14, 13, 4),
+	ARM64_SYS_REG(3, 3, 14, 13, 5),
+	ARM64_SYS_REG(3, 3, 14, 13, 6),
+	ARM64_SYS_REG(3, 3, 14, 13, 7),
+	ARM64_SYS_REG(3, 3, 14, 14, 0),
+	ARM64_SYS_REG(3, 3, 14, 14, 1),
+	ARM64_SYS_REG(3, 3, 14, 14, 2),
+	ARM64_SYS_REG(3, 3, 14, 14, 3),
+	ARM64_SYS_REG(3, 3, 14, 14, 4),
+	ARM64_SYS_REG(3, 3, 14, 14, 5),
+	ARM64_SYS_REG(3, 3, 14, 14, 6),
+	ARM64_SYS_REG(3, 3, 14, 14, 7),
+	ARM64_SYS_REG(3, 3, 14, 15, 0),
+	ARM64_SYS_REG(3, 3, 14, 15, 1),
+	ARM64_SYS_REG(3, 3, 14, 15, 2),
+	ARM64_SYS_REG(3, 3, 14, 15, 3),
+	ARM64_SYS_REG(3, 3, 14, 15, 4),
+	ARM64_SYS_REG(3, 3, 14, 15, 5),
+	ARM64_SYS_REG(3, 3, 14, 15, 6),
+	ARM64_SYS_REG(3, 3, 14, 15, 7),	/* PMCCFILTR_EL0 */
+	ARM64_SYS_REG(3, 4, 3, 0, 0),	/* DACR32_EL2 */
+	ARM64_SYS_REG(3, 4, 5, 0, 1),	/* IFSR32_EL2 */
+	ARM64_SYS_REG(3, 4, 5, 3, 0),	/* FPEXC32_EL2 */
+	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 0,
+	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 1,
+	KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 2,
+};
+static __u64 blessed_n = ARRAY_SIZE(blessed_reg);
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index 77f53dbc34ff..feb949a92055 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -152,6 +152,7 @@ void vcpu_set_guest_debug(struct kvm_vm *vm, uint32_t vcpuid,
 			  struct kvm_guest_debug *debug);
 void vcpu_set_mp_state(struct kvm_vm *vm, uint32_t vcpuid,
 		       struct kvm_mp_state *mp_state);
+struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vm *vm, uint32_t vcpuid);
 void vcpu_regs_get(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_regs *regs);
 void vcpu_regs_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_regs *regs);
 
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 91e547031d8c..7669cb7c86e3 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1291,6 +1291,35 @@ void vcpu_set_mp_state(struct kvm_vm *vm, uint32_t vcpuid,
 		"rc: %i errno: %i", ret, errno);
 }
 
+/*
+ * VM VCPU Get Reg List
+ *
+ * Input Args:
+ *   vm - Virtual Machine
+ *   vcpuid - VCPU ID
+ *
+ * Output Args:
+ *   None
+ *
+ * Return:
+ *   A pointer to an allocated struct kvm_reg_list
+ *
+ * Get the list of guest registers which are supported for
+ * KVM_GET_ONE_REG/KVM_SET_ONE_REG calls
+ */
+struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vm *vm, uint32_t vcpuid)
+{
+	struct kvm_reg_list reg_list_n = { .n = 0 }, *reg_list;
+	int ret;
+
+	ret = _vcpu_ioctl(vm, vcpuid, KVM_GET_REG_LIST, &reg_list_n);
+	TEST_ASSERT(ret == -1 && errno == E2BIG, "KVM_GET_REG_LIST n=0");
+	reg_list = calloc(1, sizeof(*reg_list) + reg_list_n.n * sizeof(__u64));
+	reg_list->n = reg_list_n.n;
+	vcpu_ioctl(vm, vcpuid, KVM_GET_REG_LIST, reg_list);
+	return reg_list;
+}
+
 /*
  * VM VCPU Regs Get
  *
commit ac4a4d6de22e674cd6e3fe57199a15383496aad2
Author: Oliver Upton <oupton at google.com>
Date:   Tue Oct 27 16:10:44 2020 -0700

    selftests: kvm: test enforcement of paravirtual cpuid features
    
    Add a set of tests that ensure the guest cannot access paravirtual msrs
    and hypercalls that have been disabled in the KVM_CPUID_FEATURES leaf.
    Expect a #GP in the case of msr accesses and -KVM_ENOSYS from
    hypercalls.
    
    Cc: Jim Mattson <jmattson at google.com>
    Signed-off-by: Oliver Upton <oupton at google.com>
    Reviewed-by: Peter Shier <pshier at google.com>
    Reviewed-by: Aaron Lewis <aaronlewis at google.com>
    Message-Id: <20201027231044.655110-7-oupton at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
index d2c2d6205008..22973aa75eda 100644
--- a/tools/testing/selftests/kvm/.gitignore
+++ b/tools/testing/selftests/kvm/.gitignore
@@ -5,6 +5,7 @@
 /x86_64/cr4_cpuid_sync_test
 /x86_64/debug_regs
 /x86_64/evmcs_test
+/x86_64/kvm_pv_test
 /x86_64/hyperv_cpuid
 /x86_64/mmio_warning_test
 /x86_64/platform_info_test
diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index b0f1fcab79f5..44ca6badb544 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -41,6 +41,7 @@ LIBKVM_s390x = lib/s390x/processor.c lib/s390x/ucall.c
 TEST_GEN_PROGS_x86_64 = x86_64/cr4_cpuid_sync_test
 TEST_GEN_PROGS_x86_64 += x86_64/evmcs_test
 TEST_GEN_PROGS_x86_64 += x86_64/hyperv_cpuid
+TEST_GEN_PROGS_x86_64 += x86_64/kvm_pv_test
 TEST_GEN_PROGS_x86_64 += x86_64/mmio_warning_test
 TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test
 TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index 356930690bea..77f53dbc34ff 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -63,6 +63,9 @@ enum vm_mem_backing_src_type {
 
 int kvm_check_cap(long cap);
 int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap);
+int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
+		    struct kvm_enable_cap *cap);
+void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size);
 
 struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
 struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h
index 02530dc6339b..8e61340b3911 100644
--- a/tools/testing/selftests/kvm/include/x86_64/processor.h
+++ b/tools/testing/selftests/kvm/include/x86_64/processor.h
@@ -362,6 +362,18 @@ void vcpu_init_descriptor_tables(struct kvm_vm *vm, uint32_t vcpuid);
 void vm_handle_exception(struct kvm_vm *vm, int vector,
 			void (*handler)(struct ex_regs *));
 
+/*
+ * set_cpuid() - overwrites a matching cpuid entry with the provided value.
+ *		 matches based on ent->function && ent->index. returns true
+ *		 if a match was found and successfully overwritten.
+ * @cpuid: the kvm cpuid list to modify.
+ * @ent: cpuid entry to insert
+ */
+bool set_cpuid(struct kvm_cpuid2 *cpuid, struct kvm_cpuid_entry2 *ent);
+
+uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2,
+		       uint64_t a3);
+
 /*
  * Basic CPU control in CR0
  */
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index be230f3728d5..91e547031d8c 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -86,6 +86,34 @@ int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap)
 	return ret;
 }
 
+/* VCPU Enable Capability
+ *
+ * Input Args:
+ *   vm - Virtual Machine
+ *   vcpu_id - VCPU
+ *   cap - Capability
+ *
+ * Output Args: None
+ *
+ * Return: On success, 0. On failure a TEST_ASSERT failure is produced.
+ *
+ * Enables a capability (KVM_CAP_*) on the VCPU.
+ */
+int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
+		    struct kvm_enable_cap *cap)
+{
+	struct vcpu *vcpu = vcpu_find(vm, vcpu_id);
+	int r;
+
+	TEST_ASSERT(vcpu, "cannot find vcpu %d", vcpu_id);
+
+	r = ioctl(vcpu->fd, KVM_ENABLE_CAP, cap);
+	TEST_ASSERT(!r, "KVM_ENABLE_CAP vCPU ioctl failed,\n"
+			"  rc: %i, errno: %i", r, errno);
+
+	return r;
+}
+
 static void vm_open(struct kvm_vm *vm, int perm)
 {
 	vm->kvm_fd = open(KVM_DEV_PATH, perm);
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index 66228297ac03..d10c5c05bdf0 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -1227,3 +1227,32 @@ void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid)
 			    *data);
 	}
 }
+
+bool set_cpuid(struct kvm_cpuid2 *cpuid,
+	       struct kvm_cpuid_entry2 *ent)
+{
+	int i;
+
+	for (i = 0; i < cpuid->nent; i++) {
+		struct kvm_cpuid_entry2 *cur = &cpuid->entries[i];
+
+		if (cur->function != ent->function || cur->index != ent->index)
+			continue;
+
+		memcpy(cur, ent, sizeof(struct kvm_cpuid_entry2));
+		return true;
+	}
+
+	return false;
+}
+
+uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2,
+		       uint64_t a3)
+{
+	uint64_t r;
+
+	asm volatile("vmcall"
+		     : "=a"(r)
+		     : "b"(a0), "c"(a1), "d"(a2), "S"(a3));
+	return r;
+}
diff --git a/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c b/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
new file mode 100644
index 000000000000..b10a27485bad
--- /dev/null
+++ b/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
@@ -0,0 +1,234 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2020, Google LLC.
+ *
+ * Tests for KVM paravirtual feature disablement
+ */
+#include <asm/kvm_para.h>
+#include <linux/kvm_para.h>
+#include <stdint.h>
+
+#include "test_util.h"
+#include "kvm_util.h"
+#include "processor.h"
+
+extern unsigned char rdmsr_start;
+extern unsigned char rdmsr_end;
+
+static u64 do_rdmsr(u32 idx)
+{
+	u32 lo, hi;
+
+	asm volatile("rdmsr_start: rdmsr;"
+		     "rdmsr_end:"
+		     : "=a"(lo), "=c"(hi)
+		     : "c"(idx));
+
+	return (((u64) hi) << 32) | lo;
+}
+
+extern unsigned char wrmsr_start;
+extern unsigned char wrmsr_end;
+
+static void do_wrmsr(u32 idx, u64 val)
+{
+	u32 lo, hi;
+
+	lo = val;
+	hi = val >> 32;
+
+	asm volatile("wrmsr_start: wrmsr;"
+		     "wrmsr_end:"
+		     : : "a"(lo), "c"(idx), "d"(hi));
+}
+
+static int nr_gp;
+
+static void guest_gp_handler(struct ex_regs *regs)
+{
+	unsigned char *rip = (unsigned char *)regs->rip;
+	bool r, w;
+
+	r = rip == &rdmsr_start;
+	w = rip == &wrmsr_start;
+	GUEST_ASSERT(r || w);
+
+	nr_gp++;
+
+	if (r)
+		regs->rip = (uint64_t)&rdmsr_end;
+	else
+		regs->rip = (uint64_t)&wrmsr_end;
+}
+
+struct msr_data {
+	uint32_t idx;
+	const char *name;
+};
+
+#define TEST_MSR(msr) { .idx = msr, .name = #msr }
+#define UCALL_PR_MSR 0xdeadbeef
+#define PR_MSR(msr) ucall(UCALL_PR_MSR, 1, msr)
+
+/*
+ * KVM paravirtual msrs to test. Expect a #GP if any of these msrs are read or
+ * written, as the KVM_CPUID_FEATURES leaf is cleared.
+ */
+static struct msr_data msrs_to_test[] = {
+	TEST_MSR(MSR_KVM_SYSTEM_TIME),
+	TEST_MSR(MSR_KVM_SYSTEM_TIME_NEW),
+	TEST_MSR(MSR_KVM_WALL_CLOCK),
+	TEST_MSR(MSR_KVM_WALL_CLOCK_NEW),
+	TEST_MSR(MSR_KVM_ASYNC_PF_EN),
+	TEST_MSR(MSR_KVM_STEAL_TIME),
+	TEST_MSR(MSR_KVM_PV_EOI_EN),
+	TEST_MSR(MSR_KVM_POLL_CONTROL),
+	TEST_MSR(MSR_KVM_ASYNC_PF_INT),
+	TEST_MSR(MSR_KVM_ASYNC_PF_ACK),
+};
+
+static void test_msr(struct msr_data *msr)
+{
+	PR_MSR(msr);
+	do_rdmsr(msr->idx);
+	GUEST_ASSERT(READ_ONCE(nr_gp) == 1);
+
+	nr_gp = 0;
+	do_wrmsr(msr->idx, 0);
+	GUEST_ASSERT(READ_ONCE(nr_gp) == 1);
+	nr_gp = 0;
+}
+
+struct hcall_data {
+	uint64_t nr;
+	const char *name;
+};
+
+#define TEST_HCALL(hc) { .nr = hc, .name = #hc }
+#define UCALL_PR_HCALL 0xdeadc0de
+#define PR_HCALL(hc) ucall(UCALL_PR_HCALL, 1, hc)
+
+/*
+ * KVM hypercalls to test. Expect -KVM_ENOSYS when called, as the corresponding
+ * features have been cleared in KVM_CPUID_FEATURES.
+ */
+static struct hcall_data hcalls_to_test[] = {
+	TEST_HCALL(KVM_HC_KICK_CPU),
+	TEST_HCALL(KVM_HC_SEND_IPI),
+	TEST_HCALL(KVM_HC_SCHED_YIELD),
+};
+
+static void test_hcall(struct hcall_data *hc)
+{
+	uint64_t r;
+
+	PR_HCALL(hc);
+	r = kvm_hypercall(hc->nr, 0, 0, 0, 0);
+	GUEST_ASSERT(r == -KVM_ENOSYS);
+}
+
+static void guest_main(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(msrs_to_test); i++) {
+		test_msr(&msrs_to_test[i]);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(hcalls_to_test); i++) {
+		test_hcall(&hcalls_to_test[i]);
+	}
+
+	GUEST_DONE();
+}
+
+static void clear_kvm_cpuid_features(struct kvm_cpuid2 *cpuid)
+{
+	struct kvm_cpuid_entry2 ent = {0};
+
+	ent.function = KVM_CPUID_FEATURES;
+	TEST_ASSERT(set_cpuid(cpuid, &ent),
+		    "failed to clear KVM_CPUID_FEATURES leaf");
+}
+
+static void pr_msr(struct ucall *uc)
+{
+	struct msr_data *msr = (struct msr_data *)uc->args[0];
+
+	pr_info("testing msr: %s (%#x)\n", msr->name, msr->idx);
+}
+
+static void pr_hcall(struct ucall *uc)
+{
+	struct hcall_data *hc = (struct hcall_data *)uc->args[0];
+
+	pr_info("testing hcall: %s (%lu)\n", hc->name, hc->nr);
+}
+
+static void handle_abort(struct ucall *uc)
+{
+	TEST_FAIL("%s at %s:%ld", (const char *)uc->args[0],
+		  __FILE__, uc->args[1]);
+}
+
+#define VCPU_ID 0
+
+static void enter_guest(struct kvm_vm *vm)
+{
+	struct kvm_run *run;
+	struct ucall uc;
+	int r;
+
+	run = vcpu_state(vm, VCPU_ID);
+
+	while (true) {
+		r = _vcpu_run(vm, VCPU_ID);
+		TEST_ASSERT(!r, "vcpu_run failed: %d\n", r);
+		TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
+			    "unexpected exit reason: %u (%s)",
+			    run->exit_reason, exit_reason_str(run->exit_reason));
+
+		switch (get_ucall(vm, VCPU_ID, &uc)) {
+		case UCALL_PR_MSR:
+			pr_msr(&uc);
+			break;
+		case UCALL_PR_HCALL:
+			pr_hcall(&uc);
+			break;
+		case UCALL_ABORT:
+			handle_abort(&uc);
+			return;
+		case UCALL_DONE:
+			return;
+		}
+	}
+}
+
+int main(void)
+{
+	struct kvm_enable_cap cap = {0};
+	struct kvm_cpuid2 *best;
+	struct kvm_vm *vm;
+
+	if (!kvm_check_cap(KVM_CAP_ENFORCE_PV_FEATURE_CPUID)) {
+		pr_info("will skip kvm paravirt restriction tests.\n");
+		return 0;
+	}
+
+	vm = vm_create_default(VCPU_ID, 0, guest_main);
+
+	cap.cap = KVM_CAP_ENFORCE_PV_FEATURE_CPUID;
+	cap.args[0] = 1;
+	vcpu_enable_cap(vm, VCPU_ID, &cap);
+
+	best = kvm_get_supported_cpuid();
+	clear_kvm_cpuid_features(best);
+	vcpu_set_cpuid(vm, VCPU_ID, best);
+
+	vm_init_descriptor_tables(vm);
+	vcpu_init_descriptor_tables(vm, VCPU_ID);
+	vm_handle_exception(vm, GP_VECTOR, guest_gp_handler);
+
+	enter_guest(vm);
+	kvm_vm_free(vm);
+}
commit 29faeb9632012d6c3fa4aa33c3d589b9ff18b206
Author: Aaron Lewis <aaronlewis at google.com>
Date:   Mon Oct 12 12:47:15 2020 -0700

    selftests: kvm: Add exception handling to selftests
    
    Add the infrastructure needed to enable exception handling in selftests.
    This allows any of the exception and interrupt vectors to be overridden
    in the guest.
    
    Signed-off-by: Aaron Lewis <aaronlewis at google.com>
    Reviewed-by: Alexander Graf <graf at amazon.com>
    Message-Id: <20201012194716.3950330-4-aaronlewis at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index 30afbad36cd5..b0f1fcab79f5 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -34,7 +34,7 @@ ifeq ($(ARCH),s390)
 endif
 
 LIBKVM = lib/assert.c lib/elf.c lib/io.c lib/kvm_util.c lib/sparsebit.c lib/test_util.c
-LIBKVM_x86_64 = lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/svm.c lib/x86_64/ucall.c
+LIBKVM_x86_64 = lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/svm.c lib/x86_64/ucall.c lib/x86_64/handlers.S
 LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c
 LIBKVM_s390x = lib/s390x/processor.c lib/s390x/ucall.c
 
@@ -111,14 +111,21 @@ LDFLAGS += -pthread $(no-pie-option) $(pgste-option)
 include ../lib.mk
 
 STATIC_LIBS := $(OUTPUT)/libkvm.a
-LIBKVM_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM))
-EXTRA_CLEAN += $(LIBKVM_OBJ) $(STATIC_LIBS) cscope.*
+LIBKVM_C := $(filter %.c,$(LIBKVM))
+LIBKVM_S := $(filter %.S,$(LIBKVM))
+LIBKVM_C_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_C))
+LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S))
+EXTRA_CLEAN += $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(STATIC_LIBS) cscope.*
+
+x := $(shell mkdir -p $(sort $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ))))
+$(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c
+	$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
 
-x := $(shell mkdir -p $(sort $(dir $(LIBKVM_OBJ))))
-$(LIBKVM_OBJ): $(OUTPUT)/%.o: %.c
+$(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S
 	$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
 
-$(OUTPUT)/libkvm.a: $(LIBKVM_OBJ)
+LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)
+$(OUTPUT)/libkvm.a: $(LIBKVM_OBJS)
 	$(AR) crs $@ $^
 
 x := $(shell mkdir -p $(sort $(dir $(TEST_GEN_PROGS))))
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index 919e161dd289..356930690bea 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -294,6 +294,8 @@ int vm_create_device(struct kvm_vm *vm, struct kvm_create_device *cd);
 	memcpy(&(g), _p, sizeof(g));				\
 })
 
+void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid);
+
 /* Common ucalls */
 enum {
 	UCALL_NONE,
diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h
index 0a65e7bb5249..02530dc6339b 100644
--- a/tools/testing/selftests/kvm/include/x86_64/processor.h
+++ b/tools/testing/selftests/kvm/include/x86_64/processor.h
@@ -36,6 +36,8 @@
 #define X86_CR4_SMAP		(1ul << 21)
 #define X86_CR4_PKE		(1ul << 22)
 
+#define UNEXPECTED_VECTOR_PORT 0xfff0u
+
 /* General Registers in 64-Bit Mode */
 struct gpr64_regs {
 	u64 rax;
@@ -239,6 +241,11 @@ static inline struct desc_ptr get_idt(void)
 	return idt;
 }
 
+static inline void outl(uint16_t port, uint32_t value)
+{
+	__asm__ __volatile__("outl %%eax, %%dx" : : "d"(port), "a"(value));
+}
+
 #define SET_XMM(__var, __xmm) \
 	asm volatile("movq %0, %%"#__xmm : : "r"(__var) : #__xmm)
 
@@ -338,6 +345,23 @@ uint32_t kvm_get_cpuid_max_basic(void);
 uint32_t kvm_get_cpuid_max_extended(void);
 void kvm_get_cpu_address_width(unsigned int *pa_bits, unsigned int *va_bits);
 
+struct ex_regs {
+	uint64_t rax, rcx, rdx, rbx;
+	uint64_t rbp, rsi, rdi;
+	uint64_t r8, r9, r10, r11;
+	uint64_t r12, r13, r14, r15;
+	uint64_t vector;
+	uint64_t error_code;
+	uint64_t rip;
+	uint64_t cs;
+	uint64_t rflags;
+};
+
+void vm_init_descriptor_tables(struct kvm_vm *vm);
+void vcpu_init_descriptor_tables(struct kvm_vm *vm, uint32_t vcpuid);
+void vm_handle_exception(struct kvm_vm *vm, int vector,
+			void (*handler)(struct ex_regs *));
+
 /*
  * Basic CPU control in CR0
  */
diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 2afa6618b396..d6c32c328e9a 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -350,3 +350,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
 
 	va_end(ap);
 }
+
+void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid)
+{
+}
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 3327cebc1095..be230f3728d5 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1204,6 +1204,9 @@ int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)
 	do {
 		rc = ioctl(vcpu->fd, KVM_RUN, NULL);
 	} while (rc == -1 && errno == EINTR);
+
+	assert_on_unhandled_exception(vm, vcpuid);
+
 	return rc;
 }
 
diff --git a/tools/testing/selftests/kvm/lib/kvm_util_internal.h b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
index 2ef446520748..f07d383d03a1 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util_internal.h
+++ b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
@@ -50,6 +50,8 @@ struct kvm_vm {
 	vm_paddr_t pgd;
 	vm_vaddr_t gdt;
 	vm_vaddr_t tss;
+	vm_vaddr_t idt;
+	vm_vaddr_t handlers;
 };
 
 struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid);
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index a88c5d665725..7349bb2e1a24 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -241,3 +241,7 @@ void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
 	fprintf(stream, "%*spstate: psw: 0x%.16llx:0x%.16llx\n",
 		indent, "", vcpu->state->psw_mask, vcpu->state->psw_addr);
 }
+
+void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid)
+{
+}
diff --git a/tools/testing/selftests/kvm/lib/x86_64/handlers.S b/tools/testing/selftests/kvm/lib/x86_64/handlers.S
new file mode 100644
index 000000000000..aaf7bc7d2ce1
--- /dev/null
+++ b/tools/testing/selftests/kvm/lib/x86_64/handlers.S
@@ -0,0 +1,81 @@
+handle_exception:
+	push %r15
+	push %r14
+	push %r13
+	push %r12
+	push %r11
+	push %r10
+	push %r9
+	push %r8
+
+	push %rdi
+	push %rsi
+	push %rbp
+	push %rbx
+	push %rdx
+	push %rcx
+	push %rax
+	mov %rsp, %rdi
+
+	call route_exception
+
+	pop %rax
+	pop %rcx
+	pop %rdx
+	pop %rbx
+	pop %rbp
+	pop %rsi
+	pop %rdi
+	pop %r8
+	pop %r9
+	pop %r10
+	pop %r11
+	pop %r12
+	pop %r13
+	pop %r14
+	pop %r15
+
+	/* Discard vector and error code. */
+	add $16, %rsp
+	iretq
+
+/*
+ * Build the handle_exception wrappers which push the vector/error code on the
+ * stack and an array of pointers to those wrappers.
+ */
+.pushsection .rodata
+.globl idt_handlers
+idt_handlers:
+.popsection
+
+.macro HANDLERS has_error from to
+	vector = \from
+	.rept \to - \from + 1
+	.align 8
+
+	/* Fetch current address and append it to idt_handlers. */
+	current_handler = .
+.pushsection .rodata
+.quad current_handler
+.popsection
+
+	.if ! \has_error
+	pushq $0
+	.endif
+	pushq $vector
+	jmp handle_exception
+	vector = vector + 1
+	.endr
+.endm
+
+.global idt_handler_code
+idt_handler_code:
+	HANDLERS has_error=0 from=0  to=7
+	HANDLERS has_error=1 from=8  to=8
+	HANDLERS has_error=0 from=9  to=9
+	HANDLERS has_error=1 from=10 to=14
+	HANDLERS has_error=0 from=15 to=16
+	HANDLERS has_error=1 from=17 to=17
+	HANDLERS has_error=0 from=18 to=255
+
+.section        .note.GNU-stack, "", %progbits
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index 1ccf6c9b3476..66228297ac03 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -12,9 +12,18 @@
 #include "../kvm_util_internal.h"
 #include "processor.h"
 
+#ifndef NUM_INTERRUPTS
+#define NUM_INTERRUPTS 256
+#endif
+
+#define DEFAULT_CODE_SELECTOR 0x8
+#define DEFAULT_DATA_SELECTOR 0x10
+
 /* Minimum physical address used for virtual translation tables. */
 #define KVM_GUEST_PAGE_TABLE_MIN_PADDR 0x180000
 
+vm_vaddr_t exception_handlers;
+
 /* Virtual translation table structure declarations */
 struct pageMapL4Entry {
 	uint64_t present:1;
@@ -557,9 +566,9 @@ static void vcpu_setup(struct kvm_vm *vm, int vcpuid, int pgd_memslot, int gdt_m
 		sregs.efer |= (EFER_LME | EFER_LMA | EFER_NX);
 
 		kvm_seg_set_unusable(&sregs.ldt);
-		kvm_seg_set_kernel_code_64bit(vm, 0x8, &sregs.cs);
-		kvm_seg_set_kernel_data_64bit(vm, 0x10, &sregs.ds);
-		kvm_seg_set_kernel_data_64bit(vm, 0x10, &sregs.es);
+		kvm_seg_set_kernel_code_64bit(vm, DEFAULT_CODE_SELECTOR, &sregs.cs);
+		kvm_seg_set_kernel_data_64bit(vm, DEFAULT_DATA_SELECTOR, &sregs.ds);
+		kvm_seg_set_kernel_data_64bit(vm, DEFAULT_DATA_SELECTOR, &sregs.es);
 		kvm_setup_tss_64bit(vm, &sregs.tr, 0x18, gdt_memslot, pgd_memslot);
 		break;
 
@@ -1119,3 +1128,102 @@ void kvm_get_cpu_address_width(unsigned int *pa_bits, unsigned int *va_bits)
 		*va_bits = (entry->eax >> 8) & 0xff;
 	}
 }
+
+struct idt_entry {
+	uint16_t offset0;
+	uint16_t selector;
+	uint16_t ist : 3;
+	uint16_t : 5;
+	uint16_t type : 4;
+	uint16_t : 1;
+	uint16_t dpl : 2;
+	uint16_t p : 1;
+	uint16_t offset1;
+	uint32_t offset2; uint32_t reserved;
+};
+
+static void set_idt_entry(struct kvm_vm *vm, int vector, unsigned long addr,
+			  int dpl, unsigned short selector)
+{
+	struct idt_entry *base =
+		(struct idt_entry *)addr_gva2hva(vm, vm->idt);
+	struct idt_entry *e = &base[vector];
+
+	memset(e, 0, sizeof(*e));
+	e->offset0 = addr;
+	e->selector = selector;
+	e->ist = 0;
+	e->type = 14;
+	e->dpl = dpl;
+	e->p = 1;
+	e->offset1 = addr >> 16;
+	e->offset2 = addr >> 32;
+}
+
+void kvm_exit_unexpected_vector(uint32_t value)
+{
+	outl(UNEXPECTED_VECTOR_PORT, value);
+}
+
+void route_exception(struct ex_regs *regs)
+{
+	typedef void(*handler)(struct ex_regs *);
+	handler *handlers = (handler *)exception_handlers;
+
+	if (handlers && handlers[regs->vector]) {
+		handlers[regs->vector](regs);
+		return;
+	}
+
+	kvm_exit_unexpected_vector(regs->vector);
+}
+
+void vm_init_descriptor_tables(struct kvm_vm *vm)
+{
+	extern void *idt_handlers;
+	int i;
+
+	vm->idt = vm_vaddr_alloc(vm, getpagesize(), 0x2000, 0, 0);
+	vm->handlers = vm_vaddr_alloc(vm, 256 * sizeof(void *), 0x2000, 0, 0);
+	/* Handlers have the same address in both address spaces.*/
+	for (i = 0; i < NUM_INTERRUPTS; i++)
+		set_idt_entry(vm, i, (unsigned long)(&idt_handlers)[i], 0,
+			DEFAULT_CODE_SELECTOR);
+}
+
+void vcpu_init_descriptor_tables(struct kvm_vm *vm, uint32_t vcpuid)
+{
+	struct kvm_sregs sregs;
+
+	vcpu_sregs_get(vm, vcpuid, &sregs);
+	sregs.idt.base = vm->idt;
+	sregs.idt.limit = NUM_INTERRUPTS * sizeof(struct idt_entry) - 1;
+	sregs.gdt.base = vm->gdt;
+	sregs.gdt.limit = getpagesize() - 1;
+	kvm_seg_set_kernel_data_64bit(NULL, DEFAULT_DATA_SELECTOR, &sregs.gs);
+	vcpu_sregs_set(vm, vcpuid, &sregs);
+	*(vm_vaddr_t *)addr_gva2hva(vm, (vm_vaddr_t)(&exception_handlers)) = vm->handlers;
+}
+
+void vm_handle_exception(struct kvm_vm *vm, int vector,
+			 void (*handler)(struct ex_regs *))
+{
+	vm_vaddr_t *handlers = (vm_vaddr_t *)addr_gva2hva(vm, vm->handlers);
+
+	handlers[vector] = (vm_vaddr_t)handler;
+}
+
+void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid)
+{
+	if (vcpu_state(vm, vcpuid)->exit_reason == KVM_EXIT_IO
+		&& vcpu_state(vm, vcpuid)->io.port == UNEXPECTED_VECTOR_PORT
+		&& vcpu_state(vm, vcpuid)->io.size == 4) {
+		/* Grab pointer to io data */
+		uint32_t *data = (void *)vcpu_state(vm, vcpuid)
+			+ vcpu_state(vm, vcpuid)->io.data_offset;
+
+		TEST_ASSERT(false,
+			    "Unexpected vectored event in guest (vector:0x%x)",
+			    *data);
+	}
+}
commit 85f2a4320ef27ce74b9da0631460561028c48756
Author: Aaron Lewis <aaronlewis at google.com>
Date:   Mon Oct 12 12:47:14 2020 -0700

    selftests: kvm: Clear uc so UCALL_NONE is being properly reported
    
    Ensure the out value 'uc' in get_ucall() is properly reporting
    UCALL_NONE if the call fails.  The return value will be correctly
    reported, however, the out parameter 'uc' will not be.  Clear the struct
    to ensure the correct value is being reported in the out parameter.
    
    Signed-off-by: Aaron Lewis <aaronlewis at google.com>
    Reviewed-by: Andrew Jones <drjones at redhat.com>
    Reviewed-by: Alexander Graf <graf at amazon.com>
    Message-Id: <20201012194716.3950330-3-aaronlewis at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
index c8e0ec20d3bf..2f37b90ee1a9 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
@@ -94,6 +94,9 @@ uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
 	struct kvm_run *run = vcpu_state(vm, vcpu_id);
 	struct ucall ucall = {};
 
+	if (uc)
+		memset(uc, 0, sizeof(*uc));
+
 	if (run->exit_reason == KVM_EXIT_MMIO &&
 	    run->mmio.phys_addr == (uint64_t)ucall_exit_mmio_addr) {
 		vm_vaddr_t gva;
diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c
index fd589dc9bfab..9d3b0f15249a 100644
--- a/tools/testing/selftests/kvm/lib/s390x/ucall.c
+++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c
@@ -38,6 +38,9 @@ uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
 	struct kvm_run *run = vcpu_state(vm, vcpu_id);
 	struct ucall ucall = {};
 
+	if (uc)
+		memset(uc, 0, sizeof(*uc));
+
 	if (run->exit_reason == KVM_EXIT_S390_SIEIC &&
 	    run->s390_sieic.icptcode == 4 &&
 	    (run->s390_sieic.ipa >> 8) == 0x83 &&    /* 0x83 means DIAGNOSE */
diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c
index da4d89ad5419..a3489973e290 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c
@@ -40,6 +40,9 @@ uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
 	struct kvm_run *run = vcpu_state(vm, vcpu_id);
 	struct ucall ucall = {};
 
+	if (uc)
+		memset(uc, 0, sizeof(*uc));
+
 	if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) {
 		struct kvm_regs regs;
 
commit df11f7dd5834146defa448acba097e8d7703cc42
Author: Aaron Lewis <aaronlewis at google.com>
Date:   Mon Oct 12 12:47:13 2020 -0700

    selftests: kvm: Fix the segment descriptor layout to match the actual layout
    
    Fix the layout of 'struct desc64' to match the layout described in the
    SDM Vol 3, Chapter 3 "Protected-Mode Memory Management", section 3.4.5
    "Segment Descriptors", Figure 3-8 "Segment Descriptor".  The test added
    later in this series relies on this and crashes if this layout is not
    correct.
    
    Signed-off-by: Aaron Lewis <aaronlewis at google.com>
    Reviewed-by: Alexander Graf <graf at amazon.com>
    Message-Id: <20201012194716.3950330-2-aaronlewis at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h
index 82b7fe16a824..0a65e7bb5249 100644
--- a/tools/testing/selftests/kvm/include/x86_64/processor.h
+++ b/tools/testing/selftests/kvm/include/x86_64/processor.h
@@ -59,7 +59,7 @@ struct gpr64_regs {
 struct desc64 {
 	uint16_t limit0;
 	uint16_t base0;
-	unsigned base1:8, s:1, type:4, dpl:2, p:1;
+	unsigned base1:8, type:4, s:1, dpl:2, p:1;
 	unsigned limit1:4, avl:1, l:1, db:1, g:1, base2:8;
 	uint32_t base3;
 	uint32_t zero1;
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index f6eb34eaa0d2..1ccf6c9b3476 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -392,11 +392,12 @@ static void kvm_seg_fill_gdt_64bit(struct kvm_vm *vm, struct kvm_segment *segp)
 	desc->limit0 = segp->limit & 0xFFFF;
 	desc->base0 = segp->base & 0xFFFF;
 	desc->base1 = segp->base >> 16;
-	desc->s = segp->s;
 	desc->type = segp->type;
+	desc->s = segp->s;
 	desc->dpl = segp->dpl;
 	desc->p = segp->present;
 	desc->limit1 = segp->limit >> 16;
+	desc->avl = segp->avl;
 	desc->l = segp->l;
 	desc->db = segp->db;
 	desc->g = segp->g;
commit 8519873d19120c5046e4124d18a9c09eec20eab9
Author: Nishanth Menon <nm at ti.com>
Date:   Mon Oct 26 11:54:41 2020 -0500

    drm: bridge: cdns: Kconfig: Switch over dependency to ARCH_K3
    
    With the integration of chip-id detection scheme in kernel[1], there
    is no specific need to maintain multitudes of SoC specific config
    options, discussed as per [2], we have deprecated the usage in other
    places for v5.10-rc1. Fix the missing user so that we can clean up the
    configs in v5.11.
    
    [1] drivers/soc/ti/k3-socinfo.c commit 907a2b7e2fc7 ("soc: ti: add k3 platforms chipid module driver")
    [2] https://lore.kernel.org/linux-arm-kernel/20200908112534.t5bgrjf7y3a6l2ss@akan/
    
    Fixes: afba7e6c5fc1 ("drm: bridge: cdns-mhdp8546: Add TI J721E wrapper")
    Cc: Swapnil Jakhade <sjakhade at cadence.com>
    Cc: Tomi Valkeinen <tomi.valkeinen at ti.com>
    Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
    Cc: Yuti Amonkar <yamonkar at cadence.com>
    Cc: Jyri Sarha <jsarha at ti.com>
    Signed-off-by: Nishanth Menon <nm at ti.com>
    Reviewed-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
    Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20201026165441.22894-1-nm@ti.com

diff --git a/drivers/gpu/drm/bridge/cadence/Kconfig b/drivers/gpu/drm/bridge/cadence/Kconfig
index 511d67b16d14..ef8c230e0f62 100644
--- a/drivers/gpu/drm/bridge/cadence/Kconfig
+++ b/drivers/gpu/drm/bridge/cadence/Kconfig
@@ -13,7 +13,7 @@ config DRM_CDNS_MHDP8546
 if DRM_CDNS_MHDP8546
 
 config DRM_CDNS_MHDP8546_J721E
-	depends on ARCH_K3_J721E_SOC || COMPILE_TEST
+	depends on ARCH_K3 || COMPILE_TEST
 	bool "J721E Cadence DPI/DP wrapper support"
 	default y
 	help
commit 2cdef91cf882abc74dd2f6bfae16db782b44c6ce
Author: Pankaj Gupta <pankaj.gupta at cloud.ionos.com>
Date:   Thu Nov 5 16:39:32 2020 +0100

    KVM: x86: handle MSR_IA32_DEBUGCTLMSR with report_ignored_msrs
    
    Windows2016 guest tries to enable LBR by setting the corresponding bits
    in MSR_IA32_DEBUGCTLMSR. KVM does not emulate MSR_IA32_DEBUGCTLMSR and
    spams the host kernel logs with error messages like:
    
            kvm [...]: vcpu1, guest rIP: 0xfffff800a8b687d3 kvm_set_msr_common: MSR_IA32_DEBUGCTLMSR 0x1, nop"
    
    This patch fixes this by enabling error logging only with
    'report_ignored_msrs=1'.
    
    Signed-off-by: Pankaj Gupta <pankaj.gupta at cloud.ionos.com>
    Message-Id: <20201105153932.24316-1-pankaj.gupta.linux at gmail.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index d9651faabe68..447edc0d1d5a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3065,9 +3065,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 			/* Values other than LBR and BTF are vendor-specific,
 			   thus reserved and should throw a #GP */
 			return 1;
-		}
-		vcpu_unimpl(vcpu, "%s: MSR_IA32_DEBUGCTLMSR 0x%llx, nop\n",
-			    __func__, data);
+		} else if (report_ignored_msrs)
+			vcpu_unimpl(vcpu, "%s: MSR_IA32_DEBUGCTLMSR 0x%llx, nop\n",
+				    __func__, data);
 		break;
 	case 0x200 ... 0x2ff:
 		return kvm_mtrr_set_msr(vcpu, msr, data);
commit 1e293d1ae88cd0e2a0ad4c275f5dc2d8ae7b4387
Author: Oliver Upton <oupton at google.com>
Date:   Tue Oct 27 16:10:43 2020 -0700

    kvm: x86: request masterclock update any time guest uses different msr
    
    Commit 5b9bb0ebbcdc ("kvm: x86: encapsulate wrmsr(MSR_KVM_SYSTEM_TIME)
    emulation in helper fn", 2020-10-21) subtly changed the behavior of guest
    writes to MSR_KVM_SYSTEM_TIME(_NEW). Restore the previous behavior; update
    the masterclock any time the guest uses a different msr than before.
    
    Fixes: 5b9bb0ebbcdc ("kvm: x86: encapsulate wrmsr(MSR_KVM_SYSTEM_TIME) emulation in helper fn", 2020-10-21)
    Signed-off-by: Oliver Upton <oupton at google.com>
    Reviewed-by: Peter Shier <pshier at google.com>
    Message-Id: <20201027231044.655110-6-oupton at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 948561183fd1..d9651faabe68 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1967,7 +1967,7 @@ static void kvm_write_system_time(struct kvm_vcpu *vcpu, gpa_t system_time,
 	struct kvm_arch *ka = &vcpu->kvm->arch;
 
 	if (vcpu->vcpu_id == 0 && !host_initiated) {
-		if (ka->boot_vcpu_runs_old_kvmclock && old_msr)
+		if (ka->boot_vcpu_runs_old_kvmclock != old_msr)
 			kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu);
 
 		ka->boot_vcpu_runs_old_kvmclock = old_msr;
commit 01b4f510b9f467abfc781e198e810e1ecffb782e
Author: Oliver Upton <oupton at google.com>
Date:   Tue Oct 27 16:10:42 2020 -0700

    kvm: x86: ensure pv_cpuid.features is initialized when enabling cap
    
    Make the paravirtual cpuid enforcement mechanism idempotent to ioctl()
    ordering by updating pv_cpuid.features whenever userspace requests the
    capability. Extract this update out of kvm_update_cpuid_runtime() into a
    new helper function and move its other call site into
    kvm_vcpu_after_set_cpuid() where it more likely belongs.
    
    Fixes: 66570e966dd9 ("kvm: x86: only provide PV features if enabled in guest's CPUID")
    Signed-off-by: Oliver Upton <oupton at google.com>
    Reviewed-by: Peter Shier <pshier at google.com>
    Message-Id: <20201027231044.655110-5-oupton at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 06a278b3701d..d50041f570e8 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -90,6 +90,20 @@ static int kvm_check_cpuid(struct kvm_cpuid_entry2 *entries, int nent)
 	return 0;
 }
 
+void kvm_update_pv_runtime(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *best;
+
+	best = kvm_find_cpuid_entry(vcpu, KVM_CPUID_FEATURES, 0);
+
+	/*
+	 * save the feature bitmap to avoid cpuid lookup for every PV
+	 * operation
+	 */
+	if (best)
+		vcpu->arch.pv_cpuid.features = best->eax;
+}
+
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
 {
 	struct kvm_cpuid_entry2 *best;
@@ -124,13 +138,6 @@ void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
 		(best->eax & (1 << KVM_FEATURE_PV_UNHALT)))
 		best->eax &= ~(1 << KVM_FEATURE_PV_UNHALT);
 
-	/*
-	 * save the feature bitmap to avoid cpuid lookup for every PV
-	 * operation
-	 */
-	if (best)
-		vcpu->arch.pv_cpuid.features = best->eax;
-
 	if (!kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT)) {
 		best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
 		if (best)
@@ -162,6 +169,8 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 		vcpu->arch.guest_supported_xcr0 =
 			(best->eax | ((u64)best->edx << 32)) & supported_xcr0;
 
+	kvm_update_pv_runtime(vcpu);
+
 	vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu);
 	kvm_mmu_reset_context(vcpu);
 
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index bf8577947ed2..f7a6e8f83783 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -11,6 +11,7 @@ extern u32 kvm_cpu_caps[NCAPINTS] __read_mostly;
 void kvm_set_cpu_caps(void);
 
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu);
+void kvm_update_pv_runtime(struct kvm_vcpu *vcpu);
 struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
 					      u32 function, u32 index);
 int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid,
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index d12820acc548..948561183fd1 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4611,6 +4611,8 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
 
 	case KVM_CAP_ENFORCE_PV_FEATURE_CPUID:
 		vcpu->arch.pv_cpuid.enforce = cap->args[0];
+		if (vcpu->arch.pv_cpuid.enforce)
+			kvm_update_pv_runtime(vcpu);
 
 		return 0;
 
commit 1930e5ddcead2c23567131e62c86b15efce054be
Author: Oliver Upton <oupton at google.com>
Date:   Tue Oct 27 16:10:41 2020 -0700

    kvm: x86: reads of restricted pv msrs should also result in #GP
    
    commit 66570e966dd9 ("kvm: x86: only provide PV features if enabled in
    guest's CPUID") only protects against disallowed guest writes to KVM
    paravirtual msrs, leaving msr reads unchecked. Fix this by enforcing
    KVM_CPUID_FEATURES for msr reads as well.
    
    Fixes: 66570e966dd9 ("kvm: x86: only provide PV features if enabled in guest's CPUID")
    Signed-off-by: Oliver Upton <oupton at google.com>
    Reviewed-by: Peter Shier <pshier at google.com>
    Message-Id: <20201027231044.655110-4-oupton at google.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a4c59be8d566..d12820acc548 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3465,29 +3465,63 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 		msr_info->data = vcpu->arch.efer;
 		break;
 	case MSR_KVM_WALL_CLOCK:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE))
+			return 1;
+
+		msr_info->data = vcpu->kvm->arch.wall_clock;
+		break;
 	case MSR_KVM_WALL_CLOCK_NEW:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2))
+			return 1;
+
 		msr_info->data = vcpu->kvm->arch.wall_clock;
 		break;
 	case MSR_KVM_SYSTEM_TIME:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE))
+			return 1;
+
+		msr_info->data = vcpu->arch.time;
+		break;
 	case MSR_KVM_SYSTEM_TIME_NEW:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2))
+			return 1;
+
 		msr_info->data = vcpu->arch.time;
 		break;
 	case MSR_KVM_ASYNC_PF_EN:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF))
+			return 1;
+
 		msr_info->data = vcpu->arch.apf.msr_en_val;
 		break;
 	case MSR_KVM_ASYNC_PF_INT:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT))
+			return 1;
+
 		msr_info->data = vcpu->arch.apf.msr_int_val;
 		break;
 	case MSR_KVM_ASYNC_PF_ACK:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF))
+			return 1;
+
 		msr_info->data = 0;
 		break;
 	case MSR_KVM_STEAL_TIME:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_STEAL_TIME))
+			return 1;
+
 		msr_info->data = vcpu->arch.st.msr_val;
 		break;
 	case MSR_KVM_PV_EOI_EN:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_PV_EOI))
+			return 1;
+
 		msr_info->data = vcpu->arch.pv_eoi.msr_val;
 		break;
 	case MSR_KVM_POLL_CONTROL:
+		if (!guest_pv_has(vcpu, KVM_FEATURE_POLL_CONTROL))
+			return 1;
+
 		msr_info->data = vcpu->arch.msr_kvm_poll_control;
 		break;
 	case MSR_IA32_P5_MC_ADDR:
commit cc4cb017678aa66d3fb4501b2f7424ed28fc7f4d
Author: Maxim Levitsky <mlevitsk at redhat.com>
Date:   Sun Nov 1 13:55:23 2020 +0200

    KVM: x86: use positive error values for msr emulation that causes #GP
    
    Recent introduction of the userspace msr filtering added code that uses
    negative error codes for cases that result in either #GP delivery to
    the guest, or handled by the userspace msr filtering.
    
    This breaks an assumption that a negative error code returned from the
    msr emulation code is a semi-fatal error which should be returned
    to userspace via KVM_RUN ioctl and usually kill the guest.
    
    Fix this by reusing the already existing KVM_MSR_RET_INVALID error code,
    and by adding a new KVM_MSR_RET_FILTERED error code for the
    userspace filtered msrs.
    
    Fixes: 291f35fb2c1d1 ("KVM: x86: report negative values from wrmsr emulation to userspace")
    Reported-by: Qian Cai <cai at redhat.com>
    Signed-off-by: Maxim Levitsky <mlevitsk at redhat.com>
    Message-Id: <20201101115523.115780-1-mlevitsk at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index f5ede41bf9e6..a4c59be8d566 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -255,11 +255,10 @@ static struct kmem_cache *x86_emulator_cache;
 
 /*
  * When called, it means the previous get/set msr reached an invalid msr.
- * Return 0 if we want to ignore/silent this failed msr access, or 1 if we want
- * to fail the caller.
+ * Return true if we want to ignore/silent this failed msr access.
  */
-static int kvm_msr_ignored_check(struct kvm_vcpu *vcpu, u32 msr,
-				 u64 data, bool write)
+static bool kvm_msr_ignored_check(struct kvm_vcpu *vcpu, u32 msr,
+				  u64 data, bool write)
 {
 	const char *op = write ? "wrmsr" : "rdmsr";
 
@@ -268,11 +267,11 @@ static int kvm_msr_ignored_check(struct kvm_vcpu *vcpu, u32 msr,
 			kvm_pr_unimpl("ignored %s: 0x%x data 0x%llx\n",
 				      op, msr, data);
 		/* Mask the error */
-		return 0;
+		return true;
 	} else {
 		kvm_debug_ratelimited("unhandled %s: 0x%x data 0x%llx\n",
 				      op, msr, data);
-		return -ENOENT;
+		return false;
 	}
 }
 
@@ -1416,7 +1415,8 @@ static int do_get_msr_feature(struct kvm_vcpu *vcpu, unsigned index, u64 *data)
 	if (r == KVM_MSR_RET_INVALID) {
 		/* Unconditionally clear the output for simplicity */
 		*data = 0;
-		r = kvm_msr_ignored_check(vcpu, index, 0, false);
+		if (kvm_msr_ignored_check(vcpu, index, 0, false))
+			r = 0;
 	}
 
 	if (r)
@@ -1540,7 +1540,7 @@ static int __kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data,
 	struct msr_data msr;
 
 	if (!host_initiated && !kvm_msr_allowed(vcpu, index, KVM_MSR_FILTER_WRITE))
-		return -EPERM;
+		return KVM_MSR_RET_FILTERED;
 
 	switch (index) {
 	case MSR_FS_BASE:
@@ -1581,7 +1581,8 @@ static int kvm_set_msr_ignored_check(struct kvm_vcpu *vcpu,
 	int ret = __kvm_set_msr(vcpu, index, data, host_initiated);
 
 	if (ret == KVM_MSR_RET_INVALID)
-		ret = kvm_msr_ignored_check(vcpu, index, data, true);
+		if (kvm_msr_ignored_check(vcpu, index, data, true))
+			ret = 0;
 
 	return ret;
 }
@@ -1599,7 +1600,7 @@ int __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data,
 	int ret;
 
 	if (!host_initiated && !kvm_msr_allowed(vcpu, index, KVM_MSR_FILTER_READ))
-		return -EPERM;
+		return KVM_MSR_RET_FILTERED;
 
 	msr.index = index;
 	msr.host_initiated = host_initiated;
@@ -1618,7 +1619,8 @@ static int kvm_get_msr_ignored_check(struct kvm_vcpu *vcpu,
 	if (ret == KVM_MSR_RET_INVALID) {
 		/* Unconditionally clear *data for simplicity */
 		*data = 0;
-		ret = kvm_msr_ignored_check(vcpu, index, 0, false);
+		if (kvm_msr_ignored_check(vcpu, index, 0, false))
+			ret = 0;
 	}
 
 	return ret;
@@ -1662,9 +1664,9 @@ static int complete_emulated_wrmsr(struct kvm_vcpu *vcpu)
 static u64 kvm_msr_reason(int r)
 {
 	switch (r) {
-	case -ENOENT:
+	case KVM_MSR_RET_INVALID:
 		return KVM_MSR_EXIT_REASON_UNKNOWN;
-	case -EPERM:
+	case KVM_MSR_RET_FILTERED:
 		return KVM_MSR_EXIT_REASON_FILTER;
 	default:
 		return KVM_MSR_EXIT_REASON_INVAL;
diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
index 3900ab0c6004..e7ca622a468f 100644
--- a/arch/x86/kvm/x86.h
+++ b/arch/x86/kvm/x86.h
@@ -376,7 +376,13 @@ int kvm_handle_memory_failure(struct kvm_vcpu *vcpu, int r,
 int kvm_handle_invpcid(struct kvm_vcpu *vcpu, unsigned long type, gva_t gva);
 bool kvm_msr_allowed(struct kvm_vcpu *vcpu, u32 index, u32 type);
 
-#define  KVM_MSR_RET_INVALID  2
+/*
+ * Internal error codes that are used to indicate that MSR emulation encountered
+ * an error that should result in #GP in the guest, unless userspace
+ * handles it.
+ */
+#define  KVM_MSR_RET_INVALID	2	/* in-kernel MSR emulation #GP condition */
+#define  KVM_MSR_RET_FILTERED	3	/* #GP due to userspace MSR filter */
 
 #define __cr4_reserved_bits(__cpu_has, __c)             \
 ({                                                      \
commit 177158e5b1a558a28b9ce6b27a14bea588a6f2fb
Author: Peter Xu <peterx at redhat.com>
Date:   Fri Oct 23 14:33:46 2020 -0400

    KVM: Documentation: Update entry for KVM_CAP_ENFORCE_PV_CPUID
    
    Should be squashed into 66570e966dd9cb4f.
    
    Signed-off-by: Peter Xu <peterx at redhat.com>
    Message-Id: <20201023183358.50607-3-peterx at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
index e53e3bd99b2c..e00a66d72372 100644
--- a/Documentation/virt/kvm/api.rst
+++ b/Documentation/virt/kvm/api.rst
@@ -6381,8 +6381,7 @@ In combination with KVM_CAP_X86_USER_SPACE_MSR, this allows user space to
 trap and emulate MSRs that are outside of the scope of KVM as well as
 limit the attack surface on KVM's MSR emulation code.
 
-
-8.26 KVM_CAP_ENFORCE_PV_CPUID
+8.28 KVM_CAP_ENFORCE_PV_CPUID
 -----------------------------
 
 Architectures: x86
commit 3d20267abc789e6753fce60019bb5945fe8a74f3
Author: Peter Xu <peterx at redhat.com>
Date:   Wed Sep 30 21:20:31 2020 -0400

    KVM: Documentation: Update entry for KVM_X86_SET_MSR_FILTER
    
    It should be an accident when rebase, since we've already have section
    8.25 (which is KVM_CAP_S390_DIAG318).  Fix the number.
    
    Signed-off-by: Peter Xu <peterx at redhat.com>
    Message-Id: <20201001012044.5151-2-peterx at redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
index 36d5f1f3c6dd..e53e3bd99b2c 100644
--- a/Documentation/virt/kvm/api.rst
+++ b/Documentation/virt/kvm/api.rst
@@ -6367,7 +6367,7 @@ accesses that would usually trigger a #GP by KVM into the guest will
 instead get bounced to user space through the KVM_EXIT_X86_RDMSR and
 KVM_EXIT_X86_WRMSR exit notifications.
 
-8.25 KVM_X86_SET_MSR_FILTER
+8.27 KVM_X86_SET_MSR_FILTER
 ---------------------------
 
 :Architectures: x86
commit c6c4f961cb879aed67b1343bdef2087c899fdaa9
Author: Li RongQing <lirongqing at baidu.com>
Date:   Sun Sep 27 16:44:57 2020 +0800

    KVM: x86/mmu: fix counting of rmap entries in pte_list_add
    
    Fix an off-by-one style bug in pte_list_add() where it failed to
    account the last full set of SPTEs, i.e. when desc->sptes is full
    and desc->more is NULL.
    
    Merge the two "PTE_LIST_EXT-1" checks as part of the fix to avoid
    an extra comparison.
    
    Signed-off-by: Li RongQing <lirongqing at baidu.com>
    Reviewed-by: Sean Christopherson <sean.j.christopherson at intel.com>
    Message-Id: <1601196297-24104-1-git-send-email-lirongqing at baidu.com>
    Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>

diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 1f96adff8dc4..5bb1939b65d8 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -856,12 +856,14 @@ static int pte_list_add(struct kvm_vcpu *vcpu, u64 *spte,
 	} else {
 		rmap_printk("pte_list_add: %p %llx many->many\n", spte, *spte);
 		desc = (struct pte_list_desc *)(rmap_head->val & ~1ul);
-		while (desc->sptes[PTE_LIST_EXT-1] && desc->more) {
-			desc = desc->more;
+		while (desc->sptes[PTE_LIST_EXT-1]) {
 			count += PTE_LIST_EXT;
-		}
-		if (desc->sptes[PTE_LIST_EXT-1]) {
-			desc->more = mmu_alloc_pte_list_desc(vcpu);
+
+			if (!desc->more) {
+				desc->more = mmu_alloc_pte_list_desc(vcpu);
+				desc = desc->more;
+				break;
+			}
 			desc = desc->more;
 		}
 		for (i = 0; desc->sptes[i]; ++i)
commit 01776f070ffcbf336be3bf1672bd3c589548d6c4
Author: Christophe Leroy <christophe.leroy at csgroup.eu>
Date:   Sat Nov 7 09:07:40 2020 +0000

    powerpc/32s: Use relocation offset when setting early hash table
    
    When calling early_hash_table(), the kernel hasn't been yet
    relocated to its linking address, so data must be addressed
    with relocation offset.
    
    Add relocation offset to write into Hash in early_hash_table().
    
    Fixes: 69a1593abdbc ("powerpc/32s: Setup the early hash table at all time.")
    Reported-by: Erhard Furtner <erhard_f at mailbox.org>
    Reported-by: Andreas Schwab <schwab at linux-m68k.org>
    Signed-off-by: Christophe Leroy <christophe.leroy at csgroup.eu>
    Tested-by: Serge Belyshev <belyshev at depni.sinp.msu.ru>
    Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
    Link: https://lore.kernel.org/r/9e225a856a8b22e0e77587ee22ab7a2f5bca8753.1604740029.git.christophe.leroy@csgroup.eu

diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S
index 2aa16d5368e1..a0dda2a1f2df 100644
--- a/arch/powerpc/kernel/head_book3s_32.S
+++ b/arch/powerpc/kernel/head_book3s_32.S
@@ -156,6 +156,7 @@ __after_mmu_off:
 	bl	initial_bats
 	bl	load_segment_registers
 BEGIN_MMU_FTR_SECTION
+	bl	reloc_offset
 	bl	early_hash_table
 END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
 #if defined(CONFIG_BOOTX_TEXT)
@@ -920,7 +921,7 @@ early_hash_table:
 	ori	r6, r6, 3	/* 256kB table */
 	mtspr	SPRN_SDR1, r6
 	lis	r6, early_hash at h
-	lis	r3, Hash at ha
+	addis	r3, r3, Hash at ha
 	stw	r6, Hash at l(r3)
 	blr
 
commit ff2bb93f53782bbf7500d521368435921912ad04
Merge: 9478dec3b5e7 c512298eed03
Author: Paolo Bonzini <pbonzini at redhat.com>
Date:   Sun Nov 8 04:15:53 2020 -0500

    Merge tag 'kvmarm-fixes-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD
    
    KVM/arm64 fixes for v5.10, take #2
    
    - Fix compilation error when PMD and PUD are folded
    - Fix regresssion of the RAZ behaviour of ID_AA64ZFR0_EL1

commit 7327c8b98e2e14c47021eea14d1ab268086a6408
Author: Markus Reichl <m.reichl at fivetechno.de>
Date:   Wed Nov 4 20:29:31 2020 +0100

    arm64: dts: rockchip: Reorder LED triggers from mmc devices on rk3399-roc-pc.
    
    After patch [1] SD-card becomes mmc1 and eMMC becomes mmc2.
    Correct trigger of LEDs accordingly.
    
    [1]
    https://patchwork.kernel.org/patch/11881427
    
    Signed-off-by: Markus Reichl <m.reichl at fivetechno.de>
    Link: https://lore.kernel.org/r/20201104192933.1001-1-m.reichl@fivetechno.de
    Signed-off-by: Heiko Stuebner <heiko at sntech.de>

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi
index e7a459fa4322..20309076dbac 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi
@@ -74,14 +74,14 @@
 			label = "red:diy";
 			gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
 			default-state = "off";
-			linux,default-trigger = "mmc1";
+			linux,default-trigger = "mmc2";
 		};
 
 		yellow_led: led-2 {
 			label = "yellow:yellow-led";
 			gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
 			default-state = "off";
-			linux,default-trigger = "mmc0";
+			linux,default-trigger = "mmc1";
 		};
 	};
 
commit 0011c6d182774fc781fb9e115ebe8baa356029ae
Author: Markus Reichl <m.reichl at fivetechno.de>
Date:   Wed Nov 4 17:23:55 2020 +0100

    arm64: dts: rockchip: Assign a fixed index to mmc devices on rk3399 boards.
    
    Recently introduced async probe on mmc devices can shuffle block IDs.
    Pin them to fixed values to ease booting in environments where UUIDs
    are not practical. Use newly introduced aliases for mmcblk devices from [1].
    
    [1]
    https://patchwork.kernel.org/patch/11747669/
    
    Signed-off-by: Markus Reichl <m.reichl at fivetechno.de>
    Reviewed-by: Douglas Anderson <dianders at chromium.org>
    Link: https://lore.kernel.org/r/20201104162356.1251-1-m.reichl@fivetechno.de
    Signed-off-by: Heiko Stuebner <heiko at sntech.de>

diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
index ada724b12f01..7a9a7aca86c6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -29,6 +29,9 @@
 		i2c6 = &i2c6;
 		i2c7 = &i2c7;
 		i2c8 = &i2c8;
+		mmc0 = &sdio0;
+		mmc1 = &sdmmc;
+		mmc2 = &sdhci;
 		serial0 = &uart0;
 		serial1 = &uart1;
 		serial2 = &uart2;
commit 4e0396c59559264442963b349ab71f66e471f84d
Author: Vadym Kochan <vadym.kochan at plvision.eu>
Date:   Fri Nov 6 18:11:25 2020 +0200

    net: marvell: prestera: fix compilation with CONFIG_BRIDGE=m
    
    With CONFIG_BRIDGE=m the compilation fails:
    
        ld: drivers/net/ethernet/marvell/prestera/prestera_switchdev.o: in function `prestera_bridge_port_event':
        prestera_switchdev.c:(.text+0x2ebd): undefined reference to `br_vlan_enabled'
    
    in case the driver is statically enabled.
    
    Fix it by adding 'BRIDGE || BRIDGE=n' dependency.
    
    Fixes: e1189d9a5fbe ("net: marvell: prestera: Add Switchdev driver implementation")
    Reported-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Vadym Kochan <vadym.kochan at plvision.eu>
    Acked-by: Randy Dunlap <rdunlap at infradead.org> # build-tested
    Link: https://lore.kernel.org/r/20201106161128.24069-1-vadym.kochan@plvision.eu
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/marvell/prestera/Kconfig b/drivers/net/ethernet/marvell/prestera/Kconfig
index b1fcc44f566a..b6f20e2034c6 100644
--- a/drivers/net/ethernet/marvell/prestera/Kconfig
+++ b/drivers/net/ethernet/marvell/prestera/Kconfig
@@ -6,6 +6,7 @@
 config PRESTERA
 	tristate "Marvell Prestera Switch ASICs support"
 	depends on NET_SWITCHDEV && VLAN_8021Q
+	depends on BRIDGE || BRIDGE=n
 	select NET_DEVLINK
 	help
 	  This driver supports Marvell Prestera Switch ASICs family.
commit ee661a4abdf457cc3712725fb4f15113df7588e3
Merge: 847f0a2bfd2f 1a50cf9a67ff
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Sat Nov 7 12:27:26 2020 -0800

    Merge tag 'mlx5-fixes-2020-11-03' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
    
    Saeed Mahameed says:
    
    ====================
    mlx5 fixes 2020-11-03
    
    v1->v2:
     - Fix fixes line tag in patch #1
     - Toss ktls refcount leak fix, Maxim will look further into the root
       cause.
     - Toss eswitch chain 0 prio patch, until we determine if it is needed
       for -rc and net.
    
    * tag 'mlx5-fixes-2020-11-03' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux:
      net/mlx5e: Fix incorrect access of RCU-protected xdp_prog
      net/mlx5e: Fix VXLAN synchronization after function reload
      net/mlx5: E-switch, Avoid extack error log for disabled vport
      net/mlx5: Fix deletion of duplicate rules
      net/mlx5e: Use spin_lock_bh for async_icosq_lock
      net/mlx5e: Protect encap route dev from concurrent release
      net/mlx5e: Fix modify header actions memory leak
    ====================
    
    Link: https://lore.kernel.org/r/20201105202129.23644-1-saeedm@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 847f0a2bfd2fe16d6afa537816b313b71f32e139
Author: Heiner Kallweit <hkallweit1 at gmail.com>
Date:   Thu Nov 5 18:14:47 2020 +0100

    r8169: disable hw csum for short packets on all chip versions
    
    RTL8125B has same or similar short packet hw padding bug as RTL8168evl.
    The main workaround has been extended accordingly, however we have to
    disable also hw checksumming for short packets on affected new chip
    versions. Instead of checking for an affected chip version let's
    simply disable hw checksumming for short packets in general.
    
    v2:
    - remove the version checks and disable short packet hw csum in general
    - reflect this in commit title and message
    
    Fixes: 0439297be951 ("r8169: add support for RTL8125B")
    Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
    Link: https://lore.kernel.org/r/7fbb35f0-e244-ef65-aa55-3872d7d38698@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 4cb43a980ce9..85d9c3e30c69 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4343,18 +4343,9 @@ static netdev_features_t rtl8169_features_check(struct sk_buff *skb,
 		    rtl_chip_supports_csum_v2(tp))
 			features &= ~NETIF_F_ALL_TSO;
 	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
-		if (skb->len < ETH_ZLEN) {
-			switch (tp->mac_version) {
-			case RTL_GIGA_MAC_VER_11:
-			case RTL_GIGA_MAC_VER_12:
-			case RTL_GIGA_MAC_VER_17:
-			case RTL_GIGA_MAC_VER_34:
-				features &= ~NETIF_F_CSUM_MASK;
-				break;
-			default:
-				break;
-			}
-		}
+		/* work around hw bug on some chip versions */
+		if (skb->len < ETH_ZLEN)
+			features &= ~NETIF_F_CSUM_MASK;
 
 		if (transport_offset > TCPHO_MAX &&
 		    rtl_chip_supports_csum_v2(tp))
commit cc6528bc9a0c901c83b8220a2e2617f3354d6dd9
Author: Heiner Kallweit <hkallweit1 at gmail.com>
Date:   Thu Nov 5 15:28:42 2020 +0100

    r8169: fix potential skb double free in an error path
    
    The caller of rtl8169_tso_csum_v2() frees the skb if false is returned.
    eth_skb_pad() internally frees the skb on error what would result in a
    double free. Therefore use __skb_put_padto() directly and instruct it
    to not free the skb on error.
    
    Fixes: b423e9ae49d7 ("r8169: fix offloaded tx checksum for small packets.")
    Reported-by: Jakub Kicinski <kuba at kernel.org>
    Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
    Link: https://lore.kernel.org/r/f7e68191-acff-9ded-4263-c016428a8762@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 7766d73823eb..4cb43a980ce9 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4163,7 +4163,8 @@ static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
 		opts[1] |= transport_offset << TCPHO_SHIFT;
 	} else {
 		if (unlikely(skb->len < ETH_ZLEN && rtl_test_hw_pad_bug(tp)))
-			return !eth_skb_pad(skb);
+			/* eth_skb_pad would free the skb on error */
+			return !__skb_put_padto(skb, ETH_ZLEN, false);
 	}
 
 	return true;
commit 446b8185f0c39ac3faadbcd8ac156c50f2fd4ffe
Author: Kailang Yang <kailang at realtek.com>
Date:   Mon Nov 2 15:00:12 2020 +0800

    ALSA: hda/realtek - Add supported for Lenovo ThinkPad Headset Button
    
    Add supported for Lenovo ThinkPad Headset Button.
    Thinkpad P1 Gen 3 (0x22c1)
    Thinkpad X1 Extreme Gen 3 (0x22c2)
    
    Signed-off-by: Kailang Yang <kailang at realtek.com>
    Cc: <stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/f39b11d00340408ca2ed2df9b4fc2a09@realtek.com
    Signed-off-by: Takashi Iwai <tiwai at suse.de>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 6899089d132e..c3a02738ead2 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6301,6 +6301,7 @@ enum {
 	ALC274_FIXUP_HP_MIC,
 	ALC274_FIXUP_HP_HEADSET_MIC,
 	ALC256_FIXUP_ASUS_HPE,
+	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -7705,6 +7706,12 @@ static const struct hda_fixup alc269_fixups[] = {
 		.chained = true,
 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
 	},
+	[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc_fixup_headset_jack,
+		.chained = true,
+		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7966,6 +7973,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
 	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
 	SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
+	SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
+	SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
 	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
 	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
 	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
commit 05d5233df85e9621597c5838e95235107eb624a2
Author: Theodore Ts'o <tytso at mit.edu>
Date:   Sat Nov 7 00:00:49 2020 -0500

    jbd2: fix up sparse warnings in checkpoint code
    
    Add missing __acquires() and __releases() annotations.  Also, in an
    "this should never happen" WARN_ON check, if it *does* actually
    happen, we need to release j_state_lock since this function is always
    supposed to release that lock.  Otherwise, things will quickly grind
    to a halt after the WARN_ON trips.
    
    Fixes: 96f1e0974575 ("jbd2: avoid long hold times of j_state_lock...")
    Cc: stable at kernel.org
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c
index 263f02ad8ebf..472932b9e6bc 100644
--- a/fs/jbd2/checkpoint.c
+++ b/fs/jbd2/checkpoint.c
@@ -106,6 +106,8 @@ static int __try_to_free_cp_buf(struct journal_head *jh)
  * for a checkpoint to free up some space in the log.
  */
 void __jbd2_log_wait_for_space(journal_t *journal)
+__acquires(&journal->j_state_lock)
+__releases(&journal->j_state_lock)
 {
 	int nblocks, space_left;
 	/* assert_spin_locked(&journal->j_state_lock); */
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index 43985738aa86..d54f04674e8e 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -195,8 +195,10 @@ static void wait_transaction_switching(journal_t *journal)
 	DEFINE_WAIT(wait);
 
 	if (WARN_ON(!journal->j_running_transaction ||
-		    journal->j_running_transaction->t_state != T_SWITCH))
+		    journal->j_running_transaction->t_state != T_SWITCH)) {
+		read_unlock(&journal->j_state_lock);
 		return;
+	}
 	prepare_to_wait(&journal->j_wait_transaction_locked, &wait,
 			TASK_UNINTERRUPTIBLE);
 	read_unlock(&journal->j_state_lock);
commit fa329e27317f7f0762001b9fb1e76c387a9db25d
Author: Theodore Ts'o <tytso at mit.edu>
Date:   Fri Nov 6 23:59:42 2020 -0500

    ext4: fix sparse warnings in fast_commit code
    
    Add missing __acquire() and __releases() annotations, and make
    fc_ineligible_reasons[] static, as it is not used outside of
    fs/ext4/fast_commit.c.
    
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 5cd6630ab1b9..f2033e13a273 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -156,6 +156,7 @@ void ext4_fc_init_inode(struct inode *inode)
 
 /* This function must be called with sbi->s_fc_lock held. */
 static void ext4_fc_wait_committing_inode(struct inode *inode)
+__releases(&EXT4_SB(inode->i_sb)->s_fc_lock)
 {
 	wait_queue_head_t *wq;
 	struct ext4_inode_info *ei = EXT4_I(inode);
@@ -911,6 +912,8 @@ static int ext4_fc_wait_inode_data_all(journal_t *journal)
 
 /* Commit all the directory entry updates */
 static int ext4_fc_commit_dentry_updates(journal_t *journal, u32 *crc)
+__acquires(&sbi->s_fc_lock)
+__releases(&sbi->s_fc_lock)
 {
 	struct super_block *sb = (struct super_block *)(journal->j_private);
 	struct ext4_sb_info *sbi = EXT4_SB(sb);
@@ -2106,7 +2109,7 @@ void ext4_fc_init(struct super_block *sb, journal_t *journal)
 	journal->j_fc_cleanup_callback = ext4_fc_cleanup;
 }
 
-const char *fc_ineligible_reasons[] = {
+static const char *fc_ineligible_reasons[] = {
 	"Extended attributes changed",
 	"Cross rename",
 	"Journal flag changed",
commit 99c880decf27858b5b0a57d8d811bb50226c3c12
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:11 2020 -0800

    ext4: cleanup fast commit mount options
    
    Drop no_fc mount option that disable fast commit even if it was
    enabled at mkfs time. Move fc_debug_force mount option under ifdef
    EXT4_DEBUG to annotate that this is strictly for debugging and testing
    purposes and should not be used in production.
    
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-23-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 7bd02c252f7f..c3b864588a0b 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1716,11 +1716,10 @@ enum {
 	Opt_dioread_nolock, Opt_dioread_lock,
 	Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable,
 	Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache,
-	Opt_prefetch_block_bitmaps, Opt_no_fc,
+	Opt_prefetch_block_bitmaps,
 #ifdef CONFIG_EXT4_DEBUG
-	Opt_fc_debug_max_replay,
+	Opt_fc_debug_max_replay, Opt_fc_debug_force
 #endif
-	Opt_fc_debug_force
 };
 
 static const match_table_t tokens = {
@@ -1807,9 +1806,8 @@ static const match_table_t tokens = {
 	{Opt_init_itable, "init_itable=%u"},
 	{Opt_init_itable, "init_itable"},
 	{Opt_noinit_itable, "noinit_itable"},
-	{Opt_no_fc, "no_fc"},
-	{Opt_fc_debug_force, "fc_debug_force"},
 #ifdef CONFIG_EXT4_DEBUG
+	{Opt_fc_debug_force, "fc_debug_force"},
 	{Opt_fc_debug_max_replay, "fc_debug_max_replay=%u"},
 #endif
 	{Opt_max_dir_size_kb, "max_dir_size_kb=%u"},
@@ -2039,11 +2037,9 @@ static const struct mount_opts {
 	{Opt_nombcache, EXT4_MOUNT_NO_MBCACHE, MOPT_SET},
 	{Opt_prefetch_block_bitmaps, EXT4_MOUNT_PREFETCH_BLOCK_BITMAPS,
 	 MOPT_SET},
-	{Opt_no_fc, EXT4_MOUNT2_JOURNAL_FAST_COMMIT,
-	 MOPT_CLEAR | MOPT_2 | MOPT_EXT4_ONLY},
+#ifdef CONFIG_EXT4_DEBUG
 	{Opt_fc_debug_force, EXT4_MOUNT2_JOURNAL_FAST_COMMIT,
 	 MOPT_SET | MOPT_2 | MOPT_EXT4_ONLY},
-#ifdef CONFIG_EXT4_DEBUG
 	{Opt_fc_debug_max_replay, 0, MOPT_GTE0},
 #endif
 	{Opt_err, 0, 0}
commit 87a144f09380152d28352ecbcc4c65874e7eb892
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:10 2020 -0800

    jbd2: don't start fast commit on aborted journal
    
    Fast commit should not be started if the journal is aborted.
    
    Signed-off-by: Harshad Shirwadkar<harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-22-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index f7ebf6ef69af..0c3d5e3b24b2 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -727,6 +727,8 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid)
  */
 int jbd2_fc_begin_commit(journal_t *journal, tid_t tid)
 {
+	if (unlikely(is_journal_aborted(journal)))
+		return -EIO;
 	/*
 	 * Fast commits only allowed if at least one full commit has
 	 * been processed.
commit 9b5f6c9b83d912c63ef9fb486a052be79b06f8b0
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:09 2020 -0800

    ext4: make s_mount_flags modifications atomic
    
    Fast commit file system states are recorded in
    sbi->s_mount_flags. Fast commit expects these bit manipulations to be
    atomic. This patch adds helpers to make those modifications atomic.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-21-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 2a89c5bbb61b..1b399cafb15a 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1419,16 +1419,6 @@ struct ext4_super_block {
 
 #ifdef __KERNEL__
 
-/*
- * run-time mount flags
- */
-#define EXT4_MF_MNTDIR_SAMPLED		0x0001
-#define EXT4_MF_FS_ABORTED		0x0002	/* Fatal error detected */
-#define EXT4_MF_FC_INELIGIBLE		0x0004	/* Fast commit ineligible */
-#define EXT4_MF_FC_COMMITTING		0x0008	/* File system underoing a fast
-						 * commit.
-						 */
-
 #ifdef CONFIG_FS_ENCRYPTION
 #define DUMMY_ENCRYPTION_ENABLED(sbi) ((sbi)->s_dummy_enc_policy.policy != NULL)
 #else
@@ -1463,7 +1453,7 @@ struct ext4_sb_info {
 	struct buffer_head * __rcu *s_group_desc;
 	unsigned int s_mount_opt;
 	unsigned int s_mount_opt2;
-	unsigned int s_mount_flags;
+	unsigned long s_mount_flags;
 	unsigned int s_def_mount_opt;
 	ext4_fsblk_t s_sb_block;
 	atomic64_t s_resv_clusters;
@@ -1691,6 +1681,34 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
 	_v;								   \
 })
 
+/*
+ * run-time mount flags
+ */
+enum {
+	EXT4_MF_MNTDIR_SAMPLED,
+	EXT4_MF_FS_ABORTED,	/* Fatal error detected */
+	EXT4_MF_FC_INELIGIBLE,	/* Fast commit ineligible */
+	EXT4_MF_FC_COMMITTING	/* File system underoing a fast
+				 * commit.
+				 */
+};
+
+static inline void ext4_set_mount_flag(struct super_block *sb, int bit)
+{
+	set_bit(bit, &EXT4_SB(sb)->s_mount_flags);
+}
+
+static inline void ext4_clear_mount_flag(struct super_block *sb, int bit)
+{
+	clear_bit(bit, &EXT4_SB(sb)->s_mount_flags);
+}
+
+static inline int ext4_test_mount_flag(struct super_block *sb, int bit)
+{
+	return test_bit(bit, &EXT4_SB(sb)->s_mount_flags);
+}
+
+
 /*
  * Simulate_fail codes
  */
diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index ebe5f423f8f2..5cd6630ab1b9 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -261,7 +261,7 @@ void ext4_fc_mark_ineligible(struct super_block *sb, int reason)
 	    (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY))
 		return;
 
-	sbi->s_mount_flags |= EXT4_MF_FC_INELIGIBLE;
+	ext4_set_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
 	WARN_ON(reason >= EXT4_FC_REASON_MAX);
 	sbi->s_fc_stats.fc_ineligible_reason_count[reason]++;
 }
@@ -294,14 +294,14 @@ void ext4_fc_stop_ineligible(struct super_block *sb)
 	    (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY))
 		return;
 
-	EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FC_INELIGIBLE;
+	ext4_set_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
 	atomic_dec(&EXT4_SB(sb)->s_fc_ineligible_updates);
 }
 
 static inline int ext4_fc_is_ineligible(struct super_block *sb)
 {
-	return (EXT4_SB(sb)->s_mount_flags & EXT4_MF_FC_INELIGIBLE) ||
-		atomic_read(&EXT4_SB(sb)->s_fc_ineligible_updates);
+	return (ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE) ||
+		atomic_read(&EXT4_SB(sb)->s_fc_ineligible_updates));
 }
 
 /*
@@ -349,7 +349,7 @@ static int ext4_fc_track_template(
 	spin_lock(&sbi->s_fc_lock);
 	if (list_empty(&EXT4_I(inode)->i_fc_list))
 		list_add_tail(&EXT4_I(inode)->i_fc_list,
-				(sbi->s_mount_flags & EXT4_MF_FC_COMMITTING) ?
+				(ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_COMMITTING)) ?
 				&sbi->s_fc_q[FC_Q_STAGING] :
 				&sbi->s_fc_q[FC_Q_MAIN]);
 	spin_unlock(&sbi->s_fc_lock);
@@ -402,7 +402,7 @@ static int __track_dentry_update(struct inode *inode, void *arg, bool update)
 	node->fcd_name.len = dentry->d_name.len;
 
 	spin_lock(&sbi->s_fc_lock);
-	if (sbi->s_mount_flags & EXT4_MF_FC_COMMITTING)
+	if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_COMMITTING))
 		list_add_tail(&node->fcd_list,
 				&sbi->s_fc_dentry_q[FC_Q_STAGING]);
 	else
@@ -857,7 +857,7 @@ static int ext4_fc_submit_inode_data_all(journal_t *journal)
 	int ret = 0;
 
 	spin_lock(&sbi->s_fc_lock);
-	sbi->s_mount_flags |= EXT4_MF_FC_COMMITTING;
+	ext4_set_mount_flag(sb, EXT4_MF_FC_COMMITTING);
 	list_for_each(pos, &sbi->s_fc_q[FC_Q_MAIN]) {
 		ei = list_entry(pos, struct ext4_inode_info, i_fc_list);
 		ext4_set_inode_state(&ei->vfs_inode, EXT4_STATE_FC_COMMITTING);
@@ -1206,8 +1206,8 @@ static void ext4_fc_cleanup(journal_t *journal, int full)
 	list_splice_init(&sbi->s_fc_q[FC_Q_STAGING],
 				&sbi->s_fc_q[FC_Q_STAGING]);
 
-	sbi->s_mount_flags &= ~EXT4_MF_FC_COMMITTING;
-	sbi->s_mount_flags &= ~EXT4_MF_FC_INELIGIBLE;
+	ext4_clear_mount_flag(sb, EXT4_MF_FC_COMMITTING);
+	ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
 
 	if (full)
 		sbi->s_fc_bytes = 0;
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 80ad5ccc0288..3ed8c048fb12 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -780,13 +780,13 @@ static int ext4_sample_last_mounted(struct super_block *sb,
 	handle_t *handle;
 	int err;
 
-	if (likely(sbi->s_mount_flags & EXT4_MF_MNTDIR_SAMPLED))
+	if (likely(ext4_test_mount_flag(sb, EXT4_MF_MNTDIR_SAMPLED)))
 		return 0;
 
 	if (sb_rdonly(sb) || !sb_start_intwrite_trylock(sb))
 		return 0;
 
-	sbi->s_mount_flags |= EXT4_MF_MNTDIR_SAMPLED;
+	ext4_set_mount_flag(sb, EXT4_MF_MNTDIR_SAMPLED);
 	/*
 	 * Sample where the filesystem has been mounted and
 	 * store it in the superblock for sysadmin convenience
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c
index 81a545fd14a3..a42ca95840f2 100644
--- a/fs/ext4/fsync.c
+++ b/fs/ext4/fsync.c
@@ -143,7 +143,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 	if (sb_rdonly(inode->i_sb)) {
 		/* Make sure that we read updated s_mount_flags value */
 		smp_rmb();
-		if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED)
+		if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))
 			ret = -EROFS;
 		goto out;
 	}
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 000bf70e88ed..0d8385aea898 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -2442,7 +2442,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,
 			struct super_block *sb = inode->i_sb;
 
 			if (ext4_forced_shutdown(EXT4_SB(sb)) ||
-			    EXT4_SB(sb)->s_mount_flags & EXT4_MF_FS_ABORTED)
+			    ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
 				goto invalidate_dirty_pages;
 			/*
 			 * Let the uper layers retry transient errors.
@@ -2676,7 +2676,7 @@ static int ext4_writepages(struct address_space *mapping,
 	 * the stack trace.
 	 */
 	if (unlikely(ext4_forced_shutdown(EXT4_SB(mapping->host->i_sb)) ||
-		     sbi->s_mount_flags & EXT4_MF_FS_ABORTED)) {
+		     ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))) {
 		ret = -EROFS;
 		goto out_writepages;
 	}
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index f067e83f149e..24af9ed5c3e5 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -4477,7 +4477,7 @@ static inline void ext4_mb_show_pa(struct super_block *sb)
 {
 	ext4_group_t i, ngroups;
 
-	if (EXT4_SB(sb)->s_mount_flags & EXT4_MF_FS_ABORTED)
+	if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
 		return;
 
 	ngroups = ext4_get_groups_count(sb);
@@ -4508,7 +4508,7 @@ static void ext4_mb_show_ac(struct ext4_allocation_context *ac)
 {
 	struct super_block *sb = ac->ac_sb;
 
-	if (EXT4_SB(sb)->s_mount_flags & EXT4_MF_FS_ABORTED)
+	if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
 		return;
 
 	mb_debug(sb, "Can't allocate:"
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 9e2e06ed2c45..7bd02c252f7f 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -686,7 +686,7 @@ static void ext4_handle_error(struct super_block *sb)
 	if (!test_opt(sb, ERRORS_CONT)) {
 		journal_t *journal = EXT4_SB(sb)->s_journal;
 
-		EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;
+		ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
 		if (journal)
 			jbd2_journal_abort(journal, -EIO);
 	}
@@ -904,7 +904,7 @@ void __ext4_abort(struct super_block *sb, const char *function,
 	va_end(args);
 
 	if (sb_rdonly(sb) == 0) {
-		EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;
+		ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
 		if (EXT4_SB(sb)->s_journal)
 			jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);
 
@@ -2153,7 +2153,7 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
 		ext4_msg(sb, KERN_WARNING, "Ignoring removed %s option", opt);
 		return 1;
 	case Opt_abort:
-		sbi->s_mount_flags |= EXT4_MF_FS_ABORTED;
+		ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
 		return 1;
 	case Opt_i_version:
 		sb->s_flags |= SB_I_VERSION;
@@ -4778,8 +4778,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 	INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_MAIN]);
 	INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_STAGING]);
 	sbi->s_fc_bytes = 0;
-	sbi->s_mount_flags &= ~EXT4_MF_FC_INELIGIBLE;
-	sbi->s_mount_flags &= ~EXT4_MF_FC_COMMITTING;
+	ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
+	ext4_clear_mount_flag(sb, EXT4_MF_FC_COMMITTING);
 	spin_lock_init(&sbi->s_fc_lock);
 	memset(&sbi->s_fc_stats, 0, sizeof(sbi->s_fc_stats));
 	sbi->s_fc_replay_state.fc_regions = NULL;
@@ -5881,7 +5881,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
 		goto restore_opts;
 	}
 
-	if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED)
+	if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
 		ext4_abort(sb, EXT4_ERR_ESHUTDOWN, "Abort forced by user");
 
 	sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
@@ -5895,7 +5895,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
 	}
 
 	if ((bool)(*flags & SB_RDONLY) != sb_rdonly(sb)) {
-		if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) {
+		if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED)) {
 			err = -EROFS;
 			goto restore_opts;
 		}
commit da0c5d2695265962f20099737348fcb3ff524d0f
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:08 2020 -0800

    ext4: issue fsdev cache flush before starting fast commit
    
    If the journal dev is different from fsdev, issue a cache flush before
    committing fast commit blocks to disk.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Reviewed-by: Jan Kara <jack at suse.cz>
    Link: https://lore.kernel.org/r/20201106035911.1942128-20-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index fb9b4e9d82b2..ebe5f423f8f2 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -1007,6 +1007,13 @@ static int ext4_fc_perform_commit(journal_t *journal)
 	if (ret)
 		return ret;
 
+	/*
+	 * If file system device is different from journal device, issue a cache
+	 * flush before we start writing fast commit blocks.
+	 */
+	if (journal->j_fs_dev != journal->j_dev)
+		blkdev_issue_flush(journal->j_fs_dev, GFP_NOFS);
+
 	blk_start_plug(&plug);
 	if (sbi->s_fc_bytes == 0) {
 		/*
commit 556e0319fbb8eee3fa19fdcc27c8bcb4af1c7211
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:07 2020 -0800

    ext4: disable fast commit with data journalling
    
    Fast commits don't work with data journalling. This patch disables the
    fast commit support when data journalling is turned on.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Reviewed-by: Jan Kara <jack at suse.cz>
    Link: https://lore.kernel.org/r/20201106035911.1942128-19-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 6b963e09af2c..fb9b4e9d82b2 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -483,6 +483,12 @@ void ext4_fc_track_inode(handle_t *handle, struct inode *inode)
 	if (S_ISDIR(inode->i_mode))
 		return;
 
+	if (ext4_should_journal_data(inode)) {
+		ext4_fc_mark_ineligible(inode->i_sb,
+					EXT4_FC_REASON_INODE_JOURNAL_DATA);
+		return;
+	}
+
 	ret = ext4_fc_track_template(handle, inode, __track_inode, NULL, 1);
 	trace_ext4_fc_track_inode(inode, ret);
 }
@@ -2102,6 +2108,7 @@ const char *fc_ineligible_reasons[] = {
 	"Resize",
 	"Dir renamed",
 	"Falloc range op",
+	"Data journalling",
 	"FC Commit Failed"
 };
 
diff --git a/fs/ext4/fast_commit.h b/fs/ext4/fast_commit.h
index 1d96e0ac8138..3a6e5a1fa1b8 100644
--- a/fs/ext4/fast_commit.h
+++ b/fs/ext4/fast_commit.h
@@ -102,6 +102,7 @@ enum {
 	EXT4_FC_REASON_RESIZE,
 	EXT4_FC_REASON_RENAME_DIR,
 	EXT4_FC_REASON_FALLOC_RANGE,
+	EXT4_FC_REASON_INODE_JOURNAL_DATA,
 	EXT4_FC_COMMIT_FAILED,
 	EXT4_FC_REASON_MAX
 };
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index ba02d7c86fb3..9e2e06ed2c45 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4340,9 +4340,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 #endif
 
 	if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
-		printk_once(KERN_WARNING "EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, and O_DIRECT support!\n");
+		printk_once(KERN_WARNING "EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, O_DIRECT and fast_commit support!\n");
 		/* can't mount with both data=journal and dioread_nolock. */
 		clear_opt(sb, DIOREAD_NOLOCK);
+		clear_opt2(sb, JOURNAL_FAST_COMMIT);
 		if (test_opt2(sb, EXPLICIT_DELALLOC)) {
 			ext4_msg(sb, KERN_ERR, "can't mount with "
 				 "both data=journal and delalloc");
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
index 0f899d3b09d3..70ae5497b73a 100644
--- a/include/trace/events/ext4.h
+++ b/include/trace/events/ext4.h
@@ -104,7 +104,8 @@ TRACE_DEFINE_ENUM(ES_REFERENCED_B);
 		{ EXT4_FC_REASON_SWAP_BOOT,	"SWAP_BOOT"},		\
 		{ EXT4_FC_REASON_RESIZE,	"RESIZE"},		\
 		{ EXT4_FC_REASON_RENAME_DIR,	"RENAME_DIR"},		\
-		{ EXT4_FC_REASON_FALLOC_RANGE,	"FALLOC_RANGE"})
+		{ EXT4_FC_REASON_FALLOC_RANGE,	"FALLOC_RANGE"},	\
+		{ EXT4_FC_REASON_INODE_JOURNAL_DATA,	"INODE_JOURNAL_DATA"})
 
 TRACE_EVENT(ext4_other_inode_update_time,
 	TP_PROTO(struct inode *inode, ino_t orig_ino),
@@ -2917,7 +2918,7 @@ TRACE_EVENT(ext4_fc_stats,
 		    ),
 
 	    TP_printk("dev %d:%d fc ineligible reasons:\n"
-		      "%s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d; "
+		      "%s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d; "
 		      "num_commits:%ld, ineligible: %ld, numblks: %ld",
 		      MAJOR(__entry->dev), MINOR(__entry->dev),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_XATTR),
@@ -2928,6 +2929,7 @@ TRACE_EVENT(ext4_fc_stats,
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_RESIZE),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_RENAME_DIR),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_FALLOC_RANGE),
+		      FC_REASON_NAME_STAT(EXT4_FC_REASON_INODE_JOURNAL_DATA),
 		      __entry->sbi->s_fc_stats.fc_num_commits,
 		      __entry->sbi->s_fc_stats.fc_ineligible_commits,
 		      __entry->sbi->s_fc_stats.fc_numblks)
commit 1ceecb537f72734e4315638e7a1bb62e56c86fbf
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:06 2020 -0800

    ext4: fix inode dirty check in case of fast commits
    
    In case of fast commits, determine if the inode is dirty by checking
    if the inode is on fast commit list. This also helps us get rid of
    ext4_inode_info.i_fc_committed_subtid field.
    
    Reported-by: Andrea Righi <andrea.righi at canonical.com>
    Tested-by: Andrea Righi <andrea.righi at canonical.com>
    Reviewed-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-18-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index c6339bd75a93..2a89c5bbb61b 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1028,9 +1028,6 @@ struct ext4_inode_info {
 					 * protected by sbi->s_fc_lock.
 					 */
 
-	/* Fast commit subtid when this inode was committed */
-	unsigned int i_fc_committed_subtid;
-
 	/* Start of lblk range that needs to be committed in this fast commit */
 	ext4_lblk_t i_fc_lblk_start;
 
diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 05e6e76a7663..6b963e09af2c 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -152,7 +152,6 @@ void ext4_fc_init_inode(struct inode *inode)
 	INIT_LIST_HEAD(&ei->i_fc_list);
 	init_waitqueue_head(&ei->i_fc_wait);
 	atomic_set(&ei->i_fc_updates, 0);
-	ei->i_fc_committed_subtid = 0;
 }
 
 /* This function must be called with sbi->s_fc_lock held. */
@@ -1037,8 +1036,6 @@ static int ext4_fc_perform_commit(journal_t *journal)
 		if (ret)
 			goto out;
 		spin_lock(&sbi->s_fc_lock);
-		EXT4_I(inode)->i_fc_committed_subtid =
-			atomic_read(&sbi->s_fc_subtid);
 	}
 	spin_unlock(&sbi->s_fc_lock);
 
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 87120c4c44f3..000bf70e88ed 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3312,8 +3312,7 @@ static bool ext4_inode_datasync_dirty(struct inode *inode)
 			EXT4_I(inode)->i_datasync_tid))
 			return false;
 		if (test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT))
-			return atomic_read(&EXT4_SB(inode->i_sb)->s_fc_subtid) <
-				EXT4_I(inode)->i_fc_committed_subtid;
+			return !list_empty(&EXT4_I(inode)->i_fc_list);
 		return true;
 	}
 
commit a3114fe747be42351ac1368bd3ad30f695e473a7
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:05 2020 -0800

    ext4: remove unnecessary fast commit calls from ext4_file_mmap
    
    Remove unnecessary calls to ext4_fc_start_update() and
    ext4_fc_stop_update() from ext4_file_mmap().
    
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-17-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index d85412d12e3a..80ad5ccc0288 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -761,7 +761,6 @@ static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma)
 	if (!daxdev_mapping_supported(vma, dax_dev))
 		return -EOPNOTSUPP;
 
-	ext4_fc_start_update(inode);
 	file_accessed(file);
 	if (IS_DAX(file_inode(file))) {
 		vma->vm_ops = &ext4_dax_vm_ops;
@@ -769,7 +768,6 @@ static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma)
 	} else {
 		vma->vm_ops = &ext4_file_vm_ops;
 	}
-	ext4_fc_stop_update(inode);
 	return 0;
 }
 
commit 764b3fd31d131c4b8b5fa064aa94382091923aec
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:04 2020 -0800

    ext4: mark buf dirty before submitting fast commit buffer
    
    Mark the fast commit buffer as dirty before submission.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-16-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 639b2a308c7b..05e6e76a7663 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -546,7 +546,7 @@ static void ext4_fc_submit_bh(struct super_block *sb)
 	if (test_opt(sb, BARRIER))
 		write_flags |= REQ_FUA | REQ_PREFLUSH;
 	lock_buffer(bh);
-	clear_buffer_dirty(bh);
+	set_buffer_dirty(bh);
 	set_buffer_uptodate(bh);
 	bh->b_end_io = ext4_end_buffer_io_sync;
 	submit_bh(REQ_OP_WRITE, write_flags, bh);
commit a740762fb3b36dbdddb63ebe65b71cea3014f1c3
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:03 2020 -0800

    ext4: fix code documentatioon
    
    Add a TODO to remember fixing REQ_FUA | REQ_PREFLUSH for fast commit
    buffers. Also, fix a typo in top level comment in fast_commit.c
    
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-15-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index fc5a5e6a581d..639b2a308c7b 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -83,7 +83,7 @@
  *
  * Atomicity of commits
  * --------------------
- * In order to gaurantee atomicity during the commit operation, fast commit
+ * In order to guarantee atomicity during the commit operation, fast commit
  * uses "EXT4_FC_TAG_TAIL" tag that marks a fast commit as complete. Tail
  * tag contains CRC of the contents and TID of the transaction after which
  * this fast commit should be applied. Recovery code replays fast commit
@@ -542,6 +542,7 @@ static void ext4_fc_submit_bh(struct super_block *sb)
 	int write_flags = REQ_SYNC;
 	struct buffer_head *bh = EXT4_SB(sb)->s_fc_bh;
 
+	/* TODO: REQ_FUA | REQ_PREFLUSH is unnecessarily expensive. */
 	if (test_opt(sb, BARRIER))
 		write_flags |= REQ_FUA | REQ_PREFLUSH;
 	lock_buffer(bh);
commit f6634e2609d13d7aa8852734e16300845db915d5
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:02 2020 -0800

    ext4: dedpulicate the code to wait on inode that's being committed
    
    This patch removes the deduplicates the code that implements waiting
    on inode that's being committed. That code is moved into a new
    function.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-14-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index e69c580fa91e..fc5a5e6a581d 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -155,6 +155,30 @@ void ext4_fc_init_inode(struct inode *inode)
 	ei->i_fc_committed_subtid = 0;
 }
 
+/* This function must be called with sbi->s_fc_lock held. */
+static void ext4_fc_wait_committing_inode(struct inode *inode)
+{
+	wait_queue_head_t *wq;
+	struct ext4_inode_info *ei = EXT4_I(inode);
+
+#if (BITS_PER_LONG < 64)
+	DEFINE_WAIT_BIT(wait, &ei->i_state_flags,
+			EXT4_STATE_FC_COMMITTING);
+	wq = bit_waitqueue(&ei->i_state_flags,
+				EXT4_STATE_FC_COMMITTING);
+#else
+	DEFINE_WAIT_BIT(wait, &ei->i_flags,
+			EXT4_STATE_FC_COMMITTING);
+	wq = bit_waitqueue(&ei->i_flags,
+				EXT4_STATE_FC_COMMITTING);
+#endif
+	lockdep_assert_held(&EXT4_SB(inode->i_sb)->s_fc_lock);
+	prepare_to_wait(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
+	spin_unlock(&EXT4_SB(inode->i_sb)->s_fc_lock);
+	schedule();
+	finish_wait(wq, &wait.wq_entry);
+}
+
 /*
  * Inform Ext4's fast about start of an inode update
  *
@@ -176,22 +200,7 @@ restart:
 		goto out;
 
 	if (ext4_test_inode_state(inode, EXT4_STATE_FC_COMMITTING)) {
-		wait_queue_head_t *wq;
-#if (BITS_PER_LONG < 64)
-		DEFINE_WAIT_BIT(wait, &ei->i_state_flags,
-				EXT4_STATE_FC_COMMITTING);
-		wq = bit_waitqueue(&ei->i_state_flags,
-				   EXT4_STATE_FC_COMMITTING);
-#else
-		DEFINE_WAIT_BIT(wait, &ei->i_flags,
-				EXT4_STATE_FC_COMMITTING);
-		wq = bit_waitqueue(&ei->i_flags,
-				   EXT4_STATE_FC_COMMITTING);
-#endif
-		prepare_to_wait(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
-		spin_unlock(&EXT4_SB(inode->i_sb)->s_fc_lock);
-		schedule();
-		finish_wait(wq, &wait.wq_entry);
+		ext4_fc_wait_committing_inode(inode);
 		goto restart;
 	}
 out:
@@ -234,26 +243,10 @@ restart:
 	}
 
 	if (ext4_test_inode_state(inode, EXT4_STATE_FC_COMMITTING)) {
-		wait_queue_head_t *wq;
-#if (BITS_PER_LONG < 64)
-		DEFINE_WAIT_BIT(wait, &ei->i_state_flags,
-				EXT4_STATE_FC_COMMITTING);
-		wq = bit_waitqueue(&ei->i_state_flags,
-				   EXT4_STATE_FC_COMMITTING);
-#else
-		DEFINE_WAIT_BIT(wait, &ei->i_flags,
-				EXT4_STATE_FC_COMMITTING);
-		wq = bit_waitqueue(&ei->i_flags,
-				   EXT4_STATE_FC_COMMITTING);
-#endif
-		prepare_to_wait(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
-		spin_unlock(&EXT4_SB(inode->i_sb)->s_fc_lock);
-		schedule();
-		finish_wait(wq, &wait.wq_entry);
+		ext4_fc_wait_committing_inode(inode);
 		goto restart;
 	}
-	if (!list_empty(&ei->i_fc_list))
-		list_del_init(&ei->i_fc_list);
+	list_del_init(&ei->i_fc_list);
 	spin_unlock(&EXT4_SB(inode->i_sb)->s_fc_lock);
 }
 
commit 480f89d553260e7823920e687846877bebc8dca0
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:01 2020 -0800

    jbd2: don't read journal->j_commit_sequence without taking a lock
    
    Take journal state lock before reading journal->j_commit_sequence.
    
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-13-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index b5fbcd1b444c..f7ebf6ef69af 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -734,10 +734,12 @@ int jbd2_fc_begin_commit(journal_t *journal, tid_t tid)
 	if (!journal->j_stats.ts_tid)
 		return -EINVAL;
 
-	if (tid <= journal->j_commit_sequence)
+	write_lock(&journal->j_state_lock);
+	if (tid <= journal->j_commit_sequence) {
+		write_unlock(&journal->j_state_lock);
 		return -EALREADY;
+	}
 
-	write_lock(&journal->j_state_lock);
 	if (journal->j_flags & JBD2_FULL_COMMIT_ONGOING ||
 	    (journal->j_flags & JBD2_FAST_COMMIT_ONGOING)) {
 		DEFINE_WAIT(wait);
commit 0ee66ddcf3c1503a9bdb3e49a7a96c6e429ddfad
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:59:00 2020 -0800

    jbd2: don't touch buffer state until it is filled
    
    Fast commit buffers should be filled in before toucing their
    state. Remove code that sets buffer state as dirty before the buffer
    is passed to the file system.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-12-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 59166e299cde..b5fbcd1b444c 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -891,11 +891,7 @@ int jbd2_fc_get_buf(journal_t *journal, struct buffer_head **bh_out)
 	if (!bh)
 		return -ENOMEM;
 
-	lock_buffer(bh);
 
-	clear_buffer_uptodate(bh);
-	set_buffer_dirty(bh);
-	unlock_buffer(bh);
 	journal->j_fc_wbuf[fc_off] = bh;
 
 	*bh_out = bh;
commit cc80586a57f704f806b9a1b99a21cd07e37dbedc
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:59 2020 -0800

    jbd2: add todo for a fast commit performance optimization
    
    Fast commit performance can be optimized if commit thread doesn't wait
    for ongoing fast commits to complete until the transaction enters
    T_FLUSH state. Document this optimization.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-11-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index ec516490cb35..b121d7d434c6 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -450,6 +450,15 @@ void jbd2_journal_commit_transaction(journal_t *journal)
 		schedule();
 		write_lock(&journal->j_state_lock);
 		finish_wait(&journal->j_fc_wait, &wait);
+		/*
+		 * TODO: by blocking fast commits here, we are increasing
+		 * fsync() latency slightly. Strictly speaking, we don't need
+		 * to block fast commits until the transaction enters T_FLUSH
+		 * state. So an optimization is possible where we block new fast
+		 * commits here and wait for existing ones to complete
+		 * just before we enter T_FLUSH. That way, the existing fast
+		 * commits and this full commit can proceed parallely.
+		 */
 	}
 	write_unlock(&journal->j_state_lock);
 
commit 0bce577bf9cae13ae32d391432d0030e3f67fc1d
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:58 2020 -0800

    jbd2: don't pass tid to jbd2_fc_end_commit_fallback()
    
    In jbd2_fc_end_commit_fallback(), we know which tid to commit. There's
    no need for caller to pass it.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-10-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index bab60c5d5095..e69c580fa91e 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -1143,7 +1143,7 @@ out:
 		"Fast commit ended with blks = %d, reason = %d, subtid - %d",
 		nblks, reason, subtid);
 	if (reason == EXT4_FC_REASON_FC_FAILED)
-		return jbd2_fc_end_commit_fallback(journal, commit_tid);
+		return jbd2_fc_end_commit_fallback(journal);
 	if (reason == EXT4_FC_REASON_FC_START_FAILED ||
 		reason == EXT4_FC_REASON_INELIGIBLE)
 		return jbd2_complete_transaction(journal, commit_tid);
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 778ea50fc8d1..59166e299cde 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -777,13 +777,19 @@ static int __jbd2_fc_end_commit(journal_t *journal, tid_t tid, bool fallback)
 
 int jbd2_fc_end_commit(journal_t *journal)
 {
-	return __jbd2_fc_end_commit(journal, 0, 0);
+	return __jbd2_fc_end_commit(journal, 0, false);
 }
 EXPORT_SYMBOL(jbd2_fc_end_commit);
 
-int jbd2_fc_end_commit_fallback(journal_t *journal, tid_t tid)
+int jbd2_fc_end_commit_fallback(journal_t *journal)
 {
-	return __jbd2_fc_end_commit(journal, tid, 1);
+	tid_t tid;
+
+	read_lock(&journal->j_state_lock);
+	tid = journal->j_running_transaction ?
+		journal->j_running_transaction->t_tid : 0;
+	read_unlock(&journal->j_state_lock);
+	return __jbd2_fc_end_commit(journal, tid, true);
 }
 EXPORT_SYMBOL(jbd2_fc_end_commit_fallback);
 
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index 5f0ef6380b0c..1c49fd62ff2e 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -1619,7 +1619,7 @@ extern int jbd2_cleanup_journal_tail(journal_t *);
 /* Fast commit related APIs */
 int jbd2_fc_begin_commit(journal_t *journal, tid_t tid);
 int jbd2_fc_end_commit(journal_t *journal);
-int jbd2_fc_end_commit_fallback(journal_t *journal, tid_t tid);
+int jbd2_fc_end_commit_fallback(journal_t *journal);
 int jbd2_fc_get_buf(journal_t *journal, struct buffer_head **bh_out);
 int jbd2_submit_inode_data(struct jbd2_inode *jinode);
 int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode);
commit c460e5edc85a063ec9cb60addff93d00ed378701
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:57 2020 -0800

    jbd2: don't use state lock during commit path
    
    Variables journal->j_fc_off, journal->j_fc_wbuf are accessed during
    commit path. Since today we allow only one process to perform a fast
    commit, there is no need take state lock before accessing these
    variables. This patch removes these locks and adds comments to
    describe this.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-9-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 500152f0421a..778ea50fc8d1 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -865,7 +865,6 @@ int jbd2_fc_get_buf(journal_t *journal, struct buffer_head **bh_out)
 	int fc_off;
 
 	*bh_out = NULL;
-	write_lock(&journal->j_state_lock);
 
 	if (journal->j_fc_off + journal->j_fc_first < journal->j_fc_last) {
 		fc_off = journal->j_fc_off;
@@ -874,7 +873,6 @@ int jbd2_fc_get_buf(journal_t *journal, struct buffer_head **bh_out)
 	} else {
 		ret = -EINVAL;
 	}
-	write_unlock(&journal->j_state_lock);
 
 	if (ret)
 		return ret;
@@ -909,9 +907,7 @@ int jbd2_fc_wait_bufs(journal_t *journal, int num_blks)
 	struct buffer_head *bh;
 	int i, j_fc_off;
 
-	read_lock(&journal->j_state_lock);
 	j_fc_off = journal->j_fc_off;
-	read_unlock(&journal->j_state_lock);
 
 	/*
 	 * Wait in reverse order to minimize chances of us being woken up before
@@ -939,9 +935,7 @@ int jbd2_fc_release_bufs(journal_t *journal)
 	struct buffer_head *bh;
 	int i, j_fc_off;
 
-	read_lock(&journal->j_state_lock);
 	j_fc_off = journal->j_fc_off;
-	read_unlock(&journal->j_state_lock);
 
 	/*
 	 * Wait in reverse order to minimize chances of us being woken up before
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index b2caf7bbd8e5..5f0ef6380b0c 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -945,8 +945,9 @@ struct journal_s
 	/**
 	 * @j_fc_off:
 	 *
-	 * Number of fast commit blocks currently allocated.
-	 * [j_state_lock].
+	 * Number of fast commit blocks currently allocated. Accessed only
+	 * during fast commit. Currently only process can do fast commit, so
+	 * this field is not protected by any lock.
 	 */
 	unsigned long		j_fc_off;
 
@@ -1109,8 +1110,9 @@ struct journal_s
 	struct buffer_head	**j_wbuf;
 
 	/**
-	 * @j_fc_wbuf: Array of fast commit bhs for
-	 * jbd2_journal_commit_transaction.
+	 * @j_fc_wbuf: Array of fast commit bhs for fast commit. Accessed only
+	 * during a fast commit. Currently only process can do fast commit, so
+	 * this field is not protected by any lock.
 	 */
 	struct buffer_head	**j_fc_wbuf;
 
commit 37e0a30e94f1aa25f16b403dfabb64e0b806de0b
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:56 2020 -0800

    jbd2: drop jbd2_fc_init documentation
    
    Now that jbd2_fc_init is dropped, drop its docs too.
    
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-8-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/Documentation/filesystems/journalling.rst b/Documentation/filesystems/journalling.rst
index 5a5f70b4063e..e18f90ffc6fd 100644
--- a/Documentation/filesystems/journalling.rst
+++ b/Documentation/filesystems/journalling.rst
@@ -136,10 +136,8 @@ Fast commits
 ~~~~~~~~~~~~
 
 JBD2 to also allows you to perform file-system specific delta commits known as
-fast commits. In order to use fast commits, you first need to call
-:c:func:`jbd2_fc_init` and tell how many blocks at the end of journal
-area should be reserved for fast commits. Along with that, you will also need
-to set following callbacks that perform correspodning work:
+fast commits. In order to use fast commits, you will need to set following
+callbacks that perform correspodning work:
 
 `journal->j_fc_cleanup_cb`: Cleanup function called after every full commit and
 fast commit.
commit a1e5e465b31d6015fccb359d99053b39e5180466
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:55 2020 -0800

    ext4: clean up the JBD2 API that initializes fast commits
    
    This patch removes jbd2_fc_init() API and its related functions to
    simplify enabling fast commits. With this change, the number of fast
    commit blocks to use is solely determined by the JBD2 layer. So, we
    move the default value for minimum number of fast commit blocks from
    ext4/fast_commit.h to include/linux/jbd2.h. However, whether or not to
    use fast commits is determined by the file system. The file system
    just sets the fast commit feature using
    jbd2_journal_set_features(). JBD2 layer then determines how many
    blocks to use for fast commits (based on the value found in the JBD2
    superblock).
    
    Note that the JBD2 feature flag of fast commits is just an indication
    that there are fast commit blocks present on disk. It doesn't tell
    JBD2 layer about the intent of the file system of whether to it wants
    to use fast commit or not. That's why, we blindly clear the fast
    commit flag in journal_reset() after the recovery is done.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-7-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 9399e9cccb7e..bab60c5d5095 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -2091,8 +2091,6 @@ static int ext4_fc_replay(journal_t *journal, struct buffer_head *bh,
 
 void ext4_fc_init(struct super_block *sb, journal_t *journal)
 {
-	int num_fc_blocks;
-
 	/*
 	 * We set replay callback even if fast commit disabled because we may
 	 * could still have fast commit blocks that need to be replayed even if
@@ -2102,18 +2100,6 @@ void ext4_fc_init(struct super_block *sb, journal_t *journal)
 	if (!test_opt2(sb, JOURNAL_FAST_COMMIT))
 		return;
 	journal->j_fc_cleanup_callback = ext4_fc_cleanup;
-	if (!buffer_uptodate(journal->j_sb_buffer)
-		&& ext4_read_bh_lock(journal->j_sb_buffer, REQ_META | REQ_PRIO,
-					true)) {
-		ext4_msg(sb, KERN_ERR, "I/O error on journal");
-		return;
-	}
-	num_fc_blocks = be32_to_cpu(journal->j_superblock->s_num_fc_blks);
-	if (jbd2_fc_init(journal, num_fc_blocks ? num_fc_blocks :
-					EXT4_NUM_FC_BLKS)) {
-		pr_warn("Error while enabling fast commits, turning off.");
-		ext4_clear_feature_fast_commit(sb);
-	}
 }
 
 const char *fc_ineligible_reasons[] = {
diff --git a/fs/ext4/fast_commit.h b/fs/ext4/fast_commit.h
index 140fbb6af19e..1d96e0ac8138 100644
--- a/fs/ext4/fast_commit.h
+++ b/fs/ext4/fast_commit.h
@@ -3,9 +3,6 @@
 #ifndef __FAST_COMMIT_H__
 #define __FAST_COMMIT_H__
 
-/* Number of blocks in journal area to allocate for fast commits */
-#define EXT4_NUM_FC_BLKS		256
-
 /* Fast commit tags */
 #define EXT4_FC_TAG_ADD_RANGE		0x0001
 #define EXT4_FC_TAG_DEL_RANGE		0x0002
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 8a6dd433bb70..ba02d7c86fb3 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4857,6 +4857,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 		goto failed_mount_wq;
 	}
 
+	if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&
+		!jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
+					  JBD2_FEATURE_INCOMPAT_FAST_COMMIT)) {
+		ext4_msg(sb, KERN_ERR,
+			"Failed to set fast commit journal feature");
+		goto failed_mount_wq;
+	}
+
 	/* We have now updated the journal if required, so we can
 	 * validate the data journaling mode. */
 	switch (test_opt(sb, DATA_FLAGS)) {
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index c3c768248527..500152f0421a 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -1352,19 +1352,12 @@ static journal_t *journal_init_common(struct block_device *bdev,
 	/* We need enough buffers to write out full descriptor block. */
 	n = journal->j_blocksize / jbd2_min_tag_size();
 	journal->j_wbufsize = n;
+	journal->j_fc_wbuf = NULL;
 	journal->j_wbuf = kmalloc_array(n, sizeof(struct buffer_head *),
 					GFP_KERNEL);
 	if (!journal->j_wbuf)
 		goto err_cleanup;
 
-	if (journal->j_fc_wbufsize > 0) {
-		journal->j_fc_wbuf = kmalloc_array(journal->j_fc_wbufsize,
-					sizeof(struct buffer_head *),
-					GFP_KERNEL);
-		if (!journal->j_fc_wbuf)
-			goto err_cleanup;
-	}
-
 	bh = getblk_unmovable(journal->j_dev, start, journal->j_blocksize);
 	if (!bh) {
 		pr_err("%s: Cannot get buffer for journal superblock\n",
@@ -1378,23 +1371,11 @@ static journal_t *journal_init_common(struct block_device *bdev,
 
 err_cleanup:
 	kfree(journal->j_wbuf);
-	kfree(journal->j_fc_wbuf);
 	jbd2_journal_destroy_revoke(journal);
 	kfree(journal);
 	return NULL;
 }
 
-int jbd2_fc_init(journal_t *journal, int num_fc_blks)
-{
-	journal->j_fc_wbufsize = num_fc_blks;
-	journal->j_fc_wbuf = kmalloc_array(journal->j_fc_wbufsize,
-				sizeof(struct buffer_head *), GFP_KERNEL);
-	if (!journal->j_fc_wbuf)
-		return -ENOMEM;
-	return 0;
-}
-EXPORT_SYMBOL(jbd2_fc_init);
-
 /* jbd2_journal_init_dev and jbd2_journal_init_inode:
  *
  * Create a journal structure assigned some fixed set of disk blocks to
@@ -1512,16 +1493,7 @@ static int journal_reset(journal_t *journal)
 	}
 
 	journal->j_first = first;
-
-	if (jbd2_has_feature_fast_commit(journal) &&
-	    journal->j_fc_wbufsize > 0) {
-		journal->j_fc_last = last;
-		journal->j_last = last - journal->j_fc_wbufsize;
-		journal->j_fc_first = journal->j_last + 1;
-		journal->j_fc_off = 0;
-	} else {
-		journal->j_last = last;
-	}
+	journal->j_last = last;
 
 	journal->j_head = journal->j_first;
 	journal->j_tail = journal->j_first;
@@ -1533,6 +1505,13 @@ static int journal_reset(journal_t *journal)
 
 	journal->j_max_transaction_buffers = jbd2_journal_get_max_txn_bufs(journal);
 
+	/*
+	 * Now that journal recovery is done, turn fast commits off here. This
+	 * way, if fast commit was enabled before the crash but if now FS has
+	 * disabled it, we don't enable fast commits.
+	 */
+	jbd2_clear_feature_fast_commit(journal);
+
 	/*
 	 * As a special case, if the on-disk copy is already marked as needing
 	 * no recovery (s_start == 0), then we can safely defer the superblock
@@ -1872,6 +1851,7 @@ static int load_superblock(journal_t *journal)
 {
 	int err;
 	journal_superblock_t *sb;
+	int num_fc_blocks;
 
 	err = journal_get_superblock(journal);
 	if (err)
@@ -1883,15 +1863,17 @@ static int load_superblock(journal_t *journal)
 	journal->j_tail = be32_to_cpu(sb->s_start);
 	journal->j_first = be32_to_cpu(sb->s_first);
 	journal->j_errno = be32_to_cpu(sb->s_errno);
+	journal->j_last = be32_to_cpu(sb->s_maxlen);
 
-	if (jbd2_has_feature_fast_commit(journal) &&
-	    journal->j_fc_wbufsize > 0) {
+	if (jbd2_has_feature_fast_commit(journal)) {
 		journal->j_fc_last = be32_to_cpu(sb->s_maxlen);
-		journal->j_last = journal->j_fc_last - journal->j_fc_wbufsize;
+		num_fc_blocks = be32_to_cpu(sb->s_num_fc_blks);
+		if (!num_fc_blocks)
+			num_fc_blocks = JBD2_MIN_FC_BLOCKS;
+		if (journal->j_last - num_fc_blocks >= JBD2_MIN_JOURNAL_BLOCKS)
+			journal->j_last = journal->j_fc_last - num_fc_blocks;
 		journal->j_fc_first = journal->j_last + 1;
 		journal->j_fc_off = 0;
-	} else {
-		journal->j_last = be32_to_cpu(sb->s_maxlen);
 	}
 
 	return 0;
@@ -1954,9 +1936,6 @@ int jbd2_journal_load(journal_t *journal)
 	 */
 	journal->j_flags &= ~JBD2_ABORT;
 
-	if (journal->j_fc_wbufsize > 0)
-		jbd2_journal_set_features(journal, 0, 0,
-					  JBD2_FEATURE_INCOMPAT_FAST_COMMIT);
 	/* OK, we've finished with the dynamic journal bits:
 	 * reinitialise the dynamic contents of the superblock in memory
 	 * and reset them on disk. */
@@ -2040,8 +2019,7 @@ int jbd2_journal_destroy(journal_t *journal)
 		jbd2_journal_destroy_revoke(journal);
 	if (journal->j_chksum_driver)
 		crypto_free_shash(journal->j_chksum_driver);
-	if (journal->j_fc_wbufsize > 0)
-		kfree(journal->j_fc_wbuf);
+	kfree(journal->j_fc_wbuf);
 	kfree(journal->j_wbuf);
 	kfree(journal);
 
@@ -2116,6 +2094,37 @@ int jbd2_journal_check_available_features(journal_t *journal, unsigned long comp
 	return 0;
 }
 
+static int
+jbd2_journal_initialize_fast_commit(journal_t *journal)
+{
+	journal_superblock_t *sb = journal->j_superblock;
+	unsigned long long num_fc_blks;
+
+	num_fc_blks = be32_to_cpu(sb->s_num_fc_blks);
+	if (num_fc_blks == 0)
+		num_fc_blks = JBD2_MIN_FC_BLOCKS;
+	if (journal->j_last - num_fc_blks < JBD2_MIN_JOURNAL_BLOCKS)
+		return -ENOSPC;
+
+	/* Are we called twice? */
+	WARN_ON(journal->j_fc_wbuf != NULL);
+	journal->j_fc_wbuf = kmalloc_array(num_fc_blks,
+				sizeof(struct buffer_head *), GFP_KERNEL);
+	if (!journal->j_fc_wbuf)
+		return -ENOMEM;
+
+	journal->j_fc_wbufsize = num_fc_blks;
+	journal->j_fc_last = journal->j_last;
+	journal->j_last = journal->j_fc_last - num_fc_blks;
+	journal->j_fc_first = journal->j_last + 1;
+	journal->j_fc_off = 0;
+	journal->j_free = journal->j_last - journal->j_first;
+	journal->j_max_transaction_buffers =
+		jbd2_journal_get_max_txn_bufs(journal);
+
+	return 0;
+}
+
 /**
  * int jbd2_journal_set_features() - Mark a given journal feature in the superblock
  * @journal: Journal to act on.
@@ -2159,6 +2168,13 @@ int jbd2_journal_set_features(journal_t *journal, unsigned long compat,
 
 	sb = journal->j_superblock;
 
+	if (incompat & JBD2_FEATURE_INCOMPAT_FAST_COMMIT) {
+		if (jbd2_journal_initialize_fast_commit(journal)) {
+			pr_err("JBD2: Cannot enable fast commits.\n");
+			return 0;
+		}
+	}
+
 	/* Load the checksum driver if necessary */
 	if ((journal->j_chksum_driver == NULL) &&
 	    INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) {
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index e0b6b53eae64..b2caf7bbd8e5 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -68,6 +68,7 @@ extern void *jbd2_alloc(size_t size, gfp_t flags);
 extern void jbd2_free(void *ptr, size_t size);
 
 #define JBD2_MIN_JOURNAL_BLOCKS 1024
+#define JBD2_MIN_FC_BLOCKS	256
 
 #ifdef __KERNEL__
 
@@ -1614,7 +1615,6 @@ extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *);
 extern int jbd2_cleanup_journal_tail(journal_t *);
 
 /* Fast commit related APIs */
-int jbd2_fc_init(journal_t *journal, int num_fc_blks);
 int jbd2_fc_begin_commit(journal_t *journal, tid_t tid);
 int jbd2_fc_end_commit(journal_t *journal);
 int jbd2_fc_end_commit_fallback(journal_t *journal, tid_t tid);
commit ede7dc7fa0af619afc08995776eadb9ff3b0a711
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:54 2020 -0800

    jbd2: rename j_maxlen to j_total_len and add jbd2_journal_max_txn_bufs
    
    The on-disk superblock field sb->s_maxlen represents the total size of
    the journal including the fast commit area and is no more the max
    number of blocks available for a transaction. The maximum number of
    blocks available to a transaction is reduced by the number of fast
    commit blocks. So, this patch renames j_maxlen to j_total_len to
    better represent its intent. Also, it adds a function to calculate max
    number of bufs available for a transaction.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-6-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fsmap.c b/fs/ext4/fsmap.c
index b232c2767534..4c2a9fe30067 100644
--- a/fs/ext4/fsmap.c
+++ b/fs/ext4/fsmap.c
@@ -280,7 +280,7 @@ static int ext4_getfsmap_logdev(struct super_block *sb, struct ext4_fsmap *keys,
 
 	/* Fabricate an rmap entry for the external log device. */
 	irec.fmr_physical = journal->j_blk_offset;
-	irec.fmr_length = journal->j_maxlen;
+	irec.fmr_length = journal->j_total_len;
 	irec.fmr_owner = EXT4_FMR_OWN_LOG;
 	irec.fmr_flags = 0;
 
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 738a6dd4957d..8a6dd433bb70 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3976,7 +3976,7 @@ int ext4_calculate_overhead(struct super_block *sb)
 	 * loaded or not
 	 */
 	if (sbi->s_journal && !sbi->s_journal_bdev)
-		overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_maxlen);
+		overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_total_len);
 	else if (ext4_has_feature_journal(sb) && !sbi->s_journal && j_inum) {
 		/* j_inum for internal journal is non-zero */
 		j_inode = ext4_get_journal_inode(sb, j_inum);
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index fa688e163a80..ec516490cb35 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -801,7 +801,7 @@ start_journal_io:
 		if (first_block < journal->j_tail)
 			freed += journal->j_last - journal->j_first;
 		/* Update tail only if we free significant amount of space */
-		if (freed < journal->j_maxlen / 4)
+		if (freed < jbd2_journal_get_max_txn_bufs(journal))
 			update_tail = 0;
 	}
 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 0c7c42bd530f..c3c768248527 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -1348,7 +1348,7 @@ static journal_t *journal_init_common(struct block_device *bdev,
 	journal->j_dev = bdev;
 	journal->j_fs_dev = fs_dev;
 	journal->j_blk_offset = start;
-	journal->j_maxlen = len;
+	journal->j_total_len = len;
 	/* We need enough buffers to write out full descriptor block. */
 	n = journal->j_blocksize / jbd2_min_tag_size();
 	journal->j_wbufsize = n;
@@ -1531,7 +1531,7 @@ static int journal_reset(journal_t *journal)
 	journal->j_commit_sequence = journal->j_transaction_sequence - 1;
 	journal->j_commit_request = journal->j_commit_sequence;
 
-	journal->j_max_transaction_buffers = journal->j_maxlen / 4;
+	journal->j_max_transaction_buffers = jbd2_journal_get_max_txn_bufs(journal);
 
 	/*
 	 * As a special case, if the on-disk copy is already marked as needing
@@ -1792,15 +1792,15 @@ static int journal_get_superblock(journal_t *journal)
 		goto out;
 	}
 
-	if (be32_to_cpu(sb->s_maxlen) < journal->j_maxlen)
-		journal->j_maxlen = be32_to_cpu(sb->s_maxlen);
-	else if (be32_to_cpu(sb->s_maxlen) > journal->j_maxlen) {
+	if (be32_to_cpu(sb->s_maxlen) < journal->j_total_len)
+		journal->j_total_len = be32_to_cpu(sb->s_maxlen);
+	else if (be32_to_cpu(sb->s_maxlen) > journal->j_total_len) {
 		printk(KERN_WARNING "JBD2: journal file too short\n");
 		goto out;
 	}
 
 	if (be32_to_cpu(sb->s_first) == 0 ||
-	    be32_to_cpu(sb->s_first) >= journal->j_maxlen) {
+	    be32_to_cpu(sb->s_first) >= journal->j_total_len) {
 		printk(KERN_WARNING
 			"JBD2: Invalid start block of journal: %u\n",
 			be32_to_cpu(sb->s_first));
diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c
index eb2606133cd8..dc0694fcfcd1 100644
--- a/fs/jbd2/recovery.c
+++ b/fs/jbd2/recovery.c
@@ -74,8 +74,8 @@ static int do_readahead(journal_t *journal, unsigned int start)
 
 	/* Do up to 128K of readahead */
 	max = start + (128 * 1024 / journal->j_blocksize);
-	if (max > journal->j_maxlen)
-		max = journal->j_maxlen;
+	if (max > journal->j_total_len)
+		max = journal->j_total_len;
 
 	/* Do the readahead itself.  We'll submit MAXBUF buffer_heads at
 	 * a time to the block device IO layer. */
@@ -134,7 +134,7 @@ static int jread(struct buffer_head **bhp, journal_t *journal,
 
 	*bhp = NULL;
 
-	if (offset >= journal->j_maxlen) {
+	if (offset >= journal->j_total_len) {
 		printk(KERN_ERR "JBD2: corrupted journal superblock\n");
 		return -EFSCORRUPTED;
 	}
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
index b9a9d69dde7e..db52e843002a 100644
--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -877,7 +877,7 @@ int ocfs2_journal_init(struct ocfs2_journal *journal, int *dirty)
 		goto done;
 	}
 
-	trace_ocfs2_journal_init_maxlen(j_journal->j_maxlen);
+	trace_ocfs2_journal_init_maxlen(j_journal->j_total_len);
 
 	*dirty = (le32_to_cpu(di->id1.journal1.ij_flags) &
 		  OCFS2_JOURNAL_DIRTY_FL);
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index 1d5566af48ac..e0b6b53eae64 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -988,9 +988,9 @@ struct journal_s
 	struct block_device	*j_fs_dev;
 
 	/**
-	 * @j_maxlen: Total maximum capacity of the journal region on disk.
+	 * @j_total_len: Total maximum capacity of the journal region on disk.
 	 */
-	unsigned int		j_maxlen;
+	unsigned int		j_total_len;
 
 	/**
 	 * @j_reserved_credits:
@@ -1624,6 +1624,11 @@ int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode);
 int jbd2_fc_wait_bufs(journal_t *journal, int num_blks);
 int jbd2_fc_release_bufs(journal_t *journal);
 
+static inline int jbd2_journal_get_max_txn_bufs(journal_t *journal)
+{
+	return (journal->j_total_len - journal->j_fc_wbufsize) / 4;
+}
+
 /*
  * is_journal_abort
  *
commit a80f7fcf18672ae4971a6b713b58c0d389aa99fe
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:53 2020 -0800

    ext4: fixup ext4_fc_track_* functions' signature
    
    Firstly, pass handle to all ext4_fc_track_* functions and use
    transaction id found in handle->h_transaction->h_tid for tracking fast
    commit updates. Secondly, don't pass inode to
    ext4_fc_track_link/create/unlink functions. inode can be found inside
    these functions as d_inode(dentry). However, rename path is an
    exeception. That's because in that case, we need inode that's not same
    as d_inode(dentry). To handle that, add a couple of low-level wrapper
    functions that take inode and dentry as arguments.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-5-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index d513553ceafa..c6339bd75a93 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2738,12 +2738,16 @@ extern void ext4_end_bitmap_read(struct buffer_head *bh, int uptodate);
 int ext4_fc_info_show(struct seq_file *seq, void *v);
 void ext4_fc_init(struct super_block *sb, journal_t *journal);
 void ext4_fc_init_inode(struct inode *inode);
-void ext4_fc_track_range(struct inode *inode, ext4_lblk_t start,
+void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t start,
 			 ext4_lblk_t end);
-void ext4_fc_track_unlink(struct inode *inode, struct dentry *dentry);
-void ext4_fc_track_link(struct inode *inode, struct dentry *dentry);
-void ext4_fc_track_create(struct inode *inode, struct dentry *dentry);
-void ext4_fc_track_inode(struct inode *inode);
+void __ext4_fc_track_unlink(handle_t *handle, struct inode *inode,
+	struct dentry *dentry);
+void __ext4_fc_track_link(handle_t *handle, struct inode *inode,
+	struct dentry *dentry);
+void ext4_fc_track_unlink(handle_t *handle, struct dentry *dentry);
+void ext4_fc_track_link(handle_t *handle, struct dentry *dentry);
+void ext4_fc_track_create(handle_t *handle, struct dentry *dentry);
+void ext4_fc_track_inode(handle_t *handle, struct inode *inode);
 void ext4_fc_mark_ineligible(struct super_block *sb, int reason);
 void ext4_fc_start_ineligible(struct super_block *sb, int reason);
 void ext4_fc_stop_ineligible(struct super_block *sb);
@@ -3459,7 +3463,7 @@ extern int ext4_handle_dirty_dirblock(handle_t *handle, struct inode *inode,
 extern int ext4_ci_compare(const struct inode *parent,
 			   const struct qstr *fname,
 			   const struct qstr *entry, bool quick);
-extern int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
+extern int __ext4_unlink(handle_t *handle, struct inode *dir, const struct qstr *d_name,
 			 struct inode *inode);
 extern int __ext4_link(struct inode *dir, struct inode *inode,
 		       struct dentry *dentry);
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 94ba44785d28..17d7096b3212 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -4599,7 +4599,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
 	ret = ext4_mark_inode_dirty(handle, inode);
 	if (unlikely(ret))
 		goto out_handle;
-	ext4_fc_track_range(inode, offset >> inode->i_sb->s_blocksize_bits,
+	ext4_fc_track_range(handle, inode, offset >> inode->i_sb->s_blocksize_bits,
 			(offset + len - 1) >> inode->i_sb->s_blocksize_bits);
 	/* Zero out partial block at the edges of the range */
 	ret = ext4_zero_partial_blocks(handle, inode, offset, len);
diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 48b7bc129392..9399e9cccb7e 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -323,13 +323,14 @@ static inline int ext4_fc_is_ineligible(struct super_block *sb)
  * If enqueue is set, this function enqueues the inode in fast commit list.
  */
 static int ext4_fc_track_template(
-	struct inode *inode, int (*__fc_track_fn)(struct inode *, void *, bool),
+	handle_t *handle, struct inode *inode,
+	int (*__fc_track_fn)(struct inode *, void *, bool),
 	void *args, int enqueue)
 {
-	tid_t running_txn_tid;
 	bool update = false;
 	struct ext4_inode_info *ei = EXT4_I(inode);
 	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+	tid_t tid = 0;
 	int ret;
 
 	if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
@@ -339,15 +340,13 @@ static int ext4_fc_track_template(
 	if (ext4_fc_is_ineligible(inode->i_sb))
 		return -EINVAL;
 
-	running_txn_tid = sbi->s_journal ?
-		sbi->s_journal->j_commit_sequence + 1 : 0;
-
+	tid = handle->h_transaction->t_tid;
 	mutex_lock(&ei->i_fc_lock);
-	if (running_txn_tid == ei->i_sync_tid) {
+	if (tid == ei->i_sync_tid) {
 		update = true;
 	} else {
 		ext4_fc_reset_inode(inode);
-		ei->i_sync_tid = running_txn_tid;
+		ei->i_sync_tid = tid;
 	}
 	ret = __fc_track_fn(inode, args, update);
 	mutex_unlock(&ei->i_fc_lock);
@@ -422,7 +421,8 @@ static int __track_dentry_update(struct inode *inode, void *arg, bool update)
 	return 0;
 }
 
-void ext4_fc_track_unlink(struct inode *inode, struct dentry *dentry)
+void __ext4_fc_track_unlink(handle_t *handle,
+		struct inode *inode, struct dentry *dentry)
 {
 	struct __track_dentry_update_args args;
 	int ret;
@@ -430,12 +430,18 @@ void ext4_fc_track_unlink(struct inode *inode, struct dentry *dentry)
 	args.dentry = dentry;
 	args.op = EXT4_FC_TAG_UNLINK;
 
-	ret = ext4_fc_track_template(inode, __track_dentry_update,
+	ret = ext4_fc_track_template(handle, inode, __track_dentry_update,
 					(void *)&args, 0);
 	trace_ext4_fc_track_unlink(inode, dentry, ret);
 }
 
-void ext4_fc_track_link(struct inode *inode, struct dentry *dentry)
+void ext4_fc_track_unlink(handle_t *handle, struct dentry *dentry)
+{
+	__ext4_fc_track_unlink(handle, d_inode(dentry), dentry);
+}
+
+void __ext4_fc_track_link(handle_t *handle,
+	struct inode *inode, struct dentry *dentry)
 {
 	struct __track_dentry_update_args args;
 	int ret;
@@ -443,20 +449,26 @@ void ext4_fc_track_link(struct inode *inode, struct dentry *dentry)
 	args.dentry = dentry;
 	args.op = EXT4_FC_TAG_LINK;
 
-	ret = ext4_fc_track_template(inode, __track_dentry_update,
+	ret = ext4_fc_track_template(handle, inode, __track_dentry_update,
 					(void *)&args, 0);
 	trace_ext4_fc_track_link(inode, dentry, ret);
 }
 
-void ext4_fc_track_create(struct inode *inode, struct dentry *dentry)
+void ext4_fc_track_link(handle_t *handle, struct dentry *dentry)
+{
+	__ext4_fc_track_link(handle, d_inode(dentry), dentry);
+}
+
+void ext4_fc_track_create(handle_t *handle, struct dentry *dentry)
 {
 	struct __track_dentry_update_args args;
+	struct inode *inode = d_inode(dentry);
 	int ret;
 
 	args.dentry = dentry;
 	args.op = EXT4_FC_TAG_CREAT;
 
-	ret = ext4_fc_track_template(inode, __track_dentry_update,
+	ret = ext4_fc_track_template(handle, inode, __track_dentry_update,
 					(void *)&args, 0);
 	trace_ext4_fc_track_create(inode, dentry, ret);
 }
@@ -472,14 +484,14 @@ static int __track_inode(struct inode *inode, void *arg, bool update)
 	return 0;
 }
 
-void ext4_fc_track_inode(struct inode *inode)
+void ext4_fc_track_inode(handle_t *handle, struct inode *inode)
 {
 	int ret;
 
 	if (S_ISDIR(inode->i_mode))
 		return;
 
-	ret = ext4_fc_track_template(inode, __track_inode, NULL, 1);
+	ret = ext4_fc_track_template(handle, inode, __track_inode, NULL, 1);
 	trace_ext4_fc_track_inode(inode, ret);
 }
 
@@ -515,7 +527,7 @@ static int __track_range(struct inode *inode, void *arg, bool update)
 	return 0;
 }
 
-void ext4_fc_track_range(struct inode *inode, ext4_lblk_t start,
+void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t start,
 			 ext4_lblk_t end)
 {
 	struct __track_range_args args;
@@ -527,7 +539,7 @@ void ext4_fc_track_range(struct inode *inode, ext4_lblk_t start,
 	args.start = start;
 	args.end = end;
 
-	ret = ext4_fc_track_template(inode,  __track_range, &args, 1);
+	ret = ext4_fc_track_template(handle, inode,  __track_range, &args, 1);
 
 	trace_ext4_fc_track_range(inode, start, end, ret);
 }
@@ -1263,7 +1275,7 @@ static int ext4_fc_replay_unlink(struct super_block *sb, struct ext4_fc_tl *tl)
 		return 0;
 	}
 
-	ret = __ext4_unlink(old_parent, &entry, inode);
+	ret = __ext4_unlink(NULL, old_parent, &entry, inode);
 	/* -ENOENT ok coz it might not exist anymore. */
 	if (ret == -ENOENT)
 		ret = 0;
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 081b6a86b5db..87120c4c44f3 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -732,7 +732,7 @@ out_sem:
 			if (ret)
 				return ret;
 		}
-		ext4_fc_track_range(inode, map->m_lblk,
+		ext4_fc_track_range(handle, inode, map->m_lblk,
 			    map->m_lblk + map->m_len - 1);
 	}
 
@@ -4111,7 +4111,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
 
 		up_write(&EXT4_I(inode)->i_data_sem);
 	}
-	ext4_fc_track_range(inode, first_block, stop_block);
+	ext4_fc_track_range(handle, inode, first_block, stop_block);
 	if (IS_SYNC(inode))
 		ext4_handle_sync(handle);
 
@@ -5444,14 +5444,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
 			}
 
 			if (shrink)
-				ext4_fc_track_range(inode,
+				ext4_fc_track_range(handle, inode,
 					(attr->ia_size > 0 ? attr->ia_size - 1 : 0) >>
 					inode->i_sb->s_blocksize_bits,
 					(oldsize > 0 ? oldsize - 1 : 0) >>
 					inode->i_sb->s_blocksize_bits);
 			else
 				ext4_fc_track_range(
-					inode,
+					handle, inode,
 					(oldsize > 0 ? oldsize - 1 : oldsize) >>
 					inode->i_sb->s_blocksize_bits,
 					(attr->ia_size > 0 ? attr->ia_size - 1 : 0) >>
@@ -5701,7 +5701,7 @@ int ext4_mark_iloc_dirty(handle_t *handle,
 		put_bh(iloc->bh);
 		return -EIO;
 	}
-	ext4_fc_track_inode(inode);
+	ext4_fc_track_inode(handle, inode);
 
 	if (IS_I_VERSION(inode))
 		inode_inc_iversion(inode);
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index f458d1d81d96..33509266f5a0 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2606,7 +2606,7 @@ static int ext4_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 		       bool excl)
 {
 	handle_t *handle;
-	struct inode *inode, *inode_save;
+	struct inode *inode;
 	int err, credits, retries = 0;
 
 	err = dquot_initialize(dir);
@@ -2624,11 +2624,9 @@ retry:
 		inode->i_op = &ext4_file_inode_operations;
 		inode->i_fop = &ext4_file_operations;
 		ext4_set_aops(inode);
-		inode_save = inode;
-		ihold(inode_save);
 		err = ext4_add_nondir(handle, dentry, &inode);
-		ext4_fc_track_create(inode_save, dentry);
-		iput(inode_save);
+		if (!err)
+			ext4_fc_track_create(handle, dentry);
 	}
 	if (handle)
 		ext4_journal_stop(handle);
@@ -2643,7 +2641,7 @@ static int ext4_mknod(struct inode *dir, struct dentry *dentry,
 		      umode_t mode, dev_t rdev)
 {
 	handle_t *handle;
-	struct inode *inode, *inode_save;
+	struct inode *inode;
 	int err, credits, retries = 0;
 
 	err = dquot_initialize(dir);
@@ -2660,12 +2658,9 @@ retry:
 	if (!IS_ERR(inode)) {
 		init_special_inode(inode, inode->i_mode, rdev);
 		inode->i_op = &ext4_special_inode_operations;
-		inode_save = inode;
-		ihold(inode_save);
 		err = ext4_add_nondir(handle, dentry, &inode);
 		if (!err)
-			ext4_fc_track_create(inode_save, dentry);
-		iput(inode_save);
+			ext4_fc_track_create(handle, dentry);
 	}
 	if (handle)
 		ext4_journal_stop(handle);
@@ -2829,7 +2824,6 @@ out_clear_inode:
 		iput(inode);
 		goto out_retry;
 	}
-	ext4_fc_track_create(inode, dentry);
 	ext4_inc_count(dir);
 
 	ext4_update_dx_flag(dir);
@@ -2837,6 +2831,7 @@ out_clear_inode:
 	if (err)
 		goto out_clear_inode;
 	d_instantiate_new(dentry, inode);
+	ext4_fc_track_create(handle, dentry);
 	if (IS_DIRSYNC(dir))
 		ext4_handle_sync(handle);
 
@@ -3171,7 +3166,7 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry)
 		goto end_rmdir;
 	ext4_dec_count(dir);
 	ext4_update_dx_flag(dir);
-	ext4_fc_track_unlink(inode, dentry);
+	ext4_fc_track_unlink(handle, dentry);
 	retval = ext4_mark_inode_dirty(handle, dir);
 
 #ifdef CONFIG_UNICODE
@@ -3192,13 +3187,12 @@ end_rmdir:
 	return retval;
 }
 
-int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
+int __ext4_unlink(handle_t *handle, struct inode *dir, const struct qstr *d_name,
 		  struct inode *inode)
 {
 	int retval = -ENOENT;
 	struct buffer_head *bh;
 	struct ext4_dir_entry_2 *de;
-	handle_t *handle = NULL;
 	int skip_remove_dentry = 0;
 
 	bh = ext4_find_entry(dir, d_name, &de, NULL);
@@ -3217,14 +3211,7 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
 		if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
 			skip_remove_dentry = 1;
 		else
-			goto out_bh;
-	}
-
-	handle = ext4_journal_start(dir, EXT4_HT_DIR,
-				    EXT4_DATA_TRANS_BLOCKS(dir->i_sb));
-	if (IS_ERR(handle)) {
-		retval = PTR_ERR(handle);
-		goto out_bh;
+			goto out;
 	}
 
 	if (IS_DIRSYNC(dir))
@@ -3233,12 +3220,12 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
 	if (!skip_remove_dentry) {
 		retval = ext4_delete_entry(handle, dir, de, bh);
 		if (retval)
-			goto out_handle;
+			goto out;
 		dir->i_ctime = dir->i_mtime = current_time(dir);
 		ext4_update_dx_flag(dir);
 		retval = ext4_mark_inode_dirty(handle, dir);
 		if (retval)
-			goto out_handle;
+			goto out;
 	} else {
 		retval = 0;
 	}
@@ -3252,15 +3239,14 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
 	inode->i_ctime = current_time(inode);
 	retval = ext4_mark_inode_dirty(handle, inode);
 
-out_handle:
-	ext4_journal_stop(handle);
-out_bh:
+out:
 	brelse(bh);
 	return retval;
 }
 
 static int ext4_unlink(struct inode *dir, struct dentry *dentry)
 {
+	handle_t *handle;
 	int retval;
 
 	if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb))))
@@ -3278,9 +3264,16 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
 	if (retval)
 		goto out_trace;
 
-	retval = __ext4_unlink(dir, &dentry->d_name, d_inode(dentry));
+	handle = ext4_journal_start(dir, EXT4_HT_DIR,
+				    EXT4_DATA_TRANS_BLOCKS(dir->i_sb));
+	if (IS_ERR(handle)) {
+		retval = PTR_ERR(handle);
+		goto out_trace;
+	}
+
+	retval = __ext4_unlink(handle, dir, &dentry->d_name, d_inode(dentry));
 	if (!retval)
-		ext4_fc_track_unlink(d_inode(dentry), dentry);
+		ext4_fc_track_unlink(handle, dentry);
 #ifdef CONFIG_UNICODE
 	/* VFS negative dentries are incompatible with Encoding and
 	 * Case-insensitiveness. Eventually we'll want avoid
@@ -3291,6 +3284,8 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)
 	if (IS_CASEFOLDED(dir))
 		d_invalidate(dentry);
 #endif
+	if (handle)
+		ext4_journal_stop(handle);
 
 out_trace:
 	trace_ext4_unlink_exit(dentry, retval);
@@ -3447,7 +3442,6 @@ retry:
 
 	err = ext4_add_entry(handle, dentry, inode);
 	if (!err) {
-		ext4_fc_track_link(inode, dentry);
 		err = ext4_mark_inode_dirty(handle, inode);
 		/* this can happen only for tmpfile being
 		 * linked the first time
@@ -3455,6 +3449,7 @@ retry:
 		if (inode->i_nlink == 1)
 			ext4_orphan_del(handle, inode);
 		d_instantiate(dentry, inode);
+		ext4_fc_track_link(handle, dentry);
 	} else {
 		drop_nlink(inode);
 		iput(inode);
@@ -3915,9 +3910,9 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
 			EXT4_FC_REASON_RENAME_DIR);
 	} else {
 		if (new.inode)
-			ext4_fc_track_unlink(new.inode, new.dentry);
-		ext4_fc_track_link(old.inode, new.dentry);
-		ext4_fc_track_unlink(old.inode, old.dentry);
+			ext4_fc_track_unlink(handle, new.dentry);
+		__ext4_fc_track_link(handle, old.inode, new.dentry);
+		__ext4_fc_track_unlink(handle, old.inode, old.dentry);
 	}
 
 	if (new.inode) {
commit 5b552ad70c6197e764ffe6070089c5b355fe2d26
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:52 2020 -0800

    ext4: drop redundant calls ext4_fc_track_range
    
    ext4_fc_track_range() should only be called when blocks are added or
    removed from an inode. So, the only places from where we need to call
    this function are ext4_map_blocks(), punch hole, collapse / zero
    range, truncate. Remove all the other redundant calls to ths function.
    
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-4-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 57cfa28919a9..94ba44785d28 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3724,7 +3724,6 @@ static int ext4_convert_unwritten_extents_endio(handle_t *handle,
 	err = ext4_ext_dirty(handle, inode, path + path->p_depth);
 out:
 	ext4_ext_show_leaf(inode, path);
-	ext4_fc_track_range(inode, ee_block, ee_block + ee_len - 1);
 	return err;
 }
 
@@ -3796,7 +3795,6 @@ convert_initialized_extent(handle_t *handle, struct inode *inode,
 	if (*allocated > map->m_len)
 		*allocated = map->m_len;
 	map->m_len = *allocated;
-	ext4_fc_track_range(inode, ee_block, ee_block + ee_len - 1);
 	return 0;
 }
 
@@ -4329,7 +4327,6 @@ got_allocated_blocks:
 	map->m_len = ar.len;
 	allocated = map->m_len;
 	ext4_ext_show_leaf(inode, path);
-	ext4_fc_track_range(inode, map->m_lblk, map->m_lblk + map->m_len - 1);
 out:
 	ext4_ext_drop_refs(path);
 	kfree(path);
@@ -4651,8 +4648,6 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
 		     FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE |
 		     FALLOC_FL_INSERT_RANGE))
 		return -EOPNOTSUPP;
-	ext4_fc_track_range(inode, offset >> blkbits,
-			(offset + len - 1) >> blkbits);
 
 	ext4_fc_start_update(inode);
 
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 5dbbd48923c1..738a6dd4957d 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -6560,10 +6560,6 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type,
 	brelse(bh);
 out:
 	if (inode->i_size < off + len) {
-		ext4_fc_track_range(inode,
-			(inode->i_size > 0 ? inode->i_size - 1 : 0)
-				>> inode->i_sb->s_blocksize_bits,
-			(off + len) >> inode->i_sb->s_blocksize_bits);
 		i_size_write(inode, off + len);
 		EXT4_I(inode)->i_disksize = inode->i_size;
 		err2 = ext4_mark_inode_dirty(handle, inode);
commit b21ebf143af219207214c79bc217beb39c43212a
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:51 2020 -0800

    ext4: mark fc ineligible if inode gets evictied due to mem pressure
    
    If inode gets evicted due to memory pressure, we have to remove it
    from the fast commit list. However, that inode may have uncommitted
    changes that fast commits will lose. So, just fall back to full
    commits in this case. Also, rename the fast commit ineligiblity reason
    from "EXT4_FC_REASON_MEM" to "EXT4_FC_REASON_MEM_NOMEM" for better
    expression.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Link: https://lore.kernel.org/r/20201106035911.1942128-3-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index 8d43058386c3..48b7bc129392 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -384,7 +384,7 @@ static int __track_dentry_update(struct inode *inode, void *arg, bool update)
 	mutex_unlock(&ei->i_fc_lock);
 	node = kmem_cache_alloc(ext4_fc_dentry_cachep, GFP_NOFS);
 	if (!node) {
-		ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_MEM);
+		ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM);
 		mutex_lock(&ei->i_fc_lock);
 		return -ENOMEM;
 	}
@@ -397,7 +397,7 @@ static int __track_dentry_update(struct inode *inode, void *arg, bool update)
 		if (!node->fcd_name.name) {
 			kmem_cache_free(ext4_fc_dentry_cachep, node);
 			ext4_fc_mark_ineligible(inode->i_sb,
-				EXT4_FC_REASON_MEM);
+				EXT4_FC_REASON_NOMEM);
 			mutex_lock(&ei->i_fc_lock);
 			return -ENOMEM;
 		}
diff --git a/fs/ext4/fast_commit.h b/fs/ext4/fast_commit.h
index 06907d485989..140fbb6af19e 100644
--- a/fs/ext4/fast_commit.h
+++ b/fs/ext4/fast_commit.h
@@ -100,7 +100,7 @@ enum {
 	EXT4_FC_REASON_XATTR = 0,
 	EXT4_FC_REASON_CROSS_RENAME,
 	EXT4_FC_REASON_JOURNAL_FLAG_CHANGE,
-	EXT4_FC_REASON_MEM,
+	EXT4_FC_REASON_NOMEM,
 	EXT4_FC_REASON_SWAP_BOOT,
 	EXT4_FC_REASON_RESIZE,
 	EXT4_FC_REASON_RENAME_DIR,
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index b96a18679a27..081b6a86b5db 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -327,6 +327,8 @@ stop_handle:
 	ext4_xattr_inode_array_free(ea_inode_array);
 	return;
 no_delete:
+	if (!list_empty(&EXT4_I(inode)->i_fc_list))
+		ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM);
 	ext4_clear_inode(inode);	/* We must guarantee clearing of inode... */
 }
 
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
index b14314fcf732..0f899d3b09d3 100644
--- a/include/trace/events/ext4.h
+++ b/include/trace/events/ext4.h
@@ -100,7 +100,7 @@ TRACE_DEFINE_ENUM(ES_REFERENCED_B);
 		{ EXT4_FC_REASON_XATTR,		"XATTR"},		\
 		{ EXT4_FC_REASON_CROSS_RENAME,	"CROSS_RENAME"},	\
 		{ EXT4_FC_REASON_JOURNAL_FLAG_CHANGE, "JOURNAL_FLAG_CHANGE"}, \
-		{ EXT4_FC_REASON_MEM,	"NO_MEM"},			\
+		{ EXT4_FC_REASON_NOMEM,	"NO_MEM"},			\
 		{ EXT4_FC_REASON_SWAP_BOOT,	"SWAP_BOOT"},		\
 		{ EXT4_FC_REASON_RESIZE,	"RESIZE"},		\
 		{ EXT4_FC_REASON_RENAME_DIR,	"RENAME_DIR"},		\
@@ -2917,13 +2917,13 @@ TRACE_EVENT(ext4_fc_stats,
 		    ),
 
 	    TP_printk("dev %d:%d fc ineligible reasons:\n"
-		      "%s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s,%d; "
+		      "%s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d; "
 		      "num_commits:%ld, ineligible: %ld, numblks: %ld",
 		      MAJOR(__entry->dev), MINOR(__entry->dev),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_XATTR),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_CROSS_RENAME),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_JOURNAL_FLAG_CHANGE),
-		      FC_REASON_NAME_STAT(EXT4_FC_REASON_MEM),
+		      FC_REASON_NAME_STAT(EXT4_FC_REASON_NOMEM),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_SWAP_BOOT),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_RESIZE),
 		      FC_REASON_NAME_STAT(EXT4_FC_REASON_RENAME_DIR),
commit a44ad6835da52fdf4df2e482f45a167336555121
Author: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
Date:   Thu Nov 5 19:58:50 2020 -0800

    ext4: describe fast_commit feature flags
    
    Fast commit feature has flags in the file system as well in JBD2. The
    meaning of fast commit feature flags can get confusing. Update docs
    and code to add more documentation about it.
    
    Suggested-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Harshad Shirwadkar <harshadshirwadkar at gmail.com>
    Reviewed-by: Jan Kara <jack at suse.cz>
    Link: https://lore.kernel.org/r/20201106035911.1942128-2-harshadshirwadkar@gmail.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/Documentation/filesystems/ext4/journal.rst b/Documentation/filesystems/ext4/journal.rst
index 805a1e9ea3a5..849d5b119eb8 100644
--- a/Documentation/filesystems/ext4/journal.rst
+++ b/Documentation/filesystems/ext4/journal.rst
@@ -256,6 +256,10 @@ which is 1024 bytes long:
      - s\_padding2
      -
    * - 0x54
+     - \_\_be32
+     - s\_num\_fc\_blocks
+     - Number of fast commit blocks in the journal.
+   * - 0x58
      - \_\_u32
      - s\_padding[42]
      -
@@ -310,6 +314,8 @@ The journal incompat features are any combination of the following:
      - This journal uses v3 of the checksum on-disk format. This is the same as
        v2, but the journal block tag size is fixed regardless of the size of
        block numbers. (JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3)
+   * - 0x20
+     - Journal has fast commit blocks. (JBD2\_FEATURE\_INCOMPAT\_FAST\_COMMIT)
 
 .. _jbd2_checksum_type:
 
diff --git a/Documentation/filesystems/ext4/super.rst b/Documentation/filesystems/ext4/super.rst
index 93e55d7c1d40..2eb1ab20498d 100644
--- a/Documentation/filesystems/ext4/super.rst
+++ b/Documentation/filesystems/ext4/super.rst
@@ -596,6 +596,13 @@ following:
      - Sparse Super Block, v2. If this flag is set, the SB field s\_backup\_bgs
        points to the two block groups that contain backup superblocks
        (COMPAT\_SPARSE\_SUPER2).
+   * - 0x400
+     - Fast commits supported. Although fast commits blocks are
+       backward incompatible, fast commit blocks are not always
+       present in the journal. If fast commit blocks are present in
+       the journal, JBD2 incompat feature
+       (JBD2\_FEATURE\_INCOMPAT\_FAST\_COMMIT) gets
+       set (COMPAT\_FAST\_COMMIT).
 
 .. _super_incompat:
 
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 45fcdbf538d1..d513553ceafa 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1863,6 +1863,13 @@ static inline bool ext4_verity_in_progress(struct inode *inode)
 #define EXT4_FEATURE_COMPAT_RESIZE_INODE	0x0010
 #define EXT4_FEATURE_COMPAT_DIR_INDEX		0x0020
 #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2	0x0200
+/*
+ * The reason why "FAST_COMMIT" is a compat feature is that, FS becomes
+ * incompatible only if fast commit blocks are present in the FS. Since we
+ * clear the journal (and thus the fast commit blocks), we don't mark FS as
+ * incompatible. We also have a JBD2 incompat feature, which gets set when
+ * there are fast commit blocks present in the journal.
+ */
 #define EXT4_FEATURE_COMPAT_FAST_COMMIT		0x0400
 #define EXT4_FEATURE_COMPAT_STABLE_INODES	0x0800
 
commit 7067b2619017d51e71686ca9756b454de0e5826a
Author: Joseph Qi <joseph.qi at linux.alibaba.com>
Date:   Tue Nov 3 10:29:02 2020 +0800

    ext4: unlock xattr_sem properly in ext4_inline_data_truncate()
    
    It takes xattr_sem to check inline data again but without unlock it
    in case not have. So unlock it before return.
    
    Fixes: aef1c8513c1f ("ext4: let ext4_truncate handle inline data correctly")
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Cc: Tao Ma <boyu.mt at taobao.com>
    Signed-off-by: Joseph Qi <joseph.qi at linux.alibaba.com>
    Reviewed-by: Andreas Dilger <adilger at dilger.ca>
    Link: https://lore.kernel.org/r/1604370542-124630-1-git-send-email-joseph.qi@linux.alibaba.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>
    Cc: stable at kernel.org

diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index caa51473207d..b41512d1badc 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -1880,6 +1880,7 @@ int ext4_inline_data_truncate(struct inode *inode, int *has_inline)
 
 	ext4_write_lock_xattr(inode, &no_expand);
 	if (!ext4_has_inline_data(inode)) {
+		ext4_write_unlock_xattr(inode, &no_expand);
 		*has_inline = 0;
 		ext4_journal_stop(handle);
 		return 0;
commit e121bd48b9eb8e3b9104d3d5d08fdf88e9ca0f97
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Oct 30 14:46:20 2020 +0300

    ext4: silence an uninitialized variable warning
    
    Smatch complains that "i" can be uninitialized if we don't enter the
    loop.  I don't know if it's possible but we may as well silence this
    warning.
    
    [ Initialize i to sb->s_blocksize instead of 0.  The only way the for
      loop could be skipped entirely is the in-memory data structures, in
      particular the bh->b_data for the on-disk superblock has gotten
      corrupted enough that calculated value of group is >= to
      ext4_get_groups_count(sb).  In that case, we want to exit
      immediately without allocating a block.  -- TYT ]
    
    Fixes: 8016e29f4362 ("ext4: fast commit recovery path")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Link: https://lore.kernel.org/r/20201030114620.GB3251003@mwanda
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>
    Cc: stable at kernel.org

diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 85abbfb98cbe..f067e83f149e 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -5167,7 +5167,7 @@ static ext4_fsblk_t ext4_mb_new_blocks_simple(handle_t *handle,
 	struct super_block *sb = ar->inode->i_sb;
 	ext4_group_t group;
 	ext4_grpblk_t blkoff;
-	int  i;
+	int i = sb->s_blocksize;
 	ext4_fsblk_t goal, block;
 	struct ext4_super_block *es = EXT4_SB(sb)->s_es;
 
commit a0650046d31d3ca92e7fb41ae5c667ed9250a2fc
Author: Chao Yu <yuchao0 at huawei.com>
Date:   Fri Oct 30 10:24:35 2020 +0800

    MAINTAINERS: add missing file in ext4 entry
    
    include/trace/events/ext4.h belongs to ext4 module, add the file path into
    ext4 entry in MAINTAINERS.
    
    Signed-off-by: Chao Yu <yuchao0 at huawei.com>
    Link: https://lore.kernel.org/r/20201030022435.1136-1-yuchao0@huawei.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>

diff --git a/MAINTAINERS b/MAINTAINERS
index b516bb34a8d5..025d16ae0767 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -6614,6 +6614,7 @@ Q:	http://patchwork.ozlabs.org/project/linux-ext4/list/
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git
 F:	Documentation/filesystems/ext4/
 F:	fs/ext4/
+F:	include/trace/events/ext4.h
 
 Extended Verification Module (EVM)
 M:	Mimi Zohar <zohar at linux.ibm.com>
commit 174fe5ba2d1ea0d6c5ab2a7d4aa058d6d497ae4d
Author: Kaixu Xia <kaixuxia at tencent.com>
Date:   Thu Oct 29 23:46:36 2020 +0800

    ext4: correctly report "not supported" for {usr,grp}jquota when !CONFIG_QUOTA
    
    The macro MOPT_Q is used to indicates the mount option is related to
    quota stuff and is defined to be MOPT_NOSUPPORT when CONFIG_QUOTA is
    disabled.  Normally the quota options are handled explicitly, so it
    didn't matter that the MOPT_STRING flag was missing, even though the
    usrjquota and grpjquota mount options take a string argument.  It's
    important that's present in the !CONFIG_QUOTA case, since without
    MOPT_STRING, the mount option matcher will match usrjquota= followed
    by an integer, and will otherwise skip the table entry, and so "mount
    option not supported" error message is never reported.
    
    [ Fixed up the commit description to better explain why the fix
      works. --TYT ]
    
    Fixes: 26092bf52478 ("ext4: use a table-driven handler for mount options")
    Signed-off-by: Kaixu Xia <kaixuxia at tencent.com>
    Link: https://lore.kernel.org/r/1603986396-28917-1-git-send-email-kaixuxia@tencent.com
    Signed-off-by: Theodore Ts'o <tytso at mit.edu>
    Cc: stable at kernel.org

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index ef4734b40e2a..5dbbd48923c1 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2027,8 +2027,8 @@ static const struct mount_opts {
 	{Opt_noquota, (EXT4_MOUNT_QUOTA | EXT4_MOUNT_USRQUOTA |
 		       EXT4_MOUNT_GRPQUOTA | EXT4_MOUNT_PRJQUOTA),
 							MOPT_CLEAR | MOPT_Q},
-	{Opt_usrjquota, 0, MOPT_Q},
-	{Opt_grpjquota, 0, MOPT_Q},
+	{Opt_usrjquota, 0, MOPT_Q | MOPT_STRING},
+	{Opt_grpjquota, 0, MOPT_Q | MOPT_STRING},
 	{Opt_offusrjquota, 0, MOPT_Q},
 	{Opt_offgrpjquota, 0, MOPT_Q},
 	{Opt_jqfmt_vfsold, QFMT_VFS_OLD, MOPT_QFMT},
commit 86bbf01977b4fdfffc8cab46e398ff279380b194
Merge: bf3e76289cd2 6f64e4778300
Author: Jakub Kicinski <kuba at kernel.org>
Date:   Fri Nov 6 17:49:31 2020 -0800

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
    
    Alexei Starovoitov says:
    
    ====================
    pull-request: bpf 2020-11-06
    
    1) Pre-allocated per-cpu hashmap needs to zero-fill reused element, from David.
    
    2) Tighten bpf_lsm function check, from KP.
    
    3) Fix bpftool attaching to flow dissector, from Lorenz.
    
    4) Use -fno-gcse for the whole kernel/bpf/core.c instead of function attribute, from Ard.
    
    * git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
      bpf: Update verification logic for LSM programs
      bpf: Zero-fill re-used per-cpu map element
      bpf: BPF_PRELOAD depends on BPF_SYSCALL
      tools/bpftool: Fix attaching flow dissector
      libbpf: Fix possible use after free in xsk_socket__delete
      libbpf: Fix null dereference in xsk_socket__delete
      libbpf, hashmap: Fix undefined behavior in hash_bits
      bpf: Don't rely on GCC __attribute__((optimize)) to disable GCSE
      tools, bpftool: Remove two unused variables.
      tools, bpftool: Avoid array index warnings.
      xsk: Fix possible memory leak at socket close
      bpf: Add struct bpf_redir_neigh forward declaration to BPF helper defs
      samples/bpf: Set rlimit for memlock to infinity in all samples
      bpf: Fix -Wshadow warnings
      selftest/bpf: Fix profiler test using CO-RE relocation for enums
    ====================
    
    Link: https://lore.kernel.org/r/20201106221759.24143-1-alexei.starovoitov@gmail.com
    Signed-off-by: Jakub Kicinski <kuba at kernel.org>

commit 6f64e477830000746c1f992050fbd45c03c89429
Author: KP Singh <kpsingh at google.com>
Date:   Thu Nov 5 23:06:51 2020 +0000

    bpf: Update verification logic for LSM programs
    
    The current logic checks if the name of the BTF type passed in
    attach_btf_id starts with "bpf_lsm_", this is not sufficient as it also
    allows attachment to non-LSM hooks like the very function that performs
    this check, i.e. bpf_lsm_verify_prog.
    
    In order to ensure that this verification logic allows attachment to
    only LSM hooks, the LSM_HOOK definitions in lsm_hook_defs.h are used to
    generate a BTF_ID set. Upon verification, the attach_btf_id of the
    program being attached is checked for presence in this set.
    
    Fixes: 9e4e01dfd325 ("bpf: lsm: Implement attach, detach and execution")
    Signed-off-by: KP Singh <kpsingh at google.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201105230651.2621917-1-kpsingh@chromium.org

diff --git a/kernel/bpf/bpf_lsm.c b/kernel/bpf/bpf_lsm.c
index 78ea8a7bd27f..56cc5a915f67 100644
--- a/kernel/bpf/bpf_lsm.c
+++ b/kernel/bpf/bpf_lsm.c
@@ -13,6 +13,7 @@
 #include <linux/bpf_verifier.h>
 #include <net/bpf_sk_storage.h>
 #include <linux/bpf_local_storage.h>
+#include <linux/btf_ids.h>
 
 /* For every LSM hook that allows attachment of BPF programs, declare a nop
  * function where a BPF program can be attached.
@@ -26,7 +27,11 @@ noinline RET bpf_lsm_##NAME(__VA_ARGS__)	\
 #include <linux/lsm_hook_defs.h>
 #undef LSM_HOOK
 
-#define BPF_LSM_SYM_PREFX  "bpf_lsm_"
+#define LSM_HOOK(RET, DEFAULT, NAME, ...) BTF_ID(func, bpf_lsm_##NAME)
+BTF_SET_START(bpf_lsm_hooks)
+#include <linux/lsm_hook_defs.h>
+#undef LSM_HOOK
+BTF_SET_END(bpf_lsm_hooks)
 
 int bpf_lsm_verify_prog(struct bpf_verifier_log *vlog,
 			const struct bpf_prog *prog)
@@ -37,8 +42,7 @@ int bpf_lsm_verify_prog(struct bpf_verifier_log *vlog,
 		return -EINVAL;
 	}
 
-	if (strncmp(BPF_LSM_SYM_PREFX, prog->aux->attach_func_name,
-		    sizeof(BPF_LSM_SYM_PREFX) - 1)) {
+	if (!btf_id_set_contains(&bpf_lsm_hooks, prog->aux->attach_btf_id)) {
 		bpf_log(vlog, "attach_btf_id %u points to wrong type name %s\n",
 			prog->aux->attach_btf_id, prog->aux->attach_func_name);
 		return -EINVAL;
commit d435c05ab0197ee302290e1cee3f2d9c9024a64f
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Nov 6 15:39:50 2020 -0500

    net/sunrpc: return 0 on attempt to write to "transports"
    
    You can't write to this file because the permissions are 0444.  But
    it sort of looked like you could do a write and it would result in
    a read.  Then it looked like proc_sys_call_handler() just ignored
    it.  Which is confusing.  It's more clear if the "write" just
    returns zero.
    
    Also, the "lenp" pointer is never NULL so that check can be removed.
    
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c
index a18b36b5422d..5c9f5bca4d99 100644
--- a/net/sunrpc/sysctl.c
+++ b/net/sunrpc/sysctl.c
@@ -65,7 +65,7 @@ static int proc_do_xprt(struct ctl_table *table, int write,
 	char tmpbuf[256];
 	size_t len;
 
-	if ((*ppos && !write) || !*lenp) {
+	if (write || *ppos) {
 		*lenp = 0;
 		return 0;
 	}
commit 92cfcd030e4b1de11a6b1edb0840e55c26332d31
Author: Eric Biggers <ebiggers at google.com>
Date:   Fri Oct 30 17:45:56 2020 -0700

    fscrypt: remove reachable WARN in fscrypt_setup_iv_ino_lblk_32_key()
    
    I_CREATING isn't actually set until the inode has been assigned an inode
    number and inserted into the inode hash table.  So the WARN_ON() in
    fscrypt_setup_iv_ino_lblk_32_key() is wrong, and it can trigger when
    creating an encrypted file on ext4.  Remove it.
    
    This was sometimes causing xfstest generic/602 to fail on ext4.  I
    didn't notice it before because due to a separate oversight, new inodes
    that haven't been assigned an inode number yet don't necessarily have
    i_ino == 0 as I had thought, so by chance I never saw the test fail.
    
    Fixes: a992b20cd4ee ("fscrypt: add fscrypt_prepare_new_inode() and fscrypt_set_context()")
    Reported-by: Theodore Y. Ts'o <tytso at mit.edu>
    Link: https://lore.kernel.org/r/20201031004556.87862-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers at google.com>

diff --git a/fs/crypto/keysetup.c b/fs/crypto/keysetup.c
index d3c3e5d9b41f..d595abb8ef90 100644
--- a/fs/crypto/keysetup.c
+++ b/fs/crypto/keysetup.c
@@ -269,9 +269,7 @@ unlock:
 	 * New inodes may not have an inode number assigned yet.
 	 * Hashing their inode number is delayed until later.
 	 */
-	if (ci->ci_inode->i_ino == 0)
-		WARN_ON(!(ci->ci_inode->i_state & I_CREATING));
-	else
+	if (ci->ci_inode->i_ino)
 		fscrypt_hash_inode_number(ci, mk);
 	return 0;
 }
commit aee9dccc5b64e878cf1b18207436e73f66d74157
Author: Brian O'Keefe <bokeefe at alum.wpi.edu>
Date:   Fri Nov 6 10:10:34 2020 -0500

    staging: rtl8723bs: Add 024c:0627 to the list of SDIO device-ids
    
    Add 024c:0627 to the list of SDIO device-ids, based on hardware found in
    the wild. This hardware exists on at least some Acer SW1-011 tablets.
    
    Signed-off-by: Brian O'Keefe <bokeefe at alum.wpi.edu>
    Reviewed-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/b9e1523f-2ba7-fb82-646a-37f095b4440e@alum.wpi.edu
    Cc: stable <stable at vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/staging/rtl8723bs/os_dep/sdio_intf.c b/drivers/staging/rtl8723bs/os_dep/sdio_intf.c
index 79b55ec827a4..b2208e5f190a 100644
--- a/drivers/staging/rtl8723bs/os_dep/sdio_intf.c
+++ b/drivers/staging/rtl8723bs/os_dep/sdio_intf.c
@@ -20,6 +20,7 @@ static const struct sdio_device_id sdio_ids[] = {
 	{ SDIO_DEVICE(0x024c, 0x0525), },
 	{ SDIO_DEVICE(0x024c, 0x0623), },
 	{ SDIO_DEVICE(0x024c, 0x0626), },
+	{ SDIO_DEVICE(0x024c, 0x0627), },
 	{ SDIO_DEVICE(0x024c, 0xb723), },
 	{ /* end: all zeroes */				},
 };
commit c512298eed0360923d0cbc4a1f30bc0509af0d50
Author: Andrew Jones <drjones at redhat.com>
Date:   Thu Nov 5 10:10:22 2020 +0100

    KVM: arm64: Remove AA64ZFR0_EL1 accessors
    
    The AA64ZFR0_EL1 accessors are just the general accessors with
    its visibility function open-coded. It also skips the if-else
    chain in read_id_reg, but there's no reason not to go there.
    Indeed consolidating ID register accessors and removing lines
    of code make it worthwhile.
    
    Remove the AA64ZFR0_EL1 accessors, replacing them with the
    general accessors for sanitized ID registers.
    
    No functional change intended.
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201105091022.15373-5-drjones@redhat.com

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 4ee098abd87c..436043cd327e 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1154,6 +1154,16 @@ static u64 read_id_reg(const struct kvm_vcpu *vcpu,
 static unsigned int id_visibility(const struct kvm_vcpu *vcpu,
 				  const struct sys_reg_desc *r)
 {
+	u32 id = sys_reg((u32)r->Op0, (u32)r->Op1,
+			 (u32)r->CRn, (u32)r->CRm, (u32)r->Op2);
+
+	switch (id) {
+	case SYS_ID_AA64ZFR0_EL1:
+		if (!vcpu_has_sve(vcpu))
+			return REG_RAZ;
+		break;
+	}
+
 	return 0;
 }
 
@@ -1201,55 +1211,6 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
 	return REG_HIDDEN;
 }
 
-/* Generate the emulated ID_AA64ZFR0_EL1 value exposed to the guest */
-static u64 guest_id_aa64zfr0_el1(const struct kvm_vcpu *vcpu)
-{
-	if (!vcpu_has_sve(vcpu))
-		return 0;
-
-	return read_sanitised_ftr_reg(SYS_ID_AA64ZFR0_EL1);
-}
-
-static bool access_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
-				   struct sys_reg_params *p,
-				   const struct sys_reg_desc *rd)
-{
-	if (p->is_write)
-		return write_to_read_only(vcpu, p, rd);
-
-	p->regval = guest_id_aa64zfr0_el1(vcpu);
-	return true;
-}
-
-static int get_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
-		const struct sys_reg_desc *rd,
-		const struct kvm_one_reg *reg, void __user *uaddr)
-{
-	u64 val;
-
-	val = guest_id_aa64zfr0_el1(vcpu);
-	return reg_to_user(uaddr, &val, reg->id);
-}
-
-static int set_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
-		const struct sys_reg_desc *rd,
-		const struct kvm_one_reg *reg, void __user *uaddr)
-{
-	const u64 id = sys_reg_to_index(rd);
-	int err;
-	u64 val;
-
-	err = reg_from_user(&val, uaddr, id);
-	if (err)
-		return err;
-
-	/* This is what we mean by invariant: you can't change it. */
-	if (val != guest_id_aa64zfr0_el1(vcpu))
-		return -EINVAL;
-
-	return 0;
-}
-
 /*
  * cpufeature ID register user accessors
  *
@@ -1506,7 +1467,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	ID_SANITISED(ID_AA64PFR1_EL1),
 	ID_UNALLOCATED(4,2),
 	ID_UNALLOCATED(4,3),
-	{ SYS_DESC(SYS_ID_AA64ZFR0_EL1), access_id_aa64zfr0_el1, .get_user = get_id_aa64zfr0_el1, .set_user = set_id_aa64zfr0_el1, },
+	ID_SANITISED(ID_AA64ZFR0_EL1),
 	ID_UNALLOCATED(4,5),
 	ID_UNALLOCATED(4,6),
 	ID_UNALLOCATED(4,7),
commit 912dee572691ffb2b387dd8b4f183d549a6b24d1
Author: Andrew Jones <drjones at redhat.com>
Date:   Thu Nov 5 10:10:21 2020 +0100

    KVM: arm64: Check RAZ visibility in ID register accessors
    
    The instruction encodings of ID registers are preallocated. Until an
    encoding is assigned a purpose the register is RAZ. KVM's general ID
    register accessor functions already support both paths, RAZ or not.
    If for each ID register we can determine if it's RAZ or not, then all
    ID registers can build on the general functions. The register visibility
    function allows us to check whether a register should be completely
    hidden or not, extending it to also report when the register should
    be RAZ or not allows us to use it for ID registers as well.
    
    Check for RAZ visibility in the ID register accessor functions,
    allowing the RAZ case to be handled in a generic way for all system
    registers.
    
    The new REG_RAZ flag will be used in a later patch. This patch has
    no intended functional change.
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201105091022.15373-4-drjones@redhat.com

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 26a285127620..4ee098abd87c 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1151,6 +1151,12 @@ static u64 read_id_reg(const struct kvm_vcpu *vcpu,
 	return val;
 }
 
+static unsigned int id_visibility(const struct kvm_vcpu *vcpu,
+				  const struct sys_reg_desc *r)
+{
+	return 0;
+}
+
 /* cpufeature ID register access trap handlers */
 
 static bool __access_id_reg(struct kvm_vcpu *vcpu,
@@ -1169,7 +1175,9 @@ static bool access_id_reg(struct kvm_vcpu *vcpu,
 			  struct sys_reg_params *p,
 			  const struct sys_reg_desc *r)
 {
-	return __access_id_reg(vcpu, p, r, false);
+	bool raz = sysreg_visible_as_raz(vcpu, r);
+
+	return __access_id_reg(vcpu, p, r, raz);
 }
 
 static bool access_raz_id_reg(struct kvm_vcpu *vcpu,
@@ -1281,13 +1289,17 @@ static int __set_id_reg(const struct kvm_vcpu *vcpu,
 static int get_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 		      const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	return __get_id_reg(vcpu, rd, uaddr, false);
+	bool raz = sysreg_visible_as_raz(vcpu, rd);
+
+	return __get_id_reg(vcpu, rd, uaddr, raz);
 }
 
 static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 		      const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	return __set_id_reg(vcpu, rd, uaddr, false);
+	bool raz = sysreg_visible_as_raz(vcpu, rd);
+
+	return __set_id_reg(vcpu, rd, uaddr, raz);
 }
 
 static int get_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
@@ -1372,6 +1384,7 @@ static bool access_ccsidr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
 	.access	= access_id_reg,		\
 	.get_user = get_id_reg,			\
 	.set_user = set_id_reg,			\
+	.visibility = id_visibility,		\
 }
 
 /*
diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h
index 2641b2ee6a91..0f95964339b1 100644
--- a/arch/arm64/kvm/sys_regs.h
+++ b/arch/arm64/kvm/sys_regs.h
@@ -60,6 +60,7 @@ struct sys_reg_desc {
 };
 
 #define REG_HIDDEN		(1 << 0) /* hidden from userspace and guest */
+#define REG_RAZ			(1 << 1) /* RAZ from userspace and guest */
 
 static __printf(2, 3)
 inline void print_sys_reg_msg(const struct sys_reg_params *p,
@@ -119,6 +120,15 @@ static inline bool sysreg_hidden(const struct kvm_vcpu *vcpu,
 	return r->visibility(vcpu, r) & REG_HIDDEN;
 }
 
+static inline bool sysreg_visible_as_raz(const struct kvm_vcpu *vcpu,
+					 const struct sys_reg_desc *r)
+{
+	if (likely(!r->visibility))
+		return false;
+
+	return r->visibility(vcpu, r) & REG_RAZ;
+}
+
 static inline int cmp_sys_reg(const struct sys_reg_desc *i1,
 			      const struct sys_reg_desc *i2)
 {
commit 01fe5ace92ddb8732e3331355e7ba9cb6f2ef787
Author: Andrew Jones <drjones at redhat.com>
Date:   Thu Nov 5 10:10:20 2020 +0100

    KVM: arm64: Consolidate REG_HIDDEN_GUEST/USER
    
    REG_HIDDEN_GUEST and REG_HIDDEN_USER are always used together.
    Consolidate them into a single REG_HIDDEN flag. We can always
    add another flag later if some register needs to expose itself
    differently to the guest than it does to userspace.
    
    No functional change intended.
    
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201105091022.15373-3-drjones@redhat.com

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 3af306e6b9cd..26a285127620 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1069,7 +1069,7 @@ static bool trap_ptrauth(struct kvm_vcpu *vcpu,
 static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
 			const struct sys_reg_desc *rd)
 {
-	return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN_USER | REG_HIDDEN_GUEST;
+	return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN;
 }
 
 #define __PTRAUTH_KEY(k)						\
@@ -1190,7 +1190,7 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
 	if (vcpu_has_sve(vcpu))
 		return 0;
 
-	return REG_HIDDEN_USER | REG_HIDDEN_GUEST;
+	return REG_HIDDEN;
 }
 
 /* Generate the emulated ID_AA64ZFR0_EL1 value exposed to the guest */
@@ -2153,7 +2153,7 @@ static void perform_access(struct kvm_vcpu *vcpu,
 	trace_kvm_sys_access(*vcpu_pc(vcpu), params, r);
 
 	/* Check for regs disabled by runtime config */
-	if (sysreg_hidden_from_guest(vcpu, r)) {
+	if (sysreg_hidden(vcpu, r)) {
 		kvm_inject_undefined(vcpu);
 		return;
 	}
@@ -2652,7 +2652,7 @@ int kvm_arm_sys_reg_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg
 		return get_invariant_sys_reg(reg->id, uaddr);
 
 	/* Check for regs disabled by runtime config */
-	if (sysreg_hidden_from_user(vcpu, r))
+	if (sysreg_hidden(vcpu, r))
 		return -ENOENT;
 
 	if (r->get_user)
@@ -2677,7 +2677,7 @@ int kvm_arm_sys_reg_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg
 		return set_invariant_sys_reg(reg->id, uaddr);
 
 	/* Check for regs disabled by runtime config */
-	if (sysreg_hidden_from_user(vcpu, r))
+	if (sysreg_hidden(vcpu, r))
 		return -ENOENT;
 
 	if (r->set_user)
@@ -2748,7 +2748,7 @@ static int walk_one_sys_reg(const struct kvm_vcpu *vcpu,
 	if (!(rd->reg || rd->get_user))
 		return 0;
 
-	if (sysreg_hidden_from_user(vcpu, rd))
+	if (sysreg_hidden(vcpu, rd))
 		return 0;
 
 	if (!copy_reg_to_user(rd, uind))
diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h
index 5a6fc30f5989..2641b2ee6a91 100644
--- a/arch/arm64/kvm/sys_regs.h
+++ b/arch/arm64/kvm/sys_regs.h
@@ -59,8 +59,7 @@ struct sys_reg_desc {
 				   const struct sys_reg_desc *rd);
 };
 
-#define REG_HIDDEN_USER		(1 << 0) /* hidden from userspace ioctls */
-#define REG_HIDDEN_GUEST	(1 << 1) /* hidden from guest */
+#define REG_HIDDEN		(1 << 0) /* hidden from userspace and guest */
 
 static __printf(2, 3)
 inline void print_sys_reg_msg(const struct sys_reg_params *p,
@@ -111,22 +110,13 @@ static inline void reset_val(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r
 	__vcpu_sys_reg(vcpu, r->reg) = r->val;
 }
 
-static inline bool sysreg_hidden_from_guest(const struct kvm_vcpu *vcpu,
-					    const struct sys_reg_desc *r)
-{
-	if (likely(!r->visibility))
-		return false;
-
-	return r->visibility(vcpu, r) & REG_HIDDEN_GUEST;
-}
-
-static inline bool sysreg_hidden_from_user(const struct kvm_vcpu *vcpu,
-					   const struct sys_reg_desc *r)
+static inline bool sysreg_hidden(const struct kvm_vcpu *vcpu,
+				 const struct sys_reg_desc *r)
 {
 	if (likely(!r->visibility))
 		return false;
 
-	return r->visibility(vcpu, r) & REG_HIDDEN_USER;
+	return r->visibility(vcpu, r) & REG_HIDDEN;
 }
 
 static inline int cmp_sys_reg(const struct sys_reg_desc *i1,
commit f81cb2c3ad41ac6d8cb2650e3d72d5f67db1aa28
Author: Andrew Jones <drjones at redhat.com>
Date:   Thu Nov 5 10:10:19 2020 +0100

    KVM: arm64: Don't hide ID registers from userspace
    
    ID registers are RAZ until they've been allocated a purpose, but
    that doesn't mean they should be removed from the KVM_GET_REG_LIST
    list. So far we only have one register, SYS_ID_AA64ZFR0_EL1, that
    is hidden from userspace when its function, SVE, is not present.
    
    Expose SYS_ID_AA64ZFR0_EL1 to userspace as RAZ when SVE is not
    implemented. Removing the userspace visibility checks is enough
    to reexpose it, as it will already return zero to userspace when
    SVE is not present. The register already behaves as RAZ for the
    guest when SVE is not present.
    
    Fixes: 73433762fcae ("KVM: arm64/sve: System register context switch and access support")
    Reported-by: 张东旭 <xu910121 at sina.com>
    Signed-off-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Cc: stable at vger.kernel.org#v5.2+
    Link: https://lore.kernel.org/r/20201105091022.15373-2-drjones@redhat.com

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 983994f01a63..3af306e6b9cd 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1193,16 +1193,6 @@ static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
 	return REG_HIDDEN_USER | REG_HIDDEN_GUEST;
 }
 
-/* Visibility overrides for SVE-specific ID registers */
-static unsigned int sve_id_visibility(const struct kvm_vcpu *vcpu,
-				      const struct sys_reg_desc *rd)
-{
-	if (vcpu_has_sve(vcpu))
-		return 0;
-
-	return REG_HIDDEN_USER;
-}
-
 /* Generate the emulated ID_AA64ZFR0_EL1 value exposed to the guest */
 static u64 guest_id_aa64zfr0_el1(const struct kvm_vcpu *vcpu)
 {
@@ -1229,9 +1219,6 @@ static int get_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
 {
 	u64 val;
 
-	if (WARN_ON(!vcpu_has_sve(vcpu)))
-		return -ENOENT;
-
 	val = guest_id_aa64zfr0_el1(vcpu);
 	return reg_to_user(uaddr, &val, reg->id);
 }
@@ -1244,9 +1231,6 @@ static int set_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
 	int err;
 	u64 val;
 
-	if (WARN_ON(!vcpu_has_sve(vcpu)))
-		return -ENOENT;
-
 	err = reg_from_user(&val, uaddr, id);
 	if (err)
 		return err;
@@ -1509,7 +1493,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	ID_SANITISED(ID_AA64PFR1_EL1),
 	ID_UNALLOCATED(4,2),
 	ID_UNALLOCATED(4,3),
-	{ SYS_DESC(SYS_ID_AA64ZFR0_EL1), access_id_aa64zfr0_el1, .get_user = get_id_aa64zfr0_el1, .set_user = set_id_aa64zfr0_el1, .visibility = sve_id_visibility },
+	{ SYS_DESC(SYS_ID_AA64ZFR0_EL1), access_id_aa64zfr0_el1, .get_user = get_id_aa64zfr0_el1, .set_user = set_id_aa64zfr0_el1, },
 	ID_UNALLOCATED(4,5),
 	ID_UNALLOCATED(4,6),
 	ID_UNALLOCATED(4,7),
commit faf000397e7f103df9953a312e1df21df1dc797f
Author: Gavin Shan <gshan at redhat.com>
Date:   Tue Nov 3 11:30:09 2020 +1100

    KVM: arm64: Fix build error in user_mem_abort()
    
    The PUD and PMD are folded into PGD when the following options are
    enabled. In that case, PUD_SHIFT is equal to PMD_SHIFT and we fail
    to build with the indicated errors:
    
       CONFIG_ARM64_VA_BITS_42=y
       CONFIG_ARM64_PAGE_SHIFT=16
       CONFIG_PGTABLE_LEVELS=3
    
       arch/arm64/kvm/mmu.c: In function ‘user_mem_abort’:
       arch/arm64/kvm/mmu.c:798:2: error: duplicate case value
         case PMD_SHIFT:
         ^~~~
       arch/arm64/kvm/mmu.c:791:2: note: previously used here
         case PUD_SHIFT:
         ^~~~
    
    This fixes the issue by skipping the check on PUD huge page when PUD
    and PMD are folded into PGD.
    
    Fixes: 2f40c46021bbb ("KVM: arm64: Use fallback mapping sizes for contiguous huge page sizes")
    Reported-by: Eric Auger <eric.auger at redhat.com>
    Signed-off-by: Gavin Shan <gshan at redhat.com>
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201103003009.32955-1-gshan@redhat.com

diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index c7c6df6309d5..a109c5001827 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -788,10 +788,12 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 	}
 
 	switch (vma_shift) {
+#ifndef __PAGETABLE_PMD_FOLDED
 	case PUD_SHIFT:
 		if (fault_supports_stage2_huge_mapping(memslot, hva, PUD_SIZE))
 			break;
 		fallthrough;
+#endif
 	case CONT_PMD_SHIFT:
 		vma_shift = PMD_SHIFT;
 		fallthrough;
commit 10a2f11d3c9e48363c729419e0f0530dea76e4fe
Author: Arnaud de Turckheim <quarium at gmail.com>
Date:   Wed Nov 4 16:24:55 2020 +0100

    gpio: pcie-idio-24: Enable PEX8311 interrupts
    
    This enables the PEX8311 internal PCI wire interrupt and the PEX8311
    local interrupt input so the local interrupts are forwarded to the PCI.
    
    Fixes: 585562046628 ("gpio: Add GPIO support for the ACCES PCIe-IDIO-24 family")
    Cc: stable at vger.kernel.org
    Signed-off-by: Arnaud de Turckheim <quarium at gmail.com>
    Reviewed-by: William Breathitt Gray <vilhelm.gray at gmail.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c
index a61de14d09b6..2a07fd96707e 100644
--- a/drivers/gpio/gpio-pcie-idio-24.c
+++ b/drivers/gpio/gpio-pcie-idio-24.c
@@ -28,6 +28,47 @@
 #include <linux/spinlock.h>
 #include <linux/types.h>
 
+/*
+ * PLX PEX8311 PCI LCS_INTCSR Interrupt Control/Status
+ *
+ * Bit: Description
+ *   0: Enable Interrupt Sources (Bit 0)
+ *   1: Enable Interrupt Sources (Bit 1)
+ *   2: Generate Internal PCI Bus Internal SERR# Interrupt
+ *   3: Mailbox Interrupt Enable
+ *   4: Power Management Interrupt Enable
+ *   5: Power Management Interrupt
+ *   6: Slave Read Local Data Parity Check Error Enable
+ *   7: Slave Read Local Data Parity Check Error Status
+ *   8: Internal PCI Wire Interrupt Enable
+ *   9: PCI Express Doorbell Interrupt Enable
+ *  10: PCI Abort Interrupt Enable
+ *  11: Local Interrupt Input Enable
+ *  12: Retry Abort Enable
+ *  13: PCI Express Doorbell Interrupt Active
+ *  14: PCI Abort Interrupt Active
+ *  15: Local Interrupt Input Active
+ *  16: Local Interrupt Output Enable
+ *  17: Local Doorbell Interrupt Enable
+ *  18: DMA Channel 0 Interrupt Enable
+ *  19: DMA Channel 1 Interrupt Enable
+ *  20: Local Doorbell Interrupt Active
+ *  21: DMA Channel 0 Interrupt Active
+ *  22: DMA Channel 1 Interrupt Active
+ *  23: Built-In Self-Test (BIST) Interrupt Active
+ *  24: Direct Master was the Bus Master during a Master or Target Abort
+ *  25: DMA Channel 0 was the Bus Master during a Master or Target Abort
+ *  26: DMA Channel 1 was the Bus Master during a Master or Target Abort
+ *  27: Target Abort after internal 256 consecutive Master Retrys
+ *  28: PCI Bus wrote data to LCS_MBOX0
+ *  29: PCI Bus wrote data to LCS_MBOX1
+ *  30: PCI Bus wrote data to LCS_MBOX2
+ *  31: PCI Bus wrote data to LCS_MBOX3
+ */
+#define PLX_PEX8311_PCI_LCS_INTCSR  0x68
+#define INTCSR_INTERNAL_PCI_WIRE    BIT(8)
+#define INTCSR_LOCAL_INPUT          BIT(11)
+
 /**
  * struct idio_24_gpio_reg - GPIO device registers structure
  * @out0_7:	Read: FET Outputs 0-7
@@ -92,6 +133,7 @@ struct idio_24_gpio_reg {
 struct idio_24_gpio {
 	struct gpio_chip chip;
 	raw_spinlock_t lock;
+	__u8 __iomem *plx;
 	struct idio_24_gpio_reg __iomem *reg;
 	unsigned long irq_mask;
 };
@@ -455,6 +497,7 @@ static int idio_24_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	struct device *const dev = &pdev->dev;
 	struct idio_24_gpio *idio24gpio;
 	int err;
+	const size_t pci_plx_bar_index = 1;
 	const size_t pci_bar_index = 2;
 	const char *const name = pci_name(pdev);
 	struct gpio_irq_chip *girq;
@@ -469,12 +512,13 @@ static int idio_24_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 		return err;
 	}
 
-	err = pcim_iomap_regions(pdev, BIT(pci_bar_index), name);
+	err = pcim_iomap_regions(pdev, BIT(pci_plx_bar_index) | BIT(pci_bar_index), name);
 	if (err) {
 		dev_err(dev, "Unable to map PCI I/O addresses (%d)\n", err);
 		return err;
 	}
 
+	idio24gpio->plx = pcim_iomap_table(pdev)[pci_plx_bar_index];
 	idio24gpio->reg = pcim_iomap_table(pdev)[pci_bar_index];
 
 	idio24gpio->chip.label = name;
@@ -504,6 +548,12 @@ static int idio_24_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
 	/* Software board reset */
 	iowrite8(0, &idio24gpio->reg->soft_reset);
+	/*
+	 * enable PLX PEX8311 internal PCI wire interrupt and local interrupt
+	 * input
+	 */
+	iowrite8((INTCSR_INTERNAL_PCI_WIRE | INTCSR_LOCAL_INPUT) >> 8,
+		 idio24gpio->plx + PLX_PEX8311_PCI_LCS_INTCSR + 1);
 
 	err = devm_gpiochip_add_data(dev, &idio24gpio->chip, idio24gpio);
 	if (err) {
commit 23a7fdc06ebcc334fa667f0550676b035510b70b
Author: Arnaud de Turckheim <quarium at gmail.com>
Date:   Wed Nov 4 16:24:54 2020 +0100

    gpio: pcie-idio-24: Fix IRQ Enable Register value
    
    This fixes the COS Enable Register value for enabling/disabling the
    corresponding IRQs bank.
    
    Fixes: 585562046628 ("gpio: Add GPIO support for the ACCES PCIe-IDIO-24 family")
    Cc: stable at vger.kernel.org
    Signed-off-by: Arnaud de Turckheim <quarium at gmail.com>
    Reviewed-by: William Breathitt Gray <vilhelm.gray at gmail.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c
index 5ea517416366..a61de14d09b6 100644
--- a/drivers/gpio/gpio-pcie-idio-24.c
+++ b/drivers/gpio/gpio-pcie-idio-24.c
@@ -334,13 +334,13 @@ static void idio_24_irq_mask(struct irq_data *data)
 	unsigned long flags;
 	const unsigned long bit_offset = irqd_to_hwirq(data) - 24;
 	unsigned char new_irq_mask;
-	const unsigned long bank_offset = bit_offset/8 * 8;
+	const unsigned long bank_offset = bit_offset / 8;
 	unsigned char cos_enable_state;
 
 	raw_spin_lock_irqsave(&idio24gpio->lock, flags);
 
 	idio24gpio->irq_mask &= ~BIT(bit_offset);
-	new_irq_mask = idio24gpio->irq_mask >> bank_offset;
+	new_irq_mask = idio24gpio->irq_mask >> bank_offset * 8;
 
 	if (!new_irq_mask) {
 		cos_enable_state = ioread8(&idio24gpio->reg->cos_enable);
@@ -363,12 +363,12 @@ static void idio_24_irq_unmask(struct irq_data *data)
 	unsigned long flags;
 	unsigned char prev_irq_mask;
 	const unsigned long bit_offset = irqd_to_hwirq(data) - 24;
-	const unsigned long bank_offset = bit_offset/8 * 8;
+	const unsigned long bank_offset = bit_offset / 8;
 	unsigned char cos_enable_state;
 
 	raw_spin_lock_irqsave(&idio24gpio->lock, flags);
 
-	prev_irq_mask = idio24gpio->irq_mask >> bank_offset;
+	prev_irq_mask = idio24gpio->irq_mask >> bank_offset * 8;
 	idio24gpio->irq_mask |= BIT(bit_offset);
 
 	if (!prev_irq_mask) {
commit d8f270efeac850c569c305dc0baa42ac3d607988
Author: Arnaud de Turckheim <quarium at gmail.com>
Date:   Wed Nov 4 16:24:53 2020 +0100

    gpio: pcie-idio-24: Fix irq mask when masking
    
    Fix the bitwise operation to remove only the corresponding bit from the
    mask.
    
    Fixes: 585562046628 ("gpio: Add GPIO support for the ACCES PCIe-IDIO-24 family")
    Cc: stable at vger.kernel.org
    Signed-off-by: Arnaud de Turckheim <quarium at gmail.com>
    Reviewed-by: William Breathitt Gray <vilhelm.gray at gmail.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c
index a68941d19ac6..5ea517416366 100644
--- a/drivers/gpio/gpio-pcie-idio-24.c
+++ b/drivers/gpio/gpio-pcie-idio-24.c
@@ -339,7 +339,7 @@ static void idio_24_irq_mask(struct irq_data *data)
 
 	raw_spin_lock_irqsave(&idio24gpio->lock, flags);
 
-	idio24gpio->irq_mask &= BIT(bit_offset);
+	idio24gpio->irq_mask &= ~BIT(bit_offset);
 	new_irq_mask = idio24gpio->irq_mask >> bank_offset;
 
 	if (!new_irq_mask) {
commit f6439c531d52193f890807958aaec52905bc0f2e
Author: Mika Westerberg <mika.westerberg at linux.intel.com>
Date:   Sat Mar 28 11:59:11 2020 +0200

    thunderbolt: Add support for Intel Tiger Lake-H
    
    Intel Tiger Lake-H has the same Thunderbolt/USB4 controller as Tiger
    Lake-LP. Add the Tiger Lake-H PCI IDs to the driver list of supported
    devices.
    
    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
index b51fc3f62b1f..977ba91f4d0e 100644
--- a/drivers/thunderbolt/icm.c
+++ b/drivers/thunderbolt/icm.c
@@ -2284,6 +2284,8 @@ struct tb *icm_probe(struct tb_nhi *nhi)
 
 	case PCI_DEVICE_ID_INTEL_TGL_NHI0:
 	case PCI_DEVICE_ID_INTEL_TGL_NHI1:
+	case PCI_DEVICE_ID_INTEL_TGL_H_NHI0:
+	case PCI_DEVICE_ID_INTEL_TGL_H_NHI1:
 		icm->is_supported = icm_tgl_is_supported;
 		icm->driver_ready = icm_icl_driver_ready;
 		icm->set_uuid = icm_icl_set_uuid;
diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index e29ac3e3aa1e..db80dc5dfeba 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -1345,6 +1345,10 @@ static struct pci_device_id nhi_ids[] = {
 	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },
 	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL_NHI1),
 	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },
+	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL_H_NHI0),
+	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },
+	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL_H_NHI1),
+	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },
 
 	/* Any USB4 compliant host */
 	{ PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_USB4, ~0) },
diff --git a/drivers/thunderbolt/nhi.h b/drivers/thunderbolt/nhi.h
index 80162e4b013f..4e0861d75072 100644
--- a/drivers/thunderbolt/nhi.h
+++ b/drivers/thunderbolt/nhi.h
@@ -75,6 +75,8 @@ extern const struct tb_nhi_ops icl_nhi_ops;
 #define PCI_DEVICE_ID_INTEL_ICL_NHI0			0x8a17
 #define PCI_DEVICE_ID_INTEL_TGL_NHI0			0x9a1b
 #define PCI_DEVICE_ID_INTEL_TGL_NHI1			0x9a1d
+#define PCI_DEVICE_ID_INTEL_TGL_H_NHI0			0x9a1f
+#define PCI_DEVICE_ID_INTEL_TGL_H_NHI1			0x9a21
 
 #define PCI_CLASS_SERIAL_USB_USB4			0x0c0340
 
diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
index a9995e21b916..8ea360b0ff77 100644
--- a/drivers/thunderbolt/tb.h
+++ b/drivers/thunderbolt/tb.h
@@ -784,6 +784,8 @@ static inline bool tb_switch_is_tiger_lake(const struct tb_switch *sw)
 		switch (sw->config.device_id) {
 		case PCI_DEVICE_ID_INTEL_TGL_NHI0:
 		case PCI_DEVICE_ID_INTEL_TGL_NHI1:
+		case PCI_DEVICE_ID_INTEL_TGL_H_NHI0:
+		case PCI_DEVICE_ID_INTEL_TGL_H_NHI1:
 			return true;
 		}
 	}
commit 06ea594051707c6b8834ef5b24e9b0730edd391b
Author: Necip Fazil Yildiran <fazilyildiran at gmail.com>
Date:   Wed Nov 4 21:15:23 2020 +0300

    staging: ralink-gdma: fix kconfig dependency bug for DMA_RALINK
    
    When DMA_RALINK is enabled and DMADEVICES is disabled, it results in the
    following Kbuild warnings:
    
    WARNING: unmet direct dependencies detected for DMA_ENGINE
      Depends on [n]: DMADEVICES [=n]
      Selected by [y]:
      - DMA_RALINK [=y] && STAGING [=y] && RALINK [=y] && !SOC_RT288X [=n]
    
    WARNING: unmet direct dependencies detected for DMA_VIRTUAL_CHANNELS
      Depends on [n]: DMADEVICES [=n]
      Selected by [y]:
      - DMA_RALINK [=y] && STAGING [=y] && RALINK [=y] && !SOC_RT288X [=n]
    
    The reason is that DMA_RALINK selects DMA_ENGINE and DMA_VIRTUAL_CHANNELS
    without depending on or selecting DMADEVICES while DMA_ENGINE and
    DMA_VIRTUAL_CHANNELS are subordinate to DMADEVICES. This can also fail
    building the kernel as demonstrated in a bug report.
    
    Honor the kconfig dependency to remove unmet direct dependency warnings
    and avoid any potential build failures.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=210055
    Signed-off-by: Necip Fazil Yildiran <fazilyildiran at gmail.com>
    Link: https://lore.kernel.org/r/20201104181522.43567-1-fazilyildiran@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/staging/ralink-gdma/Kconfig b/drivers/staging/ralink-gdma/Kconfig
index 54e8029e6b1a..0017376234e2 100644
--- a/drivers/staging/ralink-gdma/Kconfig
+++ b/drivers/staging/ralink-gdma/Kconfig
@@ -2,6 +2,7 @@
 config DMA_RALINK
 	tristate "RALINK DMA support"
 	depends on RALINK && !SOC_RT288X
+	depends on DMADEVICES
 	select DMA_ENGINE
 	select DMA_VIRTUAL_CHANNELS
 
commit e2b2e4386cb7a5e935dff388cf8961317daf39ce
Author: Sergio Paracuellos <sergio.paracuellos at gmail.com>
Date:   Mon Nov 2 21:25:15 2020 +0100

    staging: mt7621-pci: avoid to request pci bus resources
    
    After upgrading kernel to version 5.9.x the driver was not
    working anymore showing the following kernel trace:
    
    ...
    mt7621-pci 1e140000.pcie: resource collision:
    [mem 0x60000000-0x6fffffff] conflicts with pcie at 1e140000 [mem 0x60000000-0x6fffffff]
    ------------[ cut here ]------------
    WARNING: CPU: 2 PID: 73 at kernel/resource.c:1400
    devm_request_resource+0xfc/0x10c
    Modules linked in:
    CPU: 2 PID: 73 Comm: kworker/2:1 Not tainted 5.9.2 #0
    Workqueue: events deferred_probe_work_func
    Stack : 00000000 81590000 807d0a1c 808a0000 8fd49080
            807d0000 00000009 808ac820
            00000001 808338d0 7fff0001 800839dc 00000049
            00000001 8fe51b00 367204ab
            00000000 00000000 807d0a1c 807c0000 00000001
            80082358 8fe50000 00559000
            00000000 8fe519f1 ffffffff 00000005 00000000
            00000001 00000000 807d0000
            00000009 808ac820 00000001 808338d0 00000001
            803bf1b0 00000008 81390008
    
    Call Trace:
    [<8000d018>] show_stack+0x30/0x100
    [<8032e66c>] dump_stack+0xa4/0xd4
    [<8002db1c>] __warn+0xc0/0x134
    [<8002dbec>] warn_slowpath_fmt+0x5c/0xac
    [<80033b34>] devm_request_resource+0xfc/0x10c
    [<80365ff8>] devm_request_pci_bus_resources+0x58/0xdc
    [<8048e13c>] mt7621_pci_probe+0x8dc/0xe48
    [<803d2140>] platform_drv_probe+0x40/0x94
    [<803cfd94>] really_probe+0x108/0x4ec
    [<803cd958>] bus_for_each_drv+0x70/0xb0
    [<803d0388>] __device_attach+0xec/0x164
    [<803cec8c>] bus_probe_device+0xa4/0xc0
    [<803cf1c4>] deferred_probe_work_func+0x80/0xc4
    [<80048444>] process_one_work+0x260/0x510
    [<80048a4c>] worker_thread+0x358/0x5cc
    [<8004f7d0>] kthread+0x134/0x13c
    [<80007478>] ret_from_kernel_thread+0x14/0x1c
    ---[ end trace a9dd2e37537510d3 ]---
    mt7621-pci 1e140000.pcie: Error requesting resources
    mt7621-pci: probe of 1e140000.pcie failed with error -16
    ...
    
    With commit 669cbc708122 ("PCI: Move DT resource setup into
    devm_pci_alloc_host_bridge()"), the DT 'ranges' is parsed and populated
    into resources when the host bridge is allocated. The resources are
    requested as well, but that happens a 2nd time for this driver in
    mt7621_pcie_request_resources(). Hence we should avoid this second
    request.
    
    Also, the bus ranges was also populated by default, so we can remove
    it from mt7621_pcie_request_resources() to avoid the following trace
    if we don't avoid it:
    
    pci_bus 0000:00: busn_res: can not insert [bus 00-ff]
    under domain [bus 00-ff] (conflicts with (null) [bus 00-ff])
    
    Function 'mt7621_pcie_request_resources' has been renamed into
    'mt7621_pcie_add_resources' which now is a more accurate name
    for this function.
    
    Cc: stable at vger.kernel.org #5.9.x-
    Signed-off-by: Sergio Paracuellos <sergio.paracuellos at gmail.com>
    Link: https://lore.kernel.org/r/20201102202515.19073-1-sergio.paracuellos@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c
index f961b353c22e..8831db383fad 100644
--- a/drivers/staging/mt7621-pci/pci-mt7621.c
+++ b/drivers/staging/mt7621-pci/pci-mt7621.c
@@ -653,16 +653,11 @@ static int mt7621_pcie_init_virtual_bridges(struct mt7621_pcie *pcie)
 	return 0;
 }
 
-static int mt7621_pcie_request_resources(struct mt7621_pcie *pcie,
-					 struct list_head *res)
+static void mt7621_pcie_add_resources(struct mt7621_pcie *pcie,
+				      struct list_head *res)
 {
-	struct device *dev = pcie->dev;
-
 	pci_add_resource_offset(res, &pcie->io, pcie->offset.io);
 	pci_add_resource_offset(res, &pcie->mem, pcie->offset.mem);
-	pci_add_resource(res, &pcie->busn);
-
-	return devm_request_pci_bus_resources(dev, res);
 }
 
 static int mt7621_pcie_register_host(struct pci_host_bridge *host,
@@ -738,11 +733,7 @@ static int mt7621_pci_probe(struct platform_device *pdev)
 
 	setup_cm_memory_region(pcie);
 
-	err = mt7621_pcie_request_resources(pcie, &res);
-	if (err) {
-		dev_err(dev, "Error requesting resources\n");
-		return err;
-	}
+	mt7621_pcie_add_resources(pcie, &res);
 
 	err = mt7621_pcie_register_host(bridge, &res);
 	if (err) {
commit 90574a9c02f1ed46d9d8fec222fbcf375eb90e9b
Author: Lukas Bulwahn <lukas.bulwahn at gmail.com>
Date:   Fri Nov 6 04:40:05 2020 +0100

    printk: remove unneeded dead-store assignment
    
    make clang-analyzer on x86_64 defconfig caught my attention with:
    
      kernel/printk/printk_ringbuffer.c:885:3: warning:
      Value stored to 'desc' is never read [clang-analyzer-deadcode.DeadStores]
    
                    desc = to_desc(desc_ring, head_id);
                    ^
    
    Commit b6cf8b3f3312 ("printk: add lockless ringbuffer") introduced
    desc_reserve() with this unneeded dead-store assignment.
    
    As discussed with John Ogness privately, this is probably just some minor
    left-over from previous iterations of the ringbuffer implementation. So,
    simply remove this unneeded dead assignment to make clang-analyzer happy.
    
    As compilers will detect this unneeded assignment and optimize this anyway,
    the resulting object code is identical before and after this change.
    
    No functional change. No change to object code.
    
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn at gmail.com>
    Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky at gmail.com>
    Reviewed-by: John Ogness <john.ogness at linutronix.de>
    Reviewed-by: Nathan Chancellor <natechancellor at gmail.com>
    Signed-off-by: Petr Mladek <pmladek at suse.com>
    Link: https://lore.kernel.org/r/20201106034005.18822-1-lukas.bulwahn@gmail.com

diff --git a/kernel/printk/printk_ringbuffer.c b/kernel/printk/printk_ringbuffer.c
index 24a960a89aa8..dd43c4cf16fb 100644
--- a/kernel/printk/printk_ringbuffer.c
+++ b/kernel/printk/printk_ringbuffer.c
@@ -882,8 +882,6 @@ static bool desc_reserve(struct printk_ringbuffer *rb, unsigned long *id_out)
 	head_id = atomic_long_read(&desc_ring->head_id); /* LMM(desc_reserve:A) */
 
 	do {
-		desc = to_desc(desc_ring, head_id);
-
 		id = DESC_ID(head_id + 1);
 		id_prev_wrap = DESC_ID_PREV_WRAP(desc_ring, id);
 
commit d85b4b2bf2d4229847d76cfd81e48d5beb72f75b
Author: Chi-Hsien Lin <chi-hsien.lin at cypress.com>
Date:   Fri Oct 30 03:56:10 2020 -0500

    MAINTAINERS: update maintainers list for Cypress
    
    - Update maintainers' email with Infineon hosted email
    - Add Chung-hsien Hsu as a maintainer
    
    Signed-off-by: Chi-Hsien Lin <chi-hsien.lin at cypress.com>
    Signed-off-by: Wright Feng <wright.feng at cypress.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/20201030085610.145679-1-chi-hsien.lin@cypress.com

diff --git a/MAINTAINERS b/MAINTAINERS
index bd2d28cfdb4e..900ff33789eb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3541,11 +3541,12 @@ BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
 M:	Arend van Spriel <arend.vanspriel at broadcom.com>
 M:	Franky Lin <franky.lin at broadcom.com>
 M:	Hante Meuleman <hante.meuleman at broadcom.com>
-M:	Chi-Hsien Lin <chi-hsien.lin at cypress.com>
-M:	Wright Feng <wright.feng at cypress.com>
+M:	Chi-hsien Lin <chi-hsien.lin at infineon.com>
+M:	Wright Feng <wright.feng at infineon.com>
+M:	Chung-hsien Hsu <chung-hsien.hsu at infineon.com>
 L:	linux-wireless at vger.kernel.org
 L:	brcm80211-dev-list.pdl at broadcom.com
-L:	brcm80211-dev-list at cypress.com
+L:	SHA-cyfmac-dev-list at infineon.com
 S:	Supported
 F:	drivers/net/wireless/broadcom/brcm80211/
 
commit 397a973b9978533418892c6453853c52b2ad8ec6
Author: Yan-Hsuan Chuang <tony0620emma at gmail.com>
Date:   Mon Oct 12 16:11:40 2020 +0800

    MAINTAINERS: update Yan-Hsuan's email address
    
    Switch my email to gmail.com address.
    
    Signed-off-by: Yan-Hsuan Chuang <tony0620emma at gmail.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/20201012081140.18085-1-tony0620emma@gmail.com

diff --git a/MAINTAINERS b/MAINTAINERS
index e73636b75f29..bd2d28cfdb4e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14831,7 +14831,7 @@ T:	git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.g
 F:	drivers/net/wireless/realtek/rtlwifi/
 
 REALTEK WIRELESS DRIVER (rtw88)
-M:	Yan-Hsuan Chuang <yhchuang at realtek.com>
+M:	Yan-Hsuan Chuang <tony0620emma at gmail.com>
 L:	linux-wireless at vger.kernel.org
 S:	Maintained
 F:	drivers/net/wireless/realtek/rtw88/
commit d3bec0138bfbe58606fc1d6f57a4cdc1a20218db
Author: David Verbeiren <david.verbeiren at tessares.net>
Date:   Wed Nov 4 12:23:32 2020 +0100

    bpf: Zero-fill re-used per-cpu map element
    
    Zero-fill element values for all other cpus than current, just as
    when not using prealloc. This is the only way the bpf program can
    ensure known initial values for all cpus ('onallcpus' cannot be
    set when coming from the bpf program).
    
    The scenario is: bpf program inserts some elements in a per-cpu
    map, then deletes some (or userspace does). When later adding
    new elements using bpf_map_update_elem(), the bpf program can
    only set the value of the new elements for the current cpu.
    When prealloc is enabled, previously deleted elements are re-used.
    Without the fix, values for other cpus remain whatever they were
    when the re-used entry was previously freed.
    
    A selftest is added to validate correct operation in above
    scenario as well as in case of LRU per-cpu map element re-use.
    
    Fixes: 6c9059817432 ("bpf: pre-allocate hash map elements")
    Signed-off-by: David Verbeiren <david.verbeiren at tessares.net>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Acked-by: Matthieu Baerts <matthieu.baerts at tessares.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201104112332.15191-1-david.verbeiren@tessares.net

diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
index 1815e97d4c9c..1fccba6e88c4 100644
--- a/kernel/bpf/hashtab.c
+++ b/kernel/bpf/hashtab.c
@@ -821,6 +821,32 @@ static void pcpu_copy_value(struct bpf_htab *htab, void __percpu *pptr,
 	}
 }
 
+static void pcpu_init_value(struct bpf_htab *htab, void __percpu *pptr,
+			    void *value, bool onallcpus)
+{
+	/* When using prealloc and not setting the initial value on all cpus,
+	 * zero-fill element values for other cpus (just as what happens when
+	 * not using prealloc). Otherwise, bpf program has no way to ensure
+	 * known initial values for cpus other than current one
+	 * (onallcpus=false always when coming from bpf prog).
+	 */
+	if (htab_is_prealloc(htab) && !onallcpus) {
+		u32 size = round_up(htab->map.value_size, 8);
+		int current_cpu = raw_smp_processor_id();
+		int cpu;
+
+		for_each_possible_cpu(cpu) {
+			if (cpu == current_cpu)
+				bpf_long_memcpy(per_cpu_ptr(pptr, cpu), value,
+						size);
+			else
+				memset(per_cpu_ptr(pptr, cpu), 0, size);
+		}
+	} else {
+		pcpu_copy_value(htab, pptr, value, onallcpus);
+	}
+}
+
 static bool fd_htab_map_needs_adjust(const struct bpf_htab *htab)
 {
 	return htab->map.map_type == BPF_MAP_TYPE_HASH_OF_MAPS &&
@@ -891,7 +917,7 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
 			}
 		}
 
-		pcpu_copy_value(htab, pptr, value, onallcpus);
+		pcpu_init_value(htab, pptr, value, onallcpus);
 
 		if (!prealloc)
 			htab_elem_set_ptr(l_new, key_size, pptr);
@@ -1183,7 +1209,7 @@ static int __htab_lru_percpu_map_update_elem(struct bpf_map *map, void *key,
 		pcpu_copy_value(htab, htab_elem_get_ptr(l_old, key_size),
 				value, onallcpus);
 	} else {
-		pcpu_copy_value(htab, htab_elem_get_ptr(l_new, key_size),
+		pcpu_init_value(htab, htab_elem_get_ptr(l_new, key_size),
 				value, onallcpus);
 		hlist_nulls_add_head_rcu(&l_new->hash_node, head);
 		l_new = NULL;
diff --git a/tools/testing/selftests/bpf/prog_tests/map_init.c b/tools/testing/selftests/bpf/prog_tests/map_init.c
new file mode 100644
index 000000000000..14a31109dd0e
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/map_init.c
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (c) 2020 Tessares SA <http://www.tessares.net> */
+
+#include <test_progs.h>
+#include "test_map_init.skel.h"
+
+#define TEST_VALUE 0x1234
+#define FILL_VALUE 0xdeadbeef
+
+static int nr_cpus;
+static int duration;
+
+typedef unsigned long long map_key_t;
+typedef unsigned long long map_value_t;
+typedef struct {
+	map_value_t v; /* padding */
+} __bpf_percpu_val_align pcpu_map_value_t;
+
+
+static int map_populate(int map_fd, int num)
+{
+	pcpu_map_value_t value[nr_cpus];
+	int i, err;
+	map_key_t key;
+
+	for (i = 0; i < nr_cpus; i++)
+		bpf_percpu(value, i) = FILL_VALUE;
+
+	for (key = 1; key <= num; key++) {
+		err = bpf_map_update_elem(map_fd, &key, value, BPF_NOEXIST);
+		if (!ASSERT_OK(err, "bpf_map_update_elem"))
+			return -1;
+	}
+
+	return 0;
+}
+
+static struct test_map_init *setup(enum bpf_map_type map_type, int map_sz,
+			    int *map_fd, int populate)
+{
+	struct test_map_init *skel;
+	int err;
+
+	skel = test_map_init__open();
+	if (!ASSERT_OK_PTR(skel, "skel_open"))
+		return NULL;
+
+	err = bpf_map__set_type(skel->maps.hashmap1, map_type);
+	if (!ASSERT_OK(err, "bpf_map__set_type"))
+		goto error;
+
+	err = bpf_map__set_max_entries(skel->maps.hashmap1, map_sz);
+	if (!ASSERT_OK(err, "bpf_map__set_max_entries"))
+		goto error;
+
+	err = test_map_init__load(skel);
+	if (!ASSERT_OK(err, "skel_load"))
+		goto error;
+
+	*map_fd = bpf_map__fd(skel->maps.hashmap1);
+	if (CHECK(*map_fd < 0, "bpf_map__fd", "failed\n"))
+		goto error;
+
+	err = map_populate(*map_fd, populate);
+	if (!ASSERT_OK(err, "map_populate"))
+		goto error_map;
+
+	return skel;
+
+error_map:
+	close(*map_fd);
+error:
+	test_map_init__destroy(skel);
+	return NULL;
+}
+
+/* executes bpf program that updates map with key, value */
+static int prog_run_insert_elem(struct test_map_init *skel, map_key_t key,
+				map_value_t value)
+{
+	struct test_map_init__bss *bss;
+
+	bss = skel->bss;
+
+	bss->inKey = key;
+	bss->inValue = value;
+	bss->inPid = getpid();
+
+	if (!ASSERT_OK(test_map_init__attach(skel), "skel_attach"))
+		return -1;
+
+	/* Let tracepoint trigger */
+	syscall(__NR_getpgid);
+
+	test_map_init__detach(skel);
+
+	return 0;
+}
+
+static int check_values_one_cpu(pcpu_map_value_t *value, map_value_t expected)
+{
+	int i, nzCnt = 0;
+	map_value_t val;
+
+	for (i = 0; i < nr_cpus; i++) {
+		val = bpf_percpu(value, i);
+		if (val) {
+			if (CHECK(val != expected, "map value",
+				  "unexpected for cpu %d: 0x%llx\n", i, val))
+				return -1;
+			nzCnt++;
+		}
+	}
+
+	if (CHECK(nzCnt != 1, "map value", "set for %d CPUs instead of 1!\n",
+		  nzCnt))
+		return -1;
+
+	return 0;
+}
+
+/* Add key=1 elem with values set for all CPUs
+ * Delete elem key=1
+ * Run bpf prog that inserts new key=1 elem with value=0x1234
+ *   (bpf prog can only set value for current CPU)
+ * Lookup Key=1 and check value is as expected for all CPUs:
+ *   value set by bpf prog for one CPU, 0 for all others
+ */
+static void test_pcpu_map_init(void)
+{
+	pcpu_map_value_t value[nr_cpus];
+	struct test_map_init *skel;
+	int map_fd, err;
+	map_key_t key;
+
+	/* max 1 elem in map so insertion is forced to reuse freed entry */
+	skel = setup(BPF_MAP_TYPE_PERCPU_HASH, 1, &map_fd, 1);
+	if (!ASSERT_OK_PTR(skel, "prog_setup"))
+		return;
+
+	/* delete element so the entry can be re-used*/
+	key = 1;
+	err = bpf_map_delete_elem(map_fd, &key);
+	if (!ASSERT_OK(err, "bpf_map_delete_elem"))
+		goto cleanup;
+
+	/* run bpf prog that inserts new elem, re-using the slot just freed */
+	err = prog_run_insert_elem(skel, key, TEST_VALUE);
+	if (!ASSERT_OK(err, "prog_run_insert_elem"))
+		goto cleanup;
+
+	/* check that key=1 was re-created by bpf prog */
+	err = bpf_map_lookup_elem(map_fd, &key, value);
+	if (!ASSERT_OK(err, "bpf_map_lookup_elem"))
+		goto cleanup;
+
+	/* and has expected values */
+	check_values_one_cpu(value, TEST_VALUE);
+
+cleanup:
+	test_map_init__destroy(skel);
+}
+
+/* Add key=1 and key=2 elems with values set for all CPUs
+ * Run bpf prog that inserts new key=3 elem
+ *   (only for current cpu; other cpus should have initial value = 0)
+ * Lookup Key=1 and check value is as expected for all CPUs
+ */
+static void test_pcpu_lru_map_init(void)
+{
+	pcpu_map_value_t value[nr_cpus];
+	struct test_map_init *skel;
+	int map_fd, err;
+	map_key_t key;
+
+	/* Set up LRU map with 2 elements, values filled for all CPUs.
+	 * With these 2 elements, the LRU map is full
+	 */
+	skel = setup(BPF_MAP_TYPE_LRU_PERCPU_HASH, 2, &map_fd, 2);
+	if (!ASSERT_OK_PTR(skel, "prog_setup"))
+		return;
+
+	/* run bpf prog that inserts new key=3 element, re-using LRU slot */
+	key = 3;
+	err = prog_run_insert_elem(skel, key, TEST_VALUE);
+	if (!ASSERT_OK(err, "prog_run_insert_elem"))
+		goto cleanup;
+
+	/* check that key=3 replaced one of earlier elements */
+	err = bpf_map_lookup_elem(map_fd, &key, value);
+	if (!ASSERT_OK(err, "bpf_map_lookup_elem"))
+		goto cleanup;
+
+	/* and has expected values */
+	check_values_one_cpu(value, TEST_VALUE);
+
+cleanup:
+	test_map_init__destroy(skel);
+}
+
+void test_map_init(void)
+{
+	nr_cpus = bpf_num_possible_cpus();
+	if (nr_cpus <= 1) {
+		printf("%s:SKIP: >1 cpu needed for this test\n", __func__);
+		test__skip();
+		return;
+	}
+
+	if (test__start_subtest("pcpu_map_init"))
+		test_pcpu_map_init();
+	if (test__start_subtest("pcpu_lru_map_init"))
+		test_pcpu_lru_map_init();
+}
diff --git a/tools/testing/selftests/bpf/progs/test_map_init.c b/tools/testing/selftests/bpf/progs/test_map_init.c
new file mode 100644
index 000000000000..c89d28ead673
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_map_init.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2020 Tessares SA <http://www.tessares.net> */
+
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+
+__u64 inKey = 0;
+__u64 inValue = 0;
+__u32 inPid = 0;
+
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_HASH);
+	__uint(max_entries, 2);
+	__type(key, __u64);
+	__type(value, __u64);
+} hashmap1 SEC(".maps");
+
+
+SEC("tp/syscalls/sys_enter_getpgid")
+int sysenter_getpgid(const void *ctx)
+{
+	/* Just do it for once, when called from our own test prog. This
+	 * ensures the map value is only updated for a single CPU.
+	 */
+	int cur_pid = bpf_get_current_pid_tgid() >> 32;
+
+	if (cur_pid == inPid)
+		bpf_map_update_elem(&hashmap1, &inKey, &inValue, BPF_NOEXIST);
+
+	return 0;
+}
+
+char _license[] SEC("license") = "GPL";
commit 7c0afcad7507636529e6a5a2a5eef5482619a449
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Thu Nov 5 11:51:09 2020 -0800

    bpf: BPF_PRELOAD depends on BPF_SYSCALL
    
    Fix build error when BPF_SYSCALL is not set/enabled but BPF_PRELOAD is
    by making BPF_PRELOAD depend on BPF_SYSCALL.
    
    ERROR: modpost: "bpf_preload_ops" [kernel/bpf/preload/bpf_preload.ko] undefined!
    
    Reported-by: kernel test robot <lkp at intel.com>
    Reported-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Link: https://lore.kernel.org/bpf/20201105195109.26232-1-rdunlap@infradead.org

diff --git a/kernel/bpf/preload/Kconfig b/kernel/bpf/preload/Kconfig
index ace49111d3a3..26bced262473 100644
--- a/kernel/bpf/preload/Kconfig
+++ b/kernel/bpf/preload/Kconfig
@@ -6,6 +6,7 @@ config USERMODE_DRIVER
 menuconfig BPF_PRELOAD
 	bool "Preload BPF file system with kernel specific program and map iterators"
 	depends on BPF
+	depends on BPF_SYSCALL
 	# The dependency on !COMPILE_TEST prevents it from being enabled
 	# in allmodconfig or allyesconfig configurations
 	depends on !COMPILE_TEST
commit f9b7ff0d7f7a466a920424246e7ddc2b84c87e52
Author: Lorenz Bauer <lmb at cloudflare.com>
Date:   Thu Nov 5 11:52:30 2020 +0000

    tools/bpftool: Fix attaching flow dissector
    
    My earlier patch to reject non-zero arguments to flow dissector attach
    broke attaching via bpftool. Instead of 0 it uses -1 for target_fd.
    Fix this by passing a zero argument when attaching the flow dissector.
    
    Fixes: 1b514239e859 ("bpf: flow_dissector: Check value of unused flags to BPF_PROG_ATTACH")
    Reported-by: Jiri Benc <jbenc at redhat.com>
    Signed-off-by: Lorenz Bauer <lmb at cloudflare.com>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Acked-by: Song Liu <songliubraving at fb.com>
    Link: https://lore.kernel.org/bpf/20201105115230.296657-1-lmb@cloudflare.com

diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index d942c1e3372c..acdb2c245f0a 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -940,7 +940,7 @@ static int parse_attach_detach_args(int argc, char **argv, int *progfd,
 	}
 
 	if (*attach_type == BPF_FLOW_DISSECTOR) {
-		*mapfd = -1;
+		*mapfd = 0;
 		return 0;
 	}
 
commit a422490a595600659664901b609aacccdbba4a5f
Author: Bhawanpreet Lakha <Bhawanpreet.Lakha at amd.com>
Date:   Fri Oct 16 14:57:23 2020 -0400

    drm/amd/display: Add missing pflip irq
    
    If we have more than 4 displays we will run
    into dummy irq calls or flip timout issues.
    
    Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha at amd.com>
    Reviewed-by: Charlene Liu <Charlene.Liu at amd.com>
    Acked-by: Qingqing Zhuo <qingqing.zhuo at amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
    Cc: stable at vger.kernel.org # 5.9.x

diff --git a/drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.c b/drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.c
index 49689f71f4f1..0effbb2bd74a 100644
--- a/drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.c
+++ b/drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.c
@@ -306,8 +306,8 @@ irq_source_info_dcn30[DAL_IRQ_SOURCES_NUMBER] = {
 	pflip_int_entry(1),
 	pflip_int_entry(2),
 	pflip_int_entry(3),
-	[DC_IRQ_SOURCE_PFLIP5] = dummy_irq_entry(),
-	[DC_IRQ_SOURCE_PFLIP6] = dummy_irq_entry(),
+	pflip_int_entry(4),
+	pflip_int_entry(5),
 	[DC_IRQ_SOURCE_PFLIP_UNDERLAY0] = dummy_irq_entry(),
 	gpio_pad_int_entry(0),
 	gpio_pad_int_entry(1),
commit 49a361327332c9221438397059067f9b205f690d
Author: Dai Ngo <dai.ngo at oracle.com>
Date:   Thu Oct 29 15:07:16 2020 -0400

    NFSD: fix missing refcount in nfsd4_copy by nfsd4_do_async_copy
    
    Need to initialize nfsd4_copy's refcount to 1 to avoid use-after-free
    warning when nfs4_put_copy is called from nfsd4_cb_offload_release.
    
    Fixes: ce0887ac96d3 ("NFSD add nfs4 inter ssc to nfsd4_copy")
    Signed-off-by: Dai Ngo <dai.ngo at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 9c43cad7e408..e83b21778816 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -1486,6 +1486,7 @@ do_callback:
 	cb_copy = kzalloc(sizeof(struct nfsd4_copy), GFP_KERNEL);
 	if (!cb_copy)
 		goto out;
+	refcount_set(&cb_copy->refcount, 1);
 	memcpy(&cb_copy->cp_res, &copy->cp_res, sizeof(copy->cp_res));
 	cb_copy->cp_clp = copy->cp_clp;
 	cb_copy->nfserr = copy->nfserr;
commit 36e1e5ba90fb3fba6888fae26e4dfc28bf70aaf1
Author: Dai Ngo <dai.ngo at oracle.com>
Date:   Thu Oct 29 15:07:15 2020 -0400

    NFSD: Fix use-after-free warning when doing inter-server copy
    
    The source file nfsd_file is not constructed the same as other
    nfsd_file's via nfsd_file_alloc. nfsd_file_put should not be
    called to free the object; nfsd_file_put is not the inverse of
    kzalloc, instead kfree is called by nfsd4_do_async_copy when done.
    
    Fixes: ce0887ac96d3 ("NFSD add nfs4 inter ssc to nfsd4_copy")
    Signed-off-by: Dai Ngo <dai.ngo at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index ad2fa1a8e7ad..9c43cad7e408 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -1299,7 +1299,7 @@ nfsd4_cleanup_inter_ssc(struct vfsmount *ss_mnt, struct nfsd_file *src,
 			struct nfsd_file *dst)
 {
 	nfs42_ssc_close(src->nf_file);
-	nfsd_file_put(src);
+	/* 'src' is freed by nfsd4_do_async_copy */
 	nfsd_file_put(dst);
 	mntput(ss_mnt);
 }
commit 66d60e3ad1e44d42d940767f62bf265f107fb628
Author: Chuck Lever <chuck.lever at oracle.com>
Date:   Fri Oct 23 10:41:12 2020 -0400

    NFSD: MKNOD should return NFSERR_BADTYPE instead of NFSERR_INVAL
    
    A late paragraph of RFC 1813 Section 3.3.11 states:
    
    | ... if the server does not support the target type or the
    | target type is illegal, the error, NFS3ERR_BADTYPE, should
    | be returned. Note that NF3REG, NF3DIR, and NF3LNK are
    | illegal types for MKNOD.
    
    The Linux NFS server incorrectly returns NFSERR_INVAL in these
    cases.
    
    Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
index 14468613d150..a633044b0dc1 100644
--- a/fs/nfsd/nfs3proc.c
+++ b/fs/nfsd/nfs3proc.c
@@ -316,10 +316,6 @@ nfsd3_proc_mknod(struct svc_rqst *rqstp)
 	fh_copy(&resp->dirfh, &argp->fh);
 	fh_init(&resp->fh, NFS3_FHSIZE);
 
-	if (argp->ftype == 0 || argp->ftype >= NF3BAD) {
-		resp->status = nfserr_inval;
-		goto out;
-	}
 	if (argp->ftype == NF3CHR || argp->ftype == NF3BLK) {
 		rdev = MKDEV(argp->major, argp->minor);
 		if (MAJOR(rdev) != argp->major ||
@@ -328,7 +324,7 @@ nfsd3_proc_mknod(struct svc_rqst *rqstp)
 			goto out;
 		}
 	} else if (argp->ftype != NF3SOCK && argp->ftype != NF3FIFO) {
-		resp->status = nfserr_inval;
+		resp->status = nfserr_badtype;
 		goto out;
 	}
 
commit d321ff589c16d8c2207485a6d7fbdb14e873d46e
Author: Chuck Lever <chuck.lever at oracle.com>
Date:   Fri Oct 23 10:41:07 2020 -0400

    SUNRPC: Fix general protection fault in trace_rpc_xdr_overflow()
    
    The TP_fast_assign() section is careful enough not to dereference
    xdr->rqst if it's NULL. The TP_STRUCT__entry section is not.
    
    Fixes: 5582863f450c ("SUNRPC: Add XDR overflow trace event")
    Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h
index f45b3c01370c..2477014e3fa6 100644
--- a/include/trace/events/sunrpc.h
+++ b/include/trace/events/sunrpc.h
@@ -655,10 +655,10 @@ TRACE_EVENT(rpc_xdr_overflow,
 		__field(size_t, tail_len)
 		__field(unsigned int, page_len)
 		__field(unsigned int, len)
-		__string(progname,
-			 xdr->rqst->rq_task->tk_client->cl_program->name)
-		__string(procedure,
-			 xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
+		__string(progname, xdr->rqst ?
+			 xdr->rqst->rq_task->tk_client->cl_program->name : "unknown")
+		__string(procedure, xdr->rqst ?
+			 xdr->rqst->rq_task->tk_msg.rpc_proc->p_name : "unknown")
 	),
 
 	TP_fast_assign(
commit 1905cac9d621a10358bc2750f8b25b64df439a21
Author: Chuck Lever <chuck.lever at oracle.com>
Date:   Fri Oct 23 10:41:01 2020 -0400

    NFSD: NFSv3 PATHCONF Reply is improperly formed
    
    Commit cc028a10a48c ("NFSD: Hoist status code encoding into XDR
    encoder functions") missed a spot.
    
    Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
    Signed-off-by: J. Bruce Fields <bfields at redhat.com>

diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
index 9c23b6acf234..2277f83da250 100644
--- a/fs/nfsd/nfs3xdr.c
+++ b/fs/nfsd/nfs3xdr.c
@@ -1114,6 +1114,7 @@ nfs3svc_encode_pathconfres(struct svc_rqst *rqstp, __be32 *p)
 {
 	struct nfsd3_pathconfres *resp = rqstp->rq_resp;
 
+	*p++ = resp->status;
 	*p++ = xdr_zero;	/* no post_op_attr */
 
 	if (resp->status == 0) {
commit 1a50cf9a67ff2241c2949d30bc11c8dd4280eef8
Author: Maxim Mikityanskiy <maximmi at mellanox.com>
Date:   Thu Oct 22 12:49:51 2020 +0300

    net/mlx5e: Fix incorrect access of RCU-protected xdp_prog
    
    rq->xdp_prog is RCU-protected and should be accessed only with
    rcu_access_pointer for the NULL check in mlx5e_poll_rx_cq.
    
    rq->xdp_prog may change on the fly only from one non-NULL value to
    another non-NULL value, so the checks in mlx5e_xdp_handle and
    mlx5e_poll_rx_cq will have the same result during one NAPI cycle,
    meaning that no additional synchronization is needed.
    
    Fixes: fe45386a2082 ("net/mlx5e: Use RCU to protect rq->xdp_prog")
    Signed-off-by: Maxim Mikityanskiy <maximmi at mellanox.com>
    Reviewed-by: Tariq Toukan <tariqt at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index 599f5b5ebc97..6628a0197b4e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -1584,7 +1584,7 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
 	} while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(cqwq)));
 
 out:
-	if (rq->xdp_prog)
+	if (rcu_access_pointer(rq->xdp_prog))
 		mlx5e_xdp_rx_poll_complete(rq);
 
 	mlx5_cqwq_update_db_record(cqwq);
commit c5eb51adf06b2644fa28d4af886bfdcc53e288da
Author: Aya Levin <ayal at nvidia.com>
Date:   Wed Sep 23 12:58:44 2020 +0300

    net/mlx5e: Fix VXLAN synchronization after function reload
    
    During driver reload, perform firmware tear-down which results in
    firmware losing the configured VXLAN ports. These ports are still
    available in the driver's database. Fix this by cleaning up driver's
    VXLAN database in the nic unload flow, before firmware tear-down. With
    that, minimize mlx5_vxlan_destroy() to remove only what was added in
    mlx5_vxlan_create() and warn on leftover UDP ports.
    
    Fixes: 18a2b7f969c9 ("net/mlx5: convert to new udp_tunnel infrastructure")
    Signed-off-by: Aya Levin <ayal at nvidia.com>
    Reviewed-by: Moshe Shemesh <moshe at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index b3f02aac7f26..ebce97921e03 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -5253,6 +5253,7 @@ static void mlx5e_nic_disable(struct mlx5e_priv *priv)
 
 	mlx5e_disable_async_events(priv);
 	mlx5_lag_remove(mdev);
+	mlx5_vxlan_reset_to_default(mdev->vxlan);
 }
 
 int mlx5e_update_nic_rx(struct mlx5e_priv *priv)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.c
index 3315afe2f8dc..38084400ee8f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.c
@@ -167,6 +167,17 @@ struct mlx5_vxlan *mlx5_vxlan_create(struct mlx5_core_dev *mdev)
 }
 
 void mlx5_vxlan_destroy(struct mlx5_vxlan *vxlan)
+{
+	if (!mlx5_vxlan_allowed(vxlan))
+		return;
+
+	mlx5_vxlan_del_port(vxlan, IANA_VXLAN_UDP_PORT);
+	WARN_ON(!hash_empty(vxlan->htable));
+
+	kfree(vxlan);
+}
+
+void mlx5_vxlan_reset_to_default(struct mlx5_vxlan *vxlan)
 {
 	struct mlx5_vxlan_port *vxlanp;
 	struct hlist_node *tmp;
@@ -175,12 +186,12 @@ void mlx5_vxlan_destroy(struct mlx5_vxlan *vxlan)
 	if (!mlx5_vxlan_allowed(vxlan))
 		return;
 
-	/* Lockless since we are the only hash table consumers*/
 	hash_for_each_safe(vxlan->htable, bkt, tmp, vxlanp, hlist) {
-		hash_del(&vxlanp->hlist);
-		mlx5_vxlan_core_del_port_cmd(vxlan->mdev, vxlanp->udp_port);
-		kfree(vxlanp);
+		/* Don't delete default UDP port added by the HW.
+		 * Remove only user configured ports
+		 */
+		if (vxlanp->udp_port == IANA_VXLAN_UDP_PORT)
+			continue;
+		mlx5_vxlan_del_port(vxlan, vxlanp->udp_port);
 	}
-
-	kfree(vxlan);
 }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.h b/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.h
index ec766529f49b..34ef662da35e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.h
@@ -56,6 +56,7 @@ void mlx5_vxlan_destroy(struct mlx5_vxlan *vxlan);
 int mlx5_vxlan_add_port(struct mlx5_vxlan *vxlan, u16 port);
 int mlx5_vxlan_del_port(struct mlx5_vxlan *vxlan, u16 port);
 bool mlx5_vxlan_lookup_port(struct mlx5_vxlan *vxlan, u16 port);
+void mlx5_vxlan_reset_to_default(struct mlx5_vxlan *vxlan);
 #else
 static inline struct mlx5_vxlan*
 mlx5_vxlan_create(struct mlx5_core_dev *mdev) { return ERR_PTR(-EOPNOTSUPP); }
@@ -63,6 +64,7 @@ static inline void mlx5_vxlan_destroy(struct mlx5_vxlan *vxlan) { return; }
 static inline int mlx5_vxlan_add_port(struct mlx5_vxlan *vxlan, u16 port) { return -EOPNOTSUPP; }
 static inline int mlx5_vxlan_del_port(struct mlx5_vxlan *vxlan, u16 port) { return -EOPNOTSUPP; }
 static inline bool mlx5_vxlan_lookup_port(struct mlx5_vxlan *vxlan, u16 port) { return false; }
+static inline void mlx5_vxlan_reset_to_default(struct mlx5_vxlan *vxlan) { return; }
 #endif
 
 #endif /* __MLX5_VXLAN_H__ */
commit ae35859445607f7f18dd4f332749219cd636ed59
Author: Parav Pandit <parav at nvidia.com>
Date:   Mon Nov 2 12:41:28 2020 +0200

    net/mlx5: E-switch, Avoid extack error log for disabled vport
    
    When E-switch vport is disabled, querying its hardware address is
    unsupported.
    Avoid setting extack error log message in such case.
    
    Fixes: f099fde16db3 ("net/mlx5: E-switch, Support querying port function mac address")
    Signed-off-by: Parav Pandit <parav at nvidia.com>
    Reviewed-by: Roi Dayan <roid at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index 6e6a9a563992..e8e6294c7cca 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -1902,8 +1902,6 @@ int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink,
 		ether_addr_copy(hw_addr, vport->info.mac);
 		*hw_addr_len = ETH_ALEN;
 		err = 0;
-	} else {
-		NL_SET_ERR_MSG_MOD(extack, "Eswitch vport is disabled");
 	}
 	mutex_unlock(&esw->state_lock);
 	return err;
commit 465e7baab6d93b399344f5868f84c177ab5cd16f
Author: Maor Gottlieb <maorg at nvidia.com>
Date:   Wed Oct 21 08:42:49 2020 +0300

    net/mlx5: Fix deletion of duplicate rules
    
    When a rule is duplicated, the refcount of the rule is increased so only
    the second deletion of the rule should cause destruction of the FTE.
    Currently, the FTE will be destroyed in the first deletion of rule since
    the modify_mask will be 0.
    Fix it and call to destroy FTE only if all the rules (FTE's children)
    have been removed.
    
    Fixes: 718ce4d601db ("net/mlx5: Consolidate update FTE for all removal changes")
    Signed-off-by: Maor Gottlieb <maorg at nvidia.com>
    Reviewed-by: Mark Bloch <mbloch at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 16091838bfcf..325a5b0d6829 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -2010,10 +2010,11 @@ void mlx5_del_flow_rules(struct mlx5_flow_handle *handle)
 	down_write_ref_node(&fte->node, false);
 	for (i = handle->num_rules - 1; i >= 0; i--)
 		tree_remove_node(&handle->rule[i]->node, true);
-	if (fte->modify_mask && fte->dests_size) {
-		modify_fte(fte);
+	if (fte->dests_size) {
+		if (fte->modify_mask)
+			modify_fte(fte);
 		up_write_ref_node(&fte->node, false);
-	} else {
+	} else if (list_empty(&fte->node.children)) {
 		del_hw_fte(&fte->node);
 		/* Avoid double call to del_hw_fte */
 		fte->node.del_hw_func = NULL;
commit f42139ba49791ab6b12443c60044872705b74a1e
Author: Maxim Mikityanskiy <maximmi at mellanox.com>
Date:   Thu Oct 8 11:34:03 2020 +0300

    net/mlx5e: Use spin_lock_bh for async_icosq_lock
    
    async_icosq_lock may be taken from softirq and non-softirq contexts. It
    requires protection with spin_lock_bh, otherwise a softirq may be
    triggered in the middle of the critical section, and it may deadlock if
    it tries to take the same lock. This patch fixes such a scenario by
    using spin_lock_bh to disable softirqs on that CPU while inside the
    critical section.
    
    Fixes: 8d94b590f1e4 ("net/mlx5e: Turn XSK ICOSQ into a general asynchronous one")
    Signed-off-by: Maxim Mikityanskiy <maximmi at mellanox.com>
    Reviewed-by: Tariq Toukan <tariqt at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
index 4e574ac73019..be3465ba38ca 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c
@@ -122,9 +122,9 @@ void mlx5e_activate_xsk(struct mlx5e_channel *c)
 	set_bit(MLX5E_RQ_STATE_ENABLED, &c->xskrq.state);
 	/* TX queue is created active. */
 
-	spin_lock(&c->async_icosq_lock);
+	spin_lock_bh(&c->async_icosq_lock);
 	mlx5e_trigger_irq(&c->async_icosq);
-	spin_unlock(&c->async_icosq_lock);
+	spin_unlock_bh(&c->async_icosq_lock);
 }
 
 void mlx5e_deactivate_xsk(struct mlx5e_channel *c)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
index fb671a457129..8e96260fce1d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
@@ -36,9 +36,9 @@ int mlx5e_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
 		if (test_and_set_bit(MLX5E_SQ_STATE_PENDING_XSK_TX, &c->async_icosq.state))
 			return 0;
 
-		spin_lock(&c->async_icosq_lock);
+		spin_lock_bh(&c->async_icosq_lock);
 		mlx5e_trigger_irq(&c->async_icosq);
-		spin_unlock(&c->async_icosq_lock);
+		spin_unlock_bh(&c->async_icosq_lock);
 	}
 
 	return 0;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
index ccaccb9fc2f7..7f6221b8b1f7 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
@@ -188,7 +188,7 @@ static int post_rx_param_wqes(struct mlx5e_channel *c,
 
 	err = 0;
 	sq = &c->async_icosq;
-	spin_lock(&c->async_icosq_lock);
+	spin_lock_bh(&c->async_icosq_lock);
 
 	cseg = post_static_params(sq, priv_rx);
 	if (IS_ERR(cseg))
@@ -199,7 +199,7 @@ static int post_rx_param_wqes(struct mlx5e_channel *c,
 
 	mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, cseg);
 unlock:
-	spin_unlock(&c->async_icosq_lock);
+	spin_unlock_bh(&c->async_icosq_lock);
 
 	return err;
 
@@ -265,10 +265,10 @@ resync_post_get_progress_params(struct mlx5e_icosq *sq,
 
 	BUILD_BUG_ON(MLX5E_KTLS_GET_PROGRESS_WQEBBS != 1);
 
-	spin_lock(&sq->channel->async_icosq_lock);
+	spin_lock_bh(&sq->channel->async_icosq_lock);
 
 	if (unlikely(!mlx5e_wqc_has_room_for(&sq->wq, sq->cc, sq->pc, 1))) {
-		spin_unlock(&sq->channel->async_icosq_lock);
+		spin_unlock_bh(&sq->channel->async_icosq_lock);
 		err = -ENOSPC;
 		goto err_dma_unmap;
 	}
@@ -299,7 +299,7 @@ resync_post_get_progress_params(struct mlx5e_icosq *sq,
 	icosq_fill_wi(sq, pi, &wi);
 	sq->pc++;
 	mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, cseg);
-	spin_unlock(&sq->channel->async_icosq_lock);
+	spin_unlock_bh(&sq->channel->async_icosq_lock);
 
 	return 0;
 
@@ -360,7 +360,7 @@ static int resync_handle_seq_match(struct mlx5e_ktls_offload_context_rx *priv_rx
 	err = 0;
 
 	sq = &c->async_icosq;
-	spin_lock(&c->async_icosq_lock);
+	spin_lock_bh(&c->async_icosq_lock);
 
 	cseg = post_static_params(sq, priv_rx);
 	if (IS_ERR(cseg)) {
@@ -372,7 +372,7 @@ static int resync_handle_seq_match(struct mlx5e_ktls_offload_context_rx *priv_rx
 	mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, cseg);
 	priv_rx->stats->tls_resync_res_ok++;
 unlock:
-	spin_unlock(&c->async_icosq_lock);
+	spin_unlock_bh(&c->async_icosq_lock);
 
 	return err;
 }
commit 78c906e430b13d30a8cfbdef4ccbbe1686841a9e
Author: Vlad Buslov <vladbu at nvidia.com>
Date:   Mon Aug 31 16:17:29 2020 +0300

    net/mlx5e: Protect encap route dev from concurrent release
    
    In functions mlx5e_route_lookup_ipv{4|6}() route_dev can be arbitrary net
    device and not necessary mlx5 eswitch port representor. As such, in order
    to ensure that route_dev is not destroyed concurrent the code needs either
    explicitly take reference to the device before releasing reference to
    rtable instance or ensure that caller holds rtnl lock. First approach is
    chosen as a fix since rtnl lock dependency was intentionally removed from
    mlx5 TC layer.
    
    To prevent unprotected usage of route_dev in encap code take a reference to
    the device before releasing rt. Don't save direct pointer to the device in
    mlx5_encap_entry structure and use ifindex instead. Modify users of
    route_dev pointer to properly obtain the net device instance from its
    ifindex.
    
    Fixes: 61086f391044 ("net/mlx5e: Protect encap hash table with mutex")
    Fixes: 6707f74be862 ("net/mlx5e: Update hw flows when encap source mac changed")
    Signed-off-by: Vlad Buslov <vladbu at nvidia.com>
    Reviewed-by: Roi Dayan <roid at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
index e36e505d38ad..d29af7b9c695 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
@@ -107,12 +107,16 @@ void mlx5e_rep_update_flows(struct mlx5e_priv *priv,
 		mlx5e_tc_encap_flows_del(priv, e, &flow_list);
 
 	if (neigh_connected && !(e->flags & MLX5_ENCAP_ENTRY_VALID)) {
+		struct net_device *route_dev;
+
 		ether_addr_copy(e->h_dest, ha);
 		ether_addr_copy(eth->h_dest, ha);
 		/* Update the encap source mac, in case that we delete
 		 * the flows when encap source mac changed.
 		 */
-		ether_addr_copy(eth->h_source, e->route_dev->dev_addr);
+		route_dev = __dev_get_by_index(dev_net(priv->netdev), e->route_dev_ifindex);
+		if (route_dev)
+			ether_addr_copy(eth->h_source, route_dev->dev_addr);
 
 		mlx5e_tc_encap_flows_add(priv, e, &flow_list);
 	}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
index 7cce85faa16f..90930e54b6f2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
@@ -77,13 +77,13 @@ static int get_route_and_out_devs(struct mlx5e_priv *priv,
 	return 0;
 }
 
-static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv,
-				   struct net_device *mirred_dev,
-				   struct net_device **out_dev,
-				   struct net_device **route_dev,
-				   struct flowi4 *fl4,
-				   struct neighbour **out_n,
-				   u8 *out_ttl)
+static int mlx5e_route_lookup_ipv4_get(struct mlx5e_priv *priv,
+				       struct net_device *mirred_dev,
+				       struct net_device **out_dev,
+				       struct net_device **route_dev,
+				       struct flowi4 *fl4,
+				       struct neighbour **out_n,
+				       u8 *out_ttl)
 {
 	struct neighbour *n;
 	struct rtable *rt;
@@ -117,18 +117,28 @@ static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv,
 		ip_rt_put(rt);
 		return ret;
 	}
+	dev_hold(*route_dev);
 
 	if (!(*out_ttl))
 		*out_ttl = ip4_dst_hoplimit(&rt->dst);
 	n = dst_neigh_lookup(&rt->dst, &fl4->daddr);
 	ip_rt_put(rt);
-	if (!n)
+	if (!n) {
+		dev_put(*route_dev);
 		return -ENOMEM;
+	}
 
 	*out_n = n;
 	return 0;
 }
 
+static void mlx5e_route_lookup_ipv4_put(struct net_device *route_dev,
+					struct neighbour *n)
+{
+	neigh_release(n);
+	dev_put(route_dev);
+}
+
 static const char *mlx5e_netdev_kind(struct net_device *dev)
 {
 	if (dev->rtnl_link_ops)
@@ -193,8 +203,8 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
 	fl4.saddr = tun_key->u.ipv4.src;
 	ttl = tun_key->ttl;
 
-	err = mlx5e_route_lookup_ipv4(priv, mirred_dev, &out_dev, &route_dev,
-				      &fl4, &n, &ttl);
+	err = mlx5e_route_lookup_ipv4_get(priv, mirred_dev, &out_dev, &route_dev,
+					  &fl4, &n, &ttl);
 	if (err)
 		return err;
 
@@ -223,7 +233,7 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
 	e->m_neigh.family = n->ops->family;
 	memcpy(&e->m_neigh.dst_ip, n->primary_key, n->tbl->key_len);
 	e->out_dev = out_dev;
-	e->route_dev = route_dev;
+	e->route_dev_ifindex = route_dev->ifindex;
 
 	/* It's important to add the neigh to the hash table before checking
 	 * the neigh validity state. So if we'll get a notification, in case the
@@ -278,7 +288,7 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
 
 	e->flags |= MLX5_ENCAP_ENTRY_VALID;
 	mlx5e_rep_queue_neigh_stats_work(netdev_priv(out_dev));
-	neigh_release(n);
+	mlx5e_route_lookup_ipv4_put(route_dev, n);
 	return err;
 
 destroy_neigh_entry:
@@ -286,18 +296,18 @@ destroy_neigh_entry:
 free_encap:
 	kfree(encap_header);
 release_neigh:
-	neigh_release(n);
+	mlx5e_route_lookup_ipv4_put(route_dev, n);
 	return err;
 }
 
 #if IS_ENABLED(CONFIG_INET) && IS_ENABLED(CONFIG_IPV6)
-static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv,
-				   struct net_device *mirred_dev,
-				   struct net_device **out_dev,
-				   struct net_device **route_dev,
-				   struct flowi6 *fl6,
-				   struct neighbour **out_n,
-				   u8 *out_ttl)
+static int mlx5e_route_lookup_ipv6_get(struct mlx5e_priv *priv,
+				       struct net_device *mirred_dev,
+				       struct net_device **out_dev,
+				       struct net_device **route_dev,
+				       struct flowi6 *fl6,
+				       struct neighbour **out_n,
+				       u8 *out_ttl)
 {
 	struct dst_entry *dst;
 	struct neighbour *n;
@@ -318,15 +328,25 @@ static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv,
 		return ret;
 	}
 
+	dev_hold(*route_dev);
 	n = dst_neigh_lookup(dst, &fl6->daddr);
 	dst_release(dst);
-	if (!n)
+	if (!n) {
+		dev_put(*route_dev);
 		return -ENOMEM;
+	}
 
 	*out_n = n;
 	return 0;
 }
 
+static void mlx5e_route_lookup_ipv6_put(struct net_device *route_dev,
+					struct neighbour *n)
+{
+	neigh_release(n);
+	dev_put(route_dev);
+}
+
 int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
 				    struct net_device *mirred_dev,
 				    struct mlx5e_encap_entry *e)
@@ -348,8 +368,8 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
 	fl6.daddr = tun_key->u.ipv6.dst;
 	fl6.saddr = tun_key->u.ipv6.src;
 
-	err = mlx5e_route_lookup_ipv6(priv, mirred_dev, &out_dev, &route_dev,
-				      &fl6, &n, &ttl);
+	err = mlx5e_route_lookup_ipv6_get(priv, mirred_dev, &out_dev, &route_dev,
+					  &fl6, &n, &ttl);
 	if (err)
 		return err;
 
@@ -378,7 +398,7 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
 	e->m_neigh.family = n->ops->family;
 	memcpy(&e->m_neigh.dst_ip, n->primary_key, n->tbl->key_len);
 	e->out_dev = out_dev;
-	e->route_dev = route_dev;
+	e->route_dev_ifindex = route_dev->ifindex;
 
 	/* It's importent to add the neigh to the hash table before checking
 	 * the neigh validity state. So if we'll get a notification, in case the
@@ -433,7 +453,7 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
 
 	e->flags |= MLX5_ENCAP_ENTRY_VALID;
 	mlx5e_rep_queue_neigh_stats_work(netdev_priv(out_dev));
-	neigh_release(n);
+	mlx5e_route_lookup_ipv6_put(route_dev, n);
 	return err;
 
 destroy_neigh_entry:
@@ -441,7 +461,7 @@ destroy_neigh_entry:
 free_encap:
 	kfree(encap_header);
 release_neigh:
-	neigh_release(n);
+	mlx5e_route_lookup_ipv6_put(route_dev, n);
 	return err;
 }
 #endif
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
index 9020d1419bcf..8932c387d46a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
@@ -186,7 +186,7 @@ struct mlx5e_encap_entry {
 	unsigned char h_dest[ETH_ALEN];	/* destination eth addr	*/
 
 	struct net_device *out_dev;
-	struct net_device *route_dev;
+	int route_dev_ifindex;
 	struct mlx5e_tc_tunnel *tunnel;
 	int reformat_type;
 	u8 flags;
commit e68e28b4a9d71261e3f8fd05a72d6cf0b443a493
Author: Maor Dickman <maord at nvidia.com>
Date:   Wed Sep 30 16:31:11 2020 +0300

    net/mlx5e: Fix modify header actions memory leak
    
    Modify header actions are allocated during parse tc actions and only
    freed during the flow creation, however, on error flow the allocated
    memory is wrongly unfreed.
    
    Fix this by calling dealloc_mod_hdr_actions in __mlx5e_add_fdb_flow
    and mlx5e_add_nic_flow error flow.
    
    Fixes: d7e75a325cb2 ("net/mlx5e: Add offloading of E-Switch TC pedit (header re-write) actions")
    Fixes: 2f4fe4cab073 ("net/mlx5e: Add offloading of NIC TC pedit (header re-write) actions")
    Signed-off-by: Maor Dickman <maord at nvidia.com>
    Reviewed-by: Paul Blakey <paulb at nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index e3a968e9e2a0..2e2fa0440032 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -4658,6 +4658,7 @@ __mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
 	return flow;
 
 err_free:
+	dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
 	mlx5e_flow_put(priv, flow);
 out:
 	return ERR_PTR(err);
@@ -4802,6 +4803,7 @@ mlx5e_add_nic_flow(struct mlx5e_priv *priv,
 	return 0;
 
 err_free:
+	dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
 	mlx5e_flow_put(priv, flow);
 out:
 	return err;
commit 93bd813c17763177cf87e96c2313bd4dd747d234
Author: Jack Yu <jack.yu at realtek.com>
Date:   Thu Nov 5 11:08:04 2020 +0800

    ASoC: rt1015: add delay to fix pop noise from speaker
    
    Add delay to fix pop noise from speaker.
    
    Signed-off-by: Jack Yu <jack.yu at realtek.com>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
    Link: https://lore.kernel.org/r/20201105030804.31115-1-jack.yu@realtek.com
    Signed-off-by: Mark Brown <broonie at kernel.org>

diff --git a/Documentation/devicetree/bindings/sound/rt1015.txt b/Documentation/devicetree/bindings/sound/rt1015.txt
index fcfd02d8d32f..e498966d436f 100644
--- a/Documentation/devicetree/bindings/sound/rt1015.txt
+++ b/Documentation/devicetree/bindings/sound/rt1015.txt
@@ -8,10 +8,16 @@ Required properties:
 
 - reg : The I2C address of the device.
 
+Optional properties:
+
+- realtek,power-up-delay-ms
+  Set a delay time for flush work to be completed,
+  this value is adjustable depending on platform.
 
 Example:
 
 rt1015: codec at 28 {
 	compatible = "realtek,rt1015";
 	reg = <0x28>;
+	realtek,power-up-delay-ms = <50>;
 };
diff --git a/include/sound/rt1015.h b/include/sound/rt1015.h
new file mode 100644
index 000000000000..70a7538d4c89
--- /dev/null
+++ b/include/sound/rt1015.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * linux/sound/rt1015.h -- Platform data for RT1015
+ *
+ * Copyright 2020 Realtek Microelectronics
+ */
+
+#ifndef __LINUX_SND_RT1015_H
+#define __LINUX_SND_RT1015_H
+
+struct rt1015_platform_data {
+	unsigned int power_up_delay_ms;
+};
+
+#endif
diff --git a/sound/soc/codecs/rt1015.c b/sound/soc/codecs/rt1015.c
index 25fe2ddedd54..967193518349 100644
--- a/sound/soc/codecs/rt1015.c
+++ b/sound/soc/codecs/rt1015.c
@@ -27,10 +27,15 @@
 #include <sound/soc-dapm.h>
 #include <sound/soc.h>
 #include <sound/tlv.h>
+#include <sound/rt1015.h>
 
 #include "rl6231.h"
 #include "rt1015.h"
 
+static const struct rt1015_platform_data i2s_default_platform_data = {
+	.power_up_delay_ms = 50,
+};
+
 static const struct reg_default rt1015_reg[] = {
 	{ 0x0000, 0x0000 },
 	{ 0x0004, 0xa000 },
@@ -650,6 +655,7 @@ static int rt1015_amp_drv_event(struct snd_soc_dapm_widget *w,
 	case SND_SOC_DAPM_POST_PMU:
 		if (rt1015->hw_config == RT1015_HW_28)
 			schedule_delayed_work(&rt1015->flush_work, msecs_to_jiffies(10));
+		msleep(rt1015->pdata.power_up_delay_ms);
 		break;
 	default:
 		break;
@@ -1067,9 +1073,16 @@ static struct acpi_device_id rt1015_acpi_match[] = {
 MODULE_DEVICE_TABLE(acpi, rt1015_acpi_match);
 #endif
 
+static void rt1015_parse_dt(struct rt1015_priv *rt1015, struct device *dev)
+{
+	device_property_read_u32(dev, "realtek,power-up-delay-ms",
+		&rt1015->pdata.power_up_delay_ms);
+}
+
 static int rt1015_i2c_probe(struct i2c_client *i2c,
 	const struct i2c_device_id *id)
 {
+	struct rt1015_platform_data *pdata = dev_get_platdata(&i2c->dev);
 	struct rt1015_priv *rt1015;
 	int ret;
 	unsigned int val;
@@ -1081,6 +1094,13 @@ static int rt1015_i2c_probe(struct i2c_client *i2c,
 
 	i2c_set_clientdata(i2c, rt1015);
 
+	rt1015->pdata = i2s_default_platform_data;
+
+	if (pdata)
+		rt1015->pdata = *pdata;
+	else
+		rt1015_parse_dt(rt1015, &i2c->dev);
+
 	rt1015->regmap = devm_regmap_init_i2c(i2c, &rt1015_regmap);
 	if (IS_ERR(rt1015->regmap)) {
 		ret = PTR_ERR(rt1015->regmap);
diff --git a/sound/soc/codecs/rt1015.h b/sound/soc/codecs/rt1015.h
index d3fdd30aca6d..15cadb361ec3 100644
--- a/sound/soc/codecs/rt1015.h
+++ b/sound/soc/codecs/rt1015.h
@@ -12,6 +12,7 @@
 
 #ifndef __RT1015_H__
 #define __RT1015_H__
+#include <sound/rt1015.h>
 
 #define RT1015_DEVICE_ID_VAL			0x1011
 #define RT1015_DEVICE_ID_VAL2			0x1015
@@ -380,6 +381,7 @@ enum {
 
 struct rt1015_priv {
 	struct snd_soc_component *component;
+	struct rt1015_platform_data pdata;
 	struct regmap *regmap;
 	int sysclk;
 	int sysclk_src;
commit 1f5eb8b17f02d216703ee56e4c3115f592b060fb
Author: Kent Gibson <warthog618 at gmail.com>
Date:   Thu Nov 5 18:40:49 2020 +0800

    gpiolib: fix sysfs when cdev is not selected
    
    In gpiochip_setup_dev() the call to gpiolib_cdev_register() indirectly
    calls device_add().  This is still required for the sysfs even when
    CONFIG_GPIO_CDEV is not selected in the build.
    
    Replace the stubbed functions in gpiolib-cdev.h with macros in gpiolib.c
    that perform the required device_add() and device_del() when
    CONFIG_GPIO_CDEV is not selected.
    
    Fixes: d143493c01b7 (gpiolib: make cdev a build option)
    Reported-by: Nicolas Schichan <nschichan at freebox.fr>
    Signed-off-by: Kent Gibson <warthog618 at gmail.com>
    Tested-by: Nicolas Schichan <nschichan at freebox.fr>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpiolib-cdev.h b/drivers/gpio/gpiolib-cdev.h
index cb41dd757338..b42644cbffb8 100644
--- a/drivers/gpio/gpiolib-cdev.h
+++ b/drivers/gpio/gpiolib-cdev.h
@@ -7,22 +7,7 @@
 
 struct gpio_device;
 
-#ifdef CONFIG_GPIO_CDEV
-
 int gpiolib_cdev_register(struct gpio_device *gdev, dev_t devt);
 void gpiolib_cdev_unregister(struct gpio_device *gdev);
 
-#else
-
-static inline int gpiolib_cdev_register(struct gpio_device *gdev, dev_t devt)
-{
-	return 0;
-}
-
-static inline void gpiolib_cdev_unregister(struct gpio_device *gdev)
-{
-}
-
-#endif /* CONFIG_GPIO_CDEV */
-
 #endif /* GPIOLIB_CDEV_H */
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 3cdf9effc13a..089ddcaa9bc6 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -480,11 +480,23 @@ static void gpiodevice_release(struct device *dev)
 	kfree(gdev);
 }
 
+#ifdef CONFIG_GPIO_CDEV
+#define gcdev_register(gdev, devt)	gpiolib_cdev_register((gdev), (devt))
+#define gcdev_unregister(gdev)		gpiolib_cdev_unregister((gdev))
+#else
+/*
+ * gpiolib_cdev_register() indirectly calls device_add(), which is still
+ * required even when cdev is not selected.
+ */
+#define gcdev_register(gdev, devt)	device_add(&(gdev)->dev)
+#define gcdev_unregister(gdev)		device_del(&(gdev)->dev)
+#endif
+
 static int gpiochip_setup_dev(struct gpio_device *gdev)
 {
 	int ret;
 
-	ret = gpiolib_cdev_register(gdev, gpio_devt);
+	ret = gcdev_register(gdev, gpio_devt);
 	if (ret)
 		return ret;
 
@@ -500,7 +512,7 @@ static int gpiochip_setup_dev(struct gpio_device *gdev)
 	return 0;
 
 err_remove_device:
-	gpiolib_cdev_unregister(gdev);
+	gcdev_unregister(gdev);
 	return ret;
 }
 
@@ -825,7 +837,7 @@ void gpiochip_remove(struct gpio_chip *gc)
 	 * be removed, else it will be dangling until the last user is
 	 * gone.
 	 */
-	gpiolib_cdev_unregister(gdev);
+	gcdev_unregister(gdev);
 	put_device(&gdev->dev);
 }
 EXPORT_SYMBOL_GPL(gpiochip_remove);
commit 9b92f5c51e9a41352d665f6f956bd95085a56a83
Author: Billy Tsai <billy_tsai at aspeedtech.com>
Date:   Fri Oct 30 13:54:50 2020 +0800

    pinctrl: aspeed: Fix GPI only function problem.
    
    Some gpio pin at aspeed soc is input only and the prefix name of these
    pin is "GPI" only.
    This patch fine-tune the condition of GPIO check from "GPIO" to "GPI"
    and it will fix the usage error of banks D and E in the AST2400/AST2500
    and banks T and U in the AST2600.
    
    Fixes: 4d3d0e4272d8 ("pinctrl: Add core support for Aspeed SoCs")
    Signed-off-by: Billy Tsai <billy_tsai at aspeedtech.com>
    Reviewed-by: Andrew Jeffery <andrew at aj.id.au>
    Link: https://lore.kernel.org/r/20201030055450.29613-1-billy_tsai@aspeedtech.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed.c b/drivers/pinctrl/aspeed/pinctrl-aspeed.c
index 6a94eaecf638..d6b849552a1e 100644
--- a/drivers/pinctrl/aspeed/pinctrl-aspeed.c
+++ b/drivers/pinctrl/aspeed/pinctrl-aspeed.c
@@ -286,13 +286,14 @@ int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function,
 static bool aspeed_expr_is_gpio(const struct aspeed_sig_expr *expr)
 {
 	/*
-	 * The signal type is GPIO if the signal name has "GPIO" as a prefix.
+	 * The signal type is GPIO if the signal name has "GPI" as a prefix.
 	 * strncmp (rather than strcmp) is used to implement the prefix
 	 * requirement.
 	 *
-	 * expr->signal might look like "GPIOT3" in the GPIO case.
+	 * expr->signal might look like "GPIOB1" in the GPIO case.
+	 * expr->signal might look like "GPIT0" in the GPI case.
 	 */
-	return strncmp(expr->signal, "GPIO", 4) == 0;
+	return strncmp(expr->signal, "GPI", 3) == 0;
 }
 
 static bool aspeed_gpio_in_exprs(const struct aspeed_sig_expr **exprs)
commit 9ac924b98728c3733c91c6c59fc410827d0da49f
Author: Jernej Skrabec <jernej.skrabec at siol.net>
Date:   Wed Oct 21 22:33:25 2020 +0200

    media: cedrus: h264: Fix check for presence of scaling matrix
    
    If scaling matrix control is present, VPU should not use default matrix.
    Fix that.
    
    Fixes: b3a23db0e2f8 ("media: cedrus: Use H264_SCALING_MATRIX only when required")
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Acked-by: Maxime Ripard <mripard at kernel.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
index 28319351e909..781c84a9b1b7 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
@@ -446,7 +446,7 @@ static void cedrus_set_params(struct cedrus_ctx *ctx,
 	reg |= (pps->second_chroma_qp_index_offset & 0x3f) << 16;
 	reg |= (pps->chroma_qp_index_offset & 0x3f) << 8;
 	reg |= (pps->pic_init_qp_minus26 + 26 + slice->slice_qp_delta) & 0x3f;
-	if (pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT)
+	if (!(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT))
 		reg |= VE_H264_SHS_QP_SCALING_MATRIX_DEFAULT;
 	cedrus_write(dev, VE_H264_SHS_QP, reg);
 
commit e6fcf468c51da28c56ea447e147475a731acbdf1
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Tue Oct 20 08:02:04 2020 +0200

    media: media/platform/marvell-ccic: fix warnings when CONFIG_PM is not enabled
    
    Fix build warnings when CONFIG_PM is not set/enabled:
    
    ../drivers/media/platform/marvell-ccic/mmp-driver.c:324:12: warning: 'mmpcam_runtime_suspend' defined but not used [-Wunused-function]
      324 | static int mmpcam_runtime_suspend(struct device *dev)
    ../drivers/media/platform/marvell-ccic/mmp-driver.c:310:12: warning: 'mmpcam_runtime_resume' defined but not used [-Wunused-function]
      310 | static int mmpcam_runtime_resume(struct device *dev)
    
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: Jonathan Corbet <corbet at lwn.net>
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/platform/marvell-ccic/mmp-driver.c b/drivers/media/platform/marvell-ccic/mmp-driver.c
index cd902b180669..63fce1b85d26 100644
--- a/drivers/media/platform/marvell-ccic/mmp-driver.c
+++ b/drivers/media/platform/marvell-ccic/mmp-driver.c
@@ -307,6 +307,7 @@ static int mmpcam_platform_remove(struct platform_device *pdev)
  * Suspend/resume support.
  */
 
+#ifdef CONFIG_PM
 static int mmpcam_runtime_resume(struct device *dev)
 {
 	struct mmp_camera *cam = dev_get_drvdata(dev);
@@ -352,6 +353,7 @@ static int __maybe_unused mmpcam_resume(struct device *dev)
 		return mccic_resume(&cam->mcam);
 	return 0;
 }
+#endif
 
 static const struct dev_pm_ops mmpcam_pm_ops = {
 	SET_RUNTIME_PM_OPS(mmpcam_runtime_suspend, mmpcam_runtime_resume, NULL)
commit 2da185d6fe969ade346ad03461c3da860c602503
Author: Alexandre Courbot <acourbot at chromium.org>
Date:   Tue Oct 13 14:44:28 2020 +0200

    media: mtk-vcodec: fix build breakage when one of VPU or SCP is enabled
    
    The addition of MT8183 support added a dependency on the SCP remoteproc
    module. However the initial patch used the "select" Kconfig directive,
    which may result in the SCP module to not be compiled if remoteproc was
    disabled. In such a case, mtk-vcodec would try to link against
    non-existent SCP symbols. "select" was clearly misused here as explained
    in kconfig-language.txt.
    
    Replace this by a "depends" directive on at least one of the VPU and
    SCP modules, to allow the driver to be compiled as long as one of these
    is enabled, and adapt the code to support this new scenario.
    
    Also adapt the Kconfig text to explain the extra requirements for MT8173
    and MT8183.
    
    Reported-by: Sakari Ailus <sakari.ailus at linux.intel.com>
    Signed-off-by: Alexandre Courbot <acourbot at chromium.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Fixes: bf1d556ad4e0 ("media: mtk-vcodec: abstract firmware interface")
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig
index a3cb104956d5..7e152bbb4fa6 100644
--- a/drivers/media/platform/Kconfig
+++ b/drivers/media/platform/Kconfig
@@ -253,17 +253,31 @@ config VIDEO_MEDIATEK_VCODEC
 	depends on MTK_IOMMU || COMPILE_TEST
 	depends on VIDEO_DEV && VIDEO_V4L2
 	depends on ARCH_MEDIATEK || COMPILE_TEST
+	depends on VIDEO_MEDIATEK_VPU || MTK_SCP
+	# The two following lines ensure we have the same state ("m" or "y") as
+	# our dependencies, to avoid missing symbols during link.
+	depends on VIDEO_MEDIATEK_VPU || !VIDEO_MEDIATEK_VPU
+	depends on MTK_SCP || !MTK_SCP
 	select VIDEOBUF2_DMA_CONTIG
 	select V4L2_MEM2MEM_DEV
-	select VIDEO_MEDIATEK_VPU
-	select MTK_SCP
+	select VIDEO_MEDIATEK_VCODEC_VPU if VIDEO_MEDIATEK_VPU
+	select VIDEO_MEDIATEK_VCODEC_SCP if MTK_SCP
 	help
-	    Mediatek video codec driver provides HW capability to
-	    encode and decode in a range of video formats
-	    This driver rely on VPU driver to communicate with VPU.
+	  Mediatek video codec driver provides HW capability to
+	  encode and decode in a range of video formats on MT8173
+	  and MT8183.
+
+	  Note that support for MT8173 requires VIDEO_MEDIATEK_VPU to
+	  also be selected. Support for MT8183 depends on MTK_SCP.
+
+	  To compile this driver as modules, choose M here: the
+	  modules will be called mtk-vcodec-dec and mtk-vcodec-enc.
+
+config VIDEO_MEDIATEK_VCODEC_VPU
+	bool
 
-	    To compile this driver as modules, choose M here: the
-	    modules will be called mtk-vcodec-dec and mtk-vcodec-enc.
+config VIDEO_MEDIATEK_VCODEC_SCP
+	bool
 
 config VIDEO_MEM2MEM_DEINTERLACE
 	tristate "Deinterlace support"
diff --git a/drivers/media/platform/mtk-vcodec/Makefile b/drivers/media/platform/mtk-vcodec/Makefile
index 6e1ea3a9f052..4618d43dbbc8 100644
--- a/drivers/media/platform/mtk-vcodec/Makefile
+++ b/drivers/media/platform/mtk-vcodec/Makefile
@@ -25,5 +25,11 @@ mtk-vcodec-enc-y := venc/venc_vp8_if.o \
 mtk-vcodec-common-y := mtk_vcodec_intr.o \
 		mtk_vcodec_util.o \
 		mtk_vcodec_fw.o \
-		mtk_vcodec_fw_vpu.o \
-		mtk_vcodec_fw_scp.o
+
+ifneq ($(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU),)
+mtk-vcodec-common-y += mtk_vcodec_fw_vpu.o
+endif
+
+ifneq ($(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP),)
+mtk-vcodec-common-y += mtk_vcodec_fw_scp.o
+endif
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h
index 51f1694a7c7d..b41e66185cec 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h
@@ -27,8 +27,26 @@ struct mtk_vcodec_fw_ops {
 	void (*release)(struct mtk_vcodec_fw *fw);
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_VPU)
 struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
 					     enum mtk_vcodec_fw_use fw_use);
+#else
+static inline struct mtk_vcodec_fw *
+mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
+		       enum mtk_vcodec_fw_use fw_use)
+{
+	return ERR_PTR(-ENODEV);
+}
+#endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_VPU */
+
+#if IS_ENABLED(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP)
 struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev);
+#else
+static inline struct mtk_vcodec_fw *
+mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
+{
+	return ERR_PTR(-ENODEV);
+}
+#endif /* CONFIG_VIDEO_MEDIATEK_VCODEC_SCP */
 
 #endif /* _MTK_VCODEC_FW_PRIV_H_ */
commit 46233e91fa24a91bffca0680b1c55282ba601918
Author: Alexandre Courbot <acourbot at chromium.org>
Date:   Tue Oct 13 14:44:27 2020 +0200

    media: mtk-vcodec: move firmware implementations into their own files
    
    mtk-vcodec supports two kinds of firmware, VPU and SCP. Both were
    supported from the same source files, but this is clearly unclean and
    makes it more difficult to disable support for one or the other.
    
    Move these implementations into their own file, after adding the
    necessary private interfaces.
    
    [hverkuil: smatch fix: mtk_vcodec_fw_vpu_init() error: uninitialized symbol 'rst_id'.]
    
    Signed-off-by: Alexandre Courbot <acourbot at chromium.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
    Fixes: bf1d556ad4e0 ("media: mtk-vcodec: abstract firmware interface")
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>

diff --git a/drivers/media/platform/mtk-vcodec/Makefile b/drivers/media/platform/mtk-vcodec/Makefile
index f679c6e1a3e9..6e1ea3a9f052 100644
--- a/drivers/media/platform/mtk-vcodec/Makefile
+++ b/drivers/media/platform/mtk-vcodec/Makefile
@@ -24,4 +24,6 @@ mtk-vcodec-enc-y := venc/venc_vp8_if.o \
 
 mtk-vcodec-common-y := mtk_vcodec_intr.o \
 		mtk_vcodec_util.o \
-		mtk_vcodec_fw.o
+		mtk_vcodec_fw.o \
+		mtk_vcodec_fw_vpu.o \
+		mtk_vcodec_fw_scp.o
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
index d14bc208ea5e..145686d2c219 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
@@ -241,7 +241,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
 	}
 	dma_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32));
 
-	dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, VPU_RST_DEC);
+	dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, DECODER);
 	if (IS_ERR(dev->fw_handler))
 		return PTR_ERR(dev->fw_handler);
 
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c
index dcfa2c2d4def..3be8a04c4c67 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c
@@ -293,7 +293,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
 	}
 	dma_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32));
 
-	dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, VPU_RST_ENC);
+	dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, ENCODER);
 	if (IS_ERR(dev->fw_handler))
 		return PTR_ERR(dev->fw_handler);
 
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c
index 6c2a2568d844..94b39ae5c2e1 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.c
@@ -1,193 +1,29 @@
 // SPDX-License-Identifier: GPL-2.0
 
 #include "mtk_vcodec_fw.h"
+#include "mtk_vcodec_fw_priv.h"
 #include "mtk_vcodec_util.h"
 #include "mtk_vcodec_drv.h"
 
-struct mtk_vcodec_fw_ops {
-	int (*load_firmware)(struct mtk_vcodec_fw *fw);
-	unsigned int (*get_vdec_capa)(struct mtk_vcodec_fw *fw);
-	unsigned int (*get_venc_capa)(struct mtk_vcodec_fw *fw);
-	void * (*map_dm_addr)(struct mtk_vcodec_fw *fw, u32 dtcm_dmem_addr);
-	int (*ipi_register)(struct mtk_vcodec_fw *fw, int id,
-			    mtk_vcodec_ipi_handler handler, const char *name, void *priv);
-	int (*ipi_send)(struct mtk_vcodec_fw *fw, int id, void *buf,
-			unsigned int len, unsigned int wait);
-};
-
-struct mtk_vcodec_fw {
-	enum mtk_vcodec_fw_type type;
-	const struct mtk_vcodec_fw_ops *ops;
-	struct platform_device *pdev;
-	struct mtk_scp *scp;
-};
-
-static int mtk_vcodec_vpu_load_firmware(struct mtk_vcodec_fw *fw)
-{
-	return vpu_load_firmware(fw->pdev);
-}
-
-static unsigned int mtk_vcodec_vpu_get_vdec_capa(struct mtk_vcodec_fw *fw)
-{
-	return vpu_get_vdec_hw_capa(fw->pdev);
-}
-
-static unsigned int mtk_vcodec_vpu_get_venc_capa(struct mtk_vcodec_fw *fw)
-{
-	return vpu_get_venc_hw_capa(fw->pdev);
-}
-
-static void *mtk_vcodec_vpu_map_dm_addr(struct mtk_vcodec_fw *fw,
-					u32 dtcm_dmem_addr)
-{
-	return vpu_mapping_dm_addr(fw->pdev, dtcm_dmem_addr);
-}
-
-static int mtk_vcodec_vpu_set_ipi_register(struct mtk_vcodec_fw *fw, int id,
-					   mtk_vcodec_ipi_handler handler,
-					   const char *name, void *priv)
-{
-	/*
-	 * The handler we receive takes a void * as its first argument. We
-	 * cannot change this because it needs to be passed down to the rproc
-	 * subsystem when SCP is used. VPU takes a const argument, which is
-	 * more constrained, so the conversion below is safe.
-	 */
-	ipi_handler_t handler_const = (ipi_handler_t)handler;
-
-	return vpu_ipi_register(fw->pdev, id, handler_const, name, priv);
-}
-
-static int mtk_vcodec_vpu_ipi_send(struct mtk_vcodec_fw *fw, int id, void *buf,
-				   unsigned int len, unsigned int wait)
-{
-	return vpu_ipi_send(fw->pdev, id, buf, len);
-}
-
-static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = {
-	.load_firmware = mtk_vcodec_vpu_load_firmware,
-	.get_vdec_capa = mtk_vcodec_vpu_get_vdec_capa,
-	.get_venc_capa = mtk_vcodec_vpu_get_venc_capa,
-	.map_dm_addr = mtk_vcodec_vpu_map_dm_addr,
-	.ipi_register = mtk_vcodec_vpu_set_ipi_register,
-	.ipi_send = mtk_vcodec_vpu_ipi_send,
-};
-
-static int mtk_vcodec_scp_load_firmware(struct mtk_vcodec_fw *fw)
-{
-	return rproc_boot(scp_get_rproc(fw->scp));
-}
-
-static unsigned int mtk_vcodec_scp_get_vdec_capa(struct mtk_vcodec_fw *fw)
-{
-	return scp_get_vdec_hw_capa(fw->scp);
-}
-
-static unsigned int mtk_vcodec_scp_get_venc_capa(struct mtk_vcodec_fw *fw)
-{
-	return scp_get_venc_hw_capa(fw->scp);
-}
-
-static void *mtk_vcodec_vpu_scp_dm_addr(struct mtk_vcodec_fw *fw,
-					u32 dtcm_dmem_addr)
-{
-	return scp_mapping_dm_addr(fw->scp, dtcm_dmem_addr);
-}
-
-static int mtk_vcodec_scp_set_ipi_register(struct mtk_vcodec_fw *fw, int id,
-					   mtk_vcodec_ipi_handler handler,
-					   const char *name, void *priv)
-{
-	return scp_ipi_register(fw->scp, id, handler, priv);
-}
-
-static int mtk_vcodec_scp_ipi_send(struct mtk_vcodec_fw *fw, int id, void *buf,
-				   unsigned int len, unsigned int wait)
-{
-	return scp_ipi_send(fw->scp, id, buf, len, wait);
-}
-
-static const struct mtk_vcodec_fw_ops mtk_vcodec_rproc_msg = {
-	.load_firmware = mtk_vcodec_scp_load_firmware,
-	.get_vdec_capa = mtk_vcodec_scp_get_vdec_capa,
-	.get_venc_capa = mtk_vcodec_scp_get_venc_capa,
-	.map_dm_addr = mtk_vcodec_vpu_scp_dm_addr,
-	.ipi_register = mtk_vcodec_scp_set_ipi_register,
-	.ipi_send = mtk_vcodec_scp_ipi_send,
-};
-
-static void mtk_vcodec_reset_handler(void *priv)
-{
-	struct mtk_vcodec_dev *dev = priv;
-	struct mtk_vcodec_ctx *ctx;
-
-	mtk_v4l2_err("Watchdog timeout!!");
-
-	mutex_lock(&dev->dev_mutex);
-	list_for_each_entry(ctx, &dev->ctx_list, list) {
-		ctx->state = MTK_STATE_ABORT;
-		mtk_v4l2_debug(0, "[%d] Change to state MTK_STATE_ABORT",
-			       ctx->id);
-	}
-	mutex_unlock(&dev->dev_mutex);
-}
-
 struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
 					   enum mtk_vcodec_fw_type type,
-					   enum rst_id rst_id)
+					   enum mtk_vcodec_fw_use fw_use)
 {
-	const struct mtk_vcodec_fw_ops *ops;
-	struct mtk_vcodec_fw *fw;
-	struct platform_device *fw_pdev = NULL;
-	struct mtk_scp *scp = NULL;
-
 	switch (type) {
 	case VPU:
-		ops = &mtk_vcodec_vpu_msg;
-		fw_pdev = vpu_get_plat_device(dev->plat_dev);
-		if (!fw_pdev) {
-			mtk_v4l2_err("firmware device is not ready");
-			return ERR_PTR(-EINVAL);
-		}
-		vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_reset_handler,
-				    dev, rst_id);
-		break;
+		return mtk_vcodec_fw_vpu_init(dev, fw_use);
 	case SCP:
-		ops = &mtk_vcodec_rproc_msg;
-		scp = scp_get(dev->plat_dev);
-		if (!scp) {
-			mtk_v4l2_err("could not get vdec scp handle");
-			return ERR_PTR(-EPROBE_DEFER);
-		}
-		break;
+		return mtk_vcodec_fw_scp_init(dev);
 	default:
 		mtk_v4l2_err("invalid vcodec fw type");
 		return ERR_PTR(-EINVAL);
 	}
-
-	fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
-	if (!fw)
-		return ERR_PTR(-EINVAL);
-
-	fw->type = type;
-	fw->ops = ops;
-	fw->pdev = fw_pdev;
-	fw->scp = scp;
-
-	return fw;
 }
 EXPORT_SYMBOL_GPL(mtk_vcodec_fw_select);
 
 void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw)
 {
-	switch (fw->type) {
-	case VPU:
-		put_device(&fw->pdev->dev);
-		break;
-	case SCP:
-		scp_put(fw->scp);
-		break;
-	}
+	fw->ops->release(fw);
 }
 EXPORT_SYMBOL_GPL(mtk_vcodec_fw_release);
 
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h
index fadbbe6ba6cd..539bb626772c 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw.h
@@ -15,6 +15,11 @@ enum mtk_vcodec_fw_type {
 	SCP,
 };
 
+enum mtk_vcodec_fw_use {
+	DECODER,
+	ENCODER,
+};
+
 struct mtk_vcodec_fw;
 
 typedef void (*mtk_vcodec_ipi_handler) (void *data,
@@ -22,7 +27,7 @@ typedef void (*mtk_vcodec_ipi_handler) (void *data,
 
 struct mtk_vcodec_fw *mtk_vcodec_fw_select(struct mtk_vcodec_dev *dev,
 					   enum mtk_vcodec_fw_type type,
-					   enum rst_id rst_id);
+					   enum mtk_vcodec_fw_use fw_use);
 void mtk_vcodec_fw_release(struct mtk_vcodec_fw *fw);
 
 int mtk_vcodec_fw_load_firmware(struct mtk_vcodec_fw *fw);
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h
new file mode 100644
index 000000000000..51f1694a7c7d
--- /dev/null
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_priv.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _MTK_VCODEC_FW_PRIV_H_
+#define _MTK_VCODEC_FW_PRIV_H_
+
+#include "mtk_vcodec_fw.h"
+
+struct mtk_vcodec_dev;
+
+struct mtk_vcodec_fw {
+	enum mtk_vcodec_fw_type type;
+	const struct mtk_vcodec_fw_ops *ops;
+	struct platform_device *pdev;
+	struct mtk_scp *scp;
+};
+
+struct mtk_vcodec_fw_ops {
+	int (*load_firmware)(struct mtk_vcodec_fw *fw);
+	unsigned int (*get_vdec_capa)(struct mtk_vcodec_fw *fw);
+	unsigned int (*get_venc_capa)(struct mtk_vcodec_fw *fw);
+	void *(*map_dm_addr)(struct mtk_vcodec_fw *fw, u32 dtcm_dmem_addr);
+	int (*ipi_register)(struct mtk_vcodec_fw *fw, int id,
+			    mtk_vcodec_ipi_handler handler, const char *name,
+			    void *priv);
+	int (*ipi_send)(struct mtk_vcodec_fw *fw, int id, void *buf,
+			unsigned int len, unsigned int wait);
+	void (*release)(struct mtk_vcodec_fw *fw);
+};
+
+struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
+					     enum mtk_vcodec_fw_use fw_use);
+struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev);
+
+#endif /* _MTK_VCODEC_FW_PRIV_H_ */
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_scp.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_scp.c
new file mode 100644
index 000000000000..d8e66b645bd8
--- /dev/null
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_scp.c
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include "mtk_vcodec_fw_priv.h"
+#include "mtk_vcodec_util.h"
+#include "mtk_vcodec_drv.h"
+
+static int mtk_vcodec_scp_load_firmware(struct mtk_vcodec_fw *fw)
+{
+	return rproc_boot(scp_get_rproc(fw->scp));
+}
+
+static unsigned int mtk_vcodec_scp_get_vdec_capa(struct mtk_vcodec_fw *fw)
+{
+	return scp_get_vdec_hw_capa(fw->scp);
+}
+
+static unsigned int mtk_vcodec_scp_get_venc_capa(struct mtk_vcodec_fw *fw)
+{
+	return scp_get_venc_hw_capa(fw->scp);
+}
+
+static void *mtk_vcodec_vpu_scp_dm_addr(struct mtk_vcodec_fw *fw,
+					u32 dtcm_dmem_addr)
+{
+	return scp_mapping_dm_addr(fw->scp, dtcm_dmem_addr);
+}
+
+static int mtk_vcodec_scp_set_ipi_register(struct mtk_vcodec_fw *fw, int id,
+					   mtk_vcodec_ipi_handler handler,
+					   const char *name, void *priv)
+{
+	return scp_ipi_register(fw->scp, id, handler, priv);
+}
+
+static int mtk_vcodec_scp_ipi_send(struct mtk_vcodec_fw *fw, int id, void *buf,
+				   unsigned int len, unsigned int wait)
+{
+	return scp_ipi_send(fw->scp, id, buf, len, wait);
+}
+
+static void mtk_vcodec_scp_release(struct mtk_vcodec_fw *fw)
+{
+	scp_put(fw->scp);
+}
+
+static const struct mtk_vcodec_fw_ops mtk_vcodec_rproc_msg = {
+	.load_firmware = mtk_vcodec_scp_load_firmware,
+	.get_vdec_capa = mtk_vcodec_scp_get_vdec_capa,
+	.get_venc_capa = mtk_vcodec_scp_get_venc_capa,
+	.map_dm_addr = mtk_vcodec_vpu_scp_dm_addr,
+	.ipi_register = mtk_vcodec_scp_set_ipi_register,
+	.ipi_send = mtk_vcodec_scp_ipi_send,
+	.release = mtk_vcodec_scp_release,
+};
+
+struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(struct mtk_vcodec_dev *dev)
+{
+	struct mtk_vcodec_fw *fw;
+	struct mtk_scp *scp;
+
+	scp = scp_get(dev->plat_dev);
+	if (!scp) {
+		mtk_v4l2_err("could not get vdec scp handle");
+		return ERR_PTR(-EPROBE_DEFER);
+	}
+
+	fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
+	fw->type = SCP;
+	fw->ops = &mtk_vcodec_rproc_msg;
+	fw->scp = scp;
+
+	return fw;
+}
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_vpu.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_vpu.c
new file mode 100644
index 000000000000..cd27f637dbe7
--- /dev/null
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_fw_vpu.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include "mtk_vcodec_fw_priv.h"
+#include "mtk_vcodec_util.h"
+#include "mtk_vcodec_drv.h"
+
+static int mtk_vcodec_vpu_load_firmware(struct mtk_vcodec_fw *fw)
+{
+	return vpu_load_firmware(fw->pdev);
+}
+
+static unsigned int mtk_vcodec_vpu_get_vdec_capa(struct mtk_vcodec_fw *fw)
+{
+	return vpu_get_vdec_hw_capa(fw->pdev);
+}
+
+static unsigned int mtk_vcodec_vpu_get_venc_capa(struct mtk_vcodec_fw *fw)
+{
+	return vpu_get_venc_hw_capa(fw->pdev);
+}
+
+static void *mtk_vcodec_vpu_map_dm_addr(struct mtk_vcodec_fw *fw,
+					u32 dtcm_dmem_addr)
+{
+	return vpu_mapping_dm_addr(fw->pdev, dtcm_dmem_addr);
+}
+
+static int mtk_vcodec_vpu_set_ipi_register(struct mtk_vcodec_fw *fw, int id,
+					   mtk_vcodec_ipi_handler handler,
+					   const char *name, void *priv)
+{
+	/*
+	 * The handler we receive takes a void * as its first argument. We
+	 * cannot change this because it needs to be passed down to the rproc
+	 * subsystem when SCP is used. VPU takes a const argument, which is
+	 * more constrained, so the conversion below is safe.
+	 */
+	ipi_handler_t handler_const = (ipi_handler_t)handler;
+
+	return vpu_ipi_register(fw->pdev, id, handler_const, name, priv);
+}
+
+static int mtk_vcodec_vpu_ipi_send(struct mtk_vcodec_fw *fw, int id, void *buf,
+				   unsigned int len, unsigned int wait)
+{
+	return vpu_ipi_send(fw->pdev, id, buf, len);
+}
+
+static void mtk_vcodec_vpu_release(struct mtk_vcodec_fw *fw)
+{
+	put_device(&fw->pdev->dev);
+}
+
+static void mtk_vcodec_vpu_reset_handler(void *priv)
+{
+	struct mtk_vcodec_dev *dev = priv;
+	struct mtk_vcodec_ctx *ctx;
+
+	mtk_v4l2_err("Watchdog timeout!!");
+
+	mutex_lock(&dev->dev_mutex);
+	list_for_each_entry(ctx, &dev->ctx_list, list) {
+		ctx->state = MTK_STATE_ABORT;
+		mtk_v4l2_debug(0, "[%d] Change to state MTK_STATE_ABORT",
+			       ctx->id);
+	}
+	mutex_unlock(&dev->dev_mutex);
+}
+
+static const struct mtk_vcodec_fw_ops mtk_vcodec_vpu_msg = {
+	.load_firmware = mtk_vcodec_vpu_load_firmware,
+	.get_vdec_capa = mtk_vcodec_vpu_get_vdec_capa,
+	.get_venc_capa = mtk_vcodec_vpu_get_venc_capa,
+	.map_dm_addr = mtk_vcodec_vpu_map_dm_addr,
+	.ipi_register = mtk_vcodec_vpu_set_ipi_register,
+	.ipi_send = mtk_vcodec_vpu_ipi_send,
+	.release = mtk_vcodec_vpu_release,
+};
+
+struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(struct mtk_vcodec_dev *dev,
+					     enum mtk_vcodec_fw_use fw_use)
+{
+	struct platform_device *fw_pdev;
+	struct mtk_vcodec_fw *fw;
+	enum rst_id rst_id;
+
+	switch (fw_use) {
+	case ENCODER:
+		rst_id = VPU_RST_ENC;
+		break;
+	case DECODER:
+	default:
+		rst_id = VPU_RST_DEC;
+		break;
+	}
+
+	fw_pdev = vpu_get_plat_device(dev->plat_dev);
+	if (!fw_pdev) {
+		mtk_v4l2_err("firmware device is not ready");
+		return ERR_PTR(-EINVAL);
+	}
+	vpu_wdt_reg_handler(fw_pdev, mtk_vcodec_vpu_reset_handler, dev, rst_id);
+
+	fw = devm_kzalloc(&dev->plat_dev->dev, sizeof(*fw), GFP_KERNEL);
+	fw->type = VPU;
+	fw->ops = &mtk_vcodec_vpu_msg;
+	fw->pdev = fw_pdev;
+
+	return fw;
+}
commit 468600c6ec28613b756193c5f780aac062f1acdf
Author: Dinghao Liu <dinghao.liu at zju.edu.cn>
Date:   Wed Oct 21 13:36:55 2020 +0800

    btrfs: ref-verify: fix memory leak in btrfs_ref_tree_mod
    
    There is one error handling path that does not free ref, which may cause
    a minor memory leak.
    
    CC: stable at vger.kernel.org # 4.19+
    Reviewed-by: Josef Bacik <josef at toxicpanda.com>
    Signed-off-by: Dinghao Liu <dinghao.liu at zju.edu.cn>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/ref-verify.c b/fs/btrfs/ref-verify.c
index 7f03dbe5b609..78693d3dd15b 100644
--- a/fs/btrfs/ref-verify.c
+++ b/fs/btrfs/ref-verify.c
@@ -860,6 +860,7 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
 "dropping a ref for a 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;
 		}
commit cf89af146b7e62af55470cf5f3ec3c56ec144a5e
Author: Anand Jain <anand.jain at oracle.com>
Date:   Fri Oct 30 06:53:56 2020 +0800

    btrfs: dev-replace: fail mount if we don't have replace item with target device
    
    If there is a device BTRFS_DEV_REPLACE_DEVID without the device replace
    item, then it means the filesystem is inconsistent state. This is either
    corruption or a crafted image.  Fail the mount as this needs a closer
    look what is actually wrong.
    
    As of now if BTRFS_DEV_REPLACE_DEVID is present without the replace
    item, in __btrfs_free_extra_devids() we determine that there is an
    extra device, and free those extra devices but continue to mount the
    device.
    However, we were wrong in keeping tack of the rw_devices so the syzbot
    testcase failed:
    
      WARNING: CPU: 1 PID: 3612 at fs/btrfs/volumes.c:1166 close_fs_devices.part.0+0x607/0x800 fs/btrfs/volumes.c:1166
      Kernel panic - not syncing: panic_on_warn set ...
      CPU: 1 PID: 3612 Comm: syz-executor.2 Not tainted 5.9.0-rc4-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      Call Trace:
       __dump_stack lib/dump_stack.c:77 [inline]
       dump_stack+0x198/0x1fd lib/dump_stack.c:118
       panic+0x347/0x7c0 kernel/panic.c:231
       __warn.cold+0x20/0x46 kernel/panic.c:600
       report_bug+0x1bd/0x210 lib/bug.c:198
       handle_bug+0x38/0x90 arch/x86/kernel/traps.c:234
       exc_invalid_op+0x14/0x40 arch/x86/kernel/traps.c:254
       asm_exc_invalid_op+0x12/0x20 arch/x86/include/asm/idtentry.h:536
      RIP: 0010:close_fs_devices.part.0+0x607/0x800 fs/btrfs/volumes.c:1166
      RSP: 0018:ffffc900091777e0 EFLAGS: 00010246
      RAX: 0000000000040000 RBX: ffffffffffffffff RCX: ffffc9000c8b7000
      RDX: 0000000000040000 RSI: ffffffff83097f47 RDI: 0000000000000007
      RBP: dffffc0000000000 R08: 0000000000000001 R09: ffff8880988a187f
      R10: 0000000000000000 R11: 0000000000000001 R12: ffff88809593a130
      R13: ffff88809593a1ec R14: ffff8880988a1908 R15: ffff88809593a050
       close_fs_devices fs/btrfs/volumes.c:1193 [inline]
       btrfs_close_devices+0x95/0x1f0 fs/btrfs/volumes.c:1179
       open_ctree+0x4984/0x4a2d fs/btrfs/disk-io.c:3434
       btrfs_fill_super fs/btrfs/super.c:1316 [inline]
       btrfs_mount_root.cold+0x14/0x165 fs/btrfs/super.c:1672
    
    The fix here is, when we determine that there isn't a replace item
    then fail the mount if there is a replace target device (devid 0).
    
    CC: stable at vger.kernel.org # 4.19+
    Reported-by: syzbot+4cfe71a4da060be47502 at syzkaller.appspotmail.com
    Signed-off-by: Anand Jain <anand.jain at oracle.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 5b9e3f3ace22..10638537b9ef 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -91,6 +91,17 @@ int btrfs_init_dev_replace(struct btrfs_fs_info *fs_info)
 	ret = btrfs_search_slot(NULL, dev_root, &key, path, 0, 0);
 	if (ret) {
 no_valid_dev_replace_entry_found:
+		/*
+		 * We don't have a replace item or it's corrupted.  If there is
+		 * a replace target, fail the mount.
+		 */
+		if (btrfs_find_device(fs_info->fs_devices,
+				      BTRFS_DEV_REPLACE_DEVID, NULL, NULL, false)) {
+			btrfs_err(fs_info,
+			"found replace target device without a valid replace item");
+			ret = -EUCLEAN;
+			goto out;
+		}
 		ret = 0;
 		dev_replace->replace_state =
 			BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED;
@@ -143,8 +154,19 @@ no_valid_dev_replace_entry_found:
 	case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED:
 	case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED:
 	case BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED:
-		dev_replace->srcdev = NULL;
-		dev_replace->tgtdev = NULL;
+		/*
+		 * We don't have an active replace item but if there is a
+		 * replace target, fail the mount.
+		 */
+		if (btrfs_find_device(fs_info->fs_devices,
+				      BTRFS_DEV_REPLACE_DEVID, NULL, NULL, false)) {
+			btrfs_err(fs_info,
+			"replace devid present without an active replace item");
+			ret = -EUCLEAN;
+		} else {
+			dev_replace->srcdev = NULL;
+			dev_replace->tgtdev = NULL;
+		}
 		break;
 	case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED:
 	case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED:
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index b1e48078c318..a6406b3b8c2b 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1056,22 +1056,13 @@ static void __btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices,
 			continue;
 		}
 
-		if (device->devid == BTRFS_DEV_REPLACE_DEVID) {
-			/*
-			 * In the first step, keep the device which has
-			 * the correct fsid and the devid that is used
-			 * for the dev_replace procedure.
-			 * In the second step, the dev_replace state is
-			 * read from the device tree and it is known
-			 * whether the procedure is really active or
-			 * not, which means whether this device is
-			 * used or whether it should be removed.
-			 */
-			if (step == 0 || test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
-						  &device->dev_state)) {
-				continue;
-			}
-		}
+		/*
+		 * We have already validated the presence of BTRFS_DEV_REPLACE_DEVID,
+		 * in btrfs_init_dev_replace() so just continue.
+		 */
+		if (device->devid == BTRFS_DEV_REPLACE_DEVID)
+			continue;
+
 		if (device->bdev) {
 			blkdev_put(device->bdev, device->mode);
 			device->bdev = NULL;
@@ -1080,9 +1071,6 @@ static void __btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices,
 		if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
 			list_del_init(&device->dev_alloc_list);
 			clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
-			if (!test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
-				      &device->dev_state))
-				fs_devices->rw_devices--;
 		}
 		list_del_init(&device->dev_list);
 		fs_devices->num_devices--;
commit a4852cf268b5ae487ba18f2b24e44094afce0675
Author: David Sterba <dsterba at suse.com>
Date:   Thu Jul 9 11:25:40 2020 +0200

    btrfs: scrub: update message regarding read-only status
    
    Based on user feedback update the message printed when scrub fails to
    start due to write requirements. To make a distinction add a device id
    to the messages.
    
    Reviewed-by: Josef Bacik <josef at toxicpanda.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index cf63f1e27a27..e71e7586e9eb 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -3866,8 +3866,9 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
 	if (!is_dev_replace && !readonly &&
 	    !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state)) {
 		mutex_unlock(&fs_info->fs_devices->device_list_mutex);
-		btrfs_err_in_rcu(fs_info, "scrub: device %s is not writable",
-				rcu_str_deref(dev->name));
+		btrfs_err_in_rcu(fs_info,
+			"scrub on devid %llu: filesystem on %s is not writable",
+				 devid, rcu_str_deref(dev->name));
 		ret = -EROFS;
 		goto out;
 	}
commit f07728d541ebefcf3d2ec7bc99a3bffd052d9f90
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Fri Oct 23 14:26:33 2020 +0300

    btrfs: clean up NULL checks in qgroup_unreserve_range()
    
    Smatch complains that this code dereferences "entry" before checking
    whether it's NULL on the next line.  Fortunately, rb_entry() will never
    return NULL so it doesn't cause a problem.  We can clean up the NULL
    checking a bit to silence the warning and make the code more clear.
    
    Reviewed-by: Qu Wenruo <wqu at suse.com>
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index c54ea6586632..77c54749f432 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -3435,24 +3435,20 @@ static int qgroup_unreserve_range(struct btrfs_inode *inode,
 {
 	struct rb_node *node;
 	struct rb_node *next;
-	struct ulist_node *entry = NULL;
+	struct ulist_node *entry;
 	int ret = 0;
 
 	node = reserved->range_changed.root.rb_node;
+	if (!node)
+		return 0;
 	while (node) {
 		entry = rb_entry(node, struct ulist_node, rb_node);
 		if (entry->val < start)
 			node = node->rb_right;
-		else if (entry)
-			node = node->rb_left;
 		else
-			break;
+			node = node->rb_left;
 	}
 
-	/* Empty changeset */
-	if (!entry)
-		return 0;
-
 	if (entry->val > start && rb_prev(&entry->rb_node))
 		entry = rb_entry(rb_prev(&entry->rb_node), struct ulist_node,
 				 rb_node);
commit fca3a45d08782a2bb85e048fb8e3128b1388d7b7
Author: Josef Bacik <josef at toxicpanda.com>
Date:   Mon Oct 26 16:57:27 2020 -0400

    btrfs: fix min reserved size calculation in merge_reloc_root
    
    The minimum reserve size was adjusted to take into account the height of
    the tree we are merging, however we can have a root with a level == 0.
    What we want is root_level + 1 to get the number of nodes we may have to
    cow.  This fixes the enospc_debug warning pops with btrfs/101.
    
    Nikolay: this fixes failures on btrfs/060 btrfs/062 btrfs/063 and
    btrfs/195 That I was seeing, the call trace was:
    
      [ 3680.515564] ------------[ cut here ]------------
      [ 3680.515566] BTRFS: block rsv returned -28
      [ 3680.515585] WARNING: CPU: 2 PID: 8339 at fs/btrfs/block-rsv.c:521 btrfs_use_block_rsv+0x162/0x180
      [ 3680.515587] Modules linked in:
      [ 3680.515591] CPU: 2 PID: 8339 Comm: btrfs Tainted: G        W         5.9.0-rc8-default #95
      [ 3680.515593] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1 04/01/2014
      [ 3680.515595] RIP: 0010:btrfs_use_block_rsv+0x162/0x180
      [ 3680.515600] RSP: 0018:ffffa01ac9753910 EFLAGS: 00010282
      [ 3680.515602] RAX: 0000000000000000 RBX: ffff984b34200000 RCX: 0000000000000027
      [ 3680.515604] RDX: 0000000000000027 RSI: 0000000000000000 RDI: ffff984b3bd19e28
      [ 3680.515606] RBP: 0000000000004000 R08: ffff984b3bd19e20 R09: 0000000000000001
      [ 3680.515608] R10: 0000000000000004 R11: 0000000000000046 R12: ffff984b264fdc00
      [ 3680.515609] R13: ffff984b13149000 R14: 00000000ffffffe4 R15: ffff984b34200000
      [ 3680.515613] FS:  00007f4e2912b8c0(0000) GS:ffff984b3bd00000(0000) knlGS:0000000000000000
      [ 3680.515615] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [ 3680.515617] CR2: 00007fab87122150 CR3: 0000000118e42000 CR4: 00000000000006e0
      [ 3680.515620] Call Trace:
      [ 3680.515627]  btrfs_alloc_tree_block+0x8b/0x340
      [ 3680.515633]  ? __lock_acquire+0x51a/0xac0
      [ 3680.515646]  alloc_tree_block_no_bg_flush+0x4f/0x60
      [ 3680.515651]  __btrfs_cow_block+0x14e/0x7e0
      [ 3680.515662]  btrfs_cow_block+0x144/0x2c0
      [ 3680.515670]  merge_reloc_root+0x4d4/0x610
      [ 3680.515675]  ? btrfs_lookup_fs_root+0x78/0x90
      [ 3680.515686]  merge_reloc_roots+0xee/0x280
      [ 3680.515695]  relocate_block_group+0x2ce/0x5e0
      [ 3680.515704]  btrfs_relocate_block_group+0x16e/0x310
      [ 3680.515711]  btrfs_relocate_chunk+0x38/0xf0
      [ 3680.515716]  btrfs_shrink_device+0x200/0x560
      [ 3680.515728]  btrfs_rm_device+0x1ae/0x6a6
      [ 3680.515744]  ? _copy_from_user+0x6e/0xb0
      [ 3680.515750]  btrfs_ioctl+0x1afe/0x28c0
      [ 3680.515755]  ? find_held_lock+0x2b/0x80
      [ 3680.515760]  ? do_user_addr_fault+0x1f8/0x418
      [ 3680.515773]  ? __x64_sys_ioctl+0x77/0xb0
      [ 3680.515775]  __x64_sys_ioctl+0x77/0xb0
      [ 3680.515781]  do_syscall_64+0x31/0x70
      [ 3680.515785]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Reported-by: Nikolay Borisov <nborisov at suse.com>
    Fixes: 44d354abf33e ("btrfs: relocation: review the call sites which can be interrupted by signal")
    CC: stable at vger.kernel.org # 5.4+
    Reviewed-by: Nikolay Borisov <nborisov at suse.com>
    Tested-by: Nikolay Borisov <nborisov at suse.com>
    Signed-off-by: Josef Bacik <josef at toxicpanda.com>
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 3602806d71bd..9ba92d86da0b 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1648,6 +1648,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
 	struct btrfs_root_item *root_item;
 	struct btrfs_path *path;
 	struct extent_buffer *leaf;
+	int reserve_level;
 	int level;
 	int max_level;
 	int replaced = 0;
@@ -1696,7 +1697,8 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
 	 * Thus the needed metadata size is at most root_level * nodesize,
 	 * and * 2 since we have two trees to COW.
 	 */
-	min_reserved = fs_info->nodesize * btrfs_root_level(root_item) * 2;
+	reserve_level = max_t(int, 1, btrfs_root_level(root_item));
+	min_reserved = fs_info->nodesize * reserve_level * 2;
 	memset(&next_key, 0, sizeof(next_key));
 
 	while (1) {
commit e38fdb716702879a942017c85e84c0a3a9e4af96
Author: Josef Bacik <josef at toxicpanda.com>
Date:   Mon Oct 26 16:57:26 2020 -0400

    btrfs: print the block rsv type when we fail our reservation
    
    To help with debugging, print the type of the block rsv when we fail to
    use our target block rsv in btrfs_use_block_rsv.
    
    This now produces:
    
     [  544.672035] BTRFS: block rsv 1 returned -28
    
    which is still cryptic without consulting the enum in block-rsv.h but I
    guess it's better than nothing.
    
    Reviewed-by: Nikolay Borisov <nborisov at suse.com>
    Signed-off-by: Josef Bacik <josef at toxicpanda.com>
    Reviewed-by: David Sterba <dsterba at suse.com>
    [ add note from Nikolay ]
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c
index 7e1549a84fcc..bc920afe23bf 100644
--- a/fs/btrfs/block-rsv.c
+++ b/fs/btrfs/block-rsv.c
@@ -511,7 +511,8 @@ again:
 				/*DEFAULT_RATELIMIT_BURST*/ 1);
 		if (__ratelimit(&_rs))
 			WARN(1, KERN_DEBUG
-				"BTRFS: block rsv returned %d\n", ret);
+				"BTRFS: block rsv %d returned %d\n",
+				block_rsv->type, ret);
 	}
 try_reserve:
 	ret = btrfs_reserve_metadata_bytes(root, block_rsv, blocksize,
commit a1fbc6750e212c5675a4e48d7f51d44607eb8756
Author: Matthew Wilcox (Oracle) <willy at infradead.org>
Date:   Sun Oct 4 19:04:26 2020 +0100

    btrfs: fix potential overflow in cluster_pages_for_defrag on 32bit arch
    
    On 32-bit systems, this shift will overflow for files larger than 4GB as
    start_index is unsigned long while the calls to btrfs_delalloc_*_space
    expect u64.
    
    CC: stable at vger.kernel.org # 4.4+
    Fixes: df480633b891 ("btrfs: extent-tree: Switch to new delalloc space reserve and release")
    Reviewed-by: Josef Bacik <josef at toxicpanda.com>
    Signed-off-by: Matthew Wilcox (Oracle) <willy at infradead.org>
    Reviewed-by: David Sterba <dsterba at suse.com>
    [ define the variable instead of repeating the shift ]
    Signed-off-by: David Sterba <dsterba at suse.com>

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index ab408a23ba32..69a384145dc6 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -1274,6 +1274,7 @@ static int cluster_pages_for_defrag(struct inode *inode,
 	u64 page_start;
 	u64 page_end;
 	u64 page_cnt;
+	u64 start = (u64)start_index << PAGE_SHIFT;
 	int ret;
 	int i;
 	int i_done;
@@ -1290,8 +1291,7 @@ static int cluster_pages_for_defrag(struct inode *inode,
 	page_cnt = min_t(u64, (u64)num_pages, (u64)file_end - start_index + 1);
 
 	ret = btrfs_delalloc_reserve_space(BTRFS_I(inode), &data_reserved,
-			start_index << PAGE_SHIFT,
-			page_cnt << PAGE_SHIFT);
+			start, page_cnt << PAGE_SHIFT);
 	if (ret)
 		return ret;
 	i_done = 0;
@@ -1380,8 +1380,7 @@ again:
 		btrfs_mod_outstanding_extents(BTRFS_I(inode), 1);
 		spin_unlock(&BTRFS_I(inode)->lock);
 		btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved,
-				start_index << PAGE_SHIFT,
-				(page_cnt - i_done) << PAGE_SHIFT, true);
+				start, (page_cnt - i_done) << PAGE_SHIFT, true);
 	}
 
 
@@ -1408,8 +1407,7 @@ out:
 		put_page(pages[i]);
 	}
 	btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved,
-			start_index << PAGE_SHIFT,
-			page_cnt << PAGE_SHIFT, true);
+			start, page_cnt << PAGE_SHIFT, true);
 	btrfs_delalloc_release_extents(BTRFS_I(inode), page_cnt << PAGE_SHIFT);
 	extent_changeset_free(data_reserved);
 	return ret;
commit f8fa2c2e63c76e5d73526f38bdde59fdcfbea166
Author: Mika Westerberg <mika.westerberg at linux.intel.com>
Date:   Mon Oct 5 18:55:24 2020 +0300

    thunderbolt: Only configure USB4 wake for lane 0 adapters
    
    Only USB4 lane 0 adapter has the USB4 port capability for wakes so only
    program wakes on such adapters.
    
    Fixes: b2911a593a70 ("thunderbolt: Enable wakes from system suspend")
    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/thunderbolt/usb4.c b/drivers/thunderbolt/usb4.c
index 40f13579a3fe..f2583b4053e4 100644
--- a/drivers/thunderbolt/usb4.c
+++ b/drivers/thunderbolt/usb4.c
@@ -421,8 +421,12 @@ int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags)
 	 * upstream USB4 port.
 	 */
 	tb_switch_for_each_port(sw, port) {
+		if (!tb_port_is_null(port))
+			continue;
 		if (!route && tb_is_upstream_port(port))
 			continue;
+		if (!port->cap_usb4)
+			continue;
 
 		ret = tb_port_read(port, &val, TB_CFG_PORT,
 				   port->cap_usb4 + PORT_CS_19, 1);
commit 77455129fb5b2a8749330b2b40d0c8750b6bf076
Author: Casey Bowman <casey.g.bowman at intel.com>
Date:   Wed Oct 7 16:13:07 2020 -0700

    thunderbolt: Add uaccess dependency to debugfs interface
    
    Some calls in the debugfs interface are made to the linux/uaccess.h header,
    but the header is not referenced. So, for x86_64 architectures, this
    dependency seems to be pulled in elsewhere, which leads to a successful
    compilation. However, on arm/arm64 architectures, it was found to error out
    on implicit declarations.
    
    This change fixes the implicit declaration error by adding the
    linux/uaccess.h header.
    
    Fixes: 54e418106c76 ("thunderbolt: Add debugfs interface")
    Signed-off-by: Casey Bowman <casey.g.bowman at intel.com>
    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/thunderbolt/debugfs.c b/drivers/thunderbolt/debugfs.c
index 3680b2784ea1..ed65d2b13964 100644
--- a/drivers/thunderbolt/debugfs.c
+++ b/drivers/thunderbolt/debugfs.c
@@ -9,6 +9,7 @@
 
 #include <linux/debugfs.h>
 #include <linux/pm_runtime.h>
+#include <linux/uaccess.h>
 
 #include "tb.h"
 
commit a663e0df4a374b8537562a44d1cecafb472cd65b
Author: Mika Westerberg <mika.westerberg at linux.intel.com>
Date:   Wed Oct 7 17:06:17 2020 +0300

    thunderbolt: Fix memory leak if ida_simple_get() fails in enumerate_services()
    
    The svc->key field is not released as it should be if ida_simple_get()
    fails so fix that.
    
    Fixes: 9aabb68568b4 ("thunderbolt: Fix to check return value of ida_simple_get")
    Cc: stable at vger.kernel.org
    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/thunderbolt/xdomain.c b/drivers/thunderbolt/xdomain.c
index 48907853732a..c00ad817042e 100644
--- a/drivers/thunderbolt/xdomain.c
+++ b/drivers/thunderbolt/xdomain.c
@@ -881,6 +881,7 @@ static void enumerate_services(struct tb_xdomain *xd)
 
 		id = ida_simple_get(&xd->service_ids, 0, 0, GFP_KERNEL);
 		if (id < 0) {
+			kfree(svc->key);
 			kfree(svc);
 			break;
 		}
commit a835d3a114ab0dc2f0d8c6963c3f53734b1c5965
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Fri Oct 9 21:08:56 2020 +0300

    pinctrl: mcp23s08: Print error message when regmap init fails
    
    It is useful for debugging to have the error message printed
    when regmap initialisation fails. Add it to the driver.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Cc: Martin Hundebøll <martin at geanix.com>
    Link: https://lore.kernel.org/r/20201009180856.4738-2-andriy.shevchenko@linux.intel.com
    Tested-by: Jan Kundrát <jan.kundrat at cesnet.cz>
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-mcp23s08_spi.c b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
index 7c72cffe1412..9ae10318f6f3 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08_spi.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
@@ -126,6 +126,8 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
 	copy->name = name;
 
 	mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp, copy);
+	if (IS_ERR(mcp->regmap))
+		dev_err(dev, "regmap init failed for %s\n", mcp->chip.label);
 	return PTR_ERR_OR_ZERO(mcp->regmap);
 }
 
commit 2b12c13637134897ba320bd8906a8d918ee7069b
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Fri Oct 9 21:08:55 2020 +0300

    pinctrl: mcp23s08: Use full chunk of memory for regmap configuration
    
    It appears that simplification of mcp23s08_spi_regmap_init() made
    a regression due to wrong size calculation for dev_kmemdup() call.
    It misses the fact that config variable is already a pointer, thus
    the sizeof() calculation is wrong and only 4 or 8 bytes were copied.
    
    Fix the parameters to devm_kmemdup() to copy a full chunk of memory.
    
    Fixes: 0874758ecb2b ("pinctrl: mcp23s08: Refactor mcp23s08_spi_regmap_init()")
    Reported-by: Martin Hundebøll <martin at geanix.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Tested-by: Martin Hundebøll <martin at geanix.com>
    Link: https://lore.kernel.org/r/20201009180856.4738-1-andriy.shevchenko@linux.intel.com
    Tested-by: Jan Kundrát <jan.kundrat at cesnet.cz>
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-mcp23s08_spi.c b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
index 1f47a661b0a7..7c72cffe1412 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08_spi.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
@@ -119,7 +119,7 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
 		return -EINVAL;
 	}
 
-	copy = devm_kmemdup(dev, &config, sizeof(config), GFP_KERNEL);
+	copy = devm_kmemdup(dev, config, sizeof(*config), GFP_KERNEL);
 	if (!copy)
 		return -ENOMEM;
 
commit 567b8e9fed8add9e20885be38ecd73bb0e07406b
Author: Lars Povlsen <lars.povlsen at microchip.com>
Date:   Wed Nov 4 23:02:23 2020 +0100

    HID: mcp2221: Fix GPIO output handling
    
    The mcp2221 driver GPIO output handling has has several issues.
    
    * A wrong value is used for the GPIO direction.
    
    * Wrong offsets are calculated for some GPIO set value/set direction
      operations, when offset is larger than 0.
    
    This has been fixed by introducing proper manifest constants for the
    direction encoding, and using 'offsetof' when calculating GPIO
    register offsets.
    
    The updated driver has been tested with the Sparx5 pcb134/pcb135
    board, which has the mcp2221 device with several (output) GPIO's.
    
    Fixes: 328de1c519c5c092 ("HID: mcp2221: add GPIO functionality support")
    Reviewed-by: Rishi Gupta <gupt21 at gmail.com>
    Signed-off-by: Lars Povlsen <lars.povlsen at microchip.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-mcp2221.c b/drivers/hid/hid-mcp2221.c
index 0d27ccb55dd9..4211b9839209 100644
--- a/drivers/hid/hid-mcp2221.c
+++ b/drivers/hid/hid-mcp2221.c
@@ -49,6 +49,36 @@ enum {
 	MCP2221_ALT_F_NOT_GPIOD = 0xEF,
 };
 
+/* MCP GPIO direction encoding */
+enum {
+	MCP2221_DIR_OUT = 0x00,
+	MCP2221_DIR_IN = 0x01,
+};
+
+#define MCP_NGPIO	4
+
+/* MCP GPIO set command layout */
+struct mcp_set_gpio {
+	u8 cmd;
+	u8 dummy;
+	struct {
+		u8 change_value;
+		u8 value;
+		u8 change_direction;
+		u8 direction;
+	} gpio[MCP_NGPIO];
+} __packed;
+
+/* MCP GPIO get command layout */
+struct mcp_get_gpio {
+	u8 cmd;
+	u8 dummy;
+	struct {
+		u8 direction;
+		u8 value;
+	} gpio[MCP_NGPIO];
+} __packed;
+
 /*
  * There is no way to distinguish responses. Therefore next command
  * is sent only after response to previous has been received. Mutex
@@ -542,7 +572,7 @@ static int mcp_gpio_get(struct gpio_chip *gc,
 
 	mcp->txbuf[0] = MCP2221_GPIO_GET;
 
-	mcp->gp_idx = (offset + 1) * 2;
+	mcp->gp_idx = offsetof(struct mcp_get_gpio, gpio[offset].value);
 
 	mutex_lock(&mcp->lock);
 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
@@ -559,7 +589,7 @@ static void mcp_gpio_set(struct gpio_chip *gc,
 	memset(mcp->txbuf, 0, 18);
 	mcp->txbuf[0] = MCP2221_GPIO_SET;
 
-	mcp->gp_idx = ((offset + 1) * 4) - 1;
+	mcp->gp_idx = offsetof(struct mcp_set_gpio, gpio[offset].value);
 
 	mcp->txbuf[mcp->gp_idx - 1] = 1;
 	mcp->txbuf[mcp->gp_idx] = !!value;
@@ -575,7 +605,7 @@ static int mcp_gpio_dir_set(struct mcp2221 *mcp,
 	memset(mcp->txbuf, 0, 18);
 	mcp->txbuf[0] = MCP2221_GPIO_SET;
 
-	mcp->gp_idx = (offset + 1) * 5;
+	mcp->gp_idx = offsetof(struct mcp_set_gpio, gpio[offset].direction);
 
 	mcp->txbuf[mcp->gp_idx - 1] = 1;
 	mcp->txbuf[mcp->gp_idx] = val;
@@ -590,7 +620,7 @@ static int mcp_gpio_direction_input(struct gpio_chip *gc,
 	struct mcp2221 *mcp = gpiochip_get_data(gc);
 
 	mutex_lock(&mcp->lock);
-	ret = mcp_gpio_dir_set(mcp, offset, 0);
+	ret = mcp_gpio_dir_set(mcp, offset, MCP2221_DIR_IN);
 	mutex_unlock(&mcp->lock);
 
 	return ret;
@@ -603,7 +633,7 @@ static int mcp_gpio_direction_output(struct gpio_chip *gc,
 	struct mcp2221 *mcp = gpiochip_get_data(gc);
 
 	mutex_lock(&mcp->lock);
-	ret = mcp_gpio_dir_set(mcp, offset, 1);
+	ret = mcp_gpio_dir_set(mcp, offset, MCP2221_DIR_OUT);
 	mutex_unlock(&mcp->lock);
 
 	/* Can't configure as output, bailout early */
@@ -623,7 +653,7 @@ static int mcp_gpio_get_direction(struct gpio_chip *gc,
 
 	mcp->txbuf[0] = MCP2221_GPIO_GET;
 
-	mcp->gp_idx = (offset + 1) * 2;
+	mcp->gp_idx = offsetof(struct mcp_get_gpio, gpio[offset].direction);
 
 	mutex_lock(&mcp->lock);
 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
@@ -632,7 +662,7 @@ static int mcp_gpio_get_direction(struct gpio_chip *gc,
 	if (ret)
 		return ret;
 
-	if (mcp->gpio_dir)
+	if (mcp->gpio_dir == MCP2221_DIR_IN)
 		return GPIO_LINE_DIRECTION_IN;
 
 	return GPIO_LINE_DIRECTION_OUT;
@@ -758,7 +788,7 @@ static int mcp2221_raw_event(struct hid_device *hdev,
 				mcp->status = -ENOENT;
 			} else {
 				mcp->status = !!data[mcp->gp_idx];
-				mcp->gpio_dir = !!data[mcp->gp_idx + 1];
+				mcp->gpio_dir = data[mcp->gp_idx + 1];
 			}
 			break;
 		default:
@@ -860,7 +890,7 @@ static int mcp2221_probe(struct hid_device *hdev,
 	mcp->gc->get_direction = mcp_gpio_get_direction;
 	mcp->gc->set = mcp_gpio_set;
 	mcp->gc->get = mcp_gpio_get;
-	mcp->gc->ngpio = 4;
+	mcp->gc->ngpio = MCP_NGPIO;
 	mcp->gc->base = -1;
 	mcp->gc->can_sleep = 1;
 	mcp->gc->parent = &hdev->dev;
commit 34a9fa2025d9d3177c99351c7aaf256c5f50691f
Author: Pablo Ceballos <pceballos at google.com>
Date:   Mon Nov 2 19:29:39 2020 -0500

    HID: hid-sensor-hub: Fix issue with devices with no report ID
    
    Some HID devices don't use a report ID because they only have a single
    report. In those cases, the report ID in struct hid_report will be zero
    and the data for the report will start at the first byte, so don't skip
    over the first byte.
    
    Signed-off-by: Pablo Ceballos <pceballos at google.com>
    Acked-by: Srinivas Pandruvada <srinivas.pandruvada at linux.intel.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 94c7398b5c27..3dd7d3246737 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -483,7 +483,8 @@ static int sensor_hub_raw_event(struct hid_device *hdev,
 		return 1;
 
 	ptr = raw_data;
-	ptr++; /* Skip report id */
+	if (report->id)
+		ptr++; /* Skip report id */
 
 	spin_lock_irqsave(&pdata->lock, flags);
 
commit 0f52fcb99ea2738a0a0f28e12cf4dd427069dd2a
Author: Can Guo <cang at codeaurora.org>
Date:   Mon Nov 2 22:24:40 2020 -0800

    scsi: ufs: Try to save power mode change and UIC cmd completion timeout
    
    Use the uic_cmd->cmd_active as a flag to track the lifecycle of an UIC cmd.
    The flag is set before sending the UIC cmd and cleared in IRQ handler. When
    a PMC or UIC cmd completion timeout happens, if the flag is not set,
    instead of returning timeout error, we still treat it as a successful
    operation.  This is to deal with the scenario in which completion has been
    raised but the one waiting for the completion cannot be awaken in time due
    to kernel scheduling problem.
    
    Link: https://lore.kernel.org/r/1604384682-15837-3-git-send-email-cang@codeaurora.org
    Reviewed-by: Stanley Chu <stanley.chu at mediatek.com>
    Signed-off-by: Can Guo <cang at codeaurora.org>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 09deefe5904a..5167c3e770a3 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -2115,10 +2115,20 @@ ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
 	unsigned long flags;
 
 	if (wait_for_completion_timeout(&uic_cmd->done,
-					msecs_to_jiffies(UIC_CMD_TIMEOUT)))
+					msecs_to_jiffies(UIC_CMD_TIMEOUT))) {
 		ret = uic_cmd->argument2 & MASK_UIC_COMMAND_RESULT;
-	else
+	} else {
 		ret = -ETIMEDOUT;
+		dev_err(hba->dev,
+			"uic cmd 0x%x with arg3 0x%x completion timeout\n",
+			uic_cmd->command, uic_cmd->argument3);
+
+		if (!uic_cmd->cmd_active) {
+			dev_err(hba->dev, "%s: UIC cmd has been completed, return the result\n",
+				__func__);
+			ret = uic_cmd->argument2 & MASK_UIC_COMMAND_RESULT;
+		}
+	}
 
 	spin_lock_irqsave(hba->host->host_lock, flags);
 	hba->active_uic_cmd = NULL;
@@ -2150,6 +2160,7 @@ __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd,
 	if (completion)
 		init_completion(&uic_cmd->done);
 
+	uic_cmd->cmd_active = 1;
 	ufshcd_dispatch_uic_cmd(hba, uic_cmd);
 
 	return 0;
@@ -3807,10 +3818,18 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
 		dev_err(hba->dev,
 			"pwr ctrl cmd 0x%x with mode 0x%x completion timeout\n",
 			cmd->command, cmd->argument3);
+
+		if (!cmd->cmd_active) {
+			dev_err(hba->dev, "%s: Power Mode Change operation has been completed, go check UPMCRS\n",
+				__func__);
+			goto check_upmcrs;
+		}
+
 		ret = -ETIMEDOUT;
 		goto out;
 	}
 
+check_upmcrs:
 	status = ufshcd_get_upmcrs(hba);
 	if (status != PWR_LOCAL) {
 		dev_err(hba->dev,
@@ -4902,11 +4921,14 @@ static irqreturn_t ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status)
 			ufshcd_get_uic_cmd_result(hba);
 		hba->active_uic_cmd->argument3 =
 			ufshcd_get_dme_attr_val(hba);
+		if (!hba->uic_async_done)
+			hba->active_uic_cmd->cmd_active = 0;
 		complete(&hba->active_uic_cmd->done);
 		retval = IRQ_HANDLED;
 	}
 
 	if ((intr_status & UFSHCD_UIC_PWR_MASK) && hba->uic_async_done) {
+		hba->active_uic_cmd->cmd_active = 0;
 		complete(hba->uic_async_done);
 		retval = IRQ_HANDLED;
 	}
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 47eb1430274c..e0f00a42371c 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -64,6 +64,7 @@ enum dev_cmd_type {
  * @argument1: UIC command argument 1
  * @argument2: UIC command argument 2
  * @argument3: UIC command argument 3
+ * @cmd_active: Indicate if UIC command is outstanding
  * @done: UIC command completion
  */
 struct uic_command {
@@ -71,6 +72,7 @@ struct uic_command {
 	u32 argument1;
 	u32 argument2;
 	u32 argument3;
+	int cmd_active;
 	struct completion done;
 };
 
commit da3fecb0040324c08f1587e5bff1f15f36be1872
Author: Can Guo <cang at codeaurora.org>
Date:   Mon Nov 2 22:24:39 2020 -0800

    scsi: ufs: Fix unbalanced scsi_block_reqs_cnt caused by ufshcd_hold()
    
    The scsi_block_reqs_cnt increased in ufshcd_hold() is supposed to be
    decreased back in ufshcd_ungate_work() in a paired way. However, if
    specific ufshcd_hold/release sequences are met, it is possible that
    scsi_block_reqs_cnt is increased twice but only one ungate work is
    queued. To make sure scsi_block_reqs_cnt is handled by ufshcd_hold() and
    ufshcd_ungate_work() in a paired way, increase it only if queue_work()
    returns true.
    
    Link: https://lore.kernel.org/r/1604384682-15837-2-git-send-email-cang@codeaurora.org
    Reviewed-by: Hongwu Su <hongwus at codeaurora.org>
    Reviewed-by: Stanley Chu <stanley.chu at mediatek.com>
    Reviewed-by: Bean Huo <beanhuo at micron.com>
    Signed-off-by: Can Guo <cang at codeaurora.org>
    Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index b8f573a02713..09deefe5904a 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1627,12 +1627,12 @@ start:
 		 */
 		fallthrough;
 	case CLKS_OFF:
-		ufshcd_scsi_block_requests(hba);
 		hba->clk_gating.state = REQ_CLKS_ON;
 		trace_ufshcd_clk_gating(dev_name(hba->dev),
 					hba->clk_gating.state);
-		queue_work(hba->clk_gating.clk_gating_workq,
-			   &hba->clk_gating.ungate_work);
+		if (queue_work(hba->clk_gating.clk_gating_workq,
+			       &hba->clk_gating.ungate_work))
+			ufshcd_scsi_block_requests(hba);
 		/*
 		 * fall through to check if we should wait for this
 		 * work to be done or not.
commit c277ca155d2f0028a5c79708426d3f79b54a5fc1
Author: Peng Fan <peng.fan at nxp.com>
Date:   Sun Nov 1 19:23:54 2020 +0800

    clk: imx8m: fix bus critical clk registration
    
    noc/axi/ahb are bus clk, not peripheral clk.
    Since peripheral clk has a limitation that for peripheral clock slice,
    IP clock slices must be stopped to change the clock source.
    
    However if the bus clk is marked as critical clk peripheral, the
    assigned clock parent operation will fail.
    
    So we added CLK_SET_PARENT_GATE flag to avoid glitch.
    
    And add imx8m_clk_hw_composite_bus_critical for bus critical clock usage
    
    Fixes: 936c383673b9e ("clk: imx: fix composite peripheral flags")
    Reviewed-by: Abel Vesa <abel.vesa at nxp.com>
    Reported-by: Abel Vesa <abel.vesa at nxp.com>
    Signed-off-by: Peng Fan <peng.fan at nxp.com>
    Link: https://lore.kernel.org/r/1604229834-25594-1-git-send-email-peng.fan@nxp.com
    Signed-off-by: Stephen Boyd <sboyd at kernel.org>

diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c
index 0de0be0cf548..f358ad907299 100644
--- a/drivers/clk/imx/clk-imx8mm.c
+++ b/drivers/clk/imx/clk-imx8mm.c
@@ -443,9 +443,9 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MM_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", base + 0x9880, 24, 1, imx8mm_a53_core_sels, ARRAY_SIZE(imx8mm_a53_core_sels));
 
 	/* BUS */
-	hws[IMX8MM_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi",  imx8mm_main_axi_sels, base + 0x8800);
+	hws[IMX8MM_CLK_MAIN_AXI] = imx8m_clk_hw_composite_bus_critical("main_axi",  imx8mm_main_axi_sels, base + 0x8800);
 	hws[IMX8MM_CLK_ENET_AXI] = imx8m_clk_hw_composite_bus("enet_axi", imx8mm_enet_axi_sels, base + 0x8880);
-	hws[IMX8MM_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_critical("nand_usdhc_bus", imx8mm_nand_usdhc_sels, base + 0x8900);
+	hws[IMX8MM_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_bus_critical("nand_usdhc_bus", imx8mm_nand_usdhc_sels, base + 0x8900);
 	hws[IMX8MM_CLK_VPU_BUS] = imx8m_clk_hw_composite_bus("vpu_bus", imx8mm_vpu_bus_sels, base + 0x8980);
 	hws[IMX8MM_CLK_DISP_AXI] = imx8m_clk_hw_composite_bus("disp_axi", imx8mm_disp_axi_sels, base + 0x8a00);
 	hws[IMX8MM_CLK_DISP_APB] = imx8m_clk_hw_composite_bus("disp_apb", imx8mm_disp_apb_sels, base + 0x8a80);
@@ -453,11 +453,11 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MM_CLK_USB_BUS] = imx8m_clk_hw_composite_bus("usb_bus", imx8mm_usb_bus_sels, base + 0x8b80);
 	hws[IMX8MM_CLK_GPU_AXI] = imx8m_clk_hw_composite_bus("gpu_axi", imx8mm_gpu_axi_sels, base + 0x8c00);
 	hws[IMX8MM_CLK_GPU_AHB] = imx8m_clk_hw_composite_bus("gpu_ahb", imx8mm_gpu_ahb_sels, base + 0x8c80);
-	hws[IMX8MM_CLK_NOC] = imx8m_clk_hw_composite_critical("noc", imx8mm_noc_sels, base + 0x8d00);
-	hws[IMX8MM_CLK_NOC_APB] = imx8m_clk_hw_composite_critical("noc_apb", imx8mm_noc_apb_sels, base + 0x8d80);
+	hws[IMX8MM_CLK_NOC] = imx8m_clk_hw_composite_bus_critical("noc", imx8mm_noc_sels, base + 0x8d00);
+	hws[IMX8MM_CLK_NOC_APB] = imx8m_clk_hw_composite_bus_critical("noc_apb", imx8mm_noc_apb_sels, base + 0x8d80);
 
 	/* AHB */
-	hws[IMX8MM_CLK_AHB] = imx8m_clk_hw_composite_critical("ahb", imx8mm_ahb_sels, base + 0x9000);
+	hws[IMX8MM_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb", imx8mm_ahb_sels, base + 0x9000);
 	hws[IMX8MM_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mm_audio_ahb_sels, base + 0x9100);
 
 	/* IPG */
diff --git a/drivers/clk/imx/clk-imx8mn.c b/drivers/clk/imx/clk-imx8mn.c
index e984de543f0b..f3c5e6cf55dd 100644
--- a/drivers/clk/imx/clk-imx8mn.c
+++ b/drivers/clk/imx/clk-imx8mn.c
@@ -431,7 +431,7 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MN_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", base + 0x9880, 24, 1, imx8mn_a53_core_sels, ARRAY_SIZE(imx8mn_a53_core_sels));
 
 	/* BUS */
-	hws[IMX8MN_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mn_main_axi_sels, base + 0x8800);
+	hws[IMX8MN_CLK_MAIN_AXI] = imx8m_clk_hw_composite_bus_critical("main_axi", imx8mn_main_axi_sels, base + 0x8800);
 	hws[IMX8MN_CLK_ENET_AXI] = imx8m_clk_hw_composite_bus("enet_axi", imx8mn_enet_axi_sels, base + 0x8880);
 	hws[IMX8MN_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_bus("nand_usdhc_bus", imx8mn_nand_usdhc_sels, base + 0x8900);
 	hws[IMX8MN_CLK_DISP_AXI] = imx8m_clk_hw_composite_bus("disp_axi", imx8mn_disp_axi_sels, base + 0x8a00);
@@ -439,9 +439,9 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MN_CLK_USB_BUS] = imx8m_clk_hw_composite_bus("usb_bus", imx8mn_usb_bus_sels, base + 0x8b80);
 	hws[IMX8MN_CLK_GPU_AXI] = imx8m_clk_hw_composite_bus("gpu_axi", imx8mn_gpu_axi_sels, base + 0x8c00);
 	hws[IMX8MN_CLK_GPU_AHB] = imx8m_clk_hw_composite_bus("gpu_ahb", imx8mn_gpu_ahb_sels, base + 0x8c80);
-	hws[IMX8MN_CLK_NOC] = imx8m_clk_hw_composite_critical("noc", imx8mn_noc_sels, base + 0x8d00);
+	hws[IMX8MN_CLK_NOC] = imx8m_clk_hw_composite_bus_critical("noc", imx8mn_noc_sels, base + 0x8d00);
 
-	hws[IMX8MN_CLK_AHB] = imx8m_clk_hw_composite_critical("ahb", imx8mn_ahb_sels, base + 0x9000);
+	hws[IMX8MN_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb", imx8mn_ahb_sels, base + 0x9000);
 	hws[IMX8MN_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mn_audio_ahb_sels, base + 0x9100);
 	hws[IMX8MN_CLK_IPG_ROOT] = imx_clk_hw_divider2("ipg_root", "ahb", base + 0x9080, 0, 1);
 	hws[IMX8MN_CLK_IPG_AUDIO_ROOT] = imx_clk_hw_divider2("ipg_audio_root", "audio_ahb", base + 0x9180, 0, 1);
diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c
index 12ce4770f702..48e212477f52 100644
--- a/drivers/clk/imx/clk-imx8mp.c
+++ b/drivers/clk/imx/clk-imx8mp.c
@@ -557,9 +557,9 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
 	/* CORE SEL */
 	hws[IMX8MP_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", ccm_base + 0x9880, 24, 1, imx8mp_a53_core_sels, ARRAY_SIZE(imx8mp_a53_core_sels));
 
-	hws[IMX8MP_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mp_main_axi_sels, ccm_base + 0x8800);
+	hws[IMX8MP_CLK_MAIN_AXI] = imx8m_clk_hw_composite_bus_critical("main_axi", imx8mp_main_axi_sels, ccm_base + 0x8800);
 	hws[IMX8MP_CLK_ENET_AXI] = imx8m_clk_hw_composite_bus("enet_axi", imx8mp_enet_axi_sels, ccm_base + 0x8880);
-	hws[IMX8MP_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_critical("nand_usdhc_bus", imx8mp_nand_usdhc_sels, ccm_base + 0x8900);
+	hws[IMX8MP_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_bus_critical("nand_usdhc_bus", imx8mp_nand_usdhc_sels, ccm_base + 0x8900);
 	hws[IMX8MP_CLK_VPU_BUS] = imx8m_clk_hw_composite_bus("vpu_bus", imx8mp_vpu_bus_sels, ccm_base + 0x8980);
 	hws[IMX8MP_CLK_MEDIA_AXI] = imx8m_clk_hw_composite_bus("media_axi", imx8mp_media_axi_sels, ccm_base + 0x8a00);
 	hws[IMX8MP_CLK_MEDIA_APB] = imx8m_clk_hw_composite_bus("media_apb", imx8mp_media_apb_sels, ccm_base + 0x8a80);
@@ -567,12 +567,12 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MP_CLK_HDMI_AXI] = imx8m_clk_hw_composite_bus("hdmi_axi", imx8mp_media_axi_sels, ccm_base + 0x8b80);
 	hws[IMX8MP_CLK_GPU_AXI] = imx8m_clk_hw_composite_bus("gpu_axi", imx8mp_gpu_axi_sels, ccm_base + 0x8c00);
 	hws[IMX8MP_CLK_GPU_AHB] = imx8m_clk_hw_composite_bus("gpu_ahb", imx8mp_gpu_ahb_sels, ccm_base + 0x8c80);
-	hws[IMX8MP_CLK_NOC] = imx8m_clk_hw_composite_critical("noc", imx8mp_noc_sels, ccm_base + 0x8d00);
-	hws[IMX8MP_CLK_NOC_IO] = imx8m_clk_hw_composite_critical("noc_io", imx8mp_noc_io_sels, ccm_base + 0x8d80);
+	hws[IMX8MP_CLK_NOC] = imx8m_clk_hw_composite_bus_critical("noc", imx8mp_noc_sels, ccm_base + 0x8d00);
+	hws[IMX8MP_CLK_NOC_IO] = imx8m_clk_hw_composite_bus_critical("noc_io", imx8mp_noc_io_sels, ccm_base + 0x8d80);
 	hws[IMX8MP_CLK_ML_AXI] = imx8m_clk_hw_composite_bus("ml_axi", imx8mp_ml_axi_sels, ccm_base + 0x8e00);
 	hws[IMX8MP_CLK_ML_AHB] = imx8m_clk_hw_composite_bus("ml_ahb", imx8mp_ml_ahb_sels, ccm_base + 0x8e80);
 
-	hws[IMX8MP_CLK_AHB] = imx8m_clk_hw_composite_critical("ahb_root", imx8mp_ahb_sels, ccm_base + 0x9000);
+	hws[IMX8MP_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb_root", imx8mp_ahb_sels, ccm_base + 0x9000);
 	hws[IMX8MP_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mp_audio_ahb_sels, ccm_base + 0x9100);
 	hws[IMX8MP_CLK_MIPI_DSI_ESC_RX] = imx8m_clk_hw_composite_bus("mipi_dsi_esc_rx", imx8mp_mipi_dsi_esc_rx_sels, ccm_base + 0x9200);
 
diff --git a/drivers/clk/imx/clk-imx8mq.c b/drivers/clk/imx/clk-imx8mq.c
index 8265d1d48af4..06292d4a98ff 100644
--- a/drivers/clk/imx/clk-imx8mq.c
+++ b/drivers/clk/imx/clk-imx8mq.c
@@ -431,7 +431,7 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MQ_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", base + 0x9880, 24, 1, imx8mq_a53_core_sels, ARRAY_SIZE(imx8mq_a53_core_sels));
 
 	/* BUS */
-	hws[IMX8MQ_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mq_main_axi_sels, base + 0x8800);
+	hws[IMX8MQ_CLK_MAIN_AXI] = imx8m_clk_hw_composite_bus_critical("main_axi", imx8mq_main_axi_sels, base + 0x8800);
 	hws[IMX8MQ_CLK_ENET_AXI] = imx8m_clk_hw_composite_bus("enet_axi", imx8mq_enet_axi_sels, base + 0x8880);
 	hws[IMX8MQ_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_bus("nand_usdhc_bus", imx8mq_nand_usdhc_sels, base + 0x8900);
 	hws[IMX8MQ_CLK_VPU_BUS] = imx8m_clk_hw_composite_bus("vpu_bus", imx8mq_vpu_bus_sels, base + 0x8980);
@@ -441,12 +441,12 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
 	hws[IMX8MQ_CLK_USB_BUS] = imx8m_clk_hw_composite_bus("usb_bus", imx8mq_usb_bus_sels, base + 0x8b80);
 	hws[IMX8MQ_CLK_GPU_AXI] = imx8m_clk_hw_composite_bus("gpu_axi", imx8mq_gpu_axi_sels, base + 0x8c00);
 	hws[IMX8MQ_CLK_GPU_AHB] = imx8m_clk_hw_composite_bus("gpu_ahb", imx8mq_gpu_ahb_sels, base + 0x8c80);
-	hws[IMX8MQ_CLK_NOC] = imx8m_clk_hw_composite_critical("noc", imx8mq_noc_sels, base + 0x8d00);
-	hws[IMX8MQ_CLK_NOC_APB] = imx8m_clk_hw_composite_critical("noc_apb", imx8mq_noc_apb_sels, base + 0x8d80);
+	hws[IMX8MQ_CLK_NOC] = imx8m_clk_hw_composite_bus_critical("noc", imx8mq_noc_sels, base + 0x8d00);
+	hws[IMX8MQ_CLK_NOC_APB] = imx8m_clk_hw_composite_bus_critical("noc_apb", imx8mq_noc_apb_sels, base + 0x8d80);
 
 	/* AHB */
 	/* AHB clock is used by the AHB bus therefore marked as critical */
-	hws[IMX8MQ_CLK_AHB] = imx8m_clk_hw_composite_critical("ahb", imx8mq_ahb_sels, base + 0x9000);
+	hws[IMX8MQ_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb", imx8mq_ahb_sels, base + 0x9000);
 	hws[IMX8MQ_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mq_audio_ahb_sels, base + 0x9100);
 
 	/* IPG */
diff --git a/drivers/clk/imx/clk.h b/drivers/clk/imx/clk.h
index 3b796b3da249..1d7be0c86538 100644
--- a/drivers/clk/imx/clk.h
+++ b/drivers/clk/imx/clk.h
@@ -549,6 +549,11 @@ struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
 			IMX_COMPOSITE_BUS, \
 			CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
 
+#define imx8m_clk_hw_composite_bus_critical(name, parent_names, reg)	\
+	imx8m_clk_hw_composite_flags(name, parent_names, ARRAY_SIZE(parent_names), reg, \
+			IMX_COMPOSITE_BUS, \
+			CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE | CLK_IS_CRITICAL)
+
 #define imx8m_clk_hw_composite_core(name, parent_names, reg)	\
 	imx8m_clk_hw_composite_flags(name, parent_names, \
 			ARRAY_SIZE(parent_names), reg, \
commit 46b97aed5484a3f44584a10f9e0691bf89d29064
Author: Enric Balletbo i Serra <enric.balletbo at collabora.com>
Date:   Mon Oct 5 18:22:41 2020 +0200

    drm/mediatek: mtk_dpi: Fix unused variable 'mtk_dpi_encoder_funcs'
    
    Commit f89c696e7f63 ("drm/mediatek: mtk_dpi: Convert to bridge driver")
    introduced the following build warning with W=1
    
     drivers/gpu/drm/mediatek/mtk_dpi.c:530:39: warning: unused variable 'mtk_dpi_encoder_funcs' [-Wunused-const-variable]
     static const struct drm_encoder_funcs mtk_dpi_encoder_funcs = {
    
    This struct is and the 'mtk_dpi_encoder_destroy()' are not needed
    anymore, so remove them.
    
    Fixes: f89c696e7f63 ("drm/mediatek: mtk_dpi: Convert to bridge driver")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Enric Balletbo i Serra <enric.balletbo at collabora.com>
    Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>

diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
index cf11c4850b40..52f11a63a330 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -522,15 +522,6 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
 	return 0;
 }
 
-static void mtk_dpi_encoder_destroy(struct drm_encoder *encoder)
-{
-	drm_encoder_cleanup(encoder);
-}
-
-static const struct drm_encoder_funcs mtk_dpi_encoder_funcs = {
-	.destroy = mtk_dpi_encoder_destroy,
-};
-
 static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
 				 enum drm_bridge_attach_flags flags)
 {
commit 25cf73b9ff88fd4608699a0313f820758b4c252d
Author: Magnus Karlsson <magnus.karlsson at intel.com>
Date:   Tue Nov 3 10:41:30 2020 +0100

    libbpf: Fix possible use after free in xsk_socket__delete
    
    Fix a possible use after free in xsk_socket__delete that will happen
    if xsk_put_ctx() frees the ctx. To fix, save the umem reference taken
    from the context and just use that instead.
    
    Fixes: 2f6324a3937f ("libbpf: Support shared umems between queues and devices")
    Signed-off-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/1604396490-12129-3-git-send-email-magnus.karlsson@gmail.com

diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c
index 504b7a85d445..9bc537d0b92d 100644
--- a/tools/lib/bpf/xsk.c
+++ b/tools/lib/bpf/xsk.c
@@ -892,6 +892,7 @@ void xsk_socket__delete(struct xsk_socket *xsk)
 {
 	size_t desc_sz = sizeof(struct xdp_desc);
 	struct xdp_mmap_offsets off;
+	struct xsk_umem *umem;
 	struct xsk_ctx *ctx;
 	int err;
 
@@ -899,6 +900,7 @@ void xsk_socket__delete(struct xsk_socket *xsk)
 		return;
 
 	ctx = xsk->ctx;
+	umem = ctx->umem;
 	if (ctx->prog_fd != -1) {
 		xsk_delete_bpf_maps(xsk);
 		close(ctx->prog_fd);
@@ -918,11 +920,11 @@ void xsk_socket__delete(struct xsk_socket *xsk)
 
 	xsk_put_ctx(ctx);
 
-	ctx->umem->refcount--;
+	umem->refcount--;
 	/* Do not close an fd that also has an associated umem connected
 	 * to it.
 	 */
-	if (xsk->fd != ctx->umem->fd)
+	if (xsk->fd != umem->fd)
 		close(xsk->fd);
 	free(xsk);
 }
commit f78331f74cacb33d87cd60376dacc5bd397959e2
Author: Magnus Karlsson <magnus.karlsson at intel.com>
Date:   Tue Nov 3 10:41:29 2020 +0100

    libbpf: Fix null dereference in xsk_socket__delete
    
    Fix a possible null pointer dereference in xsk_socket__delete that
    will occur if a null pointer is fed into the function.
    
    Fixes: 2f6324a3937f ("libbpf: Support shared umems between queues and devices")
    Reported-by: Andrii Nakryiko <andrii.nakryiko at gmail.com>
    Signed-off-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/1604396490-12129-2-git-send-email-magnus.karlsson@gmail.com

diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c
index e3c98c007825..504b7a85d445 100644
--- a/tools/lib/bpf/xsk.c
+++ b/tools/lib/bpf/xsk.c
@@ -891,13 +891,14 @@ int xsk_umem__delete(struct xsk_umem *umem)
 void xsk_socket__delete(struct xsk_socket *xsk)
 {
 	size_t desc_sz = sizeof(struct xdp_desc);
-	struct xsk_ctx *ctx = xsk->ctx;
 	struct xdp_mmap_offsets off;
+	struct xsk_ctx *ctx;
 	int err;
 
 	if (!xsk)
 		return;
 
+	ctx = xsk->ctx;
 	if (ctx->prog_fd != -1) {
 		xsk_delete_bpf_maps(xsk);
 		close(ctx->prog_fd);
commit 8045ec42d14c6f77b5e925d1421150c043dfb75d
Author: Jianqun Xu <jay.xu at rock-chips.com>
Date:   Tue Oct 13 14:37:31 2020 +0800

    pinctrl: rockchip: create irq mapping in gpio_to_irq
    
    Remove totally irq mappings create in probe, the gpio irq mapping will
    be created when do
        gpio_to_irq ->
            rockchip_gpio_to_irq ->
                irq_create_mapping
    
    This patch can speed up system boot on, also abandon many unused irq
    mappings' create.
    
    Signed-off-by: Jianqun Xu <jay.xu at rock-chips.com>
    Reviewed-by: Heiko Stuebner <heiko at sntech.de>
    Reviewed-by: Kever Yang<kever.yang at rock-chips.com>
    Link: https://lore.kernel.org/r/20201013063731.3618-4-jay.xu@rock-chips.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 7b398ed2113e..aa1a1c850d05 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -3196,7 +3196,7 @@ static void rockchip_irq_demux(struct irq_desc *desc)
 
 		irq = __ffs(pend);
 		pend &= ~BIT(irq);
-		virq = irq_linear_revmap(bank->domain, irq);
+		virq = irq_find_mapping(bank->domain, irq);
 
 		if (!virq) {
 			dev_err(bank->drvdata->dev, "unmapped irq %d\n", irq);
@@ -3375,7 +3375,7 @@ static int rockchip_interrupts_register(struct platform_device *pdev,
 	unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
 	struct irq_chip_generic *gc;
 	int ret;
-	int i, j;
+	int i;
 
 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
 		if (!bank->valid) {
@@ -3402,7 +3402,7 @@ static int rockchip_interrupts_register(struct platform_device *pdev,
 
 		ret = irq_alloc_domain_generic_chips(bank->domain, 32, 1,
 					 "rockchip_gpio_irq", handle_level_irq,
-					 clr, 0, IRQ_GC_INIT_MASK_CACHE);
+					 clr, 0, 0);
 		if (ret) {
 			dev_err(&pdev->dev, "could not alloc generic chips for bank %s\n",
 				bank->name);
@@ -3411,14 +3411,6 @@ static int rockchip_interrupts_register(struct platform_device *pdev,
 			continue;
 		}
 
-		/*
-		 * Linux assumes that all interrupts start out disabled/masked.
-		 * Our driver only uses the concept of masked and always keeps
-		 * things enabled, so for us that's all masked and all enabled.
-		 */
-		writel_relaxed(0xffffffff, bank->reg_base + GPIO_INTMASK);
-		writel_relaxed(0xffffffff, bank->reg_base + GPIO_INTEN);
-
 		gc = irq_get_domain_generic_chip(bank->domain, 0);
 		gc->reg_base = bank->reg_base;
 		gc->private = bank;
@@ -3435,13 +3427,17 @@ static int rockchip_interrupts_register(struct platform_device *pdev,
 		gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type;
 		gc->wake_enabled = IRQ_MSK(bank->nr_pins);
 
+		/*
+		 * Linux assumes that all interrupts start out disabled/masked.
+		 * Our driver only uses the concept of masked and always keeps
+		 * things enabled, so for us that's all masked and all enabled.
+		 */
+		writel_relaxed(0xffffffff, bank->reg_base + GPIO_INTMASK);
+		writel_relaxed(0xffffffff, bank->reg_base + GPIO_INTEN);
+		gc->mask_cache = 0xffffffff;
+
 		irq_set_chained_handler_and_data(bank->irq,
 						 rockchip_irq_demux, bank);
-
-		/* map the gpio irqs here, when the clock is still running */
-		for (j = 0 ; j < 32 ; j++)
-			irq_create_mapping(bank->domain, j);
-
 		clk_disable(bank->clk);
 	}
 
commit 63fbf8013b2f6430754526ef9594f229c7219b1f
Author: Jianqun Xu <jay.xu at rock-chips.com>
Date:   Tue Oct 13 14:37:30 2020 +0800

    pinctrl: rockchip: enable gpio pclk for rockchip_gpio_to_irq
    
    There need to enable pclk_gpio when do irq_create_mapping, since it will
    do access to gpio controller.
    
    Signed-off-by: Jianqun Xu <jay.xu at rock-chips.com>
    Reviewed-by: Heiko Stuebner <heiko at sntech.de>
    Reviewed-by: Kever Yang<kever.yang at rock-chips.com>
    Link: https://lore.kernel.org/r/20201013063731.3618-3-jay.xu@rock-chips.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 0401c1da79dd..7b398ed2113e 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -3155,7 +3155,9 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
 	if (!bank->domain)
 		return -ENXIO;
 
+	clk_enable(bank->clk);
 	virq = irq_create_mapping(bank->domain, offset);
+	clk_disable(bank->clk);
 
 	return (virq) ? : -ENXIO;
 }
commit a8643626d84b8f2b56cc72b804b5e78a5d1b9672
Merge: bcbc0b2e275f f83f3a31b297
Author: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Date:   Wed Nov 4 10:16:03 2020 +0100

    Merge tag 'misc-habanalabs-fixes-2020-11-04' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux into char-misc-next
    
    Oded writes:
    
    This tag contains the following fixes:
    
    - Fix the kernel pointer type we are using across the driver to prevent
      compiler warnings (from u64 to void*)
    
    - Configure GAUDI's MMU coresight component in the correct location. The
      current code had a bug where the configuration was not executed in some
      cases
    
    - Mask watchdog timeout errors in QMANs which can spam the kernel log
    
    * tag 'misc-habanalabs-fixes-2020-11-04' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux:
      habanalabs/gaudi: mask WDT error in QMAN
      habanalabs/gaudi: move coresight mmu config
      habanalabs: fix kernel pointer type

commit f83f3a31b2972ddc907fbb286c6446dd9db6e198
Author: Oded Gabbay <ogabbay at kernel.org>
Date:   Mon Nov 2 18:36:03 2020 +0200

    habanalabs/gaudi: mask WDT error in QMAN
    
    This interrupt cause is not relevant because of how the user use the
    QMAN arbitration mechanism. We must mask it as the log explodes with it.
    
    Signed-off-by: Oded Gabbay <ogabbay at kernel.org>

diff --git a/drivers/misc/habanalabs/include/gaudi/gaudi_masks.h b/drivers/misc/habanalabs/include/gaudi/gaudi_masks.h
index f395721060bd..46aed13f16b1 100644
--- a/drivers/misc/habanalabs/include/gaudi/gaudi_masks.h
+++ b/drivers/misc/habanalabs/include/gaudi/gaudi_masks.h
@@ -421,7 +421,6 @@ enum axi_id {
 
 #define QM_ARB_ERR_MSG_EN_MASK		(\
 					QM_ARB_ERR_MSG_EN_CHOISE_OVF_MASK |\
-					QM_ARB_ERR_MSG_EN_CHOISE_WDT_MASK |\
 					QM_ARB_ERR_MSG_EN_AXI_LBW_ERR_MASK)
 
 #define PCIE_AUX_FLR_CTRL_HW_CTRL_MASK                               0x1
commit 1137e1ead98c0c75f7c5a9a12f0285c5155f20e2
Author: Ofir Bitton <obitton at habana.ai>
Date:   Wed Sep 30 18:43:52 2020 +0300

    habanalabs/gaudi: move coresight mmu config
    
    We must relocate the coresight mmu configuration to the coresight
    flow to make it work in case the first submission is to configure
    the profiler.
    
    Signed-off-by: Ofir Bitton <obitton at habana.ai>
    Reviewed-by: Oded Gabbay <ogabbay at kernel.org>
    Signed-off-by: Oded Gabbay <ogabbay at kernel.org>

diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c
index b071965fa10a..2519a34e25b7 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi.c
@@ -4742,7 +4742,7 @@ static void gaudi_write_pte(struct hl_device *hdev, u64 addr, u64 val)
 			(addr - gaudi->hbm_bar_cur_addr));
 }
 
-static void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
+void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
 {
 	/* mask to zero the MMBP and ASID bits */
 	WREG32_AND(reg, ~0x7FF);
@@ -4910,9 +4910,6 @@ static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid)
 	gaudi_mmu_prepare_reg(hdev, mmMME2_ACC_WBC, asid);
 	gaudi_mmu_prepare_reg(hdev, mmMME3_ACC_WBC, asid);
 
-	gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER, asid);
-	gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER, asid);
-
 	hdev->asic_funcs->set_clock_gating(hdev);
 
 	mutex_unlock(&gaudi->clk_gate_mutex);
diff --git a/drivers/misc/habanalabs/gaudi/gaudiP.h b/drivers/misc/habanalabs/gaudi/gaudiP.h
index 83ad2b0a3a61..8eb598db81b2 100644
--- a/drivers/misc/habanalabs/gaudi/gaudiP.h
+++ b/drivers/misc/habanalabs/gaudi/gaudiP.h
@@ -271,5 +271,6 @@ void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq);
 int gaudi_debug_coresight(struct hl_device *hdev, void *data);
 void gaudi_halt_coresight(struct hl_device *hdev);
 int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk);
+void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid);
 
 #endif /* GAUDIP_H_ */
diff --git a/drivers/misc/habanalabs/gaudi/gaudi_coresight.c b/drivers/misc/habanalabs/gaudi/gaudi_coresight.c
index 881531d4d9da..3d2b0f0f4650 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi_coresight.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi_coresight.c
@@ -623,6 +623,11 @@ static int gaudi_config_etr(struct hl_device *hdev,
 			return -EINVAL;
 		}
 
+		gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER,
+						hdev->compute_ctx->asid);
+		gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER,
+						hdev->compute_ctx->asid);
+
 		msb = upper_32_bits(input->buffer_address) >> 8;
 		msb &= PSOC_GLOBAL_CONF_TRACE_ADDR_MSB_MASK;
 		WREG32(mmPSOC_GLOBAL_CONF_TRACE_ADDR, msb);
commit 82948e6e1d88d2383b82bd3f95c4241a674cd3d9
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 17:08:06 2020 +0100

    habanalabs: fix kernel pointer type
    
    All throughout the driver, normal kernel pointers are
    stored as 'u64' struct members, which is kind of silly
    and requires casting through a uintptr_t to void* every
    time they are used.
    
    There is one line that missed the intermediate uintptr_t
    case, which leads to a compiler warning:
    
    drivers/misc/habanalabs/common/command_buffer.c: In function 'hl_cb_mmap':
    drivers/misc/habanalabs/common/command_buffer.c:512:44: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
      512 |  rc = hdev->asic_funcs->cb_mmap(hdev, vma, (void *) cb->kernel_address,
    
    Rather than adding one more cast, just fix the type and
    remove all the other casts.
    
    Fixes: 0db575350cb1 ("habanalabs: make use of dma_mmap_coherent")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Acked-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Oded Gabbay <oded.gabbay at gmail.com>
    Signed-off-by: Oded Gabbay <ogabbay at kernel.org>

diff --git a/drivers/misc/habanalabs/common/command_buffer.c b/drivers/misc/habanalabs/common/command_buffer.c
index 901e213daf40..ada570f35a41 100644
--- a/drivers/misc/habanalabs/common/command_buffer.c
+++ b/drivers/misc/habanalabs/common/command_buffer.c
@@ -142,11 +142,10 @@ static void cb_fini(struct hl_device *hdev, struct hl_cb *cb)
 {
 	if (cb->is_internal)
 		gen_pool_free(hdev->internal_cb_pool,
-				cb->kernel_address, cb->size);
+				(uintptr_t)cb->kernel_address, cb->size);
 	else
 		hdev->asic_funcs->asic_dma_free_coherent(hdev, cb->size,
-				(void *) (uintptr_t) cb->kernel_address,
-				cb->bus_address);
+				cb->kernel_address, cb->bus_address);
 
 	kfree(cb);
 }
@@ -230,7 +229,7 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,
 		return NULL;
 	}
 
-	cb->kernel_address = (u64) (uintptr_t) p;
+	cb->kernel_address = p;
 	cb->size = cb_size;
 
 	return cb;
@@ -509,7 +508,7 @@ int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma)
 
 	vma->vm_private_data = cb;
 
-	rc = hdev->asic_funcs->cb_mmap(hdev, vma, (void *) cb->kernel_address,
+	rc = hdev->asic_funcs->cb_mmap(hdev, vma, cb->kernel_address,
 					cb->bus_address, cb->size);
 	if (rc) {
 		spin_lock(&cb->lock);
diff --git a/drivers/misc/habanalabs/common/habanalabs.h b/drivers/misc/habanalabs/common/habanalabs.h
index 80d4d7385ffe..6ed974d2def0 100644
--- a/drivers/misc/habanalabs/common/habanalabs.h
+++ b/drivers/misc/habanalabs/common/habanalabs.h
@@ -452,7 +452,7 @@ struct hl_cb {
 	struct list_head	pool_list;
 	struct list_head	va_block_list;
 	u64			id;
-	u64			kernel_address;
+	void			*kernel_address;
 	dma_addr_t		bus_address;
 	u32			mmap_size;
 	u32			size;
@@ -515,7 +515,7 @@ struct hl_hw_queue {
 	struct hl_hw_sob	hw_sob[HL_RSVD_SOBS];
 	struct hl_cs_job	**shadow_queue;
 	enum hl_queue_type	queue_type;
-	u64			kernel_address;
+	void			*kernel_address;
 	dma_addr_t		bus_address;
 	u32			pi;
 	atomic_t		ci;
@@ -544,7 +544,7 @@ struct hl_hw_queue {
  */
 struct hl_cq {
 	struct hl_device	*hdev;
-	u64			kernel_address;
+	void			*kernel_address;
 	dma_addr_t		bus_address;
 	u32			cq_idx;
 	u32			hw_queue_id;
@@ -562,7 +562,7 @@ struct hl_cq {
  */
 struct hl_eq {
 	struct hl_device	*hdev;
-	u64			kernel_address;
+	void			*kernel_address;
 	dma_addr_t		bus_address;
 	u32			ci;
 };
@@ -757,7 +757,7 @@ struct hl_asic_funcs {
 	u32 (*get_dma_desc_list_size)(struct hl_device *hdev,
 					struct sg_table *sgt);
 	void (*add_end_of_cb_packets)(struct hl_device *hdev,
-					u64 kernel_address, u32 len,
+					void *kernel_address, u32 len,
 					u64 cq_addr, u32 cq_val, u32 msix_num,
 					bool eb);
 	void (*update_eq_ci)(struct hl_device *hdev, u32 val);
@@ -1382,13 +1382,13 @@ void hl_wreg(struct hl_device *hdev, u32 reg, u32 val);
 	for (;;) { \
 		/* Verify we read updates done by other cores or by device */ \
 		mb(); \
-		(val) = *((u32 *) (uintptr_t) (addr)); \
+		(val) = *((u32 *)(addr)); \
 		if (mem_written_by_device) \
 			(val) = le32_to_cpu(*(__le32 *) &(val)); \
 		if (cond) \
 			break; \
 		if (timeout_us && ktime_compare(ktime_get(), __timeout) > 0) { \
-			(val) = *((u32 *) (uintptr_t) (addr)); \
+			(val) = *((u32 *)(addr)); \
 			if (mem_written_by_device) \
 				(val) = le32_to_cpu(*(__le32 *) &(val)); \
 			break; \
diff --git a/drivers/misc/habanalabs/common/hw_queue.c b/drivers/misc/habanalabs/common/hw_queue.c
index 5e66c98fb0d3..250cf9cefc06 100644
--- a/drivers/misc/habanalabs/common/hw_queue.c
+++ b/drivers/misc/habanalabs/common/hw_queue.c
@@ -75,7 +75,7 @@ static void ext_and_hw_queue_submit_bd(struct hl_device *hdev,
 {
 	struct hl_bd *bd;
 
-	bd = (struct hl_bd *) (uintptr_t) q->kernel_address;
+	bd = q->kernel_address;
 	bd += hl_pi_2_offset(q->pi);
 	bd->ctl = cpu_to_le32(ctl);
 	bd->len = cpu_to_le32(len);
@@ -335,8 +335,7 @@ static void int_queue_schedule_job(struct hl_cs_job *job)
 	bd.len = cpu_to_le32(job->job_cb_size);
 	bd.ptr = cpu_to_le64((u64) (uintptr_t) job->user_cb);
 
-	pi = (__le64 *) (uintptr_t) (q->kernel_address +
-		((q->pi & (q->int_queue_len - 1)) * sizeof(bd)));
+	pi = q->kernel_address + (q->pi & (q->int_queue_len - 1)) * sizeof(bd);
 
 	q->pi++;
 	q->pi &= ((q->int_queue_len << 1) - 1);
@@ -630,7 +629,7 @@ static int ext_and_cpu_queue_init(struct hl_device *hdev, struct hl_hw_queue *q,
 	if (!p)
 		return -ENOMEM;
 
-	q->kernel_address = (u64) (uintptr_t) p;
+	q->kernel_address = p;
 
 	q->shadow_queue = kmalloc_array(HL_QUEUE_LENGTH,
 					sizeof(*q->shadow_queue),
@@ -653,11 +652,11 @@ free_queue:
 	if (is_cpu_queue)
 		hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
 					HL_QUEUE_SIZE_IN_BYTES,
-					(void *) (uintptr_t) q->kernel_address);
+					q->kernel_address);
 	else
 		hdev->asic_funcs->asic_dma_free_coherent(hdev,
 					HL_QUEUE_SIZE_IN_BYTES,
-					(void *) (uintptr_t) q->kernel_address,
+					q->kernel_address,
 					q->bus_address);
 
 	return rc;
@@ -676,7 +675,7 @@ static int int_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
 		return -EFAULT;
 	}
 
-	q->kernel_address = (u64) (uintptr_t) p;
+	q->kernel_address = p;
 	q->pi = 0;
 	atomic_set(&q->ci, 0);
 
@@ -704,7 +703,7 @@ static int hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
 	if (!p)
 		return -ENOMEM;
 
-	q->kernel_address = (u64) (uintptr_t) p;
+	q->kernel_address = p;
 
 	/* Make sure read/write pointers are initialized to start of queue */
 	atomic_set(&q->ci, 0);
@@ -839,11 +838,11 @@ static void queue_fini(struct hl_device *hdev, struct hl_hw_queue *q)
 	if (q->queue_type == QUEUE_TYPE_CPU)
 		hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
 					HL_QUEUE_SIZE_IN_BYTES,
-					(void *) (uintptr_t) q->kernel_address);
+					q->kernel_address);
 	else
 		hdev->asic_funcs->asic_dma_free_coherent(hdev,
 					HL_QUEUE_SIZE_IN_BYTES,
-					(void *) (uintptr_t) q->kernel_address,
+					q->kernel_address,
 					q->bus_address);
 }
 
diff --git a/drivers/misc/habanalabs/common/irq.c b/drivers/misc/habanalabs/common/irq.c
index d20e40a53d70..de53fb5f978a 100644
--- a/drivers/misc/habanalabs/common/irq.c
+++ b/drivers/misc/habanalabs/common/irq.c
@@ -90,7 +90,7 @@ irqreturn_t hl_irq_handler_cq(int irq, void *arg)
 		return IRQ_HANDLED;
 	}
 
-	cq_base = (struct hl_cq_entry *) (uintptr_t) cq->kernel_address;
+	cq_base = cq->kernel_address;
 
 	while (1) {
 		bool entry_ready = ((le32_to_cpu(cq_base[cq->ci].data) &
@@ -152,7 +152,7 @@ irqreturn_t hl_irq_handler_eq(int irq, void *arg)
 	struct hl_eq_entry *eq_base;
 	struct hl_eqe_work *handle_eqe_work;
 
-	eq_base = (struct hl_eq_entry *) (uintptr_t) eq->kernel_address;
+	eq_base = eq->kernel_address;
 
 	while (1) {
 		bool entry_ready =
@@ -221,7 +221,7 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
 		return -ENOMEM;
 
 	q->hdev = hdev;
-	q->kernel_address = (u64) (uintptr_t) p;
+	q->kernel_address = p;
 	q->hw_queue_id = hw_queue_id;
 	q->ci = 0;
 	q->pi = 0;
@@ -242,7 +242,8 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
 void hl_cq_fini(struct hl_device *hdev, struct hl_cq *q)
 {
 	hdev->asic_funcs->asic_dma_free_coherent(hdev, HL_CQ_SIZE_IN_BYTES,
-			(void *) (uintptr_t) q->kernel_address, q->bus_address);
+						 q->kernel_address,
+						 q->bus_address);
 }
 
 void hl_cq_reset(struct hl_device *hdev, struct hl_cq *q)
@@ -259,7 +260,7 @@ void hl_cq_reset(struct hl_device *hdev, struct hl_cq *q)
 	 * when the device is operational again
 	 */
 
-	memset((void *) (uintptr_t) q->kernel_address, 0, HL_CQ_SIZE_IN_BYTES);
+	memset(q->kernel_address, 0, HL_CQ_SIZE_IN_BYTES);
 }
 
 /**
@@ -282,7 +283,7 @@ int hl_eq_init(struct hl_device *hdev, struct hl_eq *q)
 		return -ENOMEM;
 
 	q->hdev = hdev;
-	q->kernel_address = (u64) (uintptr_t) p;
+	q->kernel_address = p;
 	q->ci = 0;
 
 	return 0;
@@ -302,7 +303,7 @@ void hl_eq_fini(struct hl_device *hdev, struct hl_eq *q)
 
 	hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
 					HL_EQ_SIZE_IN_BYTES,
-					(void *) (uintptr_t) q->kernel_address);
+					q->kernel_address);
 }
 
 void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q)
@@ -316,5 +317,5 @@ void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q)
 	 * when the device is operational again
 	 */
 
-	memset((void *) (uintptr_t) q->kernel_address, 0, HL_EQ_SIZE_IN_BYTES);
+	memset(q->kernel_address, 0, HL_EQ_SIZE_IN_BYTES);
 }
diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c
index 5f65a1691551..b071965fa10a 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi.c
@@ -680,8 +680,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev,
 	if (!cb)
 		return -EFAULT;
 
-	init_tpc_mem_pkt = (struct packet_lin_dma *) (uintptr_t)
-					cb->kernel_address;
+	init_tpc_mem_pkt = cb->kernel_address;
 	cb_size = sizeof(*init_tpc_mem_pkt);
 	memset(init_tpc_mem_pkt, 0, cb_size);
 
@@ -3811,8 +3810,7 @@ static int gaudi_validate_cb(struct hl_device *hdev,
 		u16 pkt_size;
 		struct gaudi_packet *user_pkt;
 
-		user_pkt = (struct gaudi_packet *) (uintptr_t)
-			(parser->user_cb->kernel_address + cb_parsed_length);
+		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
 
 		pkt_id = (enum packet_id) (
 				(le64_to_cpu(user_pkt->header) &
@@ -4035,11 +4033,9 @@ static int gaudi_patch_cb(struct hl_device *hdev,
 		u32 new_pkt_size = 0;
 		struct gaudi_packet *user_pkt, *kernel_pkt;
 
-		user_pkt = (struct gaudi_packet *) (uintptr_t)
-			(parser->user_cb->kernel_address + cb_parsed_length);
-		kernel_pkt = (struct gaudi_packet *) (uintptr_t)
-			(parser->patched_cb->kernel_address +
-					cb_patched_cur_length);
+		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
+		kernel_pkt = parser->patched_cb->kernel_address +
+					cb_patched_cur_length;
 
 		pkt_id = (enum packet_id) (
 				(le64_to_cpu(user_pkt->header) &
@@ -4155,8 +4151,8 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
 	 * The check that parser->user_cb_size <= parser->user_cb->size was done
 	 * in validate_queue_index().
 	 */
-	memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address,
-		(void *) (uintptr_t) parser->user_cb->kernel_address,
+	memcpy(parser->patched_cb->kernel_address,
+		parser->user_cb->kernel_address,
 		parser->user_cb_size);
 
 	patched_cb_size = parser->patched_cb_size;
@@ -4290,7 +4286,7 @@ static int gaudi_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
 }
 
 static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
-					u64 kernel_address, u32 len,
+					void *kernel_address, u32 len,
 					u64 cq_addr, u32 cq_val, u32 msi_vec,
 					bool eb)
 {
@@ -4298,8 +4294,7 @@ static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
 	struct packet_msg_prot *cq_pkt;
 	u32 tmp;
 
-	cq_pkt = (struct packet_msg_prot *) (uintptr_t)
-		(kernel_address + len - (sizeof(struct packet_msg_prot) * 2));
+	cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
 
 	tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
@@ -4342,7 +4337,7 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
 	if (!cb)
 		return -EFAULT;
 
-	lin_dma_pkt = (struct packet_lin_dma *) (uintptr_t) cb->kernel_address;
+	lin_dma_pkt = cb->kernel_address;
 	memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
 	cb_size = sizeof(*lin_dma_pkt);
 
@@ -4954,8 +4949,8 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev,
 
 	cb = job->patched_cb;
 
-	fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address +
-			job->job_cb_size - sizeof(struct packet_msg_prot));
+	fence_pkt = cb->kernel_address +
+			job->job_cb_size - sizeof(struct packet_msg_prot);
 
 	tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1);
@@ -6386,7 +6381,7 @@ static void gaudi_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id)
 	struct packet_msg_short *pkt;
 	u32 value, ctl;
 
-	pkt = (struct packet_msg_short *) (uintptr_t) cb->kernel_address;
+	pkt = cb->kernel_address;
 	memset(pkt, 0, sizeof(*pkt));
 
 	/* Inc by 1, Mode ADD */
@@ -6478,7 +6473,7 @@ static void gaudi_gen_wait_cb(struct hl_device *hdev, void *data, u16 sob_id,
 			u16 sob_val, u16 mon_id, u32 q_idx)
 {
 	struct hl_cb *cb = (struct hl_cb *) data;
-	void *buf = (void *) (uintptr_t) cb->kernel_address;
+	void *buf = cb->kernel_address;
 	u64 monitor_base, fence_addr = 0;
 	u32 size = 0;
 	u16 msg_addr_offset;
diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c
index 5db52064ed9e..235d47b2420f 100644
--- a/drivers/misc/habanalabs/goya/goya.c
+++ b/drivers/misc/habanalabs/goya/goya.c
@@ -2882,8 +2882,8 @@ static int goya_send_job_on_qman0(struct hl_device *hdev, struct hl_cs_job *job)
 
 	cb = job->patched_cb;
 
-	fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address +
-			job->job_cb_size - sizeof(struct packet_msg_prot));
+	fence_pkt = cb->kernel_address +
+			job->job_cb_size - sizeof(struct packet_msg_prot);
 
 	tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
 			(1 << GOYA_PKT_CTL_EB_SHIFT) |
@@ -3475,8 +3475,7 @@ static int goya_validate_cb(struct hl_device *hdev,
 		u16 pkt_size;
 		struct goya_packet *user_pkt;
 
-		user_pkt = (struct goya_packet *) (uintptr_t)
-			(parser->user_cb->kernel_address + cb_parsed_length);
+		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
 
 		pkt_id = (enum packet_id) (
 				(le64_to_cpu(user_pkt->header) &
@@ -3713,11 +3712,9 @@ static int goya_patch_cb(struct hl_device *hdev,
 		u32 new_pkt_size = 0;
 		struct goya_packet *user_pkt, *kernel_pkt;
 
-		user_pkt = (struct goya_packet *) (uintptr_t)
-			(parser->user_cb->kernel_address + cb_parsed_length);
-		kernel_pkt = (struct goya_packet *) (uintptr_t)
-			(parser->patched_cb->kernel_address +
-					cb_patched_cur_length);
+		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
+		kernel_pkt = parser->patched_cb->kernel_address +
+					cb_patched_cur_length;
 
 		pkt_id = (enum packet_id) (
 				(le64_to_cpu(user_pkt->header) &
@@ -3841,8 +3838,8 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
 	 * The check that parser->user_cb_size <= parser->user_cb->size was done
 	 * in validate_queue_index().
 	 */
-	memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address,
-		(void *) (uintptr_t) parser->user_cb->kernel_address,
+	memcpy(parser->patched_cb->kernel_address,
+		parser->user_cb->kernel_address,
 		parser->user_cb_size);
 
 	patched_cb_size = parser->patched_cb_size;
@@ -3974,15 +3971,14 @@ int goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
 		return goya_parse_cb_no_mmu(hdev, parser);
 }
 
-void goya_add_end_of_cb_packets(struct hl_device *hdev, u64 kernel_address,
+void goya_add_end_of_cb_packets(struct hl_device *hdev, void *kernel_address,
 				u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
 				bool eb)
 {
 	struct packet_msg_prot *cq_pkt;
 	u32 tmp;
 
-	cq_pkt = (struct packet_msg_prot *) (uintptr_t)
-		(kernel_address + len - (sizeof(struct packet_msg_prot) * 2));
+	cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
 
 	tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
 			(1 << GOYA_PKT_CTL_EB_SHIFT) |
@@ -4746,7 +4742,7 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
 	if (!cb)
 		return -ENOMEM;
 
-	lin_dma_pkt = (struct packet_lin_dma *) (uintptr_t) cb->kernel_address;
+	lin_dma_pkt = cb->kernel_address;
 
 	do {
 		memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
diff --git a/drivers/misc/habanalabs/goya/goyaP.h b/drivers/misc/habanalabs/goya/goyaP.h
index 09b4006d4dc3..def86c75e035 100644
--- a/drivers/misc/habanalabs/goya/goyaP.h
+++ b/drivers/misc/habanalabs/goya/goyaP.h
@@ -217,7 +217,7 @@ int goya_resume(struct hl_device *hdev);
 void goya_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry);
 void *goya_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size);
 
-void goya_add_end_of_cb_packets(struct hl_device *hdev, u64 kernel_address,
+void goya_add_end_of_cb_packets(struct hl_device *hdev, void *kernel_address,
 				u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
 				bool eb);
 int goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser);
commit 18e8db7f6526928858dfa99b49d831497f0f8df8
Author: Robert Hancock <robert.hancock at calian.com>
Date:   Tue Nov 3 13:33:15 2020 -0600

    hwmon: (pmbus) Add mutex locking for sysfs reads
    
    As part of commit a919ba06979a7 ("hwmon: (pmbus) Stop caching register
    values"), the update of the sensor value is now triggered directly by the
    sensor attribute value being read from sysfs. This created (or at least
    made much more likely) a locking issue, since nothing protected the device
    page selection from being unexpectedly modified by concurrent reads. If
    sensor values on different pages on the same device were being concurrently
    read by multiple threads, this could cause spurious read errors due to the
    page register not reading back the same value last written, or sensor
    values being read from the incorrect page.
    
    Add locking of the update_lock mutex in pmbus_show_sensor and
    pmbus_show_samples so that these cannot result in concurrent reads from the
    underlying device.
    
    Fixes: a919ba06979a7 ("hwmon: (pmbus) Stop caching register values")
    Signed-off-by: Robert Hancock <robert.hancock at calian.com>
    Reviewed-by: Alex Qiu <xqiu at google.com>
    Link: https://lore.kernel.org/r/20201103193315.3011800-1-robert.hancock@calian.com
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>

diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 170a9f82ca61..b0e2820a2d57 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -941,12 +941,16 @@ static ssize_t pmbus_show_sensor(struct device *dev,
 	struct i2c_client *client = to_i2c_client(dev->parent);
 	struct pmbus_sensor *sensor = to_pmbus_sensor(devattr);
 	struct pmbus_data *data = i2c_get_clientdata(client);
+	ssize_t ret;
 
+	mutex_lock(&data->update_lock);
 	pmbus_update_sensor_data(client, sensor);
 	if (sensor->data < 0)
-		return sensor->data;
-
-	return snprintf(buf, PAGE_SIZE, "%lld\n", pmbus_reg2data(data, sensor));
+		ret = sensor->data;
+	else
+		ret = snprintf(buf, PAGE_SIZE, "%lld\n", pmbus_reg2data(data, sensor));
+	mutex_unlock(&data->update_lock);
+	return ret;
 }
 
 static ssize_t pmbus_set_sensor(struct device *dev,
@@ -2012,8 +2016,11 @@ static ssize_t pmbus_show_samples(struct device *dev,
 	int val;
 	struct i2c_client *client = to_i2c_client(dev->parent);
 	struct pmbus_samples_reg *reg = to_samples_reg(devattr);
+	struct pmbus_data *data = i2c_get_clientdata(client);
 
+	mutex_lock(&data->update_lock);
 	val = _pmbus_read_word_data(client, reg->page, 0xff, reg->attr->reg);
+	mutex_unlock(&data->update_lock);
 	if (val < 0)
 		return val;
 
commit a30573b3cdc77b8533d004ece1ea7c0146b437a0
Author: Gao Xiang <hsiangkao at redhat.com>
Date:   Thu Oct 22 22:57:21 2020 +0800

    erofs: fix setting up pcluster for temporary pages
    
    pcluster should be only set up for all managed pages instead of
    temporary pages. Since it currently uses page->mapping to identify,
    the impact is minor for now.
    
    [ Update: Vladimir reported the kernel log becomes polluted
      because PAGE_FLAGS_CHECK_AT_FREE flag(s) set if the page
      allocation debug option is enabled. ]
    
    Link: https://lore.kernel.org/r/20201022145724.27284-1-hsiangkao@aol.com
    Fixes: 5ddcee1f3a1c ("erofs: get rid of __stagingpage_alloc helper")
    Cc: <stable at vger.kernel.org> # 5.5+
    Tested-by: Vladimir Zapolskiy <vladimir at tuxera.com>
    Reviewed-by: Chao Yu <yuchao0 at huawei.com>
    Signed-off-by: Gao Xiang <hsiangkao at redhat.com>

diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 50912a5420b4..86fd3bf62af6 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -1078,8 +1078,11 @@ out_allocpage:
 		cond_resched();
 		goto repeat;
 	}
-	set_page_private(page, (unsigned long)pcl);
-	SetPagePrivate(page);
+
+	if (tocache) {
+		set_page_private(page, (unsigned long)pcl);
+		SetPagePrivate(page);
+	}
 out:	/* the only exit (for tracing and debugging) */
 	return page;
 }
commit d3938ee23e97bfcac2e0eb6b356875da73d700df
Author: Gao Xiang <hsiangkao at redhat.com>
Date:   Sun Nov 1 03:51:02 2020 +0800

    erofs: derive atime instead of leaving it empty
    
    EROFS has _only one_ ondisk timestamp (ctime is currently
    documented and recorded, we might also record mtime instead
    with a new compat feature if needed) for each extended inode
    since EROFS isn't mainly for archival purposes so no need to
    keep all timestamps on disk especially for Android scenarios
    due to security concerns. Also, romfs/cramfs don't have their
    own on-disk timestamp, and squashfs only records mtime instead.
    
    Let's also derive access time from ondisk timestamp rather than
    leaving it empty, and if mtime/atime for each file are really
    needed for specific scenarios as well, we can also use xattrs
    to record them then.
    
    Link: https://lore.kernel.org/r/20201031195102.21221-1-hsiangkao@aol.com
    [ Gao Xiang: It'd be better to backport for user-friendly concern. ]
    Fixes: 431339ba9042 ("staging: erofs: add inode operations")
    Cc: stable <stable at vger.kernel.org> # 4.19+
    Reported-by: nl6720 <nl6720 at gmail.com>
    Reviewed-by: Chao Yu <yuchao0 at huawei.com>
    Signed-off-by: Gao Xiang <hsiangkao at redhat.com>

diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c
index 139d0bed42f8..3e21c0e8adae 100644
--- a/fs/erofs/inode.c
+++ b/fs/erofs/inode.c
@@ -107,11 +107,9 @@ static struct page *erofs_read_inode(struct inode *inode,
 		i_gid_write(inode, le32_to_cpu(die->i_gid));
 		set_nlink(inode, le32_to_cpu(die->i_nlink));
 
-		/* ns timestamp */
-		inode->i_mtime.tv_sec = inode->i_ctime.tv_sec =
-			le64_to_cpu(die->i_ctime);
-		inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec =
-			le32_to_cpu(die->i_ctime_nsec);
+		/* extended inode has its own timestamp */
+		inode->i_ctime.tv_sec = le64_to_cpu(die->i_ctime);
+		inode->i_ctime.tv_nsec = le32_to_cpu(die->i_ctime_nsec);
 
 		inode->i_size = le64_to_cpu(die->i_size);
 
@@ -149,11 +147,9 @@ static struct page *erofs_read_inode(struct inode *inode,
 		i_gid_write(inode, le16_to_cpu(dic->i_gid));
 		set_nlink(inode, le16_to_cpu(dic->i_nlink));
 
-		/* use build time to derive all file time */
-		inode->i_mtime.tv_sec = inode->i_ctime.tv_sec =
-			sbi->build_time;
-		inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec =
-			sbi->build_time_nsec;
+		/* use build time for compact inodes */
+		inode->i_ctime.tv_sec = sbi->build_time;
+		inode->i_ctime.tv_nsec = sbi->build_time_nsec;
 
 		inode->i_size = le32_to_cpu(dic->i_size);
 		if (erofs_inode_is_data_compressed(vi->datalayout))
@@ -167,6 +163,11 @@ static struct page *erofs_read_inode(struct inode *inode,
 		goto err_out;
 	}
 
+	inode->i_mtime.tv_sec = inode->i_ctime.tv_sec;
+	inode->i_atime.tv_sec = inode->i_ctime.tv_sec;
+	inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec;
+	inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec;
+
 	if (!nblks)
 		/* measure inode.i_blocks as generic filesystems */
 		inode->i_blocks = roundup(inode->i_size, EROFS_BLKSIZ) >> 9;
commit bcbc0b2e275f0a797de11a10eff495b4571863fc
Author: Alexander Usyskin <alexander.usyskin at intel.com>
Date:   Thu Oct 29 11:54:42 2020 +0200

    mei: protect mei_cl_mtu from null dereference
    
    A receive callback is queued while the client is still connected
    but can still be called after the client was disconnected. Upon
    disconnect cl->me_cl is set to NULL, hence we need to check
    that ME client is not-NULL in mei_cl_mtu to avoid
    null dereference.
    
    Cc: <stable at vger.kernel.org>
    Signed-off-by: Alexander Usyskin <alexander.usyskin at intel.com>
    Signed-off-by: Tomas Winkler <tomas.winkler at intel.com>
    Link: https://lore.kernel.org/r/20201029095444.957924-2-tomas.winkler@intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>

diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h
index 64143d4ec758..9e08a9843bba 100644
--- a/drivers/misc/mei/client.h
+++ b/drivers/misc/mei/client.h
@@ -182,11 +182,11 @@ static inline u8 mei_cl_me_id(const struct mei_cl *cl)
  *
  * @cl: host client
  *
- * Return: mtu
+ * Return: mtu or 0 if client is not connected
  */
 static inline size_t mei_cl_mtu(const struct mei_cl *cl)
 {
-	return cl->me_cl->props.max_msg_length;
+	return cl->me_cl ? cl->me_cl->props.max_msg_length : 0;
 }
 
 /**
commit 0f7636e1654338c34e3c220c02b2ffad78b6ccc0
Author: Paul Menzel <pmenzel at molgen.mpg.de>
Date:   Tue Aug 11 11:29:23 2020 +0200

    init/Kconfig: Fix CPU number in LOG_CPU_MAX_BUF_SHIFT description
    
    Currently, LOG_BUF_SHIFT defaults to 17, which is 2 ^ 17 bytes = 128 KB,
    and LOG_CPU_MAX_BUF_SHIFT defaults to 12, which is 2 ^ 12 bytes = 4 KB.
    
    Half of 128 KB is 64 KB, so more than 16 CPUs are required for the value
    to be used, as then the sum of contributions is greater than 64 KB for
    the first time. My guess is, that the description was written with the
    configuration values used in the SUSE in mind.
    
    Fixes: 23b2899f7f194f06e ("printk: allow increasing the ring buffer depending on the number of CPUs")
    Cc: Luis R. Rodriguez <mcgrof at suse.com>
    Cc: linux-kernel at vger.kernel.org
    Signed-off-by: Paul Menzel <pmenzel at molgen.mpg.de>
    Reviewed-by: Petr Mladek <pmladek at suse.com>
    Signed-off-by: Petr Mladek <pmladek at suse.com>
    Link: https://lore.kernel.org/r/20200811092924.6256-1-pmenzel@molgen.mpg.de

diff --git a/init/Kconfig b/init/Kconfig
index c9446911cf41..02d13ae27abb 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -719,7 +719,7 @@ config LOG_CPU_MAX_BUF_SHIFT
 	  with more CPUs. Therefore this value is used only when the sum of
 	  contributions is greater than the half of the default kernel ring
 	  buffer as defined by LOG_BUF_SHIFT. The default values are set
-	  so that more than 64 CPUs are needed to trigger the allocation.
+	  so that more than 16 CPUs are needed to trigger the allocation.
 
 	  Also this option is ignored when "log_buf_len" kernel parameter is
 	  used as it forces an exact (power of two) size of the ring buffer.
commit 7a078d2d18801bba7bde7337a823d7342299acf7
Author: Ian Rogers <irogers at google.com>
Date:   Thu Oct 29 15:37:07 2020 -0700

    libbpf, hashmap: Fix undefined behavior in hash_bits
    
    If bits is 0, the case when the map is empty, then the >> is the size of
    the register which is undefined behavior - on x86 it is the same as a
    shift by 0.
    
    Fix by handling the 0 case explicitly and guarding calls to hash_bits for
    empty maps in hashmap__for_each_key_entry and hashmap__for_each_entry_safe.
    
    Fixes: e3b924224028 ("libbpf: add resizable non-thread safe internal hashmap")
    Suggested-by: Andrii Nakryiko <andriin at fb.com>,
    Signed-off-by: Ian Rogers <irogers at google.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Acked-by: Song Liu <songliubraving at fb.com>
    Link: https://lore.kernel.org/bpf/20201029223707.494059-1-irogers@google.com

diff --git a/tools/lib/bpf/hashmap.h b/tools/lib/bpf/hashmap.h
index d9b385fe808c..10a4c4cd13cf 100644
--- a/tools/lib/bpf/hashmap.h
+++ b/tools/lib/bpf/hashmap.h
@@ -15,6 +15,9 @@
 static inline size_t hash_bits(size_t h, int bits)
 {
 	/* shuffle bits and return requested number of upper bits */
+	if (bits == 0)
+		return 0;
+
 #if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__)
 	/* LP64 case */
 	return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits);
@@ -174,17 +177,17 @@ bool hashmap__find(const struct hashmap *map, const void *key, void **value);
  * @key: key to iterate entries for
  */
 #define hashmap__for_each_key_entry(map, cur, _key)			    \
-	for (cur = ({ size_t bkt = hash_bits(map->hash_fn((_key), map->ctx),\
-					     map->cap_bits);		    \
-		     map->buckets ? map->buckets[bkt] : NULL; });	    \
+	for (cur = map->buckets						    \
+		     ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
+		     : NULL;						    \
 	     cur;							    \
 	     cur = cur->next)						    \
 		if (map->equal_fn(cur->key, (_key), map->ctx))
 
 #define hashmap__for_each_key_entry_safe(map, cur, tmp, _key)		    \
-	for (cur = ({ size_t bkt = hash_bits(map->hash_fn((_key), map->ctx),\
-					     map->cap_bits);		    \
-		     cur = map->buckets ? map->buckets[bkt] : NULL; });	    \
+	for (cur = map->buckets						    \
+		     ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
+		     : NULL;						    \
 	     cur && ({ tmp = cur->next; true; });			    \
 	     cur = tmp)							    \
 		if (map->equal_fn(cur->key, (_key), map->ctx))
commit 04516706bb99889986ddfa3a769ed50d2dc7ac13
Author: Johannes Berg <johannes.berg at intel.com>
Date:   Thu Oct 22 16:51:03 2020 +0300

    iwlwifi: pcie: limit memory read spin time
    
    When we read device memory, we lock a spinlock, write the address we
    want to read from the device and then spin in a loop reading the data
    in 32-bit quantities from another register.
    
    As the description makes clear, this is rather inefficient, incurring
    a PCIe bus transaction for every read. In a typical device today, we
    want to read 786k SMEM if it crashes, leading to 192k register reads.
    Occasionally, we've seen the whole loop take over 20 seconds and then
    triggering the soft lockup detector.
    
    Clearly, it is unreasonable to spin here for such extended periods of
    time.
    
    To fix this, break the loop down into an outer and an inner loop, and
    break out of the inner loop if more than half a second elapsed. To
    avoid too much overhead, check for that only every 128 reads, though
    there's no particular reason for that number. Then, unlock and relock
    to obtain NIC access again, reprogram the start address and continue.
    
    This will keep (interrupt) latencies on the CPU down to a reasonable
    time.
    
    Signed-off-by: Johannes Berg <johannes.berg at intel.com>
    Signed-off-by: Mordechay Goodstein <mordechay.goodstein at intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho at intel.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/iwlwifi.20201022165103.45878a7e49aa.I3b9b9c5a10002915072312ce75b68ed5b3dc6e14@changeid

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index d2e69ad53b27..2fffbbc8462f 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -2156,18 +2156,36 @@ static int iwl_trans_pcie_read_mem(struct iwl_trans *trans, u32 addr,
 				   void *buf, int dwords)
 {
 	unsigned long flags;
-	int offs, ret = 0;
+	int offs = 0;
 	u32 *vals = buf;
 
-	if (iwl_trans_grab_nic_access(trans, &flags)) {
-		iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr);
-		for (offs = 0; offs < dwords; offs++)
-			vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
-		iwl_trans_release_nic_access(trans, &flags);
-	} else {
-		ret = -EBUSY;
+	while (offs < dwords) {
+		/* limit the time we spin here under lock to 1/2s */
+		ktime_t timeout = ktime_add_us(ktime_get(), 500 * USEC_PER_MSEC);
+
+		if (iwl_trans_grab_nic_access(trans, &flags)) {
+			iwl_write32(trans, HBUS_TARG_MEM_RADDR,
+				    addr + 4 * offs);
+
+			while (offs < dwords) {
+				vals[offs] = iwl_read32(trans,
+							HBUS_TARG_MEM_RDAT);
+				offs++;
+
+				/* calling ktime_get is expensive so
+				 * do it once in 128 reads
+				 */
+				if (offs % 128 == 0 && ktime_after(ktime_get(),
+								   timeout))
+					break;
+			}
+			iwl_trans_release_nic_access(trans, &flags);
+		} else {
+			return -EBUSY;
+		}
 	}
-	return ret;
+
+	return 0;
 }
 
 static int iwl_trans_pcie_write_mem(struct iwl_trans *trans, u32 addr,
commit ddcd945e556e2cc6be8f88ef0271b56927ffbe98
Author: Tom Rix <trix at redhat.com>
Date:   Sun Oct 11 08:54:38 2020 -0700

    rtw88: fix fw_fifo_addr check
    
    The clang build reports this warning
    
    fw.c:1485:21: warning: address of array 'rtwdev->chip->fw_fifo_addr'
      will always evaluate to 'true'
            if (!rtwdev->chip->fw_fifo_addr) {
    
    fw_fifo_addr is an array in rtw_chip_info so it is always
    nonzero.  A better check is if the first element of the array is
    nonzero.  In the cases where fw_fifo_addr is initialized by rtw88b
    and rtw88c, the first array element is 0x780.
    
    Fixes: 0fbc2f0f34cc ("rtw88: add dump firmware fifo support")
    Signed-off-by: Tom Rix <trix at redhat.com>
    Reviewed-by: Nathan Chancellor <natechancellor at gmail.com>
    Acked-by: Tzu-En Huang <tehuang at realtek.com>
    Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
    Link: https://lore.kernel.org/r/20201011155438.15892-1-trix@redhat.com

diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
index 042015bc8055..b2fd87834f23 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.c
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
@@ -1482,7 +1482,7 @@ static bool rtw_fw_dump_check_size(struct rtw_dev *rtwdev,
 int rtw_fw_dump_fifo(struct rtw_dev *rtwdev, u8 fifo_sel, u32 addr, u32 size,
 		     u32 *buffer)
 {
-	if (!rtwdev->chip->fw_fifo_addr) {
+	if (!rtwdev->chip->fw_fifo_addr[0]) {
 		rtw_dbg(rtwdev, RTW_DBG_FW, "chip not support dump fw fifo\n");
 		return -ENOTSUPP;
 	}
commit f126b6702e7354d6247a36f20b9172457af5c15a
Author: Dinh Nguyen <dinguyen at kernel.org>
Date:   Sun Nov 1 14:02:56 2020 -0600

    arm64: dts: agilex/stratix10: Fix qspi node compatible
    
    The QSPI flash node needs to have the required "jedec,spi-nor"
    in the compatible string.
    
    Fixes: 0cb140d07fc7 ("arm64: dts: stratix10: Add QSPI support for Stratix10")
    Cc: stable at vger.kernel.org
    Suggested-by: Vignesh Raghavendra <vigneshr at ti.com>
    Signed-off-by: Dinh Nguyen <dinguyen at kernel.org>

diff --git a/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts b/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts
index feadd21bc0dc..46e558ab7729 100644
--- a/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts
+++ b/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts
@@ -159,7 +159,7 @@
 	flash at 0 {
 		#address-cells = <1>;
 		#size-cells = <1>;
-		compatible = "n25q00a";
+		compatible = "micron,mt25qu02g", "jedec,spi-nor";
 		reg = <0>;
 		spi-max-frequency = <100000000>;
 
diff --git a/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk_nand.dts b/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk_nand.dts
index c07966740e14..f9b4a39683cf 100644
--- a/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk_nand.dts
+++ b/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk_nand.dts
@@ -192,7 +192,7 @@
 	flash at 0 {
 		#address-cells = <1>;
 		#size-cells = <1>;
-		compatible = "n25q00a";
+		compatible = "micron,mt25qu02g", "jedec,spi-nor";
 		reg = <0>;
 		spi-max-frequency = <100000000>;
 
diff --git a/arch/arm64/boot/dts/intel/socfpga_agilex_socdk.dts b/arch/arm64/boot/dts/intel/socfpga_agilex_socdk.dts
index 96c50d48289d..a7a83f29f00b 100644
--- a/arch/arm64/boot/dts/intel/socfpga_agilex_socdk.dts
+++ b/arch/arm64/boot/dts/intel/socfpga_agilex_socdk.dts
@@ -110,7 +110,7 @@
 	flash at 0 {
 		#address-cells = <1>;
 		#size-cells = <1>;
-		compatible = "mt25qu02g";
+		compatible = "micron,mt25qu02g", "jedec,spi-nor";
 		reg = <0>;
 		spi-max-frequency = <100000000>;
 
commit 8a82d91fa275aaea49be06d7f5b1407ce1c0dd4b
Author: Pablo Greco <pgreco at centosproject.org>
Date:   Mon Nov 2 11:19:29 2020 -0300

    ARM: dts: sun8i: v40: bananapi-m2-berry: Fix ethernet node
    
    Ethernet PHY on BananaPi M2 Berry provides RX and TX delays. Fix ethernet
    node to reflect that fact.
    
    Fixes: 27e81e1970a8 ("ARM: dts: sun8i: v40: bananapi-m2-berry: Enable GMAC ethernet controller")
    Signed-off-by: Pablo Greco <pgreco at centosproject.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/1604326769-39802-1-git-send-email-pgreco@centosproject.org

diff --git a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
index 84eb08295718..47954551f573 100644
--- a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
+++ b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
@@ -120,7 +120,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-supply = <&reg_dc1sw>;
 	status = "okay";
 };
commit bd5cdcdc66e1f7179ff6d172d1e5f55e43403aa8
Author: Pablo Greco <pgreco at centosproject.org>
Date:   Mon Nov 2 11:19:14 2020 -0300

    ARM: dts: sun8i: r40: bananapi-m2-berry: Fix dcdc1 regulator
    
    DCDC1 regulator powers many different subsystems. While some of them can
    work at 3.0 V, some of them can not. For example, VCC-HDMI can only work
    between 3.24 V and 3.36 V. According to OS images provided by the board
    manufacturer this regulator should be set to 3.3 V.
    
    Set DCDC1 and DCDC1SW to 3.3 V in order to fix this.
    
    Fixes: 23edc168bd98 ("ARM: dts: sun8i: Add board dts file for Banana Pi M2 Berry")
    Fixes: 27e81e1970a8 ("ARM: dts: sun8i: v40: bananapi-m2-berry: Enable GMAC ethernet controller")
    Signed-off-by: Pablo Greco <pgreco at centosproject.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/1604326755-39742-1-git-send-email-pgreco@centosproject.org

diff --git a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
index 15c22b06fc4b..84eb08295718 100644
--- a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
+++ b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
@@ -198,16 +198,16 @@
 };
 
 &reg_dc1sw {
-	regulator-min-microvolt = <3000000>;
-	regulator-max-microvolt = <3000000>;
+	regulator-min-microvolt = <3300000>;
+	regulator-max-microvolt = <3300000>;
 	regulator-name = "vcc-gmac-phy";
 };
 
 &reg_dcdc1 {
 	regulator-always-on;
-	regulator-min-microvolt = <3000000>;
-	regulator-max-microvolt = <3000000>;
-	regulator-name = "vcc-3v0";
+	regulator-min-microvolt = <3300000>;
+	regulator-max-microvolt = <3300000>;
+	regulator-name = "vcc-3v3";
 };
 
 &reg_dcdc2 {
commit 8c9cb4094ccf242eddd140efba13872c55f68a87
Author: Pablo Greco <pgreco at centosproject.org>
Date:   Mon Nov 2 11:16:40 2020 -0300

    ARM: dts: sun7i: bananapi: Enable RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Bananapi M1 has the RX and TX delays enabled on
    the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 8a5b272fbf44 ("ARM: dts: sun7i: Add Banana Pi board")
    Signed-off-by: Pablo Greco <pgreco at centosproject.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/1604326600-39544-1-git-send-email-pgreco@centosproject.org

diff --git a/arch/arm/boot/dts/sun7i-a20-bananapi.dts b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
index bb3987e101c2..0b3d9ae75650 100644
--- a/arch/arm/boot/dts/sun7i-a20-bananapi.dts
+++ b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
@@ -132,7 +132,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-supply = <&reg_gmac_3v3>;
 	status = "okay";
 };
commit 3fc2bfa365311c6ef3e4411437786a54a911d9a9
Author: Helge Deller <deller at gmx.de>
Date:   Fri Oct 16 12:13:00 2020 +0200

    nfsroot: Default mount option should ask for built-in NFS version
    
    Change the nfsroot default mount option to ask for NFSv2 only *if* the
    kernel was built with NFSv2 support.
    If not, default to NFSv3 or as last choice to NFSv4, depending on actual
    kernel config.
    
    Signed-off-by: Helge Deller <deller at gmx.de>
    Signed-off-by: Anna Schumaker <Anna.Schumaker at Netapp.com>

diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c
index 8d3278805602..fa148308822c 100644
--- a/fs/nfs/nfsroot.c
+++ b/fs/nfs/nfsroot.c
@@ -88,7 +88,13 @@
 #define NFS_ROOT		"/tftpboot/%s"
 
 /* Default NFSROOT mount options. */
+#if defined(CONFIG_NFS_V2)
 #define NFS_DEF_OPTIONS		"vers=2,tcp,rsize=4096,wsize=4096"
+#elif defined(CONFIG_NFS_V3)
+#define NFS_DEF_OPTIONS		"vers=3,tcp,rsize=4096,wsize=4096"
+#else
+#define NFS_DEF_OPTIONS		"vers=4,tcp,rsize=4096,wsize=4096"
+#endif
 
 /* Parameters passed from the kernel command line */
 static char nfs_root_parms[NFS_MAXPATHLEN + 1] __initdata = "";
commit fc0021aa340af65a0a37d77be39e22aa886a6132
Author: Christoph Hellwig <hch at lst.de>
Date:   Fri Oct 23 08:33:09 2020 +0200

    swiotlb: remove the tbl_dma_addr argument to swiotlb_tbl_map_single
    
    The tbl_dma_addr argument is used to check the DMA boundary for the
    allocations, and thus needs to be a dma_addr_t.  swiotlb-xen instead
    passed a physical address, which could lead to incorrect results for
    strange offsets.  Fix this by removing the parameter entirely and hard
    code the DMA address for io_tlb_start instead.
    
    Fixes: 91ffe4ad534a ("swiotlb-xen: introduce phys_to_dma/dma_to_phys translations")
    Signed-off-by: Christoph Hellwig <hch at lst.de>
    Reviewed-by: Stefano Stabellini <sstabellini at kernel.org>
    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 8651f6d4dfa0..6b560e6f1930 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -3815,9 +3815,8 @@ bounce_map_single(struct device *dev, phys_addr_t paddr, size_t size,
 	 * page aligned, we don't need to use a bounce page.
 	 */
 	if (!IS_ALIGNED(paddr | size, VTD_PAGE_SIZE)) {
-		tlb_addr = swiotlb_tbl_map_single(dev,
-				phys_to_dma_unencrypted(dev, io_tlb_start),
-				paddr, size, aligned_size, dir, attrs);
+		tlb_addr = swiotlb_tbl_map_single(dev, paddr, size,
+				aligned_size, dir, attrs);
 		if (tlb_addr == DMA_MAPPING_ERROR) {
 			goto swiotlb_error;
 		} else {
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
index 71ce1b7a23d1..2b385c1b4a99 100644
--- a/drivers/xen/swiotlb-xen.c
+++ b/drivers/xen/swiotlb-xen.c
@@ -395,8 +395,7 @@ static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
 	 */
 	trace_swiotlb_bounced(dev, dev_addr, size, swiotlb_force);
 
-	map = swiotlb_tbl_map_single(dev, virt_to_phys(xen_io_tlb_start),
-				     phys, size, size, dir, attrs);
+	map = swiotlb_tbl_map_single(dev, phys, size, size, dir, attrs);
 	if (map == (phys_addr_t)DMA_MAPPING_ERROR)
 		return DMA_MAPPING_ERROR;
 
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 513913ff7486..3bb72266a75a 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -45,13 +45,9 @@ enum dma_sync_target {
 	SYNC_FOR_DEVICE = 1,
 };
 
-extern phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
-					  dma_addr_t tbl_dma_addr,
-					  phys_addr_t phys,
-					  size_t mapping_size,
-					  size_t alloc_size,
-					  enum dma_data_direction dir,
-					  unsigned long attrs);
+phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t phys,
+		size_t mapping_size, size_t alloc_size,
+		enum dma_data_direction dir, unsigned long attrs);
 
 extern void swiotlb_tbl_unmap_single(struct device *hwdev,
 				     phys_addr_t tlb_addr,
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 54078f0d4c87..781b9dca197c 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -445,14 +445,11 @@ static void swiotlb_bounce(phys_addr_t orig_addr, phys_addr_t tlb_addr,
 	}
 }
 
-phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
-				   dma_addr_t tbl_dma_addr,
-				   phys_addr_t orig_addr,
-				   size_t mapping_size,
-				   size_t alloc_size,
-				   enum dma_data_direction dir,
-				   unsigned long attrs)
+phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t orig_addr,
+		size_t mapping_size, size_t alloc_size,
+		enum dma_data_direction dir, unsigned long attrs)
 {
+	dma_addr_t tbl_dma_addr = phys_to_dma_unencrypted(hwdev, io_tlb_start);
 	unsigned long flags;
 	phys_addr_t tlb_addr;
 	unsigned int nslots, stride, index, wrap;
@@ -671,9 +668,8 @@ dma_addr_t swiotlb_map(struct device *dev, phys_addr_t paddr, size_t size,
 	trace_swiotlb_bounced(dev, phys_to_dma(dev, paddr), size,
 			      swiotlb_force);
 
-	swiotlb_addr = swiotlb_tbl_map_single(dev,
-			phys_to_dma_unencrypted(dev, io_tlb_start),
-			paddr, size, size, dir, attrs);
+	swiotlb_addr = swiotlb_tbl_map_single(dev, paddr, size, size, dir,
+			attrs);
 	if (swiotlb_addr == (phys_addr_t)DMA_MAPPING_ERROR)
 		return DMA_MAPPING_ERROR;
 
commit e9696d259d0fb5d239e8c28ca41089838ea76d13
Author: Stefano Stabellini <stefano.stabellini at xilinx.com>
Date:   Mon Oct 26 17:02:14 2020 -0700

    swiotlb: fix "x86: Don't panic if can not alloc buffer for swiotlb"
    
    kernel/dma/swiotlb.c:swiotlb_init gets called first and tries to
    allocate a buffer for the swiotlb. It does so by calling
    
      memblock_alloc_low(PAGE_ALIGN(bytes), PAGE_SIZE);
    
    If the allocation must fail, no_iotlb_memory is set.
    
    Later during initialization swiotlb-xen comes in
    (drivers/xen/swiotlb-xen.c:xen_swiotlb_init) and given that io_tlb_start
    is != 0, it thinks the memory is ready to use when actually it is not.
    
    When the swiotlb is actually needed, swiotlb_tbl_map_single gets called
    and since no_iotlb_memory is set the kernel panics.
    
    Instead, if swiotlb-xen.c:xen_swiotlb_init knew the swiotlb hadn't been
    initialized, it would do the initialization itself, which might still
    succeed.
    
    Fix the panic by setting io_tlb_start to 0 on swiotlb initialization
    failure, and also by setting no_iotlb_memory to false on swiotlb
    initialization success.
    
    Fixes: ac2cbab21f31 ("x86: Don't panic if can not alloc buffer for swiotlb")
    
    Reported-by: Elliott Mitchell <ehem+xen at m5p.com>
    Tested-by: Elliott Mitchell <ehem+xen at m5p.com>
    Signed-off-by: Stefano Stabellini <stefano.stabellini at xilinx.com>
    Reviewed-by: Christoph Hellwig <hch at lst.de>
    Cc: stable at vger.kernel.org
    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>

diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index b4eea0abc3f0..54078f0d4c87 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -229,6 +229,7 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
 		io_tlb_orig_addr[i] = INVALID_PHYS_ADDR;
 	}
 	io_tlb_index = 0;
+	no_iotlb_memory = false;
 
 	if (verbose)
 		swiotlb_print_info();
@@ -260,9 +261,11 @@ swiotlb_init(int verbose)
 	if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose))
 		return;
 
-	if (io_tlb_start)
+	if (io_tlb_start) {
 		memblock_free_early(io_tlb_start,
 				    PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
+		io_tlb_start = 0;
+	}
 	pr_warn("Cannot allocate buffer");
 	no_iotlb_memory = true;
 }
@@ -360,6 +363,7 @@ swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs)
 		io_tlb_orig_addr[i] = INVALID_PHYS_ADDR;
 	}
 	io_tlb_index = 0;
+	no_iotlb_memory = false;
 
 	swiotlb_print_info();
 
commit f51778db088b2407ec177f2f4da0f6290602aa3f
Author: Stephen Rothwell <sfr at canb.auug.org.au>
Date:   Mon Nov 2 12:43:27 2020 +1100

    swiotlb: using SIZE_MAX needs limits.h included
    
    After merging the drm-misc tree, linux-next build (arm
    multi_v7_defconfig) failed like this:
    
    In file included from drivers/gpu/drm/nouveau/nouveau_ttm.c:26:
    include/linux/swiotlb.h: In function 'swiotlb_max_mapping_size':
    include/linux/swiotlb.h:99:9: error: 'SIZE_MAX' undeclared (first use in this function)
       99 |  return SIZE_MAX;
          |         ^~~~~~~~
    include/linux/swiotlb.h:7:1: note: 'SIZE_MAX' is defined in header '<stdint.h>'; did you forget to '#include <stdint.h>'?
        6 | #include <linux/init.h>
      +++ |+#include <stdint.h>
        7 | #include <linux/types.h>
    include/linux/swiotlb.h:99:9: note: each undeclared identifier is reported only once for each function it appears in
       99 |  return SIZE_MAX;
          |         ^~~~~~~~
    
    Caused by commit
    
      abe420bfae52 ("swiotlb: Introduce swiotlb_max_mapping_size()")
    
    but only exposed by commit "drm/nouveu: fix swiotlb include"
    
    Fix it by including linux/limits.h as appropriate.
    
    Fixes: abe420bfae52 ("swiotlb: Introduce swiotlb_max_mapping_size()")
    Signed-off-by: Stephen Rothwell <sfr at canb.auug.org.au>
    Link: https://lore.kernel.org/r/20201102124327.2f82b2a7@canb.auug.org.au
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>

diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 046bb94bd4d6..fa5122c6711e 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -5,6 +5,7 @@
 #include <linux/dma-direction.h>
 #include <linux/init.h>
 #include <linux/types.h>
+#include <linux/limits.h>
 
 struct device;
 struct page;
commit 6ab48105aae79b9d8062e9bc922baaeff80918d7
Author: Matteo Scordino <matteo.scordino at gmail.com>
Date:   Fri Oct 30 23:43:25 2020 +0000

    ARM: dts: s3: pinecube: align compatible property to other S3 boards
    
    The compatible string in the Pine64 Pinecube dts diverges from the ones
    used in other S3 based boards, like the LicheePi and the Elimo Impetus
    and Initium. Discussion on LKML decided the PineCube should align to the
    others.
    
    Signed-off-by: Matteo Scordino <matteo.scordino at gmail.com>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201030234325.5865-7-matteo.scordino@gmail.com

diff --git a/arch/arm/boot/dts/sun8i-s3-pinecube.dts b/arch/arm/boot/dts/sun8i-s3-pinecube.dts
index 9bab6b7f4014..4aa0ee897a0a 100644
--- a/arch/arm/boot/dts/sun8i-s3-pinecube.dts
+++ b/arch/arm/boot/dts/sun8i-s3-pinecube.dts
@@ -10,7 +10,7 @@
 
 / {
 	model = "PineCube IP Camera";
-	compatible = "pine64,pinecube", "allwinner,sun8i-s3";
+	compatible = "pine64,pinecube", "sochip,s3", "allwinner,sun8i-v3";
 
 	aliases {
 		serial0 = &uart2;
commit ad2091f893bd5dfe2824f0d6819600d120698e9f
Author: Paul Kocialkowski <contact at paulk.fr>
Date:   Sat Oct 31 19:21:29 2020 +0100

    ARM: sunxi: Add machine match for the Allwinner V3 SoC
    
    The Allwinner V3 SoC shares the same base as the V3s but comes with
    extra pins and features available. As a result, it has its dedicated
    compatible string (already used in device trees), which is added here.
    
    Signed-off-by: Paul Kocialkowski <contact at paulk.fr>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201031182137.1879521-2-contact@paulk.fr

diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c
index 06da2747a90b..19635721013d 100644
--- a/arch/arm/mach-sunxi/sunxi.c
+++ b/arch/arm/mach-sunxi/sunxi.c
@@ -66,6 +66,7 @@ static const char * const sun8i_board_dt_compat[] = {
 	"allwinner,sun8i-h2-plus",
 	"allwinner,sun8i-h3",
 	"allwinner,sun8i-r40",
+	"allwinner,sun8i-v3",
 	"allwinner,sun8i-v3s",
 	NULL,
 };
commit 544cc3f8573bf9a82e8f348741f2f68d2a8376fb
Author: Jernej Skrabec <jernej.skrabec at siol.net>
Date:   Sun Nov 1 08:26:09 2020 +0100

    arm64: dts: allwinner: h6: orangepi-one-plus: Fix ethernet
    
    RX/TX delay on OrangePi One Plus board is set on PHY. Reflect that in
    ethernet node.
    
    Fixes: 7ee32a17e0d6 ("arm64: dts: allwinner: h6: orangepi-one-plus: Enable ethernet")
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Marcus Cooper <codekipper at gmail.com>
    Link: https://lore.kernel.org/r/20201101072609.1681891-1-jernej.skrabec@siol.net

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts
index fceb298bfd53..29a081e72a9b 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts
@@ -27,7 +27,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&ext_rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-handle = <&ext_rgmii_phy>;
 	phy-supply = <&reg_gmac_3v3>;
 	allwinner,rx-delay-ps = <200>;
commit d1889589a4f54b2d1d7075d608b596d6fcfd3d96
Author: Sven Joachim <svenjoac at gmx.de>
Date:   Mon Oct 26 20:32:16 2020 +0100

    builddeb: Fix rootless build in setuid/setgid directory
    
    Building 5.10-rc1 in a setgid directory failed with the following
    error:
    
    dpkg-deb: error: control directory has bad permissions 2755 (must be
    >=0755 and <=0775)
    
    When building with fakeroot, the earlier chown call would have removed
    the setgid bits, but in a rootless build they remain.
    
    Fixes: 3e8541803624 ("builddeb: Enable rootless builds")
    Cc: Guillem Jover <guillem at hadrons.org>
    Signed-off-by: Sven Joachim <svenjoac at gmx.de>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/scripts/package/builddeb b/scripts/package/builddeb
index 1b11f8993629..91a502bb97e8 100755
--- a/scripts/package/builddeb
+++ b/scripts/package/builddeb
@@ -45,6 +45,8 @@ create_package() {
 	chmod -R go-w "$pdir"
 	# in case we are in a restrictive umask environment like 0077
 	chmod -R a+rX "$pdir"
+	# in case we build in a setuid/setgid directory
+	chmod -R ug-s "$pdir"
 
 	# Create the package
 	dpkg-gencontrol -p$pname -P"$pdir"
commit d9b5665fb3c822730857ba9119ead8b5e5ff967d
Author: Vasily Gorbik <gor at linux.ibm.com>
Date:   Fri Oct 23 13:57:32 2020 +0200

    kbuild: remove unused OBJSIZE
    
    The "size" tool has been solely used by s390 to enforce .bss section usage
    restrictions in early startup code. Since commit 980d5f9ab36b ("s390/boot:
    enable .bss section for compressed kernel") and commit 2e83e0eb85ca
    ("s390: clean .bss before running uncompressed kernel") these restrictions
    have been lifted for the decompressor and uncompressed kernel and the
    size tool is now unused.
    
    Signed-off-by: Vasily Gorbik <gor at linux.ibm.com>
    Reviewed-by: Nathan Chancellor <natechancellor at gmail.com>
    Signed-off-by: Masahiro Yamada <masahiroy at kernel.org>

diff --git a/Documentation/kbuild/llvm.rst b/Documentation/kbuild/llvm.rst
index cf3ca236d2cc..21c847890d03 100644
--- a/Documentation/kbuild/llvm.rst
+++ b/Documentation/kbuild/llvm.rst
@@ -57,9 +57,8 @@ to enable them. ::
 They can be enabled individually. The full list of the parameters: ::
 
 	make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
-	  OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size \
-	  READELF=llvm-readelf HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar \
-	  HOSTLD=ld.lld
+	  OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \
+	  HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld
 
 Currently, the integrated assembler is disabled by default. You can pass
 ``LLVM_IAS=1`` to enable it.
diff --git a/Makefile b/Makefile
index 9e7fd6a065a7..f353886dbf44 100644
--- a/Makefile
+++ b/Makefile
@@ -433,7 +433,6 @@ NM		= llvm-nm
 OBJCOPY		= llvm-objcopy
 OBJDUMP		= llvm-objdump
 READELF		= llvm-readelf
-OBJSIZE		= llvm-size
 STRIP		= llvm-strip
 else
 CC		= $(CROSS_COMPILE)gcc
@@ -443,7 +442,6 @@ NM		= $(CROSS_COMPILE)nm
 OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
 READELF		= $(CROSS_COMPILE)readelf
-OBJSIZE		= $(CROSS_COMPILE)size
 STRIP		= $(CROSS_COMPILE)strip
 endif
 PAHOLE		= pahole
@@ -509,7 +507,7 @@ KBUILD_LDFLAGS :=
 CLANG_FLAGS :=
 
 export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
-export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL
+export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL
 export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
 export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD
 export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
commit e402599e5e5e0b2758d7766fd9f6d7953d4ccd85
Author: Oleksij Rempel <o.rempel at pengutronix.de>
Date:   Mon Oct 12 09:18:16 2020 +0200

    ARM: dts: imx6q-prti6q: fix PHY address
    
    Due to bug in the bootloader, the PHY has floating address and may
    randomly change on each PHY reset. To avoid it, the updated bootloader
    with the following patch[0] should be used:
    
    | ARM: protonic: disable on-die termination to fix PHY bootstrapping
    |
    | If on-die termination is enabled, the RXC pin of iMX6 will be pulled
    | high. Since we already have an 10K pull-down on board, the RXC level on
    | PHY reset will be ~800mV, which is mostly interpreted as 1. On some
    | reboots we get 0 instead and kernel can't detect the PHY properly.
    |
    | Since the default 0x020e07ac value is 0, it is sufficient to remove this
    | entry from the affected imxcfg files.
    |
    | Since we get stable 0 on pin PHYADDR[2], the PHY address is changed from
    | 4 to 0.
    
    With latest bootloader update, the PHY address will be fixed to "0".
    
    [0] https://git.pengutronix.de/cgit/barebox/commit/?id=93f7dcf631edfcda19e7757b28d66017ea274b81
    
    Fixes: 0d446a505592 ("ARM: dts: add Protonic PRTI6Q board")
    Signed-off-by: Oleksij Rempel <o.rempel at pengutronix.de>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/boot/dts/imx6q-prti6q.dts b/arch/arm/boot/dts/imx6q-prti6q.dts
index d112b50f8c5d..b4605edfd2ab 100644
--- a/arch/arm/boot/dts/imx6q-prti6q.dts
+++ b/arch/arm/boot/dts/imx6q-prti6q.dts
@@ -213,8 +213,8 @@
 		#size-cells = <0>;
 
 		/* Microchip KSZ9031RNX PHY */
-		rgmii_phy: ethernet-phy at 4 {
-			reg = <4>;
+		rgmii_phy: ethernet-phy at 0 {
+			reg = <0>;
 			interrupts-extended = <&gpio1 28 IRQ_TYPE_LEVEL_LOW>;
 			reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
 			reset-assert-us = <10000>;
commit f8b5a33707c9a19ec905d2826be0acd151997a09
Author: Andrew Lunn <andrew at lunn.ch>
Date:   Fri Oct 30 01:55:28 2020 +0100

    ARM: dts: vf610-zii-dev-rev-b: Fix MDIO over clocking
    
    The ZII devel B board has two generations of Marvell Switches.  The
    mv88e6352 supports an MDIO clock of 12MHz. However the older 88e6185
    does not like 12MHz, and often fails to probe.
    
    Reduce the clock speed to 5MHz, which seems to work reliably.
    
    Cc: Chris Healy <cphealy at gmail.com>
    Fixes: b955387667ec ("ARM: dts: ZII: update MDIO speed and preamble")
    Signed-off-by: Andrew Lunn <andrew at lunn.ch>
    Reviewed-by: Chris Healy <cphealy at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/boot/dts/vf610-zii-dev-rev-b.dts b/arch/arm/boot/dts/vf610-zii-dev-rev-b.dts
index e500911ce0a5..6f1e0f0d4f0a 100644
--- a/arch/arm/boot/dts/vf610-zii-dev-rev-b.dts
+++ b/arch/arm/boot/dts/vf610-zii-dev-rev-b.dts
@@ -406,6 +406,9 @@
 	};
 };
 
+&mdio1 {
+	clock-frequency = <5000000>;
+};
 
 &iomuxc {
 	pinctrl_gpio_e6185_eeprom_sel: pinctrl-gpio-e6185-eeprom-spi0 {
commit 7dd8f0ba88fce98e2953267a66af74c6f4792a56
Author: Sergey Matyukevich <geomatsi at gmail.com>
Date:   Sat Oct 24 23:11:20 2020 +0300

    arm: dts: imx6qdl-udoo: fix rgmii phy-mode for ksz9031 phy
    
    Commit bcf3440c6dd7 ("net: phy: micrel: add phy-mode support for the
    KSZ9031 PHY") fixed micrel phy driver adding proper support for phy
    modes. Adapt imx6q-udoo board phy settings : explicitly set required
    delay configuration using "rgmii-id".
    
    Fixes: cbd54fe0b2bc ("ARM: dts: imx6dl-udoo: Add board support based off imx6q-udoo")
    Signed-off-by: Sergey Matyukevich <geomatsi at gmail.com>
    Reviewed-by: Fabio Estevam <festevam at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm/boot/dts/imx6qdl-udoo.dtsi b/arch/arm/boot/dts/imx6qdl-udoo.dtsi
index 828dd20cd27d..d07d8f83456d 100644
--- a/arch/arm/boot/dts/imx6qdl-udoo.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-udoo.dtsi
@@ -98,7 +98,7 @@
 &fec {
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_enet>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit fe0b980ffd1dd8b10c09f82385514819ba2a661d
Author: Lorenzo Bianconi <lorenzo at kernel.org>
Date:   Sun Nov 1 17:21:18 2020 +0100

    iio: imu: st_lsm6dsx: set 10ms as min shub slave timeout
    
    Set 10ms as minimum i2c slave configuration timeout since st_lsm6dsx
    relies on accel ODR for i2c master clock and at high sample rates
    (e.g. 833Hz or 416Hz) the slave sensor occasionally may need more cycles
    than i2c master timeout (2s/833Hz + 1 ~ 3ms) to apply the configuration
    resulting in an uncomplete slave configuration and a constant reading
    from the i2c slave connected to st_lsm6dsx i2c master.
    
    Fixes: 8f9a5249e3d9 ("iio: imu: st_lsm6dsx: enable 833Hz sample frequency for tagged sensors")
    Fixes: c91c1c844ebd ("iio: imu: st_lsm6dsx: add i2c embedded controller support")
    Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
    Cc: <Stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/a69c8236bf16a1569966815ed71710af2722ed7d.1604247274.git.lorenzo@kernel.org
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c
index 8c8d8870ca07..99562ba85ee4 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c
@@ -156,11 +156,13 @@ static const struct st_lsm6dsx_ext_dev_settings st_lsm6dsx_ext_dev_table[] = {
 static void st_lsm6dsx_shub_wait_complete(struct st_lsm6dsx_hw *hw)
 {
 	struct st_lsm6dsx_sensor *sensor;
-	u32 odr;
+	u32 odr, timeout;
 
 	sensor = iio_priv(hw->iio_devs[ST_LSM6DSX_ID_ACC]);
 	odr = (hw->enable_mask & BIT(ST_LSM6DSX_ID_ACC)) ? sensor->odr : 12500;
-	msleep((2000000U / odr) + 1);
+	/* set 10ms as minimum timeout for i2c slave configuration */
+	timeout = max_t(u32, 2000000U / odr + 1, 10);
+	msleep(timeout);
 }
 
 /*
commit 271b339236e1c0e6448bc1cafeaedcb529324bf0
Author: David Lechner <david at lechnology.com>
Date:   Sun Oct 25 11:51:22 2020 -0500

    counter/ti-eqep: Fix regmap max_register
    
    The values given were the offset of the register after the last
    register instead of the actual last register in each range. Fix
    by using the correct last register of each range.
    
    Fixes: f213729f6796 ("counter: new TI eQEP driver")
    Signed-off-by: David Lechner <david at lechnology.com>
    Acked-by: William Breathitt Gray <vilhelm.gray at gmail.com>
    Link: https://lore.kernel.org/r/20201025165122.607866-1-david@lechnology.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/counter/ti-eqep.c b/drivers/counter/ti-eqep.c
index e27771df8e23..a60aee1a1a29 100644
--- a/drivers/counter/ti-eqep.c
+++ b/drivers/counter/ti-eqep.c
@@ -368,7 +368,7 @@ static const struct regmap_config ti_eqep_regmap32_config = {
 	.reg_bits = 32,
 	.val_bits = 32,
 	.reg_stride = 4,
-	.max_register = 0x24,
+	.max_register = QUPRD,
 };
 
 static const struct regmap_config ti_eqep_regmap16_config = {
@@ -376,7 +376,7 @@ static const struct regmap_config ti_eqep_regmap16_config = {
 	.reg_bits = 16,
 	.val_bits = 16,
 	.reg_stride = 2,
-	.max_register = 0x1e,
+	.max_register = QCPRDLAT,
 };
 
 static int ti_eqep_probe(struct platform_device *pdev)
commit 695e2f5c289bb7f8b85351dcfa35fa236e0200a4
Author: Olivier Moysan <olivier.moysan at st.com>
Date:   Wed Oct 21 10:53:13 2020 +0200

    iio: adc: stm32-adc: fix a regression when using dma and irq
    
    Since overrun interrupt support has been added, there's a regression when
    two ADCs are used at the same time, with:
    - an ADC configured to use IRQs. EOCIE bit is set. The handler is normally
      called in this case.
    - an ADC configured to use DMA. EOCIE bit isn't set. EOC triggers the DMA
      request. It's then automatically cleared by DMA read. But the handler
      gets called due to status bit is temporarily set (IRQ triggered by the
      other ADC).
    
    This is a regression as similar issue had been fixed earlier by
    commit dcb10920179a ("iio: adc: stm32-adc:
    fix a race when using several adcs with dma and irq").
    Issue is that stm32_adc_eoc_enabled() returns non-zero value (always)
    since OVR bit has been added and enabled for both DMA and IRQ case.
    
    Remove OVR mask in IER register, and rely only on CSR status for overrun.
    To avoid subsequent calls to interrupt routine on overrun, CSR OVR bit has
    to be cleared. CSR OVR bit cannot be cleared directly by software.
    To do this ADC must be stopped first, and OVR bit in ADC ISR has
    to be cleared.
    Also add a check in ADC IRQ handler to report spurious IRQs.
    
    Fixes: cc06e67d8fa5 ("iio: adc: stm32-adc: Add check on overrun interrupt")
    Signed-off-by: Olivier Moysan <olivier.moysan at st.com>
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier at st.com>
    Cc: <Stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201021085313.5335-1-olivier.moysan@st.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/adc/stm32-adc-core.c b/drivers/iio/adc/stm32-adc-core.c
index cd870c089182..a83199b212a4 100644
--- a/drivers/iio/adc/stm32-adc-core.c
+++ b/drivers/iio/adc/stm32-adc-core.c
@@ -41,18 +41,16 @@
  * struct stm32_adc_common_regs - stm32 common registers
  * @csr:	common status register offset
  * @ccr:	common control register offset
- * @eoc1_msk:	adc1 end of conversion flag in @csr
- * @eoc2_msk:	adc2 end of conversion flag in @csr
- * @eoc3_msk:	adc3 end of conversion flag in @csr
+ * @eoc_msk:    array of eoc (end of conversion flag) masks in csr for adc1..n
+ * @ovr_msk:    array of ovr (overrun flag) masks in csr for adc1..n
  * @ier:	interrupt enable register offset for each adc
  * @eocie_msk:	end of conversion interrupt enable mask in @ier
  */
 struct stm32_adc_common_regs {
 	u32 csr;
 	u32 ccr;
-	u32 eoc1_msk;
-	u32 eoc2_msk;
-	u32 eoc3_msk;
+	u32 eoc_msk[STM32_ADC_MAX_ADCS];
+	u32 ovr_msk[STM32_ADC_MAX_ADCS];
 	u32 ier;
 	u32 eocie_msk;
 };
@@ -282,21 +280,20 @@ out:
 static const struct stm32_adc_common_regs stm32f4_adc_common_regs = {
 	.csr = STM32F4_ADC_CSR,
 	.ccr = STM32F4_ADC_CCR,
-	.eoc1_msk = STM32F4_EOC1 | STM32F4_OVR1,
-	.eoc2_msk = STM32F4_EOC2 | STM32F4_OVR2,
-	.eoc3_msk = STM32F4_EOC3 | STM32F4_OVR3,
+	.eoc_msk = { STM32F4_EOC1, STM32F4_EOC2, STM32F4_EOC3},
+	.ovr_msk = { STM32F4_OVR1, STM32F4_OVR2, STM32F4_OVR3},
 	.ier = STM32F4_ADC_CR1,
-	.eocie_msk = STM32F4_EOCIE | STM32F4_OVRIE,
+	.eocie_msk = STM32F4_EOCIE,
 };
 
 /* STM32H7 common registers definitions */
 static const struct stm32_adc_common_regs stm32h7_adc_common_regs = {
 	.csr = STM32H7_ADC_CSR,
 	.ccr = STM32H7_ADC_CCR,
-	.eoc1_msk = STM32H7_EOC_MST | STM32H7_OVR_MST,
-	.eoc2_msk = STM32H7_EOC_SLV | STM32H7_OVR_SLV,
+	.eoc_msk = { STM32H7_EOC_MST, STM32H7_EOC_SLV},
+	.ovr_msk = { STM32H7_OVR_MST, STM32H7_OVR_SLV},
 	.ier = STM32H7_ADC_IER,
-	.eocie_msk = STM32H7_EOCIE | STM32H7_OVRIE,
+	.eocie_msk = STM32H7_EOCIE,
 };
 
 static const unsigned int stm32_adc_offset[STM32_ADC_MAX_ADCS] = {
@@ -318,6 +315,7 @@ static void stm32_adc_irq_handler(struct irq_desc *desc)
 {
 	struct stm32_adc_priv *priv = irq_desc_get_handler_data(desc);
 	struct irq_chip *chip = irq_desc_get_chip(desc);
+	int i;
 	u32 status;
 
 	chained_irq_enter(chip, desc);
@@ -335,17 +333,12 @@ static void stm32_adc_irq_handler(struct irq_desc *desc)
 	 * before invoking the interrupt handler (e.g. call ISR only for
 	 * IRQ-enabled ADCs).
 	 */
-	if (status & priv->cfg->regs->eoc1_msk &&
-	    stm32_adc_eoc_enabled(priv, 0))
-		generic_handle_irq(irq_find_mapping(priv->domain, 0));
-
-	if (status & priv->cfg->regs->eoc2_msk &&
-	    stm32_adc_eoc_enabled(priv, 1))
-		generic_handle_irq(irq_find_mapping(priv->domain, 1));
-
-	if (status & priv->cfg->regs->eoc3_msk &&
-	    stm32_adc_eoc_enabled(priv, 2))
-		generic_handle_irq(irq_find_mapping(priv->domain, 2));
+	for (i = 0; i < priv->cfg->num_irqs; i++) {
+		if ((status & priv->cfg->regs->eoc_msk[i] &&
+		     stm32_adc_eoc_enabled(priv, i)) ||
+		     (status & priv->cfg->regs->ovr_msk[i]))
+			generic_handle_irq(irq_find_mapping(priv->domain, i));
+	}
 
 	chained_irq_exit(chip, desc);
 };
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
index b3f31f147347..16c02c30dec7 100644
--- a/drivers/iio/adc/stm32-adc.c
+++ b/drivers/iio/adc/stm32-adc.c
@@ -154,6 +154,7 @@ struct stm32_adc;
  * @start_conv:		routine to start conversions
  * @stop_conv:		routine to stop conversions
  * @unprepare:		optional unprepare routine (disable, power-down)
+ * @irq_clear:		routine to clear irqs
  * @smp_cycles:		programmable sampling time (ADC clock cycles)
  */
 struct stm32_adc_cfg {
@@ -166,6 +167,7 @@ struct stm32_adc_cfg {
 	void (*start_conv)(struct iio_dev *, bool dma);
 	void (*stop_conv)(struct iio_dev *);
 	void (*unprepare)(struct iio_dev *);
+	void (*irq_clear)(struct iio_dev *indio_dev, u32 msk);
 	const unsigned int *smp_cycles;
 };
 
@@ -621,6 +623,13 @@ static void stm32f4_adc_stop_conv(struct iio_dev *indio_dev)
 			   STM32F4_ADON | STM32F4_DMA | STM32F4_DDS);
 }
 
+static void stm32f4_adc_irq_clear(struct iio_dev *indio_dev, u32 msk)
+{
+	struct stm32_adc *adc = iio_priv(indio_dev);
+
+	stm32_adc_clr_bits(adc, adc->cfg->regs->isr_eoc.reg, msk);
+}
+
 static void stm32h7_adc_start_conv(struct iio_dev *indio_dev, bool dma)
 {
 	struct stm32_adc *adc = iio_priv(indio_dev);
@@ -659,6 +668,13 @@ static void stm32h7_adc_stop_conv(struct iio_dev *indio_dev)
 	stm32_adc_clr_bits(adc, STM32H7_ADC_CFGR, STM32H7_DMNGT_MASK);
 }
 
+static void stm32h7_adc_irq_clear(struct iio_dev *indio_dev, u32 msk)
+{
+	struct stm32_adc *adc = iio_priv(indio_dev);
+	/* On STM32H7 IRQs are cleared by writing 1 into ISR register */
+	stm32_adc_set_bits(adc, adc->cfg->regs->isr_eoc.reg, msk);
+}
+
 static int stm32h7_adc_exit_pwr_down(struct iio_dev *indio_dev)
 {
 	struct stm32_adc *adc = iio_priv(indio_dev);
@@ -1235,17 +1251,40 @@ static int stm32_adc_read_raw(struct iio_dev *indio_dev,
 	}
 }
 
+static void stm32_adc_irq_clear(struct iio_dev *indio_dev, u32 msk)
+{
+	struct stm32_adc *adc = iio_priv(indio_dev);
+
+	adc->cfg->irq_clear(indio_dev, msk);
+}
+
 static irqreturn_t stm32_adc_threaded_isr(int irq, void *data)
 {
 	struct iio_dev *indio_dev = data;
 	struct stm32_adc *adc = iio_priv(indio_dev);
 	const struct stm32_adc_regspec *regs = adc->cfg->regs;
 	u32 status = stm32_adc_readl(adc, regs->isr_eoc.reg);
+	u32 mask = stm32_adc_readl(adc, regs->ier_eoc.reg);
 
-	if (status & regs->isr_ovr.mask)
+	/* Check ovr status right now, as ovr mask should be already disabled */
+	if (status & regs->isr_ovr.mask) {
+		/*
+		 * Clear ovr bit to avoid subsequent calls to IRQ handler.
+		 * This requires to stop ADC first. OVR bit state in ISR,
+		 * is propaged to CSR register by hardware.
+		 */
+		adc->cfg->stop_conv(indio_dev);
+		stm32_adc_irq_clear(indio_dev, regs->isr_ovr.mask);
 		dev_err(&indio_dev->dev, "Overrun, stopping: restart needed\n");
+		return IRQ_HANDLED;
+	}
 
-	return IRQ_HANDLED;
+	if (!(status & mask))
+		dev_err_ratelimited(&indio_dev->dev,
+				    "Unexpected IRQ: IER=0x%08x, ISR=0x%08x\n",
+				    mask, status);
+
+	return IRQ_NONE;
 }
 
 static irqreturn_t stm32_adc_isr(int irq, void *data)
@@ -1254,6 +1293,10 @@ static irqreturn_t stm32_adc_isr(int irq, void *data)
 	struct stm32_adc *adc = iio_priv(indio_dev);
 	const struct stm32_adc_regspec *regs = adc->cfg->regs;
 	u32 status = stm32_adc_readl(adc, regs->isr_eoc.reg);
+	u32 mask = stm32_adc_readl(adc, regs->ier_eoc.reg);
+
+	if (!(status & mask))
+		return IRQ_WAKE_THREAD;
 
 	if (status & regs->isr_ovr.mask) {
 		/*
@@ -2046,6 +2089,7 @@ static const struct stm32_adc_cfg stm32f4_adc_cfg = {
 	.start_conv = stm32f4_adc_start_conv,
 	.stop_conv = stm32f4_adc_stop_conv,
 	.smp_cycles = stm32f4_adc_smp_cycles,
+	.irq_clear = stm32f4_adc_irq_clear,
 };
 
 static const struct stm32_adc_cfg stm32h7_adc_cfg = {
@@ -2057,6 +2101,7 @@ static const struct stm32_adc_cfg stm32h7_adc_cfg = {
 	.prepare = stm32h7_adc_prepare,
 	.unprepare = stm32h7_adc_unprepare,
 	.smp_cycles = stm32h7_adc_smp_cycles,
+	.irq_clear = stm32h7_adc_irq_clear,
 };
 
 static const struct stm32_adc_cfg stm32mp1_adc_cfg = {
@@ -2069,6 +2114,7 @@ static const struct stm32_adc_cfg stm32mp1_adc_cfg = {
 	.prepare = stm32h7_adc_prepare,
 	.unprepare = stm32h7_adc_unprepare,
 	.smp_cycles = stm32h7_adc_smp_cycles,
+	.irq_clear = stm32h7_adc_irq_clear,
 };
 
 static const struct of_device_id stm32_adc_of_match[] = {
commit 15207a92e019803d62687455d8aa2ff9eb3dc82c
Author: Fabien Parent <fparent at baylibre.com>
Date:   Sun Oct 18 21:46:44 2020 +0200

    iio: adc: mediatek: fix unset field
    
    dev_comp field is used in a couple of places but it is never set. This
    results in kernel oops when dereferencing a NULL pointer. Set the
    `dev_comp` field correctly in the probe function.
    
    Fixes: 6d97024dce23 ("iio: adc: mediatek: mt6577-auxadc, add mt6765 support")
    Signed-off-by: Fabien Parent <fparent at baylibre.com>
    Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>
    Cc: <Stable at vger.kernel.org>
    Link: https://lore.kernel.org/r/20201018194644.3366846-1-fparent@baylibre.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/adc/mt6577_auxadc.c b/drivers/iio/adc/mt6577_auxadc.c
index ac415cb089cd..79c1dd68b909 100644
--- a/drivers/iio/adc/mt6577_auxadc.c
+++ b/drivers/iio/adc/mt6577_auxadc.c
@@ -9,9 +9,9 @@
 #include <linux/err.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
+#include <linux/mod_devicetable.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/iopoll.h>
 #include <linux/io.h>
 #include <linux/iio/iio.h>
@@ -276,6 +276,8 @@ static int mt6577_auxadc_probe(struct platform_device *pdev)
 		goto err_disable_clk;
 	}
 
+	adc_dev->dev_comp = device_get_match_data(&pdev->dev);
+
 	mutex_init(&adc_dev->lock);
 
 	mt6577_auxadc_mod_reg(adc_dev->reg_base + MT6577_AUXADC_MISC,
commit 56e4f2dda23c6d39d327944faa89efaa4eb290d1
Author: Gwendal Grignou <gwendal at chromium.org>
Date:   Tue Jun 30 08:37:30 2020 -0700

    iio: cros_ec: Use default frequencies when EC returns invalid information
    
    Minimal and maximal frequencies supported by a sensor is queried.
    On some older machines, these frequencies are not returned properly and
    the EC returns 0 instead.
    When returned maximal frequency is 0, ignore the information and use
    default frequencies instead.
    
    Fixes: ae7b02ad2f32 ("iio: common: cros_ec_sensors: Expose cros_ec_sensors frequency range via iio sysfs")
    Signed-off-by: Gwendal Grignou <gwendal at chromium.org>
    Reviewed-by: Enric Balletbo i Serra <enric.balletbo at collabora.com>
    Link: https://lore.kernel.org/r/20200630153730.3302889-1-gwendal@chromium.org
    CC: <Stable at vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>

diff --git a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c
index c62cacc04672..e3f507771f17 100644
--- a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c
+++ b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c
@@ -256,7 +256,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
 	struct cros_ec_sensorhub *sensor_hub = dev_get_drvdata(dev->parent);
 	struct cros_ec_dev *ec = sensor_hub->ec;
 	struct cros_ec_sensor_platform *sensor_platform = dev_get_platdata(dev);
-	u32 ver_mask;
+	u32 ver_mask, temp;
 	int frequencies[ARRAY_SIZE(state->frequencies) / 2] = { 0 };
 	int ret, i;
 
@@ -311,10 +311,16 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
 						 &frequencies[2],
 						 &state->fifo_max_event_count);
 		} else {
-			frequencies[1] = state->resp->info_3.min_frequency;
-			frequencies[2] = state->resp->info_3.max_frequency;
-			state->fifo_max_event_count =
-			    state->resp->info_3.fifo_max_event_count;
+			if (state->resp->info_3.max_frequency == 0) {
+				get_default_min_max_freq(state->resp->info.type,
+							 &frequencies[1],
+							 &frequencies[2],
+							 &temp);
+			} else {
+				frequencies[1] = state->resp->info_3.min_frequency;
+				frequencies[2] = state->resp->info_3.max_frequency;
+			}
+			state->fifo_max_event_count = state->resp->info_3.fifo_max_event_count;
 		}
 		for (i = 0; i < ARRAY_SIZE(frequencies); i++) {
 			state->frequencies[2 * i] = frequencies[i] / 1000;
commit 01fe332800d0d2f94337b45c1973f4cf28ae6195
Author: Maciej Matuszczyk <maccraft123mc at gmail.com>
Date:   Fri Oct 23 20:16:29 2020 +0200

    arm64: dts: rockchip: Remove system-power-controller from pmic on Odroid Go Advance
    
    This fixes a poweroff issue when this is supposed to happen
    via PSCI.
    
    Signed-off-by: Maciej Matuszczyk <maccraft123mc at gmail.com>
    Link: https://lore.kernel.org/r/20201023181629.119727-1-maccraft123mc@gmail.com
    Signed-off-by: Heiko Stuebner <heiko at sntech.de>

diff --git a/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts b/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts
index 35bd6b904b9c..337681038519 100644
--- a/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts
@@ -243,7 +243,6 @@
 		interrupts = <RK_PB2 IRQ_TYPE_LEVEL_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pmic_int>;
-		rockchip,system-power-controller;
 		wakeup-source;
 		#clock-cells = <1>;
 		clock-output-names = "rk808-clkout1", "xin32k";
commit b0c0aa7aa4b919e02e0a24aa3a46dfbf2bbc34dc
Author: David Bauer <mail at david-bauer.net>
Date:   Mon Oct 26 17:27:21 2020 +0100

    arm64: dts: rockchip: fix NanoPi R2S GMAC clock name
    
    This commit fixes the name for the GMAC clock to gmac_clkin, as this is
    the name of the clock provided by the rk3328-clk driver.
    
    Without this commit, the GMAC will not work in TX direction.
    
    Fixes: f1ec83f880db ("arm64: dts: rockchip: Add support for FriendlyARM NanoPi R2S")
    Suggested-by: Tobias Waldvogel <tobias.waldvogel at gmail.com>
    Signed-off-by: David Bauer <mail at david-bauer.net>
    Link: https://lore.kernel.org/r/20201026162721.70672-1-mail@david-bauer.net
    Signed-off-by: Heiko Stuebner <heiko at sntech.de>

diff --git a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
index be7a31d81632..2ee07d15a6e3 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
@@ -20,7 +20,7 @@
 	gmac_clk: gmac-clock {
 		compatible = "fixed-clock";
 		clock-frequency = <125000000>;
-		clock-output-names = "gmac_clk";
+		clock-output-names = "gmac_clkin";
 		#clock-cells = <0>;
 	};
 
commit 61cf93d3e14a29288e4d5522aecb6e58268eec62
Author: Dennis Zhou <dennis at kernel.org>
Date:   Fri Oct 30 20:40:21 2020 +0000

    percpu: convert flexible array initializers to use struct_size()
    
    Use the safer macro as sparked by the long discussion in [1].
    
    [1] https://lore.kernel.org/lkml/20200917204514.GA2880159@google.com/
    
    Reviewed-by: Gustavo A. R. Silva <gustavoars at kernel.org>
    Signed-off-by: Dennis Zhou <dennis at kernel.org>

diff --git a/mm/percpu.c b/mm/percpu.c
index 66a93f096394..ad7a37ee74ef 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1315,8 +1315,8 @@ static struct pcpu_chunk * __init pcpu_alloc_first_chunk(unsigned long tmp_addr,
 	region_size = ALIGN(start_offset + map_size, lcm_align);
 
 	/* allocate chunk */
-	alloc_size = sizeof(struct pcpu_chunk) +
-		BITS_TO_LONGS(region_size >> PAGE_SHIFT) * sizeof(unsigned long);
+	alloc_size = struct_size(chunk, populated,
+				 BITS_TO_LONGS(region_size >> PAGE_SHIFT));
 	chunk = memblock_alloc(alloc_size, SMP_CACHE_BYTES);
 	if (!chunk)
 		panic("%s: Failed to allocate %zu bytes\n", __func__,
@@ -2521,8 +2521,8 @@ void __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
 	pcpu_unit_pages = ai->unit_size >> PAGE_SHIFT;
 	pcpu_unit_size = pcpu_unit_pages << PAGE_SHIFT;
 	pcpu_atom_size = ai->atom_size;
-	pcpu_chunk_struct_size = sizeof(struct pcpu_chunk) +
-		BITS_TO_LONGS(pcpu_unit_pages) * sizeof(unsigned long);
+	pcpu_chunk_struct_size = struct_size(chunk, populated,
+					     BITS_TO_LONGS(pcpu_unit_pages));
 
 	pcpu_stats_save_ai(ai);
 
commit cf5abb0132193767c07c83e06f91b777d22ba495
Author: Adam Ford <aford173 at gmail.com>
Date:   Thu Oct 8 13:33:00 2020 -0500

    arm64: dts imx8mn: Remove non-existent USB OTG2
    
    According to the i.MX8MN TRM, there is only one OTG port.  The
    address for OTG2 is reserved on Nano.
    
    This patch removes the non-existent OTG2, usbphynop2, and the usbmisc2
    nodes.
    
    Fixes: 6c3debcbae47 ("arm64: dts: freescale: Add i.MX8MN dtsi support")
    Signed-off-by: Adam Ford <aford173 at gmail.com>
    Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mn.dtsi b/arch/arm64/boot/dts/freescale/imx8mn.dtsi
index 746faf1cf2fb..16c7202885d7 100644
--- a/arch/arm64/boot/dts/freescale/imx8mn.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mn.dtsi
@@ -790,28 +790,6 @@
 				#index-cells = <1>;
 				reg = <0x32e40200 0x200>;
 			};
-
-			usbotg2: usb at 32e50000 {
-				compatible = "fsl,imx8mn-usb", "fsl,imx7d-usb";
-				reg = <0x32e50000 0x200>;
-				interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clk IMX8MN_CLK_USB1_CTRL_ROOT>;
-				clock-names = "usb1_ctrl_root_clk";
-				assigned-clocks = <&clk IMX8MN_CLK_USB_BUS>,
-						  <&clk IMX8MN_CLK_USB_CORE_REF>;
-				assigned-clock-parents = <&clk IMX8MN_SYS_PLL2_500M>,
-							 <&clk IMX8MN_SYS_PLL1_100M>;
-				fsl,usbphy = <&usbphynop2>;
-				fsl,usbmisc = <&usbmisc2 0>;
-				status = "disabled";
-			};
-
-			usbmisc2: usbmisc at 32e50200 {
-				compatible = "fsl,imx8mn-usbmisc", "fsl,imx7d-usbmisc";
-				#index-cells = <1>;
-				reg = <0x32e50200 0x200>;
-			};
-
 		};
 
 		dma_apbh: dma-controller at 33000000 {
@@ -876,12 +854,4 @@
 		assigned-clock-parents = <&clk IMX8MN_SYS_PLL1_100M>;
 		clock-names = "main_clk";
 	};
-
-	usbphynop2: usbphynop2 {
-		compatible = "usb-nop-xceiv";
-		clocks = <&clk IMX8MN_CLK_USB_PHY_REF>;
-		assigned-clocks = <&clk IMX8MN_CLK_USB_PHY_REF>;
-		assigned-clock-parents = <&clk IMX8MN_SYS_PLL1_100M>;
-		clock-names = "main_clk";
-	};
 };
commit 587258edd94c305077923ec458e04c032fca83e6
Author: Adam Ford <aford173 at gmail.com>
Date:   Wed Oct 7 08:02:37 2020 -0500

    arm64: dts: imx8mm-beacon-som: Fix Choppy BT audio
    
    When streaming bluetooth audio, the sound is choppy due to the
    fact that the default baud rate of the HCI interface is too slow
    to handle 16-bit stereo at 48KHz.
    
    The Bluetooth chip is capable of up to 4M baud on the serial port,
    so this patch sets the max-speed to 4000000 in order to properly
    stream audio over the Bluetooth.
    
    Fixes: 593816fa2f35 ("arm64: dts: imx: Add Beacon i.MX8m-Mini development kit")
    Signed-off-by: Adam Ford <aford173 at gmail.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi
index 55b36bddd513..b88c3c99b007 100644
--- a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi
@@ -211,6 +211,7 @@
 		host-wakeup-gpios = <&gpio2 8 GPIO_ACTIVE_HIGH>;
 		device-wakeup-gpios = <&gpio2 7 GPIO_ACTIVE_HIGH>;
 		clocks = <&osc_32k>;
+		max-speed = <4000000>;
 		clock-names = "extclk";
 	};
 };
commit 054b5d97448714ae4a0bcd6f36b0515ac7aed21e
Author: Madalin Bucur <madalin.bucur at oss.nxp.com>
Date:   Mon Oct 5 15:46:39 2020 +0300

    arm64: dts: fsl: DPAA FMan DMA operations are coherent
    
    Although the DPAA 1 FMan operations are coherent, the device tree
    node for the FMan does not indicate that, resulting in a needless
    loss of performance. Adding the missing dma-coherent property.
    
    Fixes: 1ffbecdd8321 ("arm64: dts: add DPAA FMan nodes")
    Signed-off-by: Madalin Bucur <madalin.bucur at oss.nxp.com>
    Tested-by: Camelia Groza <camelia.groza at oss.nxp.com>
    Acked-by: Li Yang <leoyang.li at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/qoriq-fman3-0.dtsi b/arch/arm64/boot/dts/freescale/qoriq-fman3-0.dtsi
index 8bc6caa9167d..4338db14c5da 100644
--- a/arch/arm64/boot/dts/freescale/qoriq-fman3-0.dtsi
+++ b/arch/arm64/boot/dts/freescale/qoriq-fman3-0.dtsi
@@ -19,6 +19,7 @@ fman0: fman at 1a00000 {
 	clock-names = "fmanclk";
 	fsl,qman-channel-range = <0x800 0x10>;
 	ptimer-handle = <&ptp_timer0>;
+	dma-coherent;
 
 	muram at 0 {
 		compatible = "fsl,fman-muram";
commit 080b6f40763565f65ebb9540219c71ce885cf568
Author: Ard Biesheuvel <ardb at kernel.org>
Date:   Wed Oct 28 18:15:05 2020 +0100

    bpf: Don't rely on GCC __attribute__((optimize)) to disable GCSE
    
    Commit 3193c0836 ("bpf: Disable GCC -fgcse optimization for
    ___bpf_prog_run()") introduced a __no_fgcse macro that expands to a
    function scope __attribute__((optimize("-fno-gcse"))), to disable a
    GCC specific optimization that was causing trouble on x86 builds, and
    was not expected to have any positive effect in the first place.
    
    However, as the GCC manual documents, __attribute__((optimize))
    is not for production use, and results in all other optimization
    options to be forgotten for the function in question. This can
    cause all kinds of trouble, but in one particular reported case,
    it causes -fno-asynchronous-unwind-tables to be disregarded,
    resulting in .eh_frame info to be emitted for the function.
    
    This reverts commit 3193c0836, and instead, it disables the -fgcse
    optimization for the entire source file, but only when building for
    X86 using GCC with CONFIG_BPF_JIT_ALWAYS_ON disabled. Note that the
    original commit states that CONFIG_RETPOLINE=n triggers the issue,
    whereas CONFIG_RETPOLINE=y performs better without the optimization,
    so it is kept disabled in both cases.
    
    Fixes: 3193c0836f20 ("bpf: Disable GCC -fgcse optimization for ___bpf_prog_run()")
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
    Signed-off-by: Alexei Starovoitov <ast at kernel.org>
    Tested-by: Geert Uytterhoeven <geert+renesas at glider.be>
    Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
    Link: https://lore.kernel.org/lkml/CAMuHMdUg0WJHEcq6to0-eODpXPOywLot6UD2=GFHpzoj_hCoBQ@mail.gmail.com/
    Link: https://lore.kernel.org/bpf/20201028171506.15682-2-ardb@kernel.org

diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index d1e3c6896b71..5deb37024574 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -175,5 +175,3 @@
 #else
 #define __diag_GCC_8(s)
 #endif
-
-#define __no_fgcse __attribute__((optimize("-fno-gcse")))
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index 6e390d58a9f8..ac3fa37a84f9 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -247,10 +247,6 @@ struct ftrace_likely_data {
 #define asm_inline asm
 #endif
 
-#ifndef __no_fgcse
-# define __no_fgcse
-#endif
-
 /* Are two types/vars the same type (ignoring qualifiers)? */
 #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 
diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile
index bdc8cd1b6767..c1b9f71ee6aa 100644
--- a/kernel/bpf/Makefile
+++ b/kernel/bpf/Makefile
@@ -1,6 +1,10 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-y := core.o
-CFLAGS_core.o += $(call cc-disable-warning, override-init)
+ifneq ($(CONFIG_BPF_JIT_ALWAYS_ON),y)
+# ___bpf_prog_run() needs GCSE disabled on x86; see 3193c0836f203 for details
+cflags-nogcse-$(CONFIG_X86)$(CONFIG_CC_IS_GCC) := -fno-gcse
+endif
+CFLAGS_core.o += $(call cc-disable-warning, override-init) $(cflags-nogcse-yy)
 
 obj-$(CONFIG_BPF_SYSCALL) += syscall.o verifier.o inode.o helpers.o tnum.o bpf_iter.o map_iter.o task_iter.o prog_iter.o
 obj-$(CONFIG_BPF_SYSCALL) += hashtab.o arraymap.o percpu_freelist.o bpf_lru_list.o lpm_trie.o map_in_map.o
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 9268d77898b7..55454d2278b1 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -1369,7 +1369,7 @@ u64 __weak bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr)
  *
  * Decode and execute eBPF instructions.
  */
-static u64 __no_fgcse ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
+static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
 {
 #define BPF_INSN_2_LBL(x, y)    [BPF_##x | BPF_##y] = &&x##_##y
 #define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z
commit d92454287ee25d78f1caac3734a1864f8a5a5275
Author: Biwen Li <biwen.li at nxp.com>
Date:   Tue Sep 29 09:30:21 2020 +0800

    arm64: dts: fsl: fix endianness issue of rcpm
    
    Add little-endian property to RCPM node (for ls1028a,ls1088a,ls208xa),
    otherwise RCPM driver will program hardware with incorrect setting,
    causing system (such as LS1028ARDB) failed to be waked by wakeup source.
    
    Fixes: 791c88ca5713 (“arm64: dts: ls1028a: Add ftm_alarm0 DT node”)
    Fixes: f4fe3a8665495 (“arm64: dts: layerscape: add ftm_alarm0 node”)
    Signed-off-by: Biwen Li <biwen.li at nxp.com>
    Signed-off-by: Ran Wang <ran.wang_1 at nxp.com>
    Acked-by: Li Yang <leoyang.li at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
index 73e4f9466887..7a6fb7e1fb82 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
@@ -1012,6 +1012,7 @@
 			compatible = "fsl,ls1028a-rcpm", "fsl,qoriq-rcpm-2.1+";
 			reg = <0x0 0x1e34040 0x0 0x1c>;
 			#fsl,rcpm-wakeup-cells = <7>;
+			little-endian;
 		};
 
 		ftm_alarm0: timer at 2800000 {
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
index ff5805206a28..692d8f4a206d 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
@@ -805,6 +805,7 @@
 			compatible = "fsl,ls1088a-rcpm", "fsl,qoriq-rcpm-2.1+";
 			reg = <0x0 0x1e34040 0x0 0x18>;
 			#fsl,rcpm-wakeup-cells = <6>;
+			little-endian;
 		};
 
 		ftm_alarm0: timer at 2800000 {
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
index bf72918fe545..e7abb74bd816 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
@@ -892,6 +892,7 @@
 			compatible = "fsl,ls208xa-rcpm", "fsl,qoriq-rcpm-2.1+";
 			reg = <0x0 0x1e34040 0x0 0x18>;
 			#fsl,rcpm-wakeup-cells = <6>;
+			little-endian;
 		};
 
 		ftm_alarm0: timer at 2800000 {
commit 6efb099a1da4e954409e241b47257a637120e5c2
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Sun Sep 27 18:59:47 2020 +0200

    arm64: dts: imx8mn-evk: fix missing PMIC's interrupt line pull-up
    
    The PMIC's interrupt is level low and should be pulled up.  The PMIC's
    device node had pinctrl-0 property but it lacked pinctrl-names which
    is required to apply the pin configuration.
    
    Fixes: 4153f7811a9b ("arm64: dts: imx8mn: correct interrupt flags")
    Fixes: 6386156eb279 ("arm64: dts: imx8mn-evk: add pca9450 for i.mx8mn-evk board")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Reviewed-by: Robin Gong <yibin.gong at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mn-evk.dts b/arch/arm64/boot/dts/freescale/imx8mn-evk.dts
index 707d8486b4d8..8311b95dee49 100644
--- a/arch/arm64/boot/dts/freescale/imx8mn-evk.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mn-evk.dts
@@ -18,6 +18,7 @@
 	pmic: pmic at 25 {
 		compatible = "nxp,pca9450b";
 		reg = <0x25>;
+		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_pmic>;
 		interrupt-parent = <&gpio1>;
 		interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
commit 4d20fa1dac2e3cf5aa0cd317b3436f4fda680b04
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Sun Sep 27 18:59:46 2020 +0200

    arm64: dts: imx8mn-ddr4-evk: fix missing PMIC's interrupt line pull-up
    
    The PMIC's interrupt is level low and should be pulled up.  The PMIC's
    device node had pinctrl-0 property but it lacked pinctrl-names which
    is required to apply the pin configuration.
    
    Fixes: 4153f7811a9b ("arm64: dts: imx8mn: correct interrupt flags")
    Fixes: 3e44dd09736d ("arm64: dts: imx8mn-ddr4-evk: Add rohm,bd71847 PMIC support")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Reviewed-by: Robin Gong <yibin.gong at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts b/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts
index 46e76cf32b2f..7dfee715a2c4 100644
--- a/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts
@@ -53,6 +53,7 @@
 	pmic at 4b {
 		compatible = "rohm,bd71847";
 		reg = <0x4b>;
+		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_pmic>;
 		interrupt-parent = <&gpio1>;
 		interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
commit 34a1c5e39b670fd7a324b5620c9ad4ac80c2f018
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Sun Sep 27 18:59:45 2020 +0200

    arm64: dts: imx8mn-var-som: fix missing PMIC's interrupt line pull-up
    
    The PMIC's interrupt is level low and should be pulled up.  The PMIC's
    device node had pinctrl-0 property but it lacked pinctrl-names which
    is required to apply the pin configuration.  The actual problem in DTS
    was pointed out by Felix Radensky from Variscite.
    
    Reported-by: Felix Radensky <felix.r at variscite.com>
    Fixes: ade0176dd8a0 ("arm64: dts: imx8mn-var-som: Add Variscite VAR-SOM-MX8MN System on Module")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Reviewed-by: Robin Gong <yibin.gong at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi
index a2d0190921e4..7f356edf9f91 100644
--- a/arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi
@@ -116,13 +116,10 @@
 	pmic at 4b {
 		compatible = "rohm,bd71847";
 		reg = <0x4b>;
+		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_pmic>;
 		interrupt-parent = <&gpio2>;
-		/*
-		 * The interrupt is not correct. It should be level low,
-		 * however with internal pull up this causes IRQ storm.
-		 */
-		interrupts = <8 IRQ_TYPE_EDGE_RISING>;
+		interrupts = <8 IRQ_TYPE_LEVEL_LOW>;
 		rohm,reset-snvs-powered;
 
 		regulators {
@@ -388,7 +385,7 @@
 
 	pinctrl_pmic: pmicirqgrp {
 		fsl,pins = <
-			MX8MN_IOMUXC_SD1_DATA6_GPIO2_IO8	0x101
+			MX8MN_IOMUXC_SD1_DATA6_GPIO2_IO8	0x141
 		>;
 	};
 
commit ce6fc31f388d45b9f7135169f911cd27f4d21126
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Sun Sep 27 18:59:44 2020 +0200

    arm64: dts: imx8mm-evk: fix missing PMIC's interrupt line pull-up
    
    The PMIC's interrupt is level low and should be pulled up.  The PMIC's
    device node had pinctrl-0 property but it lacked pinctrl-names which
    is required to apply the pin configuration.
    
    Fixes: 5f67317bd967 ("arm64: dts: imx8mm: correct interrupt flags")
    Fixes: aa71d0648318 ("arm64: dts: imx8mm: Split the imx8mm evk board dts to a common dtsi")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Reviewed-by: Robin Gong <yibin.gong at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi
index f305a530ff6f..521eb3a5a12e 100644
--- a/arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi
@@ -121,6 +121,7 @@
 	pmic at 4b {
 		compatible = "rohm,bd71847";
 		reg = <0x4b>;
+		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_pmic>;
 		interrupt-parent = <&gpio1>;
 		interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
commit 0710e4385c9c978952333393396061ed1672d145
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Sun Sep 27 18:59:43 2020 +0200

    arm64: dts: imx8mm-beacon-som: fix missing PMIC's interrupt line pull-up
    
    The PMIC's interrupt is level low and should be pulled up.  The PMIC's
    device node had pinctrl-0 property but it lacked pinctrl-names which
    is required to apply the pin configuration.
    
    Fixes: 5f67317bd967 ("arm64: dts: imx8mm: correct interrupt flags")
    Fixes: 593816fa2f35 ("arm64: dts: imx: Add Beacon i.MX8m-Mini development kit")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Tested-by: Adam Ford <aford173 at gmail.com>
    Reviewed-by: Robin Gong <yibin.gong at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi
index 6de86a4f0ec4..55b36bddd513 100644
--- a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi
@@ -72,6 +72,7 @@
 	pmic at 4b {
 		compatible = "rohm,bd71847";
 		reg = <0x4b>;
+		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_pmic>;
 		interrupt-parent = <&gpio1>;
 		interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
commit 00203737867c8b63ca247e71ada1b32bb0b0dd3d
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Sun Sep 27 18:59:42 2020 +0200

    arm64: dts: imx8mm-var-som: fix missing PMIC's interrupt line pull-up
    
    The PMIC's interrupt is level low and should be pulled up.  The PMIC's
    device node had pinctrl-0 property but it lacked pinctrl-names which
    is required to apply the pin configuration.  The actual problem in DTS
    was pointed out by Felix Radensky from Variscite.
    
    Reported-by: Felix Radensky <felix.r at variscite.com>
    Fixes: 5f67317bd967 ("arm64: dts: imx8mm: correct interrupt flags")
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Reviewed-by: Robin Gong <yibin.gong at nxp.com>
    Signed-off-by: Shawn Guo <shawnguo at kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/imx8mm-var-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-var-som.dtsi
index 4107fe914d08..49082529764f 100644
--- a/arch/arm64/boot/dts/freescale/imx8mm-var-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mm-var-som.dtsi
@@ -135,13 +135,10 @@
 	pmic at 4b {
 		compatible = "rohm,bd71847";
 		reg = <0x4b>;
+		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_pmic>;
 		interrupt-parent = <&gpio2>;
-		/*
-		 * The interrupt is not correct. It should be level low,
-		 * however with internal pull up this causes IRQ storm.
-		 */
-		interrupts = <8 IRQ_TYPE_EDGE_RISING>;
+		interrupts = <8 IRQ_TYPE_LEVEL_LOW>;
 		rohm,reset-snvs-powered;
 
 		#clock-cells = <0>;
@@ -398,7 +395,7 @@
 
 	pinctrl_pmic: pmicirqgrp {
 		fsl,pins = <
-			MX8MM_IOMUXC_SD1_DATA6_GPIO2_IO8	0x41
+			MX8MM_IOMUXC_SD1_DATA6_GPIO2_IO8	0x141
 		>;
 	};
 
commit 0698ac66e01019528f0db4191ae3aaf9978e67da
Author: Ian Rogers <irogers at google.com>
Date:   Tue Oct 27 16:36:46 2020 -0700

    tools, bpftool: Remove two unused variables.
    
    Avoid an unused variable warning.
    
    Signed-off-by: Ian Rogers <irogers at google.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Tobias Klauser <tklauser at distanz.ch>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201027233646.3434896-2-irogers@google.com

diff --git a/tools/bpf/bpftool/skeleton/profiler.bpf.c b/tools/bpf/bpftool/skeleton/profiler.bpf.c
index 4e3512f700c0..ce5b65e07ab1 100644
--- a/tools/bpf/bpftool/skeleton/profiler.bpf.c
+++ b/tools/bpf/bpftool/skeleton/profiler.bpf.c
@@ -70,7 +70,7 @@ int BPF_PROG(fentry_XXX)
 static inline void
 fexit_update_maps(u32 id, struct bpf_perf_event_value *after)
 {
-	struct bpf_perf_event_value *before, diff, *accum;
+	struct bpf_perf_event_value *before, diff;
 
 	before = bpf_map_lookup_elem(&fentry_readings, &id);
 	/* only account samples with a valid fentry_reading */
@@ -95,7 +95,7 @@ int BPF_PROG(fexit_XXX)
 {
 	struct bpf_perf_event_value readings[MAX_NUM_MATRICS];
 	u32 cpu = bpf_get_smp_processor_id();
-	u32 i, one = 1, zero = 0;
+	u32 i, zero = 0;
 	int err;
 	u64 *count;
 
commit 1e6f5dcc1b9ec9068f5d38331cec38b35498edf5
Author: Ian Rogers <irogers at google.com>
Date:   Tue Oct 27 16:36:45 2020 -0700

    tools, bpftool: Avoid array index warnings.
    
    The bpf_caps array is shorter without CAP_BPF, avoid out of bounds reads
    if this isn't defined. Working around this avoids -Wno-array-bounds with
    clang.
    
    Signed-off-by: Ian Rogers <irogers at google.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Reviewed-by: Tobias Klauser <tklauser at distanz.ch>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201027233646.3434896-1-irogers@google.com

diff --git a/tools/bpf/bpftool/feature.c b/tools/bpf/bpftool/feature.c
index a43a6f10b564..359960a8f1de 100644
--- a/tools/bpf/bpftool/feature.c
+++ b/tools/bpf/bpftool/feature.c
@@ -843,9 +843,14 @@ static int handle_perms(void)
 		else
 			p_err("missing %s%s%s%s%s%s%s%srequired for full feature probing; run as root or use 'unprivileged'",
 			      capability_msg(bpf_caps, 0),
+#ifdef CAP_BPF
 			      capability_msg(bpf_caps, 1),
 			      capability_msg(bpf_caps, 2),
-			      capability_msg(bpf_caps, 3));
+			      capability_msg(bpf_caps, 3)
+#else
+				"", "", "", "", "", ""
+#endif /* CAP_BPF */
+				);
 		goto exit_free;
 	}
 
commit e5e1a4bc916d29958c3b587354293738fcb984d7
Author: Magnus Karlsson <magnus.karlsson at intel.com>
Date:   Tue Oct 27 13:32:01 2020 +0100

    xsk: Fix possible memory leak at socket close
    
    Fix a possible memory leak at xsk socket close that is caused by the
    refcounting of the umem object being wrong. The reference count of the
    umem was decremented only after the pool had been freed. Note that if
    the buffer pool is destroyed, it is important that the umem is
    destroyed after the pool, otherwise the umem would disappear while the
    driver is still running. And as the buffer pool needs to be destroyed
    in a work queue, the umem is also (if its refcount reaches zero)
    destroyed after the buffer pool in that same work queue.
    
    What was missing is that the refcount also needs to be decremented
    when the pool is not freed and when the pool has not even been
    created. The first case happens when the refcount of the pool is
    higher than 1, i.e. it is still being used by some other socket using
    the same device and queue id. In this case, it is safe to decrement
    the refcount of the umem outside of the work queue as the umem will
    never be freed because the refcount of the umem is always greater than
    or equal to the refcount of the buffer pool. The second case is if the
    buffer pool has not been created yet, i.e. the socket was closed
    before it was bound but after the umem was created. In this case, it
    is safe to destroy the umem outside of the work queue, since there is
    no pool that can use it by definition.
    
    Fixes: 1c1efc2af158 ("xsk: Create and free buffer pool independently from umem")
    Reported-by: syzbot+eb71df123dc2be2c1456 at syzkaller.appspotmail.com
    Signed-off-by: Magnus Karlsson <magnus.karlsson at intel.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Björn Töpel <bjorn.topel at intel.com>
    Link: https://lore.kernel.org/bpf/1603801921-2712-1-git-send-email-magnus.karlsson@gmail.com

diff --git a/include/net/xsk_buff_pool.h b/include/net/xsk_buff_pool.h
index 0140d086dc84..01755b838c74 100644
--- a/include/net/xsk_buff_pool.h
+++ b/include/net/xsk_buff_pool.h
@@ -86,7 +86,7 @@ int xp_assign_dev_shared(struct xsk_buff_pool *pool, struct xdp_umem *umem,
 void xp_destroy(struct xsk_buff_pool *pool);
 void xp_release(struct xdp_buff_xsk *xskb);
 void xp_get_pool(struct xsk_buff_pool *pool);
-void xp_put_pool(struct xsk_buff_pool *pool);
+bool xp_put_pool(struct xsk_buff_pool *pool);
 void xp_clear_dev(struct xsk_buff_pool *pool);
 void xp_add_xsk(struct xsk_buff_pool *pool, struct xdp_sock *xs);
 void xp_del_xsk(struct xsk_buff_pool *pool, struct xdp_sock *xs);
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index b71a32eeae65..cfbec3989a76 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -1146,7 +1146,8 @@ static void xsk_destruct(struct sock *sk)
 	if (!sock_flag(sk, SOCK_DEAD))
 		return;
 
-	xp_put_pool(xs->pool);
+	if (!xp_put_pool(xs->pool))
+		xdp_put_umem(xs->umem);
 
 	sk_refcnt_debug_dec(sk);
 }
diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c
index 64c9e55d4d4e..8a3bf4e1318e 100644
--- a/net/xdp/xsk_buff_pool.c
+++ b/net/xdp/xsk_buff_pool.c
@@ -251,15 +251,18 @@ void xp_get_pool(struct xsk_buff_pool *pool)
 	refcount_inc(&pool->users);
 }
 
-void xp_put_pool(struct xsk_buff_pool *pool)
+bool xp_put_pool(struct xsk_buff_pool *pool)
 {
 	if (!pool)
-		return;
+		return false;
 
 	if (refcount_dec_and_test(&pool->users)) {
 		INIT_WORK(&pool->work, xp_release_deferred);
 		schedule_work(&pool->work);
+		return true;
 	}
+
+	return false;
 }
 
 static struct xsk_dma_map *xp_find_dma_map(struct xsk_buff_pool *pool)
commit 821f5c90130d15f8f725412d714d05df3b9e0fac
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Wed Oct 28 11:12:04 2020 -0700

    bpf: Add struct bpf_redir_neigh forward declaration to BPF helper defs
    
    Forward-declare struct bpf_redir_neigh in bpf_helper_defs.h to avoid
    compiler warning about unknown structs.
    
    Fixes: ba452c9e996d ("bpf: Fix bpf_redirect_neigh helper api to support supplying nexthop")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Link: https://lore.kernel.org/bpf/20201028181204.111241-1-andrii@kernel.org

diff --git a/scripts/bpf_helpers_doc.py b/scripts/bpf_helpers_doc.py
index 6769caae142f..31484377b8b1 100755
--- a/scripts/bpf_helpers_doc.py
+++ b/scripts/bpf_helpers_doc.py
@@ -408,6 +408,7 @@ class PrinterHelpers(Printer):
             'struct bpf_perf_event_data',
             'struct bpf_perf_event_value',
             'struct bpf_pidns_info',
+            'struct bpf_redir_neigh',
             'struct bpf_sock',
             'struct bpf_sock_addr',
             'struct bpf_sock_ops',
commit 5c7e02a896689407555b3a10d6ed87369c70916e
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Oct 26 16:46:06 2020 +0100

    HID: i2c-hid: Put ACPI enumerated devices in D3 on shutdown
    
    The i2c-hid driver would quietly fail to probe the i2c-hid sensor-hub
    with an ACPI device-id of SMO91D0 every other boot.
    
    Specifically, the i2c_smbus_read_byte() "Make sure there is something at
    this address" check would fail every other boot.
    
    It seems that the BIOS does not properly reset/power-cycle the device
    leaving it in a confused state where it refuses to respond to i2c-xfers.
    On boots where probing the device failed, the driver-core puts the device
    in D3 after the probe-failure, which causes the probe to succeed the next
    boot.
    
    Putting the device in D3 from the shutdown-handler fixes the sensors not
    working every other boot.
    
    This has been tested on both a Lenovo Miix 2-10 and a Dell Venue 8 Pro 5830
    both of which use an i2c-hid sensor-hub with an ACPI id of SMO91D0.
    
    Note that it is safe to call acpi_device_set_power() with a NULL pointer
    as first argument, so on none ACPI enumerated devices this change is a
    no-op.
    
    Cc: Kai-Heng Feng <kai.heng.feng at canonical.com>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Acked-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
index 786e3e9af1c9..aeff1ffb0c8b 100644
--- a/drivers/hid/i2c-hid/i2c-hid-core.c
+++ b/drivers/hid/i2c-hid/i2c-hid-core.c
@@ -943,6 +943,11 @@ static void i2c_hid_acpi_enable_wakeup(struct device *dev)
 	}
 }
 
+static void i2c_hid_acpi_shutdown(struct device *dev)
+{
+	acpi_device_set_power(ACPI_COMPANION(dev), ACPI_STATE_D3_COLD);
+}
+
 static const struct acpi_device_id i2c_hid_acpi_match[] = {
 	{"ACPI0C50", 0 },
 	{"PNP0C50", 0 },
@@ -959,6 +964,8 @@ static inline int i2c_hid_acpi_pdata(struct i2c_client *client,
 static inline void i2c_hid_acpi_fix_up_power(struct device *dev) {}
 
 static inline void i2c_hid_acpi_enable_wakeup(struct device *dev) {}
+
+static inline void i2c_hid_acpi_shutdown(struct device *dev) {}
 #endif
 
 #ifdef CONFIG_OF
@@ -1175,6 +1182,8 @@ static void i2c_hid_shutdown(struct i2c_client *client)
 
 	i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
 	free_irq(client->irq, ihid);
+
+	i2c_hid_acpi_shutdown(&client->dev);
 }
 
 #ifdef CONFIG_PM_SLEEP
commit 107954afc5df667da438644aa4982606663f9b17
Author: Nenad Peric <nperic at gmail.com>
Date:   Wed Oct 28 12:58:17 2020 +0100

    arm64: dts: allwinner: h5: OrangePi Prime: Fix ethernet node
    
    RX and TX delay are provided by ethernet PHY. Reflect that in ethernet
    node.
    
    Fixes: 44a94c7ef989 ("arm64: dts: allwinner: H5: Restore EMAC changes")
    Signed-off-by: Nenad Peric <nperic at gmail.com>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201028115817.68113-1-nperic@gmail.com

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-prime.dts b/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-prime.dts
index cb44bfa5981f..33ab44072e6d 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-prime.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-prime.dts
@@ -124,7 +124,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit 8d8c3131248d7e9c6c8ab448e1c6cb6bd7755e9c
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 17:13:57 2020 +0100

    clk: define to_clk_regmap() as inline function
    
    Nesting container_of() causes warnings with W=2, which is
    annoying if it happens in headers and fills the build log
    like:
    
    In file included from drivers/clk/qcom/clk-alpha-pll.c:6:
    drivers/clk/qcom/clk-alpha-pll.c: In function 'clk_alpha_pll_hwfsm_enable':
    include/linux/kernel.h:852:8: warning: declaration of '__mptr' shadows a previous local [-Wshadow]
      852 |  void *__mptr = (void *)(ptr);     \
          |        ^~~~~~
    drivers/clk/qcom/clk-alpha-pll.c:155:31: note: in expansion of macro 'container_of'
      155 | #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \
          |                               ^~~~~~~~~~~~
    drivers/clk/qcom/clk-regmap.h:27:28: note: in expansion of macro 'container_of'
       27 | #define to_clk_regmap(_hw) container_of(_hw, struct clk_regmap, hw)
          |                            ^~~~~~~~~~~~
    drivers/clk/qcom/clk-alpha-pll.c:155:44: note: in expansion of macro 'to_clk_regmap'
      155 | #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \
          |                                            ^~~~~~~~~~~~~
    drivers/clk/qcom/clk-alpha-pll.c:254:30: note: in expansion of macro 'to_clk_alpha_pll'
      254 |  struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
          |                              ^~~~~~~~~~~~~~~~
    include/linux/kernel.h:852:8: note: shadowed declaration is here
      852 |  void *__mptr = (void *)(ptr);     \
          |        ^~~~~~
    
    Redefine two copies of the to_clk_regmap() macro as inline functions
    to avoid a lot of these.
    
    Fixes: ea11dda9e091 ("clk: meson: add regmap clocks")
    Fixes: 085d7a455444 ("clk: qcom: Add a regmap type clock struct")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Link: https://lore.kernel.org/r/20201026161411.3708639-1-arnd@kernel.org
    Acked-by: Jerome Brunet <jbrunet at baylibre.com>
    Signed-off-by: Stephen Boyd <sboyd at kernel.org>

diff --git a/drivers/clk/meson/clk-regmap.h b/drivers/clk/meson/clk-regmap.h
index c4a39604cffd..e365312da54e 100644
--- a/drivers/clk/meson/clk-regmap.h
+++ b/drivers/clk/meson/clk-regmap.h
@@ -26,7 +26,10 @@ struct clk_regmap {
 	void		*data;
 };
 
-#define to_clk_regmap(_hw) container_of(_hw, struct clk_regmap, hw)
+static inline struct clk_regmap *to_clk_regmap(struct clk_hw *hw)
+{
+	return container_of(hw, struct clk_regmap, hw);
+}
 
 /**
  * struct clk_regmap_gate_data - regmap backed gate specific data
diff --git a/drivers/clk/qcom/clk-regmap.h b/drivers/clk/qcom/clk-regmap.h
index 6cfc1bccb255..14ec659a3a77 100644
--- a/drivers/clk/qcom/clk-regmap.h
+++ b/drivers/clk/qcom/clk-regmap.h
@@ -24,7 +24,11 @@ struct clk_regmap {
 	unsigned int enable_mask;
 	bool enable_is_inverted;
 };
-#define to_clk_regmap(_hw) container_of(_hw, struct clk_regmap, hw)
+
+static inline struct clk_regmap *to_clk_regmap(struct clk_hw *hw)
+{
+	return container_of(hw, struct clk_regmap, hw);
+}
 
 int clk_is_enabled_regmap(struct clk_hw *hw);
 int clk_enable_regmap(struct clk_hw *hw);
commit cd12e4f14f7cca7d04fbcf0da2dc116070d7f26f
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Fri Oct 16 17:15:28 2020 +0200

    CREDITS: remove trailing white spaces
    
    Remove trailing white spaces.  No functional/substantive change.
    
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Link: https://lore.kernel.org/r/20201016151528.7553-4-krzk@kernel.org

diff --git a/CREDITS b/CREDITS
index 205ed442b8e6..b11224ae7235 100644
--- a/CREDITS
+++ b/CREDITS
@@ -98,7 +98,7 @@ N: Erik Andersen
 E: andersen at codepoet.org
 W: https://www.codepoet.org/
 P: 1024D/30D39057 1BC4 2742 E885 E4DE 9301  0C82 5F9B 643E 30D3 9057
-D: Maintainer of ide-cd and Uniform CD-ROM driver, 
+D: Maintainer of ide-cd and Uniform CD-ROM driver,
 D: ATAPI CD-Changer support, Major 2.1.x CD-ROM update.
 S: 352 North 525 East
 S: Springville, Utah 84663
@@ -263,7 +263,7 @@ N: Paul Barton-Davis
 E: pbd at op.net
 D: Driver for WaveFront soundcards (Turtle Beach Maui, Tropez, Tropez+)
 D: Various bugfixes and changes to sound drivers
-S: USA 
+S: USA
 
 N: Carlos Henrique Bauer
 E: chbauer at acm.org
@@ -1205,7 +1205,7 @@ N: Daniel J. Frasnelli
 E: dfrasnel at alphalinux.org
 W: http://www.alphalinux.org/
 P: 1024/3EF87611 B9 F1 44 50 D3 E8 C2 80  DA E5 55 AA 56 7C 42 DA
-D: DEC Alpha hacker 
+D: DEC Alpha hacker
 D: Miscellaneous bug squisher
 
 N: Jim Freeman
@@ -1305,7 +1305,7 @@ S: P.O. Box 76, Epping
 S: New South Wales, 2121
 S: Australia
 
-N: Carlos E. Gorges 
+N: Carlos E. Gorges
 E: carlos at techlinux.com.br
 D: fix smp support on cmpci driver
 P: 2048G/EA3C4B19 FF31 33A6 0362 4915 B7EB  E541 17D0 0379 EA3C 4B19
@@ -1346,7 +1346,7 @@ E: wgreathouse at smva.com
 E: wgreathouse at myfavoritei.com
 D: Current Belkin USB Serial Adapter F5U103 hacker
 D: Kernel hacker, embedded systems
-S: 7802 Fitzwater Road   
+S: 7802 Fitzwater Road
 S: Brecksville, OH  44141-1334
 S: USA
 
@@ -1387,7 +1387,7 @@ N: Grant Guenther
 E: grant at torque.net
 W: http://www.torque.net/linux-pp.html
 D: original author of ppa driver for parallel port ZIP drive
-D: original architect of the parallel-port sharing scheme 
+D: original architect of the parallel-port sharing scheme
 D: PARIDE subsystem: drivers for parallel port IDE & ATAPI devices
 S: 44 St. Joseph Street, Suite 506
 S: Toronto, Ontario, M4Y 2W4
@@ -1529,7 +1529,7 @@ N: Benjamin Herrenschmidt
 E: benh at kernel.crashing.org
 D: Various parts of PPC/PPC64 & PowerMac
 S: 312/107 Canberra Avenue
-S: Griffith, ACT 2603 
+S: Griffith, ACT 2603
 S: Australia
 
 N: Andreas Herrmann
@@ -1831,7 +1831,7 @@ S: Hungary
 N: Bernhard Kaindl
 E: bkaindl at netway.at
 E: edv at bartelt.via.at
-D: Author of a menu based configuration tool, kmenu, which 
+D: Author of a menu based configuration tool, kmenu, which
 D: is the predecessor of 'make menuconfig' and 'make xconfig'.
 D: digiboard driver update(modularisation work and 2.1.x upd)
 S: Tallak 95
@@ -2013,7 +2013,7 @@ W: http://www.xos.nl/
 D: IP transparent proxy support
 S: X/OS Experts in Open Systems BV
 S: Kruislaan 419
-S: 1098 VA Amsterdam 
+S: 1098 VA Amsterdam
 S: The Netherlands
 
 N: Goran Koruga
@@ -2085,7 +2085,7 @@ S: Germany
 
 N: Andrzej M. Krzysztofowicz
 E: ankry at mif.pg.gda.pl
-D: Some 8-bit XT disk driver and devfs hacking 
+D: Some 8-bit XT disk driver and devfs hacking
 D: Aladdin 1533/1543(C) chipset IDE
 D: PIIX chipset IDE
 S: ul. Matemblewska 1B/10
@@ -2460,7 +2460,7 @@ E: mge at EZ-Darmstadt.Telekom.de
 D: Logical Volume Manager
 S: Bartningstr. 12
 S: 64289 Darmstadt
-S: Germany 
+S: Germany
 
 N: Mark W. McClelland
 E: mmcclell at bigfoot.com
@@ -2544,7 +2544,7 @@ E: meskes at debian.org
 P: 1024/04B6E8F5 6C 77 33 CA CC D6 22 03  AB AB 15 A3 AE AD 39 7D
 D: Kernel hacker. PostgreSQL hacker. Software watchdog daemon.
 D: Maintainer of several Debian packages
-S: Th.-Heuss-Str. 61 
+S: Th.-Heuss-Str. 61
 S: D-41812 Erkelenz
 S: Germany
 
@@ -2782,7 +2782,7 @@ E: neuffer at goofy.zdv.uni-mainz.de
 W: http://www.i-Connect.Net/~mike/
 D: Developer and maintainer of the EATA-DMA SCSI driver
 D: Co-developer EATA-PIO SCSI driver
-D: /proc/scsi and assorted other snippets 
+D: /proc/scsi and assorted other snippets
 S: Zum Schiersteiner Grund 2
 S: 55127 Mainz
 S: Germany
@@ -3020,7 +3020,7 @@ D: Embedded PowerPC 4xx/6xx/7xx/74xx support
 S: Chandler, Arizona 85249
 S: USA
 
-N: Frederic Potter 
+N: Frederic Potter
 E: fpotter at cirpack.com
 D: Some PCI kernel support
 
@@ -3453,21 +3453,21 @@ S: Klosterweg 28 / i309
 S: 76131 Karlsruhe
 S: Germany
 
-N: James Simmons 
+N: James Simmons
 E: jsimmons at infradead.org
-E: jsimmons at users.sf.net 
+E: jsimmons at users.sf.net
 D: Frame buffer device maintainer
 D: input layer development
 D: tty/console layer
-D: various mipsel devices 
-S: 115 Carmel Avenue 
+D: various mipsel devices
+S: 115 Carmel Avenue
 S: El Cerrito CA 94530
-S: USA 
+S: USA
 
 N: Jaspreet Singh
 E: jaspreet at sangoma.com
 W: www.sangoma.com
-D: WANPIPE drivers & API Support for Sangoma S508/FT1 cards 
+D: WANPIPE drivers & API Support for Sangoma S508/FT1 cards
 S: Sangoma Technologies Inc.,
 S: 1001 Denison Street
 S: Suite 101
@@ -3491,7 +3491,7 @@ N: Craig Small
 E: csmall at triode.apana.org.au
 E: vk2xlz at gonzo.vk2xlz.ampr.org (packet radio)
 D: Gracilis PackeTwin device driver
-D: RSPF daemon 
+D: RSPF daemon
 S: 10 Stockalls Place
 S: Minto, NSW, 2566
 S: Australia
@@ -3701,7 +3701,7 @@ N: Tsu-Sheng Tsao
 E: tsusheng at scf.usc.edu
 D: IGMP(Internet Group Management Protocol) version 2
 S: 2F 14 ALY 31 LN 166 SEC 1 SHIH-PEI RD
-S: Taipei 
+S: Taipei
 S: Taiwan 112
 S: Republic of China
 S: 24335 Delta Drive
@@ -3862,7 +3862,7 @@ D: Produced the Slackware distribution, updated the SVGAlib
 D: patches for ghostscript, worked on color 'ls', etc.
 S: 301 15th Street S.
 S: Moorhead, Minnesota 56560
-S: USA 
+S: USA
 
 N: Jos Vos
 E: jos at xos.nl
@@ -3870,7 +3870,7 @@ W: http://www.xos.nl/
 D: Various IP firewall updates, ipfwadm
 S: X/OS Experts in Open Systems BV
 S: Kruislaan 419
-S: 1098 VA Amsterdam 
+S: 1098 VA Amsterdam
 S: The Netherlands
 
 N: Jeroen Vreeken
@@ -4108,7 +4108,7 @@ S: People's Repulic of China
 N: Victor Yodaiken
 E: yodaiken at fsmlabs.com
 D: RTLinux (RealTime Linux)
-S: POB 1822 
+S: POB 1822
 S: Socorro NM, 87801
 S: USA
 
@@ -4206,7 +4206,7 @@ D: EISA/sysfs subsystem
 S: France
 
 # Don't add your name here, unless you really _are_ after Marc
-# alphabetically. Leonard used to be very proud of being the 
+# alphabetically. Leonard used to be very proud of being the
 # last entry, and he'll get positively pissed if he can't even
 # be second-to-last.  (and this file really _is_ supposed to be
 # in alphabetic order)
commit d5a69b6ba186d01cb036074d337e5171d27e9c72
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Fri Oct 16 17:15:27 2020 +0200

    MAINTAINERS: remove Jeongtae Park from Samsung MFC entry
    
    Jeongtae Park has not been active on LKML:
    https://lore.kernel.org/lkml/?q=f%3A%22Jeongtae+Park%22
    
    Remove him from the Samsung S5P MFC driver entry.
    
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Cc: Jeongtae Park <jtp.park at samsung.com>
    Cc: Andrzej Hajda <a.hajda at samsung.com>
    Link: https://lore.kernel.org/r/20201016151528.7553-3-krzk@kernel.org

diff --git a/MAINTAINERS b/MAINTAINERS
index f7824667ff9d..40b4a582b4cc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2429,7 +2429,6 @@ S:	Maintained
 F:	drivers/media/platform/s5p-jpeg/
 
 ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
-M:	Jeongtae Park <jtp.park at samsung.com>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-arm-kernel at lists.infradead.org
 L:	linux-media at vger.kernel.org
commit 215f06d7efc263d4e8150e0b97c49dd9914b59d7
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Fri Oct 16 17:16:17 2020 +0200

    MAINTAINERS: move Kyungmin Park to credits
    
    Kyungmin Park maintained and contributed to some of the upstreamed
    S5Pv210 and Exynos4210 machines - as described in commit 10ffa96407b2
    ("MAINTAINERS: add maintainer of Samsung Mobile Machine support").
    However the entry in maintainers got slightly twisted by
    commit 004bbd3c01d4 ("MAINTAINERS: remove non existent files") -
    the directory matching pattern was changed from specific machines to
    the entire S5Pv210.
    
    Anyway since long time, all S5Pv210 maintenance is covered by the
    Samsung ARM architectures maintainer entry and Krzysztof Kozlowski, so
    move Kyungmin Park to the CREDITS.
    
    There was also no activity on LKML regarding other maintained drivers:
    https://lore.kernel.org/lkml/?q=f%3A%22Kyungmin+Park%22
    
    Dear Kyungmin Park, thank you for all the effort you put in to the
    upstream Samsung support.
    
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Cc: Kyungmin Park <kyungmin.park at samsung.com>
    Cc: Andrzej Hajda <a.hajda at samsung.com>
    Cc: Sylwester Nawrocki <s.nawrocki at samsung.com>
    Cc: Arnd Bergmann <arnd at arndb.de>
    Cc: Olof Johansson <olof at lixom.net>
    Link: https://lore.kernel.org/r/20201016151528.7553-1-krzk@kernel.org

diff --git a/CREDITS b/CREDITS
index f95e46f7a428..205ed442b8e6 100644
--- a/CREDITS
+++ b/CREDITS
@@ -2849,6 +2849,10 @@ D: IPX development and support
 N: Venkatesh Pallipadi (Venki)
 D: x86/HPET
 
+N: Kyungmin Park
+E: kyungmin.park at samsung.com
+D: Samsung S5Pv210 and Exynos4210 mobile platforms
+
 N: David Parsons
 E: orc at pell.chi.il.us
 D: improved memory detection code.
diff --git a/MAINTAINERS b/MAINTAINERS
index b8ce3f209144..f7824667ff9d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2374,7 +2374,7 @@ F:	drivers/i2c/busses/i2c-rk3x.c
 F:	sound/soc/rockchip/
 N:	rockchip
 
-ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
+ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
 M:	Kukjin Kim <kgene at kernel.org>
 M:	Krzysztof Kozlowski <krzk at kernel.org>
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
@@ -2404,14 +2404,7 @@ N:	s3c2410
 N:	s3c64xx
 N:	s5pv210
 
-ARM/SAMSUNG MOBILE MACHINE SUPPORT
-M:	Kyungmin Park <kyungmin.park at samsung.com>
-L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
-S:	Maintained
-F:	arch/arm/mach-s5pv210/
-
 ARM/SAMSUNG S5P SERIES 2D GRAPHICS ACCELERATION (G2D) SUPPORT
-M:	Kyungmin Park <kyungmin.park at samsung.com>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-arm-kernel at lists.infradead.org
 L:	linux-media at vger.kernel.org
@@ -2436,7 +2429,6 @@ S:	Maintained
 F:	drivers/media/platform/s5p-jpeg/
 
 ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
-M:	Kyungmin Park <kyungmin.park at samsung.com>
 M:	Jeongtae Park <jtp.park at samsung.com>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-arm-kernel at lists.infradead.org
@@ -15438,14 +15430,12 @@ F:	Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
 F:	drivers/nfc/s3fwrn5
 
 SAMSUNG S5C73M3 CAMERA DRIVER
-M:	Kyungmin Park <kyungmin.park at samsung.com>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-media at vger.kernel.org
 S:	Supported
 F:	drivers/media/i2c/s5c73m3/*
 
 SAMSUNG S5K5BAF CAMERA DRIVER
-M:	Kyungmin Park <kyungmin.park at samsung.com>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-media at vger.kernel.org
 S:	Supported
@@ -15463,7 +15453,6 @@ F:	Documentation/devicetree/bindings/crypto/samsung-sss.yaml
 F:	drivers/crypto/s5p-sss.c
 
 SAMSUNG S5P/EXYNOS4 SOC SERIES CAMERA SUBSYSTEM DRIVERS
-M:	Kyungmin Park <kyungmin.park at samsung.com>
 M:	Sylwester Nawrocki <s.nawrocki at samsung.com>
 L:	linux-media at vger.kernel.org
 S:	Supported
commit 424f5ca7c8515a4b6e3b0812899ddda082f42fd5
Author: Krzysztof Kozlowski <krzk at kernel.org>
Date:   Fri Oct 16 17:15:25 2020 +0200

    MAINTAINERS: move Kamil Debski to credits
    
    Kamil Debski has not been active on LKML since 2017:
    https://lore.kernel.org/lkml/?q=f%3A%22Kamil+Debski%22
    
    Move Kamil Debski to the CREDITS file.  Thank you for the effort you put
    in to the upstream Linux kernel work.
    
    Signed-off-by: Krzysztof Kozlowski <krzk at kernel.org>
    Acked-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
    Cc: Kamil Debski <kamil at wypas.org>
    Cc: Andrzej Hajda <a.hajda at samsung.com>
    Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie at samsung.com>
    Cc: Sylwester Nawrocki <s.nawrocki at samsung.com>
    Link: https://lore.kernel.org/r/20201016151528.7553-1-krzk@kernel.org

diff --git a/CREDITS b/CREDITS
index cb02b9923a52..f95e46f7a428 100644
--- a/CREDITS
+++ b/CREDITS
@@ -849,6 +849,12 @@ D: trivial hack to add variable address length routing to Rose.
 D: AX25-HOWTO, HAM-HOWTO, IPX-HOWTO, NET-2-HOWTO
 D: ax25-utils maintainer.
 
+N: Kamil Debski
+E: kamil at wypas.org
+D: Samsung S5P 2D graphics acceleration and Multi Format Codec drivers
+D: Samsung USB2 phy drivers
+D: PWM fan driver
+
 N: Helge Deller
 E: deller at gmx.de
 W: http://www.parisc-linux.org/
diff --git a/MAINTAINERS b/MAINTAINERS
index e73636b75f29..b8ce3f209144 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2412,7 +2412,6 @@ F:	arch/arm/mach-s5pv210/
 
 ARM/SAMSUNG S5P SERIES 2D GRAPHICS ACCELERATION (G2D) SUPPORT
 M:	Kyungmin Park <kyungmin.park at samsung.com>
-M:	Kamil Debski <kamil at wypas.org>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-arm-kernel at lists.infradead.org
 L:	linux-media at vger.kernel.org
@@ -2438,7 +2437,6 @@ F:	drivers/media/platform/s5p-jpeg/
 
 ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
 M:	Kyungmin Park <kyungmin.park at samsung.com>
-M:	Kamil Debski <kamil at wypas.org>
 M:	Jeongtae Park <jtp.park at samsung.com>
 M:	Andrzej Hajda <a.hajda at samsung.com>
 L:	linux-arm-kernel at lists.infradead.org
@@ -14230,7 +14228,6 @@ F:	drivers/media/usb/pwc/*
 F:	include/trace/events/pwc.h
 
 PWM FAN DRIVER
-M:	Kamil Debski <kamil at wypas.org>
 M:	Bartlomiej Zolnierkiewicz <b.zolnierkie at samsung.com>
 L:	linux-hwmon at vger.kernel.org
 S:	Supported
@@ -15515,7 +15512,6 @@ T:	git https://github.com/lmajewski/linux-samsung-thermal.git
 F:	drivers/thermal/samsung/
 
 SAMSUNG USB2 PHY DRIVER
-M:	Kamil Debski <kamil at wypas.org>
 M:	Sylwester Nawrocki <s.nawrocki at samsung.com>
 L:	linux-kernel at vger.kernel.org
 S:	Supported
commit 77f6ab8b7768cf5e6bdd0e72499270a0671506ee
Author: Al Viro <viro at zeniv.linux.org.uk>
Date:   Wed Oct 28 16:39:49 2020 -0400

    don't dump the threads that had been already exiting when zapped.
    
    Coredump logics needs to report not only the registers of the dumping
    thread, but (since 2.5.43) those of other threads getting killed.
    
    Doing that might require extra state saved on the stack in asm glue at
    kernel entry; signal delivery logics does that (we need to be able to
    save sigcontext there, at the very least) and so does seccomp.
    
    That covers all callers of do_coredump().  Secondary threads get hit with
    SIGKILL and caught as soon as they reach exit_mm(), which normally happens
    in signal delivery, so those are also fine most of the time.  Unfortunately,
    it is possible to end up with secondary zapped when it has already entered
    exit(2) (or, worse yet, is oopsing).  In those cases we reach exit_mm()
    when mm->core_state is already set, but the stack contents is not what
    we would have in signal delivery.
    
    At least on two architectures (alpha and m68k) it leads to infoleaks - we
    end up with a chunk of kernel stack written into coredump, with the contents
    consisting of normal C stack frames of the call chain leading to exit_mm()
    instead of the expected copy of userland registers.  In case of alpha we
    leak 312 bytes of stack.  Other architectures (including the regset-using
    ones) might have similar problems - the normal user of regsets is ptrace
    and the state of tracee at the time of such calls is special in the same
    way signal delivery is.
    
    Note that had the zapper gotten to the exiting thread slightly later,
    it wouldn't have been included into coredump anyway - we skip the threads
    that have already cleared their ->mm.  So let's pretend that zapper always
    loses the race.  IOW, have exit_mm() only insert into the dumper list if
    we'd gotten there from handling a fatal signal[*]
    
    As the result, the callers of do_exit() that have *not* gone through get_signal()
    are not seen by coredump logics as secondary threads.  Which excludes voluntary
    exit()/oopsen/traps/etc.  The dumper thread itself is unaffected by that,
    so seccomp is fine.
    
    [*] originally I intended to add a new flag in tsk->flags, but ebiederman pointed
    out that PF_SIGNALED is already doing just what we need.
    
    Cc: stable at vger.kernel.org
    Fixes: d89f3847def4 ("[PATCH] thread-aware coredumps, 2.5.43-C3")
    History-tree: https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
    Acked-by: "Eric W. Biederman" <ebiederm at xmission.com>
    Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>

diff --git a/kernel/exit.c b/kernel/exit.c
index 87a2d515de0d..1f236ed375f8 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -454,7 +454,10 @@ static void exit_mm(void)
 		mmap_read_unlock(mm);
 
 		self.task = current;
-		self.next = xchg(&core_state->dumper.next, &self);
+		if (self.task->flags & PF_SIGNALED)
+			self.next = xchg(&core_state->dumper.next, &self);
+		else
+			self.task = NULL;
 		/*
 		 * Implies mb(), the result of xchg() must be visible
 		 * to core_state->dumper.
commit 25d76fed7ffecca47be0249a5d5ec0a5dd92af67
Author: Zou Wei <zou_wei at huawei.com>
Date:   Wed Oct 28 16:59:09 2020 +0800

    phy: cpcap-usb: Use IRQF_ONESHOT
    
    Fixes coccicheck error:
    
    ./drivers/phy/motorola/phy-cpcap-usb.c:365:9-34: ERROR:
    Threaded IRQ with no primary handler requested without IRQF_ONESHOT
    
    Reported-by: Hulk Robot <hulkci at huawei.com>
    Signed-off-by: Zou Wei <zou_wei at huawei.com>
    Link: https://lore.kernel.org/r/1603875549-107500-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/motorola/phy-cpcap-usb.c b/drivers/phy/motorola/phy-cpcap-usb.c
index 089db0dea703..442522ba487f 100644
--- a/drivers/phy/motorola/phy-cpcap-usb.c
+++ b/drivers/phy/motorola/phy-cpcap-usb.c
@@ -364,7 +364,8 @@ static int cpcap_usb_init_irq(struct platform_device *pdev,
 
 	error = devm_request_threaded_irq(ddata->dev, irq, NULL,
 					  cpcap_phy_irq_thread,
-					  IRQF_SHARED,
+					  IRQF_SHARED |
+					  IRQF_ONESHOT,
 					  name, ddata);
 	if (error) {
 		dev_err(ddata->dev, "could not get irq %s: %i\n",
commit fcea94ac6154545dd13b17c947c07f5e0a54c121
Author: Stephen Boyd <swboyd at chromium.org>
Date:   Mon Oct 26 13:59:42 2020 -0700

    phy: qcom-qmp: Initialize another pointer to NULL
    
    This probe function is too complicated and should be refactored. For now
    let's just set this variable to NULL and keep the static analysis tools
    happy.
    
    Fixes: 52e013d0bffa ("phy: qcom-qmp: Add support for DP in USB3+DP combo phy")
    Reported-by: kernel test robot <lkp at intel.com>
    Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
    Signed-off-by: Stephen Boyd <swboyd at chromium.org>
    Link: https://lore.kernel.org/r/20201026205942.2861828-1-swboyd@chromium.org
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c
index 5d33ad4d06f2..0cda16846962 100644
--- a/drivers/phy/qualcomm/phy-qcom-qmp.c
+++ b/drivers/phy/qualcomm/phy-qcom-qmp.c
@@ -3926,7 +3926,7 @@ static int qcom_qmp_phy_probe(struct platform_device *pdev)
 	struct phy_provider *phy_provider;
 	void __iomem *serdes;
 	void __iomem *usb_serdes;
-	void __iomem *dp_serdes;
+	void __iomem *dp_serdes = NULL;
 	const struct qmp_phy_combo_cfg *combo_cfg = NULL;
 	const struct qmp_phy_cfg *cfg = NULL;
 	const struct qmp_phy_cfg *usb_cfg = NULL;
commit eb9c4dd9bdfdebaa13846c16a8c79b5b336066b6
Author: Marc Zyngier <maz at kernel.org>
Date:   Tue Oct 13 10:58:20 2020 +0100

    phy: tegra: xusb: Fix dangling pointer on probe failure
    
    If, for some reason, the xusb PHY fails to probe, it leaves
    a dangling pointer attached to the platform device structure.
    
    This would normally be harmless, but the Tegra XHCI driver then
    goes and extract that pointer from the PHY device. Things go
    downhill from there:
    
        8.752082] [004d554e5145533c] address between user and kernel address ranges
    [    8.752085] Internal error: Oops: 96000004 [#1] PREEMPT SMP
    [    8.752088] Modules linked in: max77620_regulator(E+) xhci_tegra(E+) sdhci_tegra(E+) xhci_hcd(E) sdhci_pltfm(E) cqhci(E) fixed(E) usbcore(E) scsi_mod(E) sdhci(E) host1x(E+)
    [    8.752103] CPU: 4 PID: 158 Comm: systemd-udevd Tainted: G S      W   E     5.9.0-rc7-00298-gf6337624c4fe #1980
    [    8.752105] Hardware name: NVIDIA Jetson TX2 Developer Kit (DT)
    [    8.752108] pstate: 20000005 (nzCv daif -PAN -UAO BTYPE=--)
    [    8.752115] pc : kobject_put+0x1c/0x21c
    [    8.752120] lr : put_device+0x20/0x30
    [    8.752121] sp : ffffffc012eb3840
    [    8.752122] x29: ffffffc012eb3840 x28: ffffffc010e82638
    [    8.752125] x27: ffffffc008d56440 x26: 0000000000000000
    [    8.752128] x25: ffffff81eb508200 x24: 0000000000000000
    [    8.752130] x23: ffffff81eb538800 x22: 0000000000000000
    [    8.752132] x21: 00000000fffffdfb x20: ffffff81eb538810
    [    8.752134] x19: 3d4d554e51455300 x18: 0000000000000020
    [    8.752136] x17: ffffffc008d00270 x16: ffffffc008d00c94
    [    8.752138] x15: 0000000000000004 x14: ffffff81ebd4ae90
    [    8.752140] x13: 0000000000000000 x12: ffffff81eb86a4e8
    [    8.752142] x11: ffffff81eb86a480 x10: ffffff81eb862fea
    [    8.752144] x9 : ffffffc01055fb28 x8 : ffffff81eb86a4a8
    [    8.752146] x7 : 0000000000000001 x6 : 0000000000000001
    [    8.752148] x5 : ffffff81dff8bc38 x4 : 0000000000000000
    [    8.752150] x3 : 0000000000000001 x2 : 0000000000000001
    [    8.752152] x1 : 0000000000000002 x0 : 3d4d554e51455300
    [    8.752155] Call trace:
    [    8.752157]  kobject_put+0x1c/0x21c
    [    8.752160]  put_device+0x20/0x30
    [    8.752164]  tegra_xusb_padctl_put+0x24/0x3c
    [    8.752170]  tegra_xusb_probe+0x8b0/0xd10 [xhci_tegra]
    [    8.752174]  platform_drv_probe+0x60/0xb4
    [    8.752176]  really_probe+0xf0/0x504
    [    8.752179]  driver_probe_device+0x100/0x170
    [    8.752181]  device_driver_attach+0xcc/0xd4
    [    8.752183]  __driver_attach+0xb0/0x17c
    [    8.752185]  bus_for_each_dev+0x7c/0xd4
    [    8.752187]  driver_attach+0x30/0x3c
    [    8.752189]  bus_add_driver+0x154/0x250
    [    8.752191]  driver_register+0x84/0x140
    [    8.752193]  __platform_driver_register+0x54/0x60
    [    8.752197]  tegra_xusb_init+0x40/0x1000 [xhci_tegra]
    [    8.752201]  do_one_initcall+0x54/0x2d0
    [    8.752205]  do_init_module+0x68/0x29c
    [    8.752207]  load_module+0x2178/0x26c0
    [    8.752209]  __do_sys_finit_module+0xb0/0x120
    [    8.752211]  __arm64_sys_finit_module+0x2c/0x40
    [    8.752215]  el0_svc_common.constprop.0+0x80/0x240
    [    8.752218]  do_el0_svc+0x30/0xa0
    [    8.752220]  el0_svc+0x18/0x50
    [    8.752223]  el0_sync_handler+0x90/0x318
    [    8.752225]  el0_sync+0x158/0x180
    [    8.752230] Code: a9bd7bfd 910003fd a90153f3 aa0003f3 (3940f000)
    [    8.752232] ---[ end trace 90f6c89d62d85ff5 ]---
    
    Reset the pointer on probe failure fixes the issue.
    
    Fixes: 53d2a715c2403 ("phy: Add Tegra XUSB pad controller support")
    Signed-off-by: Marc Zyngier <maz at kernel.org>
    Link: https://lore.kernel.org/r/20201013095820.311376-1-maz@kernel.org
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/tegra/xusb.c b/drivers/phy/tegra/xusb.c
index de4a46fe1763..ad88d74c1884 100644
--- a/drivers/phy/tegra/xusb.c
+++ b/drivers/phy/tegra/xusb.c
@@ -1242,6 +1242,7 @@ power_down:
 reset:
 	reset_control_assert(padctl->rst);
 remove:
+	platform_set_drvdata(pdev, NULL);
 	soc->ops->remove(padctl);
 	return err;
 }
commit 209c805835b29495cf66cc705b206da8f4a68e6e
Author: Al Cooper <alcooperx at gmail.com>
Date:   Fri Oct 2 15:01:15 2020 -0400

    phy: usb: Fix incorrect clearing of tca_drv_sel bit in SETUP reg for 7211
    
    The 7211a0 has a tca_drv_sel bit in the USB SETUP register that
    should never be enabled. This feature is only used if there is a
    USB Type-C PHY, and the 7211 does not have one. If the bit is
    enabled, the VBUS signal will never be asserted. In the 7211a0,
    the bit was incorrectly defaulted to on so the driver had to clear
    the bit. In the 7211c0 the state was inverted so the driver should
    no longer clear the bit. This hasn't been a problem because all
    current 7211 boards don't use the VBUS signal, but there are some
    future customer boards that may use it.
    
    Signed-off-by: Al Cooper <alcooperx at gmail.com>
    Acked-by: Florian Fainelli <f.fainelli at gmail.com>
    Link: https://lore.kernel.org/r/20201002190115.48017-1-alcooperx@gmail.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
index 456dc4a100c2..e63457e145c7 100644
--- a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
+++ b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
@@ -270,11 +270,6 @@ static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
 	reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
 	brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
 
-	/* Fix the incorrect default */
-	reg = brcm_usb_readl(ctrl + USB_CTRL_SETUP);
-	reg &= ~USB_CTRL_SETUP_tca_drv_sel_MASK;
-	brcm_usb_writel(reg, ctrl + USB_CTRL_SETUP);
-
 	usb_init_common(params);
 
 	/*
commit f83c2609079cde0bb3ad4c1da60f9c69c0ec8920
Author: Paul Cercueil <paul at crapouillou.net>
Date:   Sat Oct 10 21:25:09 2020 +0200

    pinctrl: ingenic: Fix invalid SSI pins
    
    The values for the SSI pins on GPIO chips D and E were off by 0x20.
    
    Fixes: d3ef8c6b2286 ("pinctrl: Ingenic: Add SSI pins support for JZ4770 and JZ4780.")
    Signed-off-by: Paul Cercueil <paul at crapouillou.net>
    Reported-by: Artur Rojek <contact at artur-rojek.eu>
    Link: https://lore.kernel.org/r/20201010192509.9098-1-paul@crapouillou.net
    Reviewed-by: 周琰杰 (Zhou Yanjie) <zhouyanjie at wanyeetech.com>
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/pinctrl/pinctrl-ingenic.c b/drivers/pinctrl/pinctrl-ingenic.c
index c8e50a58a5e5..621909b01deb 100644
--- a/drivers/pinctrl/pinctrl-ingenic.c
+++ b/drivers/pinctrl/pinctrl-ingenic.c
@@ -635,44 +635,44 @@ static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
 static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
 static int jz4770_ssi0_dt_a_pins[] = { 0x15, };
 static int jz4770_ssi0_dt_b_pins[] = { 0x35, };
-static int jz4770_ssi0_dt_d_pins[] = { 0x55, };
-static int jz4770_ssi0_dt_e_pins[] = { 0x71, };
+static int jz4770_ssi0_dt_d_pins[] = { 0x75, };
+static int jz4770_ssi0_dt_e_pins[] = { 0x91, };
 static int jz4770_ssi0_dr_a_pins[] = { 0x14, };
 static int jz4770_ssi0_dr_b_pins[] = { 0x34, };
-static int jz4770_ssi0_dr_d_pins[] = { 0x54, };
-static int jz4770_ssi0_dr_e_pins[] = { 0x6e, };
+static int jz4770_ssi0_dr_d_pins[] = { 0x74, };
+static int jz4770_ssi0_dr_e_pins[] = { 0x8e, };
 static int jz4770_ssi0_clk_a_pins[] = { 0x12, };
 static int jz4770_ssi0_clk_b_pins[] = { 0x3c, };
-static int jz4770_ssi0_clk_d_pins[] = { 0x58, };
-static int jz4770_ssi0_clk_e_pins[] = { 0x6f, };
+static int jz4770_ssi0_clk_d_pins[] = { 0x78, };
+static int jz4770_ssi0_clk_e_pins[] = { 0x8f, };
 static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, };
-static int jz4770_ssi0_gpc_d_pins[] = { 0x56, };
-static int jz4770_ssi0_gpc_e_pins[] = { 0x73, };
+static int jz4770_ssi0_gpc_d_pins[] = { 0x76, };
+static int jz4770_ssi0_gpc_e_pins[] = { 0x93, };
 static int jz4770_ssi0_ce0_a_pins[] = { 0x13, };
 static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, };
-static int jz4770_ssi0_ce0_d_pins[] = { 0x59, };
-static int jz4770_ssi0_ce0_e_pins[] = { 0x70, };
+static int jz4770_ssi0_ce0_d_pins[] = { 0x79, };
+static int jz4770_ssi0_ce0_e_pins[] = { 0x90, };
 static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, };
-static int jz4770_ssi0_ce1_d_pins[] = { 0x57, };
-static int jz4770_ssi0_ce1_e_pins[] = { 0x72, };
+static int jz4770_ssi0_ce1_d_pins[] = { 0x77, };
+static int jz4770_ssi0_ce1_e_pins[] = { 0x92, };
 static int jz4770_ssi1_dt_b_pins[] = { 0x35, };
-static int jz4770_ssi1_dt_d_pins[] = { 0x55, };
-static int jz4770_ssi1_dt_e_pins[] = { 0x71, };
+static int jz4770_ssi1_dt_d_pins[] = { 0x75, };
+static int jz4770_ssi1_dt_e_pins[] = { 0x91, };
 static int jz4770_ssi1_dr_b_pins[] = { 0x34, };
-static int jz4770_ssi1_dr_d_pins[] = { 0x54, };
-static int jz4770_ssi1_dr_e_pins[] = { 0x6e, };
+static int jz4770_ssi1_dr_d_pins[] = { 0x74, };
+static int jz4770_ssi1_dr_e_pins[] = { 0x8e, };
 static int jz4770_ssi1_clk_b_pins[] = { 0x3c, };
-static int jz4770_ssi1_clk_d_pins[] = { 0x58, };
-static int jz4770_ssi1_clk_e_pins[] = { 0x6f, };
+static int jz4770_ssi1_clk_d_pins[] = { 0x78, };
+static int jz4770_ssi1_clk_e_pins[] = { 0x8f, };
 static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, };
-static int jz4770_ssi1_gpc_d_pins[] = { 0x56, };
-static int jz4770_ssi1_gpc_e_pins[] = { 0x73, };
+static int jz4770_ssi1_gpc_d_pins[] = { 0x76, };
+static int jz4770_ssi1_gpc_e_pins[] = { 0x93, };
 static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, };
-static int jz4770_ssi1_ce0_d_pins[] = { 0x59, };
-static int jz4770_ssi1_ce0_e_pins[] = { 0x70, };
+static int jz4770_ssi1_ce0_d_pins[] = { 0x79, };
+static int jz4770_ssi1_ce0_e_pins[] = { 0x90, };
 static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, };
-static int jz4770_ssi1_ce1_d_pins[] = { 0x57, };
-static int jz4770_ssi1_ce1_e_pins[] = { 0x72, };
+static int jz4770_ssi1_ce1_d_pins[] = { 0x77, };
+static int jz4770_ssi1_ce1_e_pins[] = { 0x92, };
 static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
 static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
 static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
@@ -1050,35 +1050,35 @@ static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, };
 static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, };
 static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, };
 static int jz4780_ssi0_dt_b_pins[] = { 0x3d, };
-static int jz4780_ssi0_dt_d_pins[] = { 0x59, };
+static int jz4780_ssi0_dt_d_pins[] = { 0x79, };
 static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, };
 static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, };
 static int jz4780_ssi0_dr_b_pins[] = { 0x34, };
-static int jz4780_ssi0_dr_d_pins[] = { 0x54, };
+static int jz4780_ssi0_dr_d_pins[] = { 0x74, };
 static int jz4780_ssi0_clk_a_pins[] = { 0x12, };
 static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, };
 static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, };
-static int jz4780_ssi0_clk_d_pins[] = { 0x58, };
+static int jz4780_ssi0_clk_d_pins[] = { 0x78, };
 static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, };
-static int jz4780_ssi0_gpc_d_pins[] = { 0x56, };
+static int jz4780_ssi0_gpc_d_pins[] = { 0x76, };
 static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, };
 static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, };
 static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, };
-static int jz4780_ssi0_ce0_d_pins[] = { 0x57, };
+static int jz4780_ssi0_ce0_d_pins[] = { 0x77, };
 static int jz4780_ssi0_ce1_b_pins[] = { 0x35, };
-static int jz4780_ssi0_ce1_d_pins[] = { 0x55, };
+static int jz4780_ssi0_ce1_d_pins[] = { 0x75, };
 static int jz4780_ssi1_dt_b_pins[] = { 0x3d, };
-static int jz4780_ssi1_dt_d_pins[] = { 0x59, };
+static int jz4780_ssi1_dt_d_pins[] = { 0x79, };
 static int jz4780_ssi1_dr_b_pins[] = { 0x34, };
-static int jz4780_ssi1_dr_d_pins[] = { 0x54, };
+static int jz4780_ssi1_dr_d_pins[] = { 0x74, };
 static int jz4780_ssi1_clk_b_pins[] = { 0x3c, };
-static int jz4780_ssi1_clk_d_pins[] = { 0x58, };
+static int jz4780_ssi1_clk_d_pins[] = { 0x78, };
 static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, };
-static int jz4780_ssi1_gpc_d_pins[] = { 0x56, };
+static int jz4780_ssi1_gpc_d_pins[] = { 0x76, };
 static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, };
-static int jz4780_ssi1_ce0_d_pins[] = { 0x57, };
+static int jz4780_ssi1_ce0_d_pins[] = { 0x77, };
 static int jz4780_ssi1_ce1_b_pins[] = { 0x35, };
-static int jz4780_ssi1_ce1_d_pins[] = { 0x55, };
+static int jz4780_ssi1_ce1_d_pins[] = { 0x75, };
 static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
 static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, };
 static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, };
commit 7ffa08169849be898eed6f3694aab8c425497749
Author: Tony Lindgren <tony at atomide.com>
Date:   Wed Oct 28 08:05:56 2020 +0200

    Revert "Revert "gpio: omap: Fix lost edge wake-up interrupts""
    
    This reverts commit 579ced8fdb00b8e94304a83e3cc419f6f8eab08e.
    
    Turns out I was overly optimistic about cpu_pm blocking idle being a
    solution for handling edge interrupts. While it helps in preventing
    entering idle states that potentially lose context, we can still get
    an edge interrupt triggering while entering idle. So we need to also
    add back the workaround for seeing if there are any pending edge
    interrupts when waking up.
    
    Signed-off-by: Tony Lindgren <tony at atomide.com>
    Cc: Aaro Koskinen <aaro.koskinen at iki.fi>
    Cc: Grygorii Strashko <grygorii.strashko at ti.com>
    Cc: Keerthy <j-keerthy at ti.com>
    Cc: Ladislav Michl <ladis at linux-mips.org>
    Cc: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Cc: Russell King <rmk+kernel at armlinux.org.uk>
    Cc: Tero Kristo <t-kristo at ti.com>
    Link: https://lore.kernel.org/r/20201028060556.56038-1-tony@atomide.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 6d59e3a43761..f7ceb2b11afc 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1114,13 +1114,23 @@ static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
 {
 	struct device *dev = bank->chip.parent;
 	void __iomem *base = bank->base;
-	u32 nowake;
+	u32 mask, nowake;
 
 	bank->saved_datain = readl_relaxed(base + bank->regs->datain);
 
 	if (!bank->enabled_non_wakeup_gpios)
 		goto update_gpio_context_count;
 
+	/* Check for pending EDGE_FALLING, ignore EDGE_BOTH */
+	mask = bank->enabled_non_wakeup_gpios & bank->context.fallingdetect;
+	mask &= ~bank->context.risingdetect;
+	bank->saved_datain |= mask;
+
+	/* Check for pending EDGE_RISING, ignore EDGE_BOTH */
+	mask = bank->enabled_non_wakeup_gpios & bank->context.risingdetect;
+	mask &= ~bank->context.fallingdetect;
+	bank->saved_datain &= ~mask;
+
 	if (!may_lose_context)
 		goto update_gpio_context_count;
 
commit 2f84a2de539cc4301a332c2c76473fc25baf21b7
Author: Kent Gibson <warthog618 at gmail.com>
Date:   Mon Oct 5 15:03:29 2020 +0800

    gpio: uapi: clarify the meaning of 'empty' char arrays
    
    Clarify that a char array containing a string is considered 'empty' if
    the first character is the null terminator. The remaining characters
    are not relevant to this determination.
    
    Signed-off-by: Kent Gibson <warthog618 at gmail.com>
    Reviewed-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Link: https://lore.kernel.org/r/20201005070329.21055-6-warthog618@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h
index ad3f56dd87ec..2072c260f5d0 100644
--- a/include/uapi/linux/gpio.h
+++ b/include/uapi/linux/gpio.h
@@ -26,7 +26,7 @@
  * struct gpiochip_info - Information about a certain GPIO chip
  * @name: the Linux kernel name of this GPIO chip
  * @label: a functional name for this GPIO chip, such as a product
- * number, may be empty
+ * number, may be empty (i.e. label[0] == '\0')
  * @lines: number of GPIO lines on this chip
  */
 struct gpiochip_info {
@@ -203,7 +203,7 @@ struct gpio_v2_line_request {
  * struct gpio_v2_line_info - Information about a certain GPIO line
  * @name: the name of this GPIO line, such as the output pin of the line on
  * the chip, a rail or a pin header name on a board, as specified by the
- * GPIO chip, may be empty
+ * GPIO chip, may be empty (i.e. name[0] == '\0')
  * @consumer: a functional name for the consumer of this GPIO line as set
  * by whatever is using it, will be empty if there is no current user but
  * may also be empty if the consumer doesn't set this up
@@ -315,7 +315,7 @@ struct gpio_v2_line_event {
  * @flags: various flags for this line
  * @name: the name of this GPIO line, such as the output pin of the line on the
  * chip, a rail or a pin header name on a board, as specified by the gpio
- * chip, may be empty
+ * chip, may be empty (i.e. name[0] == '\0')
  * @consumer: a functional name for the consumer of this GPIO line as set by
  * whatever is using it, will be empty if there is no current user but may
  * also be empty if the consumer doesn't set this up
commit c303c51c87a61ace7330b5e0217468b1b8f98a75
Author: Kent Gibson <warthog618 at gmail.com>
Date:   Mon Oct 5 15:03:28 2020 +0800

    gpio: uapi: remove whitespace
    
    Remove leading whitespace in ABI v1 comment.
    
    Signed-off-by: Kent Gibson <warthog618 at gmail.com>
    Reviewed-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Link: https://lore.kernel.org/r/20201005070329.21055-5-warthog618@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h
index 32dd18f238c3..ad3f56dd87ec 100644
--- a/include/uapi/linux/gpio.h
+++ b/include/uapi/linux/gpio.h
@@ -292,7 +292,7 @@ struct gpio_v2_line_event {
 };
 
 /*
- *  ABI v1
+ * ABI v1
  *
  * This version of the ABI is deprecated.
  * Use the latest version of the ABI, defined above, instead.
commit 2cc522d3931ba2aa744d09d41f874d61bf3a1851
Author: Kent Gibson <warthog618 at gmail.com>
Date:   Mon Oct 5 15:03:27 2020 +0800

    gpio: uapi: kernel-doc formatting improvements
    
    Add kernel-doc formatting to all references to structs, enums, fields
    and constants, and move deprecation warnings into the Note section of
    the deprecated struct.
    
    Replace 'OR:ed' with 'added', as the former looks odd.
    
    Signed-off-by: Kent Gibson <warthog618 at gmail.com>
    Reviewed-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Link: https://lore.kernel.org/r/20201005070329.21055-4-warthog618@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h
index 1fdb0e851f83..32dd18f238c3 100644
--- a/include/uapi/linux/gpio.h
+++ b/include/uapi/linux/gpio.h
@@ -110,17 +110,17 @@ enum gpio_v2_line_attr_id {
  * struct gpio_v2_line_attribute - a configurable attribute of a line
  * @id: attribute identifier with value from &enum gpio_v2_line_attr_id
  * @padding: reserved for future use and must be zero filled
- * @flags: if id is GPIO_V2_LINE_ATTR_ID_FLAGS, the flags for the GPIO
- * line, with values from enum gpio_v2_line_flag, such as
- * GPIO_V2_LINE_FLAG_ACTIVE_LOW, GPIO_V2_LINE_FLAG_OUTPUT etc, OR:ed
+ * @flags: if id is %GPIO_V2_LINE_ATTR_ID_FLAGS, the flags for the GPIO
+ * line, with values from &enum gpio_v2_line_flag, such as
+ * %GPIO_V2_LINE_FLAG_ACTIVE_LOW, %GPIO_V2_LINE_FLAG_OUTPUT etc, added
  * together.  This overrides the default flags contained in the &struct
  * gpio_v2_line_config for the associated line.
- * @values: if id is GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES, a bitmap
+ * @values: if id is %GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES, a bitmap
  * containing the values to which the lines will be set, with each bit
  * number corresponding to the index into &struct
  * gpio_v2_line_request.offsets.
- * @debounce_period_us: if id is GPIO_V2_LINE_ATTR_ID_DEBOUNCE, the desired
- * debounce period, in microseconds
+ * @debounce_period_us: if id is %GPIO_V2_LINE_ATTR_ID_DEBOUNCE, the
+ * desired debounce period, in microseconds
  */
 struct gpio_v2_line_attribute {
 	__u32 id;
@@ -147,12 +147,12 @@ struct gpio_v2_line_config_attribute {
 
 /**
  * struct gpio_v2_line_config - Configuration for GPIO lines
- * @flags: flags for the GPIO lines, with values from enum
- * gpio_v2_line_flag, such as GPIO_V2_LINE_FLAG_ACTIVE_LOW,
- * GPIO_V2_LINE_FLAG_OUTPUT etc, OR:ed together.  This is the default for
+ * @flags: flags for the GPIO lines, with values from &enum
+ * gpio_v2_line_flag, such as %GPIO_V2_LINE_FLAG_ACTIVE_LOW,
+ * %GPIO_V2_LINE_FLAG_OUTPUT etc, added together.  This is the default for
  * all requested lines but may be overridden for particular lines using
- * attrs.
- * @num_attrs: the number of attributes in attrs
+ * @attrs.
+ * @num_attrs: the number of attributes in @attrs
  * @padding: reserved for future use and must be zero filled
  * @attrs: the configuration attributes associated with the requested
  * lines.  Any attribute should only be associated with a particular line
@@ -175,17 +175,17 @@ struct gpio_v2_line_config {
  * "my-bitbanged-relay"
  * @config: requested configuration for the lines.
  * @num_lines: number of lines requested in this request, i.e. the number
- * of valid fields in the GPIO_V2_LINES_MAX sized arrays, set to 1 to
+ * of valid fields in the %GPIO_V2_LINES_MAX sized arrays, set to 1 to
  * request a single line
  * @event_buffer_size: a suggested minimum number of line events that the
  * kernel should buffer.  This is only relevant if edge detection is
  * enabled in the configuration. Note that this is only a suggested value
  * and the kernel may allocate a larger buffer or cap the size of the
  * buffer. If this field is zero then the buffer size defaults to a minimum
- * of num_lines*16.
+ * of @num_lines * 16.
  * @padding: reserved for future use and must be zero filled
  * @fd: if successful this field will contain a valid anonymous file handle
- * after a GPIO_GET_LINE_IOCTL operation, zero or negative value means
+ * after a %GPIO_GET_LINE_IOCTL operation, zero or negative value means
  * error
  */
 struct gpio_v2_line_request {
@@ -207,11 +207,12 @@ struct gpio_v2_line_request {
  * @consumer: a functional name for the consumer of this GPIO line as set
  * by whatever is using it, will be empty if there is no current user but
  * may also be empty if the consumer doesn't set this up
- * @flags: flags for the GPIO line, such as GPIO_V2_LINE_FLAG_ACTIVE_LOW,
- * GPIO_V2_LINE_FLAG_OUTPUT etc, OR:ed together
  * @offset: the local offset on this GPIO chip, fill this in when
  * requesting the line information from the kernel
- * @num_attrs: the number of attributes in attrs
+ * @num_attrs: the number of attributes in @attrs
+ * @flags: flags for the GPIO lines, with values from &enum
+ * gpio_v2_line_flag, such as %GPIO_V2_LINE_FLAG_ACTIVE_LOW,
+ * %GPIO_V2_LINE_FLAG_OUTPUT etc, added together.
  * @attrs: the configuration attributes associated with the line
  * @padding: reserved for future use
  */
@@ -244,7 +245,7 @@ enum gpio_v2_line_changed_type {
  * of a GPIO line
  * @info: updated line information
  * @timestamp_ns: estimate of time of status change occurrence, in nanoseconds
- * @event_type: the type of change with a value from enum
+ * @event_type: the type of change with a value from &enum
  * gpio_v2_line_changed_type
  * @padding: reserved for future use
  */
@@ -269,10 +270,10 @@ enum gpio_v2_line_event_id {
 /**
  * struct gpio_v2_line_event - The actual event being pushed to userspace
  * @timestamp_ns: best estimate of time of event occurrence, in nanoseconds.
- * The timestamp_ns is read from CLOCK_MONOTONIC and is intended to allow the
- * accurate measurement of the time between events.  It does not provide
+ * The @timestamp_ns is read from %CLOCK_MONOTONIC and is intended to allow
+ * the accurate measurement of the time between events. It does not provide
  * the wall-clock time.
- * @id: event identifier with value from enum gpio_v2_line_event_id
+ * @id: event identifier with value from &enum gpio_v2_line_event_id
  * @offset: the offset of the line that triggered the event
  * @seqno: the sequence number for this event in the sequence of events for
  * all the lines in this line request
@@ -319,8 +320,8 @@ struct gpio_v2_line_event {
  * whatever is using it, will be empty if there is no current user but may
  * also be empty if the consumer doesn't set this up
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_info instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_info instead.
  */
 struct gpioline_info {
 	__u32 line_offset;
@@ -344,18 +345,18 @@ enum {
  * of a GPIO line
  * @info: updated line information
  * @timestamp: estimate of time of status change occurrence, in nanoseconds
- * @event_type: one of GPIOLINE_CHANGED_REQUESTED, GPIOLINE_CHANGED_RELEASED
- * and GPIOLINE_CHANGED_CONFIG
+ * @event_type: one of %GPIOLINE_CHANGED_REQUESTED,
+ * %GPIOLINE_CHANGED_RELEASED and %GPIOLINE_CHANGED_CONFIG
  * @padding: reserved for future use
  *
- * Note: struct gpioline_info embedded here has 32-bit alignment on its own,
+ * The &struct gpioline_info embedded here has 32-bit alignment on its own,
  * but it works fine with 64-bit alignment too. With its 72 byte size, we can
  * guarantee there are no implicit holes between it and subsequent members.
  * The 20-byte padding at the end makes sure we don't add any implicit padding
  * at the end of the structure on 64-bit architectures.
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_info_changed instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_info_changed instead.
  */
 struct gpioline_info_changed {
 	struct gpioline_info info;
@@ -379,13 +380,13 @@ struct gpioline_info_changed {
  * @lineoffsets: an array of desired lines, specified by offset index for the
  * associated GPIO device
  * @flags: desired flags for the desired GPIO lines, such as
- * GPIOHANDLE_REQUEST_OUTPUT, GPIOHANDLE_REQUEST_ACTIVE_LOW etc, OR:ed
+ * %GPIOHANDLE_REQUEST_OUTPUT, %GPIOHANDLE_REQUEST_ACTIVE_LOW etc, added
  * together. Note that even if multiple lines are requested, the same flags
  * must be applicable to all of them, if you want lines with individual
  * flags set, request them one by one. It is possible to select
  * a batch of input or output lines, but they must all have the same
  * characteristics, i.e. all inputs or all outputs, all active low etc
- * @default_values: if the GPIOHANDLE_REQUEST_OUTPUT is set for a requested
+ * @default_values: if the %GPIOHANDLE_REQUEST_OUTPUT is set for a requested
  * line, this specifies the default output value, should be 0 (low) or
  * 1 (high), anything else than 0 or 1 will be interpreted as 1 (high)
  * @consumer_label: a desired consumer label for the selected GPIO line(s)
@@ -393,11 +394,11 @@ struct gpioline_info_changed {
  * @lines: number of lines requested in this request, i.e. the number of
  * valid fields in the above arrays, set to 1 to request a single line
  * @fd: if successful this field will contain a valid anonymous file handle
- * after a GPIO_GET_LINEHANDLE_IOCTL operation, zero or negative value
+ * after a %GPIO_GET_LINEHANDLE_IOCTL operation, zero or negative value
  * means error
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_request instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_request instead.
  */
 struct gpiohandle_request {
 	__u32 lineoffsets[GPIOHANDLES_MAX];
@@ -411,15 +412,15 @@ struct gpiohandle_request {
 /**
  * struct gpiohandle_config - Configuration for a GPIO handle request
  * @flags: updated flags for the requested GPIO lines, such as
- * GPIOHANDLE_REQUEST_OUTPUT, GPIOHANDLE_REQUEST_ACTIVE_LOW etc, OR:ed
+ * %GPIOHANDLE_REQUEST_OUTPUT, %GPIOHANDLE_REQUEST_ACTIVE_LOW etc, added
  * together
- * @default_values: if the GPIOHANDLE_REQUEST_OUTPUT is set in flags,
+ * @default_values: if the %GPIOHANDLE_REQUEST_OUTPUT is set in flags,
  * this specifies the default output value, should be 0 (low) or
  * 1 (high), anything else than 0 or 1 will be interpreted as 1 (high)
  * @padding: reserved for future use and should be zero filled
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_config instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_config instead.
  */
 struct gpiohandle_config {
 	__u32 flags;
@@ -433,8 +434,8 @@ struct gpiohandle_config {
  * state of a line, when setting the state of lines these should contain
  * the desired target state
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_values instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_values instead.
  */
 struct gpiohandle_data {
 	__u8 values[GPIOHANDLES_MAX];
@@ -450,17 +451,17 @@ struct gpiohandle_data {
  * @lineoffset: the desired line to subscribe to events from, specified by
  * offset index for the associated GPIO device
  * @handleflags: desired handle flags for the desired GPIO line, such as
- * GPIOHANDLE_REQUEST_ACTIVE_LOW or GPIOHANDLE_REQUEST_OPEN_DRAIN
+ * %GPIOHANDLE_REQUEST_ACTIVE_LOW or %GPIOHANDLE_REQUEST_OPEN_DRAIN
  * @eventflags: desired flags for the desired GPIO event line, such as
- * GPIOEVENT_REQUEST_RISING_EDGE or GPIOEVENT_REQUEST_FALLING_EDGE
+ * %GPIOEVENT_REQUEST_RISING_EDGE or %GPIOEVENT_REQUEST_FALLING_EDGE
  * @consumer_label: a desired consumer label for the selected GPIO line(s)
  * such as "my-listener"
  * @fd: if successful this field will contain a valid anonymous file handle
- * after a GPIO_GET_LINEEVENT_IOCTL operation, zero or negative value
+ * after a %GPIO_GET_LINEEVENT_IOCTL operation, zero or negative value
  * means error
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_request instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_request instead.
  */
 struct gpioevent_request {
 	__u32 lineoffset;
@@ -481,8 +482,8 @@ struct gpioevent_request {
  * @timestamp: best estimate of time of event occurrence, in nanoseconds
  * @id: event identifier
  *
- * This struct is part of ABI v1 and is deprecated.
- * Use struct gpio_v2_line_event instead.
+ * Note: This struct is part of ABI v1 and is deprecated.
+ * Use &struct gpio_v2_line_event instead.
  */
 struct gpioevent_data {
 	__u64 timestamp;
commit f20160217537e9006ce4a625da62b358416fc4ed
Author: Kent Gibson <warthog618 at gmail.com>
Date:   Mon Oct 5 15:03:26 2020 +0800

    gpio: uapi: comment consistency
    
    Make debounce_period_us field documentation consistent with other fields
    in the union.
    
    Signed-off-by: Kent Gibson <warthog618 at gmail.com>
    Reviewed-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Link: https://lore.kernel.org/r/20201005070329.21055-3-warthog618@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h
index b0d5e7a1c693..1fdb0e851f83 100644
--- a/include/uapi/linux/gpio.h
+++ b/include/uapi/linux/gpio.h
@@ -98,7 +98,7 @@ struct gpio_v2_line_values {
  * identifying which field of the attribute union is in use.
  * @GPIO_V2_LINE_ATTR_ID_FLAGS: flags field is in use
  * @GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES: values field is in use
- * @GPIO_V2_LINE_ATTR_ID_DEBOUNCE: debounce_period_us is in use
+ * @GPIO_V2_LINE_ATTR_ID_DEBOUNCE: debounce_period_us field is in use
  */
 enum gpio_v2_line_attr_id {
 	GPIO_V2_LINE_ATTR_ID_FLAGS		= 1,
commit 5760648e63e6c1006a3ed0bfc2167f623b8bcbcd
Author: Kent Gibson <warthog618 at gmail.com>
Date:   Mon Oct 5 15:03:25 2020 +0800

    gpio: uapi: fix kernel-doc warnings
    
    Fix kernel-doc warnings, specifically gpioline_info_changed.padding is
    not documented and 'GPIO event types' describes defines, which are not
    documented by kernel-doc.
    
    Signed-off-by: Kent Gibson <warthog618 at gmail.com>
    Reviewed-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Link: https://lore.kernel.org/r/20201005070329.21055-2-warthog618@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h
index 07865c601099..b0d5e7a1c693 100644
--- a/include/uapi/linux/gpio.h
+++ b/include/uapi/linux/gpio.h
@@ -346,6 +346,7 @@ enum {
  * @timestamp: estimate of time of status change occurrence, in nanoseconds
  * @event_type: one of GPIOLINE_CHANGED_REQUESTED, GPIOLINE_CHANGED_RELEASED
  * and GPIOLINE_CHANGED_CONFIG
+ * @padding: reserved for future use
  *
  * Note: struct gpioline_info embedded here has 32-bit alignment on its own,
  * but it works fine with 64-bit alignment too. With its 72 byte size, we can
@@ -469,7 +470,7 @@ struct gpioevent_request {
 	int fd;
 };
 
-/**
+/*
  * GPIO event types
  */
 #define GPIOEVENT_EVENT_RISING_EDGE 0x01
commit 768664114b1ac9184f1dc6217d9c930a08ffbfa8
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 17:01:15 2020 +0100

    dmaengine: ti: k3-udma: fix -Wenum-conversion warning
    
    gcc warns about a mismatch argument type when passing
    'false' into a function that expects an enum:
    
    drivers/dma/ti/k3-udma-private.c: In function 'xudma_tchan_get':
    drivers/dma/ti/k3-udma-private.c:86:34: warning: implicit conversion from 'enum <anonymous>' to 'enum udma_tp_level' [-Wenum-conversion]
      86 |  return __udma_reserve_##res(ud, false, id);   \
         |                                  ^~~~~
    drivers/dma/ti/k3-udma-private.c:95:1: note: in expansion of macro 'XUDMA_GET_PUT_RESOURCE'
       95 | XUDMA_GET_PUT_RESOURCE(tchan);
          | ^~~~~~~~~~~~~~~~~~~~~~
    
    In this case, false has the same numerical value as
    UDMA_TP_NORMAL, so passing that is most likely the correct
    way to avoid the warning without changing the behavior.
    
    Fixes: d70241913413 ("dmaengine: ti: k3-udma: Add glue layer for non DMAengine users")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Acked-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
    Link: https://lore.kernel.org/r/20201026160123.3704531-1-arnd@kernel.org
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/ti/k3-udma-private.c b/drivers/dma/ti/k3-udma-private.c
index aa24e554f7b4..8563a392f30b 100644
--- a/drivers/dma/ti/k3-udma-private.c
+++ b/drivers/dma/ti/k3-udma-private.c
@@ -83,7 +83,7 @@ EXPORT_SYMBOL(xudma_rflow_is_gp);
 #define XUDMA_GET_PUT_RESOURCE(res)					\
 struct udma_##res *xudma_##res##_get(struct udma_dev *ud, int id)	\
 {									\
-	return __udma_reserve_##res(ud, false, id);			\
+	return __udma_reserve_##res(ud, UDMA_TP_NORMAL, id);		\
 }									\
 EXPORT_SYMBOL(xudma_##res##_get);					\
 									\
commit 484f910e93b48c1d8890d8330a87e34ae61f4782
Author: Dave Jiang <dave.jiang at intel.com>
Date:   Tue Oct 27 14:34:09 2020 -0700

    dmaengine: idxd: fix wq config registers offset programming
    
    DSA spec v1.1 [1] updated to include a stride size register for WQ
    configuration that will specify how much space is reserved for the WQ
    configuration register set. This change is expected to be in the final
    gen1 DSA hardware. Fix the driver to use WQCFG_OFFSET() for all WQ
    offset calculation and fixup WQCFG_OFFSET() to use the new calculated
    wq size.
    
    [1]: https://software.intel.com/content/www/us/en/develop/download/intel-data-streaming-accelerator-preliminary-architecture-specification.html
    
    Fixes: bfe1d56091c1 ("dmaengine: idxd: Init and probe for Intel data accelerators")
    Signed-off-by: Dave Jiang <dave.jiang at intel.com>
    Link: https://lore.kernel.org/r/160383444959.48058.14249265538404901781.stgit@djiang5-desk3.ch.intel.com
    Signed-off-by: Vinod Koul <vkoul at kernel.org>

diff --git a/drivers/dma/idxd/device.c b/drivers/dma/idxd/device.c
index 200b9109cacf..506ac85c4a7f 100644
--- a/drivers/dma/idxd/device.c
+++ b/drivers/dma/idxd/device.c
@@ -295,7 +295,7 @@ void idxd_wq_disable_cleanup(struct idxd_wq *wq)
 	int i, wq_offset;
 
 	lockdep_assert_held(&idxd->dev_lock);
-	memset(&wq->wqcfg, 0, sizeof(wq->wqcfg));
+	memset(wq->wqcfg, 0, idxd->wqcfg_size);
 	wq->type = IDXD_WQT_NONE;
 	wq->size = 0;
 	wq->group = NULL;
@@ -304,8 +304,8 @@ void idxd_wq_disable_cleanup(struct idxd_wq *wq)
 	clear_bit(WQ_FLAG_DEDICATED, &wq->flags);
 	memset(wq->name, 0, WQ_NAME_SIZE);
 
-	for (i = 0; i < 8; i++) {
-		wq_offset = idxd->wqcfg_offset + wq->id * 32 + i * sizeof(u32);
+	for (i = 0; i < WQCFG_STRIDES(idxd); i++) {
+		wq_offset = WQCFG_OFFSET(idxd, wq->id, i);
 		iowrite32(0, idxd->reg_base + wq_offset);
 		dev_dbg(dev, "WQ[%d][%d][%#x]: %#x\n",
 			wq->id, i, wq_offset,
@@ -539,10 +539,10 @@ static int idxd_wq_config_write(struct idxd_wq *wq)
 	if (!wq->group)
 		return 0;
 
-	memset(&wq->wqcfg, 0, sizeof(union wqcfg));
+	memset(wq->wqcfg, 0, idxd->wqcfg_size);
 
 	/* byte 0-3 */
-	wq->wqcfg.wq_size = wq->size;
+	wq->wqcfg->wq_size = wq->size;
 
 	if (wq->size == 0) {
 		dev_warn(dev, "Incorrect work queue size: 0\n");
@@ -550,22 +550,21 @@ static int idxd_wq_config_write(struct idxd_wq *wq)
 	}
 
 	/* bytes 4-7 */
-	wq->wqcfg.wq_thresh = wq->threshold;
+	wq->wqcfg->wq_thresh = wq->threshold;
 
 	/* byte 8-11 */
-	wq->wqcfg.priv = !!(wq->type == IDXD_WQT_KERNEL);
-	wq->wqcfg.mode = 1;
-
-	wq->wqcfg.priority = wq->priority;
+	wq->wqcfg->priv = !!(wq->type == IDXD_WQT_KERNEL);
+	wq->wqcfg->mode = 1;
+	wq->wqcfg->priority = wq->priority;
 
 	/* bytes 12-15 */
-	wq->wqcfg.max_xfer_shift = ilog2(wq->max_xfer_bytes);
-	wq->wqcfg.max_batch_shift = ilog2(wq->max_batch_size);
+	wq->wqcfg->max_xfer_shift = ilog2(wq->max_xfer_bytes);
+	wq->wqcfg->max_batch_shift = ilog2(wq->max_batch_size);
 
 	dev_dbg(dev, "WQ %d CFGs\n", wq->id);
-	for (i = 0; i < 8; i++) {
-		wq_offset = idxd->wqcfg_offset + wq->id * 32 + i * sizeof(u32);
-		iowrite32(wq->wqcfg.bits[i], idxd->reg_base + wq_offset);
+	for (i = 0; i < WQCFG_STRIDES(idxd); i++) {
+		wq_offset = WQCFG_OFFSET(idxd, wq->id, i);
+		iowrite32(wq->wqcfg->bits[i], idxd->reg_base + wq_offset);
 		dev_dbg(dev, "WQ[%d][%d][%#x]: %#x\n",
 			wq->id, i, wq_offset,
 			ioread32(idxd->reg_base + wq_offset));
diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h
index c64df197e724..d48f193daacc 100644
--- a/drivers/dma/idxd/idxd.h
+++ b/drivers/dma/idxd/idxd.h
@@ -103,7 +103,7 @@ struct idxd_wq {
 	u32 priority;
 	enum idxd_wq_state state;
 	unsigned long flags;
-	union wqcfg wqcfg;
+	union wqcfg *wqcfg;
 	u32 vec_ptr;		/* interrupt steering */
 	struct dsa_hw_desc **hw_descs;
 	int num_descs;
@@ -183,6 +183,7 @@ struct idxd_device {
 	int max_wq_size;
 	int token_limit;
 	int nr_tokens;		/* non-reserved tokens */
+	unsigned int wqcfg_size;
 
 	union sw_err_reg sw_err;
 	wait_queue_head_t cmd_waitq;
diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c
index 11e5ce168177..0a4432b063b5 100644
--- a/drivers/dma/idxd/init.c
+++ b/drivers/dma/idxd/init.c
@@ -178,6 +178,9 @@ static int idxd_setup_internals(struct idxd_device *idxd)
 		wq->idxd_cdev.minor = -1;
 		wq->max_xfer_bytes = idxd->max_xfer_bytes;
 		wq->max_batch_size = idxd->max_batch_size;
+		wq->wqcfg = devm_kzalloc(dev, idxd->wqcfg_size, GFP_KERNEL);
+		if (!wq->wqcfg)
+			return -ENOMEM;
 	}
 
 	for (i = 0; i < idxd->max_engines; i++) {
@@ -251,6 +254,8 @@ static void idxd_read_caps(struct idxd_device *idxd)
 	dev_dbg(dev, "total workqueue size: %u\n", idxd->max_wq_size);
 	idxd->max_wqs = idxd->hw.wq_cap.num_wqs;
 	dev_dbg(dev, "max workqueues: %u\n", idxd->max_wqs);
+	idxd->wqcfg_size = 1 << (idxd->hw.wq_cap.wqcfg_size + IDXD_WQCFG_MIN);
+	dev_dbg(dev, "wqcfg size: %u\n", idxd->wqcfg_size);
 
 	/* reading operation capabilities */
 	for (i = 0; i < 4; i++) {
diff --git a/drivers/dma/idxd/registers.h b/drivers/dma/idxd/registers.h
index a39e7ae6b3d9..aef5a902829e 100644
--- a/drivers/dma/idxd/registers.h
+++ b/drivers/dma/idxd/registers.h
@@ -43,7 +43,8 @@ union wq_cap_reg {
 	struct {
 		u64 total_wq_size:16;
 		u64 num_wqs:8;
-		u64 rsvd:24;
+		u64 wqcfg_size:4;
+		u64 rsvd:20;
 		u64 shared_mode:1;
 		u64 dedicated_mode:1;
 		u64 rsvd2:1;
@@ -55,6 +56,7 @@ union wq_cap_reg {
 	u64 bits;
 } __packed;
 #define IDXD_WQCAP_OFFSET		0x20
+#define IDXD_WQCFG_MIN			5
 
 union group_cap_reg {
 	struct {
@@ -333,4 +335,23 @@ union wqcfg {
 	};
 	u32 bits[8];
 } __packed;
+
+/*
+ * This macro calculates the offset into the WQCFG register
+ * idxd - struct idxd *
+ * n - wq id
+ * ofs - the index of the 32b dword for the config register
+ *
+ * The WQCFG register block is divided into groups per each wq. The n index
+ * allows us to move to the register group that's for that particular wq.
+ * Each register is 32bits. The ofs gives us the number of register to access.
+ */
+#define WQCFG_OFFSET(_idxd_dev, n, ofs) \
+({\
+	typeof(_idxd_dev) __idxd_dev = (_idxd_dev);	\
+	(__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs);	\
+})
+
+#define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32))
+
 #endif
commit c66dca98a24cb5f3493dd08d40bcfa94a220fa92
Author: Toke Høiland-Jørgensen <toke at redhat.com>
Date:   Tue Oct 27 00:36:23 2020 +0100

    samples/bpf: Set rlimit for memlock to infinity in all samples
    
    The memlock rlimit is a notorious source of failure for BPF programs. Most
    of the samples just set it to infinity, but a few used a lower limit. The
    problem with unconditionally setting a lower limit is that this will also
    override the limit if the system-wide setting is *higher* than the limit
    being set, which can lead to failures on systems that lock a lot of memory,
    but set 'ulimit -l' to unlimited before running a sample.
    
    One fix for this is to only conditionally set the limit if the current
    limit is lower, but it is simpler to just unify all the samples and have
    them all set the limit to infinity.
    
    Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Acked-by: Jesper Dangaard Brouer <brouer at redhat.com>
    Link: https://lore.kernel.org/bpf/20201026233623.91728-1-toke@redhat.com

diff --git a/samples/bpf/task_fd_query_user.c b/samples/bpf/task_fd_query_user.c
index 4a74531dc403..b68bd2f8fdc9 100644
--- a/samples/bpf/task_fd_query_user.c
+++ b/samples/bpf/task_fd_query_user.c
@@ -290,7 +290,7 @@ static int test_debug_fs_uprobe(char *binary_path, long offset, bool is_return)
 
 int main(int argc, char **argv)
 {
-	struct rlimit r = {1024*1024, RLIM_INFINITY};
+	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
 	extern char __executable_start;
 	char filename[256], buf[256];
 	__u64 uprobe_file_offset;
diff --git a/samples/bpf/tracex2_user.c b/samples/bpf/tracex2_user.c
index 3e36b3e4e3ef..3d6eab711d23 100644
--- a/samples/bpf/tracex2_user.c
+++ b/samples/bpf/tracex2_user.c
@@ -116,7 +116,7 @@ static void int_exit(int sig)
 
 int main(int ac, char **argv)
 {
-	struct rlimit r = {1024*1024, RLIM_INFINITY};
+	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
 	long key, next_key, value;
 	struct bpf_link *links[2];
 	struct bpf_program *prog;
diff --git a/samples/bpf/tracex3_user.c b/samples/bpf/tracex3_user.c
index 70e987775c15..83e0fecbb01a 100644
--- a/samples/bpf/tracex3_user.c
+++ b/samples/bpf/tracex3_user.c
@@ -107,7 +107,7 @@ static void print_hist(int fd)
 
 int main(int ac, char **argv)
 {
-	struct rlimit r = {1024*1024, RLIM_INFINITY};
+	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
 	struct bpf_link *links[2];
 	struct bpf_program *prog;
 	struct bpf_object *obj;
diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c
index 6fb8dbde62c5..f78cb18319aa 100644
--- a/samples/bpf/xdp_redirect_cpu_user.c
+++ b/samples/bpf/xdp_redirect_cpu_user.c
@@ -765,7 +765,7 @@ static int load_cpumap_prog(char *file_name, char *prog_name,
 
 int main(int argc, char **argv)
 {
-	struct rlimit r = {10 * 1024 * 1024, RLIM_INFINITY};
+	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
 	char *prog_name = "xdp_cpu_map5_lb_hash_ip_pairs";
 	char *mprog_filename = "xdp_redirect_kern.o";
 	char *redir_interface = NULL, *redir_map = NULL;
diff --git a/samples/bpf/xdp_rxq_info_user.c b/samples/bpf/xdp_rxq_info_user.c
index caa4e7ffcfc7..93fa1bc54f13 100644
--- a/samples/bpf/xdp_rxq_info_user.c
+++ b/samples/bpf/xdp_rxq_info_user.c
@@ -450,7 +450,7 @@ static void stats_poll(int interval, int action, __u32 cfg_opt)
 int main(int argc, char **argv)
 {
 	__u32 cfg_options= NO_TOUCH ; /* Default: Don't touch packet memory */
-	struct rlimit r = {10 * 1024 * 1024, RLIM_INFINITY};
+	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
 	struct bpf_prog_load_attr prog_load_attr = {
 		.prog_type	= BPF_PROG_TYPE_XDP,
 	};
commit 343a3e8bc635bd4c58d45a4fe67f9c3a78fbd191
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 17:20:50 2020 +0100

    bpf: Fix -Wshadow warnings
    
    There are thousands of warnings about one macro in a W=2 build:
    
      include/linux/filter.h:561:6: warning: declaration of 'ret' shadows a previous local [-Wshadow]
    
    Prefix all the locals in that macro with __ to avoid most of
    these warnings.
    
    Fixes: 492ecee892c2 ("bpf: enable program stats")
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii at kernel.org>
    Link: https://lore.kernel.org/bpf/20201026162110.3710415-1-arnd@kernel.org

diff --git a/include/linux/filter.h b/include/linux/filter.h
index 72d62cbc1578..1b62397bd124 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -558,21 +558,21 @@ struct sk_filter {
 DECLARE_STATIC_KEY_FALSE(bpf_stats_enabled_key);
 
 #define __BPF_PROG_RUN(prog, ctx, dfunc)	({			\
-	u32 ret;							\
+	u32 __ret;							\
 	cant_migrate();							\
 	if (static_branch_unlikely(&bpf_stats_enabled_key)) {		\
-		struct bpf_prog_stats *stats;				\
-		u64 start = sched_clock();				\
-		ret = dfunc(ctx, (prog)->insnsi, (prog)->bpf_func);	\
-		stats = this_cpu_ptr(prog->aux->stats);			\
-		u64_stats_update_begin(&stats->syncp);			\
-		stats->cnt++;						\
-		stats->nsecs += sched_clock() - start;			\
-		u64_stats_update_end(&stats->syncp);			\
+		struct bpf_prog_stats *__stats;				\
+		u64 __start = sched_clock();				\
+		__ret = dfunc(ctx, (prog)->insnsi, (prog)->bpf_func);	\
+		__stats = this_cpu_ptr(prog->aux->stats);		\
+		u64_stats_update_begin(&__stats->syncp);		\
+		__stats->cnt++;						\
+		__stats->nsecs += sched_clock() - __start;		\
+		u64_stats_update_end(&__stats->syncp);			\
 	} else {							\
-		ret = dfunc(ctx, (prog)->insnsi, (prog)->bpf_func);	\
+		__ret = dfunc(ctx, (prog)->insnsi, (prog)->bpf_func);	\
 	}								\
-	ret; })
+	__ret; })
 
 #define BPF_PROG_RUN(prog, ctx)						\
 	__BPF_PROG_RUN(prog, ctx, bpf_dispatcher_nop_func)
commit 9fa2e7af3d53a4b769136eccc32c02e128a4ee51
Author: Andrew Jeffery <andrew at aj.id.au>
Date:   Thu Oct 22 01:43:59 2020 +0100

    ARM: 9019/1: kprobes: Avoid fortify_panic() when copying optprobe template
    
    Setting both CONFIG_KPROBES=y and CONFIG_FORTIFY_SOURCE=y on ARM leads
    to a panic in memcpy() when injecting a kprobe despite the fixes found
    in commit e46daee53bb5 ("ARM: 8806/1: kprobes: Fix false positive with
    FORTIFY_SOURCE") and commit 0ac569bf6a79 ("ARM: 8834/1: Fix: kprobes:
    optimized kprobes illegal instruction").
    
    arch/arm/include/asm/kprobes.h effectively declares
    the target type of the optprobe_template_entry assembly label as a u32
    which leads memcpy()'s __builtin_object_size() call to determine that
    the pointed-to object is of size four. However, the symbol is used as a handle
    for the optimised probe assembly template that is at least 96 bytes in size.
    The symbol's use despite its type blows up the memcpy() in ARM's
    arch_prepare_optimized_kprobe() with a false-positive fortify_panic() when it
    should instead copy the optimised probe template into place:
    
    ```
    $ sudo perf probe -a aspeed_g6_pinctrl_probe
    [  158.457252] detected buffer overflow in memcpy
    [  158.458069] ------------[ cut here ]------------
    [  158.458283] kernel BUG at lib/string.c:1153!
    [  158.458436] Internal error: Oops - BUG: 0 [#1] SMP ARM
    [  158.458768] Modules linked in:
    [  158.459043] CPU: 1 PID: 99 Comm: perf Not tainted 5.9.0-rc7-00038-gc53ebf8167e9 #158
    [  158.459296] Hardware name: Generic DT based system
    [  158.459529] PC is at fortify_panic+0x18/0x20
    [  158.459658] LR is at __irq_work_queue_local+0x3c/0x74
    [  158.459831] pc : [<8047451c>]    lr : [<8020ecd4>]    psr: 60000013
    [  158.460032] sp : be2d1d50  ip : be2d1c58  fp : be2d1d5c
    [  158.460174] r10: 00000006  r9 : 00000000  r8 : 00000060
    [  158.460348] r7 : 8011e434  r6 : b9e0b800  r5 : 7f000000  r4 : b9fe4f0c
    [  158.460557] r3 : 80c04cc8  r2 : 00000000  r1 : be7c03cc  r0 : 00000022
    [  158.460801] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
    [  158.461037] Control: 10c5387d  Table: b9cd806a  DAC: 00000051
    [  158.461251] Process perf (pid: 99, stack limit = 0x81c71a69)
    [  158.461472] Stack: (0xbe2d1d50 to 0xbe2d2000)
    [  158.461757] 1d40:                                     be2d1d84 be2d1d60 8011e724 80474510
    [  158.462104] 1d60: b9e0b800 b9fe4f0c 00000000 b9fe4f14 80c8ec80 be235000 be2d1d9c be2d1d88
    [  158.462436] 1d80: 801cee44 8011e57c b9fe4f0c 00000000 be2d1dc4 be2d1da0 801d0ad0 801cedec
    [  158.462742] 1da0: 00000000 00000000 b9fe4f00 ffffffea 00000000 be235000 be2d1de4 be2d1dc8
    [  158.463087] 1dc0: 80204604 801d0738 00000000 00000000 b9fe4004 ffffffea be2d1e94 be2d1de8
    [  158.463428] 1de0: 80205434 80204570 00385c00 00000000 00000000 00000000 be2d1e14 be2d1e08
    [  158.463880] 1e00: 802ba014 b9fe4f00 b9e718c0 b9fe4f84 b9e71ec8 be2d1e24 00000000 00385c00
    [  158.464365] 1e20: 00000000 626f7270 00000065 802b905c be2d1e94 0000002e 00000000 802b9914
    [  158.464829] 1e40: be2d1e84 be2d1e50 802b9914 8028ff78 804629d0 b9e71ec0 0000002e b9e71ec0
    [  158.465141] 1e60: be2d1ea8 80c04cc8 00000cc0 b9e713c4 00000002 80205834 80205834 0000002e
    [  158.465488] 1e80: be235000 be235000 be2d1ea4 be2d1e98 80205854 80204e94 be2d1ecc be2d1ea8
    [  158.465806] 1ea0: 801ee4a0 80205840 00000002 80c04cc8 00000000 0000002e 0000002e 00000000
    [  158.466110] 1ec0: be2d1f0c be2d1ed0 801ee5c8 801ee428 00000000 be2d0000 006b1fd0 00000051
    [  158.466398] 1ee0: 00000000 b9eedf00 0000002e 80204410 006b1fd0 be2d1f60 00000000 00000004
    [  158.466763] 1f00: be2d1f24 be2d1f10 8020442c 801ee4c4 80205834 802c613c be2d1f5c be2d1f28
    [  158.467102] 1f20: 802c60ac 8020441c be2d1fac be2d1f38 8010c764 802e9888 be2d1f5c b9eedf00
    [  158.467447] 1f40: b9eedf00 006b1fd0 0000002e 00000000 be2d1f94 be2d1f60 802c634c 802c5fec
    [  158.467812] 1f60: 00000000 00000000 00000000 80c04cc8 006b1fd0 00000003 76f7a610 00000004
    [  158.468155] 1f80: 80100284 be2d0000 be2d1fa4 be2d1f98 802c63ec 802c62e8 00000000 be2d1fa8
    [  158.468508] 1fa0: 80100080 802c63e0 006b1fd0 00000003 00000003 006b1fd0 0000002e 00000000
    [  158.468858] 1fc0: 006b1fd0 00000003 76f7a610 00000004 006b1fb0 0026d348 00000017 7ef2738c
    [  158.469202] 1fe0: 76f3431c 7ef272d8 0014ec50 76f34338 60000010 00000003 00000000 00000000
    [  158.469461] Backtrace:
    [  158.469683] [<80474504>] (fortify_panic) from [<8011e724>] (arch_prepare_optimized_kprobe+0x1b4/0x1f8)
    [  158.470021] [<8011e570>] (arch_prepare_optimized_kprobe) from [<801cee44>] (alloc_aggr_kprobe+0x64/0x70)
    [  158.470287]  r9:be235000 r8:80c8ec80 r7:b9fe4f14 r6:00000000 r5:b9fe4f0c r4:b9e0b800
    [  158.470478] [<801cede0>] (alloc_aggr_kprobe) from [<801d0ad0>] (register_kprobe+0x3a4/0x5a0)
    [  158.470685]  r5:00000000 r4:b9fe4f0c
    [  158.470790] [<801d072c>] (register_kprobe) from [<80204604>] (__register_trace_kprobe+0xa0/0xa4)
    [  158.471001]  r9:be235000 r8:00000000 r7:ffffffea r6:b9fe4f00 r5:00000000 r4:00000000
    [  158.471188] [<80204564>] (__register_trace_kprobe) from [<80205434>] (trace_kprobe_create+0x5ac/0x9ac)
    [  158.471408]  r7:ffffffea r6:b9fe4004 r5:00000000 r4:00000000
    [  158.471553] [<80204e88>] (trace_kprobe_create) from [<80205854>] (create_or_delete_trace_kprobe+0x20/0x3c)
    [  158.471766]  r10:be235000 r9:be235000 r8:0000002e r7:80205834 r6:80205834 r5:00000002
    [  158.471949]  r4:b9e713c4
    [  158.472027] [<80205834>] (create_or_delete_trace_kprobe) from [<801ee4a0>] (trace_run_command+0x84/0x9c)
    [  158.472255] [<801ee41c>] (trace_run_command) from [<801ee5c8>] (trace_parse_run_command+0x110/0x1f8)
    [  158.472471]  r6:00000000 r5:0000002e r4:0000002e
    [  158.472594] [<801ee4b8>] (trace_parse_run_command) from [<8020442c>] (probes_write+0x1c/0x28)
    [  158.472800]  r10:00000004 r9:00000000 r8:be2d1f60 r7:006b1fd0 r6:80204410 r5:0000002e
    [  158.472968]  r4:b9eedf00
    [  158.473046] [<80204410>] (probes_write) from [<802c60ac>] (vfs_write+0xcc/0x1e8)
    [  158.473226] [<802c5fe0>] (vfs_write) from [<802c634c>] (ksys_write+0x70/0xf8)
    [  158.473400]  r8:00000000 r7:0000002e r6:006b1fd0 r5:b9eedf00 r4:b9eedf00
    [  158.473567] [<802c62dc>] (ksys_write) from [<802c63ec>] (sys_write+0x18/0x1c)
    [  158.473745]  r9:be2d0000 r8:80100284 r7:00000004 r6:76f7a610 r5:00000003 r4:006b1fd0
    [  158.473932] [<802c63d4>] (sys_write) from [<80100080>] (ret_fast_syscall+0x0/0x54)
    [  158.474126] Exception stack(0xbe2d1fa8 to 0xbe2d1ff0)
    [  158.474305] 1fa0:                   006b1fd0 00000003 00000003 006b1fd0 0000002e 00000000
    [  158.474573] 1fc0: 006b1fd0 00000003 76f7a610 00000004 006b1fb0 0026d348 00000017 7ef2738c
    [  158.474811] 1fe0: 76f3431c 7ef272d8 0014ec50 76f34338
    [  158.475171] Code: e24cb004 e1a01000 e59f0004 ebf40dd3 (e7f001f2)
    [  158.475847] ---[ end trace 55a5b31c08a29f00 ]---
    [  158.476088] Kernel panic - not syncing: Fatal exception
    [  158.476375] CPU0: stopping
    [  158.476709] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G      D           5.9.0-rc7-00038-gc53ebf8167e9 #158
    [  158.477176] Hardware name: Generic DT based system
    [  158.477411] Backtrace:
    [  158.477604] [<8010dd28>] (dump_backtrace) from [<8010dfd4>] (show_stack+0x20/0x24)
    [  158.477990]  r7:00000000 r6:60000193 r5:00000000 r4:80c2f634
    [  158.478323] [<8010dfb4>] (show_stack) from [<8046390c>] (dump_stack+0xcc/0xe8)
    [  158.478686] [<80463840>] (dump_stack) from [<80110750>] (handle_IPI+0x334/0x3a0)
    [  158.479063]  r7:00000000 r6:00000004 r5:80b65cc8 r4:80c78278
    [  158.479352] [<8011041c>] (handle_IPI) from [<801013f8>] (gic_handle_irq+0x88/0x94)
    [  158.479757]  r10:10c5387d r9:80c01ed8 r8:00000000 r7:c0802000 r6:80c0537c r5:000003ff
    [  158.480146]  r4:c080200c r3:fffffff4
    [  158.480364] [<80101370>] (gic_handle_irq) from [<80100b6c>] (__irq_svc+0x6c/0x90)
    [  158.480748] Exception stack(0x80c01ed8 to 0x80c01f20)
    [  158.481031] 1ec0:                                                       000128bc 00000000
    [  158.481499] 1ee0: be7b8174 8011d3a0 80c00000 00000000 80c04cec 80c04d28 80c5d7c2 80a026d4
    [  158.482091] 1f00: 10c5387d 80c01f34 80c01f38 80c01f28 80109554 80109558 60000013 ffffffff
    [  158.482621]  r9:80c00000 r8:80c5d7c2 r7:80c01f0c r6:ffffffff r5:60000013 r4:80109558
    [  158.482983] [<80109518>] (arch_cpu_idle) from [<80818780>] (default_idle_call+0x38/0x120)
    [  158.483360] [<80818748>] (default_idle_call) from [<801585a8>] (do_idle+0xd4/0x158)
    [  158.483945]  r5:00000000 r4:80c00000
    [  158.484237] [<801584d4>] (do_idle) from [<801588f4>] (cpu_startup_entry+0x28/0x2c)
    [  158.484784]  r9:80c78000 r8:00000000 r7:80c78000 r6:80c78040 r5:80c04cc0 r4:000000d6
    [  158.485328] [<801588cc>] (cpu_startup_entry) from [<80810a78>] (rest_init+0x9c/0xbc)
    [  158.485930] [<808109dc>] (rest_init) from [<80b00ae4>] (arch_call_rest_init+0x18/0x1c)
    [  158.486503]  r5:80c04cc0 r4:00000001
    [  158.486857] [<80b00acc>] (arch_call_rest_init) from [<80b00fcc>] (start_kernel+0x46c/0x548)
    [  158.487589] [<80b00b60>] (start_kernel) from [<00000000>] (0x0)
    ```
    
    Fixes: e46daee53bb5 ("ARM: 8806/1: kprobes: Fix false positive with FORTIFY_SOURCE")
    Fixes: 0ac569bf6a79 ("ARM: 8834/1: Fix: kprobes: optimized kprobes illegal instruction")
    Suggested-by: Kees Cook <keescook at chromium.org>
    Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
    Tested-by: Luka Oreskovic <luka.oreskovic at sartura.hr>
    Tested-by: Joel Stanley <joel at jms.id.au>
    Reviewed-by: Joel Stanley <joel at jms.id.au>
    Acked-by: Masami Hiramatsu <mhiramat at kernel.org>
    Cc: Luka Oreskovic <luka.oreskovic at sartura.hr>
    Cc: Juraj Vijtiuk <juraj.vijtiuk at sartura.hr>
    Signed-off-by: Russell King <rmk+kernel at armlinux.org.uk>

diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
index 213607a1f45c..e26a278d301a 100644
--- a/arch/arm/include/asm/kprobes.h
+++ b/arch/arm/include/asm/kprobes.h
@@ -44,20 +44,20 @@ int kprobe_exceptions_notify(struct notifier_block *self,
 			     unsigned long val, void *data);
 
 /* optinsn template addresses */
-extern __visible kprobe_opcode_t optprobe_template_entry;
-extern __visible kprobe_opcode_t optprobe_template_val;
-extern __visible kprobe_opcode_t optprobe_template_call;
-extern __visible kprobe_opcode_t optprobe_template_end;
-extern __visible kprobe_opcode_t optprobe_template_sub_sp;
-extern __visible kprobe_opcode_t optprobe_template_add_sp;
-extern __visible kprobe_opcode_t optprobe_template_restore_begin;
-extern __visible kprobe_opcode_t optprobe_template_restore_orig_insn;
-extern __visible kprobe_opcode_t optprobe_template_restore_end;
+extern __visible kprobe_opcode_t optprobe_template_entry[];
+extern __visible kprobe_opcode_t optprobe_template_val[];
+extern __visible kprobe_opcode_t optprobe_template_call[];
+extern __visible kprobe_opcode_t optprobe_template_end[];
+extern __visible kprobe_opcode_t optprobe_template_sub_sp[];
+extern __visible kprobe_opcode_t optprobe_template_add_sp[];
+extern __visible kprobe_opcode_t optprobe_template_restore_begin[];
+extern __visible kprobe_opcode_t optprobe_template_restore_orig_insn[];
+extern __visible kprobe_opcode_t optprobe_template_restore_end[];
 
 #define MAX_OPTIMIZED_LENGTH	4
 #define MAX_OPTINSN_SIZE				\
-	((unsigned long)&optprobe_template_end -	\
-	 (unsigned long)&optprobe_template_entry)
+	((unsigned long)optprobe_template_end -	\
+	 (unsigned long)optprobe_template_entry)
 #define RELATIVEJUMP_SIZE	4
 
 struct arch_optimized_insn {
diff --git a/arch/arm/probes/kprobes/opt-arm.c b/arch/arm/probes/kprobes/opt-arm.c
index 7a449df0b359..c78180172120 100644
--- a/arch/arm/probes/kprobes/opt-arm.c
+++ b/arch/arm/probes/kprobes/opt-arm.c
@@ -85,21 +85,21 @@ asm (
 			"optprobe_template_end:\n");
 
 #define TMPL_VAL_IDX \
-	((unsigned long *)&optprobe_template_val - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_val - (unsigned long *)optprobe_template_entry)
 #define TMPL_CALL_IDX \
-	((unsigned long *)&optprobe_template_call - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_call - (unsigned long *)optprobe_template_entry)
 #define TMPL_END_IDX \
-	((unsigned long *)&optprobe_template_end - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_end - (unsigned long *)optprobe_template_entry)
 #define TMPL_ADD_SP \
-	((unsigned long *)&optprobe_template_add_sp - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_add_sp - (unsigned long *)optprobe_template_entry)
 #define TMPL_SUB_SP \
-	((unsigned long *)&optprobe_template_sub_sp - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_sub_sp - (unsigned long *)optprobe_template_entry)
 #define TMPL_RESTORE_BEGIN \
-	((unsigned long *)&optprobe_template_restore_begin - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_restore_begin - (unsigned long *)optprobe_template_entry)
 #define TMPL_RESTORE_ORIGN_INSN \
-	((unsigned long *)&optprobe_template_restore_orig_insn - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_restore_orig_insn - (unsigned long *)optprobe_template_entry)
 #define TMPL_RESTORE_END \
-	((unsigned long *)&optprobe_template_restore_end - (unsigned long *)&optprobe_template_entry)
+	((unsigned long *)optprobe_template_restore_end - (unsigned long *)optprobe_template_entry)
 
 /*
  * ARM can always optimize an instruction when using ARM ISA, except
@@ -234,7 +234,7 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *or
 	}
 
 	/* Copy arch-dep-instance from template. */
-	memcpy(code, (unsigned long *)&optprobe_template_entry,
+	memcpy(code, (unsigned long *)optprobe_template_entry,
 			TMPL_END_IDX * sizeof(kprobe_opcode_t));
 
 	/* Adjust buffer according to instruction. */
commit 31b4d8e172f614adc53ddecb4b6b2f6411a49b84
Author: Randy Dunlap <rdunlap at infradead.org>
Date:   Fri Oct 23 12:44:40 2020 -0700

    MIPS: export has_transparent_hugepage() for modules
    
    MIPS should export its local version of "has_transparent_hugepage"
    so that loadable modules (dax) can use it.
    
    Fixes this build error:
    ERROR: modpost: "has_transparent_hugepage" [drivers/dax/dax.ko] undefined!
    
    Fixes: fd8cfd300019 ("arch: fix has_transparent_hugepage()")
    Reported-by: kernel test robot <lkp at intel.com>
    Signed-off-by: Randy Dunlap <rdunlap at infradead.org>
    Cc: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
    Cc: linux-mips at vger.kernel.org
    Cc: Dan Williams <dan.j.williams at intel.com>
    Cc: Vishal Verma <vishal.l.verma at intel.com>
    Cc: Dave Jiang <dave.jiang at intel.com>
    Cc: linux-nvdimm at lists.01.org
    Cc: Hugh Dickins <hughd at google.com>
    Cc: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Thomas Bogendoerfer <tsbogend at alpha.franken.de>

diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
index 38e2894d5fa3..1b939abbe4ca 100644
--- a/arch/mips/mm/tlb-r4k.c
+++ b/arch/mips/mm/tlb-r4k.c
@@ -438,6 +438,7 @@ int has_transparent_hugepage(void)
 	}
 	return mask == PM_HUGE_MASK;
 }
+EXPORT_SYMBOL(has_transparent_hugepage);
 
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE  */
 
commit 294a3317bef52b189139c813b50dd14d344fa9ec
Author: Tony Lindgren <tony at atomide.com>
Date:   Wed Oct 28 08:03:17 2020 +0200

    ARM: OMAP2+: Manage MPU state properly for omap_enter_idle_coupled()
    
    Based on more testing, commit 8ca5ee624b4c ("ARM: OMAP2+: Restore MPU
    power domain if cpu_cluster_pm_enter() fails") is a poor fix for handling
    cpu_cluster_pm_enter() returned errors.
    
    We should not override the cpuidle states with a hardcoded PWRDM_POWER_ON
    value. Instead, we should use a configured idle state that does not cause
    the context to be lost. Otherwise we end up configuring a potentially
    improper state for the MPUSS. We also want to update the returned state
    index for the selected state.
    
    Let's just select the highest power idle state C1 to ensure no context
    loss is allowed on cpu_cluster_pm_enter() errors. With these changes we
    can now unconditionally call omap4_enter_lowpower() for WFI like we did
    earlier before commit 55be2f50336f ("ARM: OMAP2+: Handle errors for
    cpu_pm"). And we can return the selected state index.
    
    Fixes: 8f04aea048d5 ("ARM: OMAP2+: Restore MPU power domain if cpu_cluster_pm_enter() fails")
    Fixes: 55be2f50336f ("ARM: OMAP2+: Handle errors for cpu_pm")
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
index a92d277f81a0..c8d317fafe2e 100644
--- a/arch/arm/mach-omap2/cpuidle44xx.c
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
@@ -175,8 +175,11 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
 		if (mpuss_can_lose_context) {
 			error = cpu_cluster_pm_enter();
 			if (error) {
-				omap_set_pwrdm_state(mpu_pd, PWRDM_POWER_ON);
-				goto cpu_cluster_pm_out;
+				index = 0;
+				cx = state_ptr + index;
+				pwrdm_set_logic_retst(mpu_pd, cx->mpu_logic_state);
+				omap_set_pwrdm_state(mpu_pd, cx->mpu_state);
+				mpuss_can_lose_context = 0;
 			}
 		}
 	}
@@ -184,7 +187,6 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
 	omap4_enter_lowpower(dev->cpu, cx->cpu_state);
 	cpu_done[dev->cpu] = true;
 
-cpu_cluster_pm_out:
 	/* Wakeup CPU1 only if it is not offlined */
 	if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {
 
commit b1884583fcd17d6a1b1bba94bbb5826e6b5c6e17
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Oct 26 20:53:57 2020 -0700

    Input: i8042 - allow insmod to succeed on devices without an i8042 controller
    
    The i8042 module exports several symbols which may be used by other
    modules.
    
    Before this commit it would refuse to load (when built as a module itself)
    on systems without an i8042 controller.
    
    This is a problem specifically for the asus-nb-wmi module. Many Asus
    laptops support the Asus WMI interface. Some of them have an i8042
    controller and need to use i8042_install_filter() to filter some kbd
    events. Other models do not have an i8042 controller (e.g. they use an
    USB attached kbd).
    
    Before this commit the asus-nb-wmi driver could not be loaded on Asus
    models without an i8042 controller, when the i8042 code was built as
    a module (as Arch Linux does) because the module_init function of the
    i8042 module would fail with -ENODEV and thus the i8042_install_filter
    symbol could not be loaded.
    
    This commit fixes this by exiting from module_init with a return code
    of 0 if no controller is found.  It also adds a i8042_present bool to
    make the module_exit function a no-op in this case and also adds a
    check for i8042_present to the exported i8042_command function.
    
    The latter i8042_present check should not really be necessary because
    when builtin that function can already be used on systems without
    an i8042 controller, but better safe then sorry.
    
    Reported-and-tested-by: Marius Iacob <themariusus at gmail.com>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Link: https://lore.kernel.org/r/20201008112628.3979-2-hdegoede@redhat.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index d3eda48032e3..944cbb519c6d 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -122,6 +122,7 @@ module_param_named(unmask_kbd_data, i8042_unmask_kbd_data, bool, 0600);
 MODULE_PARM_DESC(unmask_kbd_data, "Unconditional enable (may reveal sensitive data) of normally sanitize-filtered kbd data traffic debug log [pre-condition: i8042.debug=1 enabled]");
 #endif
 
+static bool i8042_present;
 static bool i8042_bypass_aux_irq_test;
 static char i8042_kbd_firmware_id[128];
 static char i8042_aux_firmware_id[128];
@@ -343,6 +344,9 @@ int i8042_command(unsigned char *param, int command)
 	unsigned long flags;
 	int retval;
 
+	if (!i8042_present)
+		return -1;
+
 	spin_lock_irqsave(&i8042_lock, flags);
 	retval = __i8042_command(param, command);
 	spin_unlock_irqrestore(&i8042_lock, flags);
@@ -1612,12 +1616,15 @@ static int __init i8042_init(void)
 
 	err = i8042_platform_init();
 	if (err)
-		return err;
+		return (err == -ENODEV) ? 0 : err;
 
 	err = i8042_controller_check();
 	if (err)
 		goto err_platform_exit;
 
+	/* Set this before creating the dev to allow i8042_command to work right away */
+	i8042_present = true;
+
 	pdev = platform_create_bundle(&i8042_driver, i8042_probe, NULL, 0, NULL, 0);
 	if (IS_ERR(pdev)) {
 		err = PTR_ERR(pdev);
@@ -1636,6 +1643,9 @@ static int __init i8042_init(void)
 
 static void __exit i8042_exit(void)
 {
+	if (!i8042_present)
+		return;
+
 	platform_device_unregister(i8042_platform_device);
 	platform_driver_unregister(&i8042_driver);
 	i8042_platform_exit();
commit 33b6c39e747c552fa770eecebd1776f1f4a222b1
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Mon Oct 26 17:10:09 2020 -0700

    Input: adxl34x - clean up a data type in adxl34x_probe()
    
    The "revid" is used to store negative error codes so it should be an int
    type.
    
    Fixes: e27c729219ad ("Input: add driver for ADXL345/346 Digital Accelerometers")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Acked-by: Michael Hennerich <michael.hennerich at analog.com>
    Link: https://lore.kernel.org/r/20201026072824.GA1620546@mwanda
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>

diff --git a/drivers/input/misc/adxl34x.c b/drivers/input/misc/adxl34x.c
index 5fe92d4ba3f0..4cc4e8ff42b3 100644
--- a/drivers/input/misc/adxl34x.c
+++ b/drivers/input/misc/adxl34x.c
@@ -696,7 +696,7 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
 	struct input_dev *input_dev;
 	const struct adxl34x_platform_data *pdata;
 	int err, range, i;
-	unsigned char revid;
+	int revid;
 
 	if (!irq) {
 		dev_err(dev, "no IRQ?\n");
commit 29813a2297910d5c4be08c7b390054f23dd794a5
Author: Arnd Bergmann <arnd at arndb.de>
Date:   Mon Oct 26 16:53:48 2020 +0100

    asm-generic: percpu: avoid Wshadow warning
    
    Nesting macros that use the same local variable names causes
    warnings when building with "make W=2":
    
    include/asm-generic/percpu.h:117:14: warning: declaration of '__ret' shadows a previous local [-Wshadow]
    include/asm-generic/percpu.h:126:14: warning: declaration of '__ret' shadows a previous local [-Wshadow]
    
    These are fairly harmless, but since the warning comes from
    a global header, the warning happens every time the headers
    are included, which is fairly annoying.
    
    Rename the variables to avoid shadowing and shut up the warning.
    
    Signed-off-by: Arnd Bergmann <arnd at arndb.de>
    Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck at gmail.com>
    Signed-off-by: Dennis Zhou <dennis at kernel.org>

diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h
index 35e4a53b83e6..6432a7fade91 100644
--- a/include/asm-generic/percpu.h
+++ b/include/asm-generic/percpu.h
@@ -114,21 +114,21 @@ do {									\
 
 #define __this_cpu_generic_read_nopreempt(pcp)				\
 ({									\
-	typeof(pcp) __ret;						\
+	typeof(pcp) ___ret;						\
 	preempt_disable_notrace();					\
-	__ret = READ_ONCE(*raw_cpu_ptr(&(pcp)));			\
+	___ret = READ_ONCE(*raw_cpu_ptr(&(pcp)));			\
 	preempt_enable_notrace();					\
-	__ret;								\
+	___ret;								\
 })
 
 #define __this_cpu_generic_read_noirq(pcp)				\
 ({									\
-	typeof(pcp) __ret;						\
-	unsigned long __flags;						\
-	raw_local_irq_save(__flags);					\
-	__ret = raw_cpu_generic_read(pcp);				\
-	raw_local_irq_restore(__flags);					\
-	__ret;								\
+	typeof(pcp) ___ret;						\
+	unsigned long ___flags;						\
+	raw_local_irq_save(___flags);					\
+	___ret = raw_cpu_generic_read(pcp);				\
+	raw_local_irq_restore(___flags);				\
+	___ret;								\
 })
 
 #define this_cpu_generic_read(pcp)					\
commit 472547778de24e2764ab325268dd5b77e6923939
Author: Andrii Nakryiko <andrii at kernel.org>
Date:   Thu Oct 22 13:27:38 2020 -0700

    selftest/bpf: Fix profiler test using CO-RE relocation for enums
    
    Instead of hard-coding invalid pids_cgrp_id, use Kconfig to detect the
    presence of that enum value and CO-RE to capture its actual value in the
    hosts's kernel.
    
    Fixes: 03d4d13fab3f ("selftests/bpf: Add profiler test")
    Signed-off-by: Andrii Nakryiko <andrii at kernel.org>
    Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
    Tested-by: Song Liu <songliubraving at fb.com>
    Link: https://lore.kernel.org/bpf/20201022202739.3667367-1-andrii@kernel.org

diff --git a/tools/testing/selftests/bpf/progs/profiler.inc.h b/tools/testing/selftests/bpf/progs/profiler.inc.h
index 00578311a423..30982a7e4d0f 100644
--- a/tools/testing/selftests/bpf/progs/profiler.inc.h
+++ b/tools/testing/selftests/bpf/progs/profiler.inc.h
@@ -243,7 +243,10 @@ static ino_t get_inode_from_kernfs(struct kernfs_node* node)
 	}
 }
 
-int pids_cgrp_id = 1;
+extern bool CONFIG_CGROUP_PIDS __kconfig __weak;
+enum cgroup_subsys_id___local {
+	pids_cgrp_id___local = 123, /* value doesn't matter */
+};
 
 static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data,
 					 struct task_struct* task,
@@ -253,7 +256,9 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data,
 		BPF_CORE_READ(task, nsproxy, cgroup_ns, root_cset, dfl_cgrp, kn);
 	struct kernfs_node* proc_kernfs = BPF_CORE_READ(task, cgroups, dfl_cgrp, kn);
 
-	if (ENABLE_CGROUP_V1_RESOLVER) {
+	if (ENABLE_CGROUP_V1_RESOLVER && CONFIG_CGROUP_PIDS) {
+		int cgrp_id = bpf_core_enum_value(enum cgroup_subsys_id___local,
+						  pids_cgrp_id___local);
 #ifdef UNROLL
 #pragma unroll
 #endif
@@ -262,7 +267,7 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data,
 				BPF_CORE_READ(task, cgroups, subsys[i]);
 			if (subsys != NULL) {
 				int subsys_id = BPF_CORE_READ(subsys, ss, id);
-				if (subsys_id == pids_cgrp_id) {
+				if (subsys_id == cgrp_id) {
 					proc_kernfs = BPF_CORE_READ(subsys, cgroup, kn);
 					root_kernfs = BPF_CORE_READ(subsys, ss, root, kf_root, kn);
 					break;
commit 7342ca34d931a357d408aaa25fadd031e46af137
Author: Jing Xiangfeng <jingxiangfeng at huawei.com>
Date:   Thu Oct 15 16:40:53 2020 +0800

    thunderbolt: Add the missed ida_simple_remove() in ring_request_msix()
    
    ring_request_msix() misses to call ida_simple_remove() in an error path.
    Add a label 'err_ida_remove' and jump to it.
    
    Fixes: 046bee1f9ab8 ("thunderbolt: Add MSI-X support")
    Cc: stable at vger.kernel.org
    Signed-off-by: Jing Xiangfeng <jingxiangfeng at huawei.com>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index 3f79baa54829..e29ac3e3aa1e 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -406,12 +406,23 @@ static int ring_request_msix(struct tb_ring *ring, bool no_suspend)
 
 	ring->vector = ret;
 
-	ring->irq = pci_irq_vector(ring->nhi->pdev, ring->vector);
-	if (ring->irq < 0)
-		return ring->irq;
+	ret = pci_irq_vector(ring->nhi->pdev, ring->vector);
+	if (ret < 0)
+		goto err_ida_remove;
+
+	ring->irq = ret;
 
 	irqflags = no_suspend ? IRQF_NO_SUSPEND : 0;
-	return request_irq(ring->irq, ring_msix, irqflags, "thunderbolt", ring);
+	ret = request_irq(ring->irq, ring_msix, irqflags, "thunderbolt", ring);
+	if (ret)
+		goto err_ida_remove;
+
+	return 0;
+
+err_ida_remove:
+	ida_simple_remove(&nhi->msix_ida, ring->vector);
+
+	return ret;
 }
 
 static void ring_release_msix(struct tb_ring *ring)
commit 402dab548d0da38b260f3843225cdfd37d91f512
Author: Dan Carpenter <dan.carpenter at oracle.com>
Date:   Thu Oct 22 10:08:24 2020 +0300

    hwmon: (pmbus/max20730) use scnprintf() instead of snprintf()
    
    The snprintf() function returns the number of characters which would
    have been printed if there were enough space, but the scnprintf()
    returns the number of characters which were actually printed.  If the
    buffer is not large enough, then using snprintf() would result in a
    read overflow and an information leak.
    
    Fixes: 8910c0bd533d ("hwmon: (pmbus/max20730) add device monitoring via debugfs")
    Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
    Link: https://lore.kernel.org/r/20201022070824.GC2817762@mwanda
    Signed-off-by: Guenter Roeck <linux at roeck-us.net>

diff --git a/drivers/hwmon/pmbus/max20730.c b/drivers/hwmon/pmbus/max20730.c
index 57923d72490c..be83b98411c7 100644
--- a/drivers/hwmon/pmbus/max20730.c
+++ b/drivers/hwmon/pmbus/max20730.c
@@ -122,8 +122,8 @@ static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
 	switch (idx) {
 	case MAX20730_DEBUGFS_VOUT_MIN:
 		ret = VOLT_FROM_REG(data->mfr_voutmin * 10000);
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d.%d\n",
-			       ret / 10000, ret % 10000);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d.%d\n",
+				ret / 10000, ret % 10000);
 		break;
 	case MAX20730_DEBUGFS_FREQUENCY:
 		val = (data->mfr_devset1 & MAX20730_MFR_DEVSET1_FSW_MASK)
@@ -141,7 +141,7 @@ static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
 			ret = 800;
 		else
 			ret = 900;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_PG_DELAY:
 		val = (data->mfr_devset1 & MAX20730_MFR_DEVSET1_TSTAT_MASK)
@@ -223,7 +223,7 @@ static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
 	case MAX20730_DEBUGFS_OC_PROTECT_MODE:
 		ret = (data->mfr_devset2 & MAX20730_MFR_DEVSET2_OCPM_MASK)
 			>> MAX20730_MFR_DEVSET2_OCPM_BIT_POS;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_SS_TIMING:
 		val = (data->mfr_devset2 & MAX20730_MFR_DEVSET2_SS_MASK)
@@ -241,32 +241,32 @@ static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
 	case MAX20730_DEBUGFS_IMAX:
 		ret = (data->mfr_devset2 & MAX20730_MFR_DEVSET2_IMAX_MASK)
 			>> MAX20730_MFR_DEVSET2_IMAX_BIT_POS;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_OPERATION:
 		ret = i2c_smbus_read_byte_data(psu->client, PMBUS_OPERATION);
 		if (ret < 0)
 			return ret;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_ON_OFF_CONFIG:
 		ret = i2c_smbus_read_byte_data(psu->client, PMBUS_ON_OFF_CONFIG);
 		if (ret < 0)
 			return ret;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_SMBALERT_MASK:
 		ret = i2c_smbus_read_word_data(psu->client,
 					       PMBUS_SMB_ALERT_MASK);
 		if (ret < 0)
 			return ret;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_VOUT_MODE:
 		ret = i2c_smbus_read_byte_data(psu->client, PMBUS_VOUT_MODE);
 		if (ret < 0)
 			return ret;
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX, "%d\n", ret);
 		break;
 	case MAX20730_DEBUGFS_VOUT_COMMAND:
 		ret = i2c_smbus_read_word_data(psu->client, PMBUS_VOUT_COMMAND);
@@ -274,8 +274,8 @@ static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
 			return ret;
 
 		ret = VOLT_FROM_REG(ret * 10000);
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX,
-			       "%d.%d\n", ret / 10000, ret % 10000);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX,
+				"%d.%d\n", ret / 10000, ret % 10000);
 		break;
 	case MAX20730_DEBUGFS_VOUT_MAX:
 		ret = i2c_smbus_read_word_data(psu->client, PMBUS_VOUT_MAX);
@@ -283,8 +283,8 @@ static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
 			return ret;
 
 		ret = VOLT_FROM_REG(ret * 10000);
-		len = snprintf(tbuf, DEBUG_FS_DATA_MAX,
-			       "%d.%d\n", ret / 10000, ret % 10000);
+		len = scnprintf(tbuf, DEBUG_FS_DATA_MAX,
+				"%d.%d\n", ret / 10000, ret % 10000);
 		break;
 	default:
 		len = strlcpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
commit 560b6ac37a87fcb78d580437e3e0bc2b6b5b0295
Author: Billy Tsai <billy_tsai at aspeedtech.com>
Date:   Mon Oct 19 12:50:26 2020 +0800

    gpio: aspeed: fix ast2600 bank properties
    
    GPIO_T is mapped to the most significant byte of input/output mask, and
    the byte in "output" mask should be 0 because GPIO_T is input only. All
    the other bits need to be 1 because GPIO_Q/R/S support both input and
    output modes.
    
    Fixes: ab4a85534c3e ("gpio: aspeed: Add in ast2600 details to Aspeed driver")
    Signed-off-by: Billy Tsai <billy_tsai at aspeedtech.com>
    Reviewed-by: Tao Ren <rentao.bupt at gmail.com>
    Reviewed-by: Joel Stanley <joel at jms.id.au>
    Reviewed-by: Andrew Jeffery <andrew at aj.id.au>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
index e44d5de2a120..b966f5e28ebf 100644
--- a/drivers/gpio/gpio-aspeed.c
+++ b/drivers/gpio/gpio-aspeed.c
@@ -1114,6 +1114,7 @@ static const struct aspeed_gpio_config ast2500_config =
 
 static const struct aspeed_bank_props ast2600_bank_props[] = {
 	/*     input	  output   */
+	{4, 0xffffffff,  0x00ffffff}, /* Q/R/S/T */
 	{5, 0xffffffff,  0xffffff00}, /* U/V/W/X */
 	{6, 0x0000ffff,  0x0000ffff}, /* Y/Z */
 	{ },
commit 3fe37204c9a233d1bd852b98bca43ec61854ba78
Author: Jia He <justin.he at arm.com>
Date:   Fri Oct 16 23:35:44 2020 +0800

    gpio: dwapb: Fix missing conversion to GPIO-lib-based IRQ-chip
    
    Commit 0ea683931adb ("gpio: dwapb: Convert driver to using the
    GPIO-lib-based IRQ-chip") missed the case in dwapb_irq_set_wake().
    
    Without this fix, probing the dwapb gpio driver will hit a error:
    "address between user and kernel address ranges" on a Ampere armv8a
    server and cause a panic.
    
    Fixes: 0ea683931adb ("gpio: dwapb: Convert driver to using the GPIO-lib-based IRQ-chip")
    Signed-off-by: Jia He <justin.he at arm.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
    Acked-by: Serge Semin <fancer.lancer at gmail.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>

diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index a5b326754124..2a9046c0fb16 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -343,8 +343,8 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type)
 #ifdef CONFIG_PM_SLEEP
 static int dwapb_irq_set_wake(struct irq_data *d, unsigned int enable)
 {
-	struct irq_chip_generic *igc = irq_data_get_irq_chip_data(d);
-	struct dwapb_gpio *gpio = igc->private;
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct dwapb_gpio *gpio = to_dwapb_gpio(gc);
 	struct dwapb_context *ctx = gpio->ports[0].ctx;
 	irq_hw_number_t bit = irqd_to_hwirq(d);
 
commit f3c75e7a9349d1d33eb53ddc1b31640994969f73
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Wed Oct 14 13:46:38 2020 +0300

    pinctrl: intel: Set default bias in case no particular value given
    
    When GPIO library asks pin control to set the bias, it doesn't pass
    any value of it and argument is considered boolean (and this is true
    for ACPI GpioIo() / GpioInt() resources, by the way). Thus, individual
    drivers must behave well, when they got the resistance value of 1 Ohm,
    i.e. transforming it to sane default.
    
    In case of Intel pin control hardware the 5 kOhm sounds plausible
    because on one hand it's a minimum of resistors present in all
    hardware generations and at the same time it's high enough to minimize
    leakage current (will be only 200 uA with the above choice).
    
    Fixes: e57725eabf87 ("pinctrl: intel: Add support for hardware debouncer")
    Reported-by: Jamie McClymont <jamie at kwiius.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
index f97b049674b7..1c10ab184783 100644
--- a/drivers/pinctrl/intel/pinctrl-intel.c
+++ b/drivers/pinctrl/intel/pinctrl-intel.c
@@ -683,6 +683,10 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
 
 		value |= PADCFG1_TERM_UP;
 
+		/* Set default strength value in case none is given */
+		if (arg == 1)
+			arg = 5000;
+
 		switch (arg) {
 		case 20000:
 			value |= PADCFG1_TERM_20K << PADCFG1_TERM_SHIFT;
@@ -705,6 +709,10 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
 	case PIN_CONFIG_BIAS_PULL_DOWN:
 		value &= ~(PADCFG1_TERM_UP | PADCFG1_TERM_MASK);
 
+		/* Set default strength value in case none is given */
+		if (arg == 1)
+			arg = 5000;
+
 		switch (arg) {
 		case 20000:
 			value |= PADCFG1_TERM_20K << PADCFG1_TERM_SHIFT;
commit dd26209bc56886cacdbd828571e54a6bca251e55
Author: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Date:   Wed Oct 14 13:46:37 2020 +0300

    pinctrl: intel: Fix 2 kOhm bias which is 833 Ohm
    
    2 kOhm bias was never an option in Intel GPIO hardware, the available
    matrix is:
    
            000     none
            001     1 kOhm (if available)
            010     5 kOhm
            100     20 kOhm
    
    As easy to get the 3 resistors are gated separately and according to
    parallel circuits calculations we may get combinations of the above where
    the result is always strictly less than minimal resistance. Hence,
    additional values can be:
    
            011     ~833.3 Ohm
            101     ~952.4 Ohm
            110     ~4 kOhm
            111     ~800 Ohm
    
    That said, convert TERM definitions to be the bit masks to reflect the above.
    
    While at it, enable the same setting for pull down case.
    
    Fixes: 7981c0015af2 ("pinctrl: intel: Add Intel Sunrisepoint pin controller and GPIO support")
    Cc: Jamie McClymont <jamie at kwiius.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>

diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
index 154ce3f908cd..f97b049674b7 100644
--- a/drivers/pinctrl/intel/pinctrl-intel.c
+++ b/drivers/pinctrl/intel/pinctrl-intel.c
@@ -62,10 +62,10 @@
 #define PADCFG1_TERM_UP			BIT(13)
 #define PADCFG1_TERM_SHIFT		10
 #define PADCFG1_TERM_MASK		GENMASK(12, 10)
-#define PADCFG1_TERM_20K		4
-#define PADCFG1_TERM_2K			3
-#define PADCFG1_TERM_5K			2
-#define PADCFG1_TERM_1K			1
+#define PADCFG1_TERM_20K		BIT(2)
+#define PADCFG1_TERM_5K			BIT(1)
+#define PADCFG1_TERM_1K			BIT(0)
+#define PADCFG1_TERM_833		(BIT(1) | BIT(0))
 
 #define PADCFG2				0x008
 #define PADCFG2_DEBEN			BIT(0)
@@ -549,12 +549,12 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
 			return -EINVAL;
 
 		switch (term) {
+		case PADCFG1_TERM_833:
+			*arg = 833;
+			break;
 		case PADCFG1_TERM_1K:
 			*arg = 1000;
 			break;
-		case PADCFG1_TERM_2K:
-			*arg = 2000;
-			break;
 		case PADCFG1_TERM_5K:
 			*arg = 5000;
 			break;
@@ -570,6 +570,11 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
 			return -EINVAL;
 
 		switch (term) {
+		case PADCFG1_TERM_833:
+			if (!(community->features & PINCTRL_FEATURE_1K_PD))
+				return -EINVAL;
+			*arg = 833;
+			break;
 		case PADCFG1_TERM_1K:
 			if (!(community->features & PINCTRL_FEATURE_1K_PD))
 				return -EINVAL;
@@ -685,12 +690,12 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
 		case 5000:
 			value |= PADCFG1_TERM_5K << PADCFG1_TERM_SHIFT;
 			break;
-		case 2000:
-			value |= PADCFG1_TERM_2K << PADCFG1_TERM_SHIFT;
-			break;
 		case 1000:
 			value |= PADCFG1_TERM_1K << PADCFG1_TERM_SHIFT;
 			break;
+		case 833:
+			value |= PADCFG1_TERM_833 << PADCFG1_TERM_SHIFT;
+			break;
 		default:
 			ret = -EINVAL;
 		}
@@ -714,6 +719,13 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
 			}
 			value |= PADCFG1_TERM_1K << PADCFG1_TERM_SHIFT;
 			break;
+		case 833:
+			if (!(community->features & PINCTRL_FEATURE_1K_PD)) {
+				ret = -EINVAL;
+				break;
+			}
+			value |= PADCFG1_TERM_833 << PADCFG1_TERM_SHIFT;
+			break;
 		default:
 			ret = -EINVAL;
 		}
commit 1a9a8910b2153cd3c4f3f2f8defcb853ead3b1fd
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:15 2020 +0800

    arm64: dts: allwinner: a64: bananapi-m64: Enable RGMII RX/TX delay on PHY
    
    The Ethernet PHY on the Bananapi M64 has the RX and TX delays
    enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: e7295499903d ("arm64: allwinner: bananapi-m64: Enable dwmac-sun8i")
    Fixes: 94f442886711 ("arm64: dts: allwinner: A64: Restore EMAC changes")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Corentin Labbe <clabbe.montjoie at gmail.com>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-10-wens@kernel.org

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
index 3ea5182ca489..e5e840b9fbb4 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
@@ -105,7 +105,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-handle = <&ext_rgmii_phy>;
 	phy-supply = <&reg_dc1sw>;
 	status = "okay";
commit 2bd8570d20c88909b8be3251727a26476b02652c
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:14 2020 +0800

    arm64: dts: allwinner: h5: libretech-all-h5-cc: Enable RGMII RX/TX delay on PHY
    
    The Ethernet PHY on the Libre Computer ALL-H5-CC has the RX and TX
    delays enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 60d0426d7603 ("arm64: dts: allwinner: h5: Add Libre Computer ALL-H5-CC H5 board")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-9-wens@kernel.org

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h5-cc.dts b/arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h5-cc.dts
index df1b9263ad0e..6e30a564c87f 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h5-cc.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h5-cc.dts
@@ -36,7 +36,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	/delete-property/ allwinner,leds-active-low;
 	status = "okay";
 };
commit 3914160ffc0bf762d6d605d4b27036b7b89367ea
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:13 2020 +0800

    ARM: dts: sunxi: bananapi-m2-plus: Enable RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Bananapi M2+ has the RX and TX delays
    enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 8c7ba536e709 ("ARM: sun8i: bananapi-m2-plus: Enable dwmac-sun8i")
    Fixes: 4904337fe34f ("ARM: dts: sunxi: Restore EMAC changes (boards)")
    Fixes: aa8fee415f46 ("ARM: dts: sun8i: h3: Split out non-SoC-specific parts of Bananapi M2 Plus")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-8-wens@kernel.org

diff --git a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
index 39263e74fbb5..8e5cb3b3fd68 100644
--- a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
+++ b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
@@ -126,7 +126,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 
 	status = "okay";
 };
commit b1064037e8ecf09d587b7b4966eebe0c362908e5
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:12 2020 +0800

    ARM: dts: sun9i: Enable both RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Cubieboard 4 and A80 Optimus have the RX
    and TX delays enabled on the PHY, using pull-ups on the RXDLY and
    TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 98048143b7f8 ("ARM: dts: sun9i: cubieboard4: Enable GMAC")
    Fixes: bc9bd03a44f9 ("ARM: dts: sun9i: a80-optimus: Enable GMAC")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-7-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun9i-a80-cubieboard4.dts b/arch/arm/boot/dts/sun9i-a80-cubieboard4.dts
index d3b337b043a1..484b93df20cb 100644
--- a/arch/arm/boot/dts/sun9i-a80-cubieboard4.dts
+++ b/arch/arm/boot/dts/sun9i-a80-cubieboard4.dts
@@ -129,7 +129,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-supply = <&reg_cldo1>;
 	status = "okay";
 };
diff --git a/arch/arm/boot/dts/sun9i-a80-optimus.dts b/arch/arm/boot/dts/sun9i-a80-optimus.dts
index bbc6335e5631..5c3580d712e4 100644
--- a/arch/arm/boot/dts/sun9i-a80-optimus.dts
+++ b/arch/arm/boot/dts/sun9i-a80-optimus.dts
@@ -124,7 +124,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-supply = <&reg_cldo1>;
 	status = "okay";
 };
commit 57dbe558457bf4042169bc1f334e3b53a8480a1c
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:11 2020 +0800

    ARM: dts: sun8i: a83t: Enable both RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Bananapi M3 and Cubietruck Plus have the RX
    and TX delays enabled on the PHY, using pull-ups on the RXDLY and
    TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 039359948a4b ("ARM: dts: sun8i: a83t: Enable Ethernet on two boards")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-6-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts b/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts
index 9d34eabba121..431f70234d36 100644
--- a/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts
+++ b/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts
@@ -131,7 +131,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_sw>;
 	phy-handle = <&rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	allwinner,rx-delay-ps = <700>;
 	allwinner,tx-delay-ps = <700>;
 	status = "okay";
diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
index d9be511f054f..d8326a5c681d 100644
--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
+++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
@@ -183,7 +183,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_dldo4>;
 	phy-handle = <&rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit e080ab31a0aa126b0a7e4f67f2b01b371b852c88
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:10 2020 +0800

    ARM: dts: sun8i: h3: orangepi-plus2e: Enable RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Orange Pi Plus 2E has the RX and TX delays
    enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 4904337fe34f ("ARM: dts: sunxi: Restore EMAC changes (boards)")
    Fixes: 7a78ef92cdc5 ("ARM: sun8i: h3: Enable EMAC with external PHY on Orange Pi Plus 2E")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-5-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-plus2e.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-plus2e.dts
index 6dbf7b2e0c13..b6ca45d18e51 100644
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-plus2e.dts
+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-plus2e.dts
@@ -67,7 +67,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit f94f78bd93f567c022f594589dbeecdf59931365
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:09 2020 +0800

    ARM: dts: sun7i: bananapi-m1-plus: Enable RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Bananapi M1+ has the RX and TX delays
    enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 04c85ecad32a ("ARM: dts: sun7i: Add dts file for Bananapi M1 Plus board")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-4-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun7i-a20-bananapi-m1-plus.dts b/arch/arm/boot/dts/sun7i-a20-bananapi-m1-plus.dts
index 32d5d45a35c0..8945dbb114a2 100644
--- a/arch/arm/boot/dts/sun7i-a20-bananapi-m1-plus.dts
+++ b/arch/arm/boot/dts/sun7i-a20-bananapi-m1-plus.dts
@@ -130,7 +130,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-supply = <&reg_gmac_3v3>;
 	status = "okay";
 };
commit 353c3de1303fc93032164402c0eb8550ecd6f154
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:08 2020 +0800

    ARM: dts: sun7i: cubietruck: Enable RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the Cubietruck has the RX and TX delays
    enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: 67073d97672d ("ARM: dts: sun7i: cubietruck: Enable the GMAC")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Emilio López <emilio at elopez.com.ar>
    Reviewed-by: Emilio López <emilio at elopez.com.ar>
    Link: https://lore.kernel.org/r/20201024162515.30032-3-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts
index 8c8dee6ea461..9109ca0919ad 100644
--- a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts
+++ b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts
@@ -151,7 +151,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit e76724153f5b4539802cc21b2c6131058668a1c6
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:07 2020 +0800

    ARM: dts: sun6i: a31-hummingbird: Enable RGMII RX/TX delay on Ethernet PHY
    
    The Ethernet PHY on the A31 Hummingbird has the RX and TX delays
    enabled on the PHY, using pull-ups on the RXDLY and TXDLY pins.
    
    Fix the phy-mode description to correct reflect this so that the
    implementation doesn't reconfigure the delays incorrectly. This
    happened with commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e
    rx/tx delay config").
    
    Fixes: c220aec2bb79 ("ARM: dts: sun6i: Add Merrii A31 Hummingbird support")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-2-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun6i-a31-hummingbird.dts b/arch/arm/boot/dts/sun6i-a31-hummingbird.dts
index 049e6ab3cf56..73de34ae37fd 100644
--- a/arch/arm/boot/dts/sun6i-a31-hummingbird.dts
+++ b/arch/arm/boot/dts/sun6i-a31-hummingbird.dts
@@ -154,7 +154,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit 8d80e2f00a42ef10b54e1b2d9e97314f8fd046c0
Author: Chen-Yu Tsai <wens at csie.org>
Date:   Sun Oct 25 00:25:06 2020 +0800

    Revert "arm: sun8i: orangepi-pc-plus: Set EMAC activity LEDs to active high"
    
    This reverts commit 75ee680cbd2e4d0156b94f9fec50076361ab12f2.
    
    Turns out the activity and link LEDs on the RJ45 port are active low,
    just like on the Orange Pi PC.
    
    Revert the commit that says otherwise.
    
    Fixes: 75ee680cbd2e ("arm: sun8i: orangepi-pc-plus: Set EMAC activity LEDs to active high")
    Fixes: 4904337fe34f ("ARM: dts: sunxi: Restore EMAC changes (boards)")
    Signed-off-by: Chen-Yu Tsai <wens at csie.org>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Tested-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201024162515.30032-1-wens@kernel.org

diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dts
index 71fb73208939..babf4cf1b2f6 100644
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dts
+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dts
@@ -53,11 +53,6 @@
 	};
 };
 
-&emac {
-	/* LEDs changed to active high on the plus */
-	/delete-property/ allwinner,leds-active-low;
-};
-
 &mmc1 {
 	vmmc-supply = <&reg_vcc3v3>;
 	bus-width = <4>;
commit b3eec3212e66ece33f69be0de98d54e67834e798
Author: Jernej Skrabec <jernej.skrabec at siol.net>
Date:   Sun Oct 25 09:19:49 2020 +0100

    ARM: dts: sun8i: r40: bananapi-m2-ultra: Fix ethernet node
    
    Ethernet PHY on BananaPi M2 Ultra provides RX and TX delays. Fix
    ethernet node to reflect that fact.
    
    Fixes: c36fd5a48bd2 ("ARM: dts: sun8i: r40: bananapi-m2-ultra: Enable GMAC ethernet controller")
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201025081949.783443-1-jernej.skrabec@siol.net

diff --git a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts
index 2fc62ef0cb3e..a6a1087a0c9b 100644
--- a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts
+++ b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts
@@ -129,7 +129,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&gmac_rgmii_pins>;
 	phy-handle = <&phy1>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-supply = <&reg_dc1sw>;
 	status = "okay";
 };
commit b34bf9f6a623ddb82600a5ed5c644224122395e1
Author: Jernej Skrabec <jernej.skrabec at siol.net>
Date:   Fri Oct 23 20:48:58 2020 +0200

    arm64: dts: allwinner: h5: OrangePi PC2: Fix ethernet node
    
    RX and TX delay are provided by ethernet PHY. Reflect that in ethernet
    node.
    
    Fixes: 44a94c7ef989 ("arm64: dts: allwinner: H5: Restore EMAC changes")
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201023184858.3272918-1-jernej.skrabec@siol.net

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts b/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts
index 7d7aad18f078..8bf2db9dcbda 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts
@@ -123,7 +123,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 
commit 927f42fcc1b4f7d04a2ac5cf02f25612aa8923a4
Author: Jernej Skrabec <jernej.skrabec at siol.net>
Date:   Thu Oct 22 23:13:01 2020 +0200

    arm64: dts: allwinner: a64: Pine64 Plus: Fix ethernet node
    
    According to board schematic, PHY provides both, RX and TX delays.
    However, according to "fix" Realtek provided for this board, only TX
    delay should be provided by PHY.
    Tests show that both variants work but TX only PHY delay works
    slightly better.
    
    Update ethernet node to reflect the fact that PHY provides TX delay.
    
    Fixes: 94f442886711 ("arm64: dts: allwinner: A64: Restore EMAC changes")
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201022211301.3548422-1-jernej.skrabec@siol.net

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts
index b26181cf9095..b54099b654c8 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts
@@ -13,7 +13,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-txid";
 	phy-handle = <&ext_rgmii_phy>;
 	status = "okay";
 };
commit d7cdff444579e6659459b2fe04340ebb27628d5e
Author: Jernej Skrabec <jernej.skrabec at siol.net>
Date:   Thu Oct 22 20:58:39 2020 +0200

    arm64: dts: allwinner: a64: OrangePi Win: Fix ethernet node
    
    RX/TX delay on OrangePi Win board is set on PHY. Reflect that in
    ethernet node.
    
    Fixes: 93d6a27cfcc0 ("arm64: dts: allwinner: a64: Orange Pi Win: Add Ethernet node")
    Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201022185839.2779245-1-jernej.skrabec@siol.net

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts
index d894ec5fa8a1..70e31743f0ba 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts
@@ -120,7 +120,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-handle = <&ext_rgmii_phy>;
 	phy-supply = <&reg_gmac_3v3>;
 	status = "okay";
commit 419c65f5000a6c25597ea52488528d75b287cbd0
Author: Corentin Labbe <clabbe at baylibre.com>
Date:   Mon Oct 19 06:34:49 2020 +0000

    arm64: dts: allwinner: Pine H64: Enable both RGMII RX/TX delay
    
    Since commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx delay config"),
    the network is unusable on PineH64 model A.
    
    This is due to phy-mode incorrectly set to rgmii instead of rgmii-id.
    
    Fixes: 729e1ffcf47e ("arm64: allwinner: h6: add support for the Ethernet on Pine H64")
    Signed-off-by: Corentin Labbe <clabbe at baylibre.com>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201019063449.33316-1-clabbe@baylibre.com

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts
index af85b2074867..961732c52aa0 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts
@@ -100,7 +100,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&ext_rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-handle = <&ext_rgmii_phy>;
 	phy-supply = <&reg_gmac_3v3>;
 	allwinner,rx-delay-ps = <200>;
commit 97a38c1c213b162aa577299de698f39c18ba696b
Author: Clément Péron <peron.clem at gmail.com>
Date:   Sun Oct 18 19:24:09 2020 +0200

    arm64: dts: allwinner: beelink-gs1: Enable both RGMII RX/TX delay
    
    Before the commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx
    delay config"), the software overwrite for RX/TX delays of the RTL8211e
    were not working properly and the Beelink GS1 had both RX/TX delay of RGMII
    interface set using pull-up on the TXDLY and RXDLY pins.
    
    Now that these delays are working properly they overwrite the HW
    config and set this to 'rgmii' meaning no delay on both RX/TX.
    This makes the ethernet of this board not working anymore.
    
    Set the phy-mode to 'rgmii-id' meaning RGMII with RX/TX delays
    in the device-tree to keep the correct configuration.
    
    Fixes: 089bee8dd119 ("arm64: dts: allwinner: h6: Introduce Beelink GS1 board")
    Signed-off-by: Clément Péron <peron.clem at gmail.com>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Chen-Yu Tsai <wens at csie.org>
    Link: https://lore.kernel.org/r/20201018172409.1754775-1-peron.clem@gmail.com

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
index 3f7ceeb1a767..7c9dbde645b5 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
@@ -97,7 +97,7 @@
 &emac {
 	pinctrl-names = "default";
 	pinctrl-0 = <&ext_rgmii_pins>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	phy-handle = <&ext_rgmii_phy>;
 	phy-supply = <&reg_aldo2>;
 	status = "okay";
commit a2089ac7f8dc682ef52ed74b52997d36cde76d05
Author: Clément Péron <peron.clem at gmail.com>
Date:   Sun Oct 11 23:15:14 2020 +0200

    arm64: dts: allwinner: pinetab: Drop unnecessary address/size-cells information
    
    make dtbs_check warm about unknown address/size-cells property in the
    pinetab device-tree.
    
    This is because these information are not necessary.
    
    Drop them.
    
    Signed-off-by: Clément Péron <peron.clem at gmail.com>
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Link: https://lore.kernel.org/r/20201011211514.155266-1-peron.clem@gmail.com

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts
index 3ab0f0347bc9..0494bfaf2ffa 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts
@@ -122,9 +122,6 @@
 	status = "okay";
 
 	port {
-		#address-cells = <1>;
-		#size-cells = <0>;
-
 		csi_ep: endpoint {
 			remote-endpoint = <&ov5640_ep>;
 			bus-width = <8>;
commit fdc24d722f353610b6aad23d99147632a19a6138
Author: Maxime Ripard <maxime at cerno.tech>
Date:   Fri Oct 9 09:44:23 2020 +0200

    MAINTAINERS: Add Jernej Škrabec as a reviewer for Allwinner SoCs support
    
    Jernej has helped a lot by reviewing patches recently, so let's make it
    official.
    
    Signed-off-by: Maxime Ripard <maxime at cerno.tech>
    Acked-by: Chen-Yu Tsai <wens at csie.org>
    Acked-by: Jernej Skrabec <jernej.skrabec at siol.net>
    Link: https://lore.kernel.org/r/20201009074423.10708-1-maxime@cerno.tech

diff --git a/MAINTAINERS b/MAINTAINERS
index e73636b75f29..b5c4163577fb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1546,6 +1546,7 @@ F:	drivers/clk/sunxi/
 ARM/Allwinner sunXi SoC support
 M:	Maxime Ripard <mripard at kernel.org>
 M:	Chen-Yu Tsai <wens at csie.org>
+R:	Jernej Skrabec <jernej.skrabec at siol.net>
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git
commit e7ae08d398e094e1305dee823435b1f996d39106
Author: Tony Lindgren <tony at atomide.com>
Date:   Mon Oct 26 10:08:47 2020 +0200

    bus: ti-sysc: Fix bogus resetdone warning on enable for cpsw
    
    Bail out early from sysc_wait_softreset() just like we do in sysc_reset()
    if there's no sysstatus srst_shift to fix a bogus resetdone warning on
    enable as suggested by Grygorii Strashko <grygorii.strashko at ti.com>.
    
    We do not currently handle resets for modules that need writing to the
    sysstatus register. If we at some point add that, we also need to add
    SYSS_QUIRK_RESETDONE_INVERTED flag for cpsw as the sysstatus bit is low
    when reset is done as described in the am335x TRM "Table 14-202
    SOFT_RESET Register Field Descriptions"
    
    Fixes: d46f9fbec719 ("bus: ti-sysc: Use optional clocks on for enable and wait for softreset bit")
    Suggested-by: Grygorii Strashko <grygorii.strashko at ti.com>
    Acked-by: Grygorii Strashko <grygorii.strashko at ti.com>
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
index 88a751c11677..16132e6e91f8 100644
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -227,6 +227,9 @@ static int sysc_wait_softreset(struct sysc *ddata)
 	u32 sysc_mask, syss_done, rstval;
 	int syss_offset, error = 0;
 
+	if (ddata->cap->regbits->srst_shift < 0)
+		return 0;
+
 	syss_offset = ddata->offsets[SYSC_SYSSTATUS];
 	sysc_mask = BIT(ddata->cap->regbits->srst_shift);
 
commit e275d2109cdaea8b4554b9eb8a828bdb8f8ba068
Author: Tony Lindgren <tony at atomide.com>
Date:   Mon Oct 26 10:08:47 2020 +0200

    bus: ti-sysc: Fix reset status check for modules with quirks
    
    Commit d46f9fbec719 ("bus: ti-sysc: Use optional clocks on for enable and
    wait for softreset bit") started showing a "OCP softreset timed out"
    warning on enable if the interconnect target module is not out of reset.
    This caused the warning to be often triggered for i2c and hdq while the
    devices are working properly.
    
    Turns out that some interconnect target modules seem to have an unusable
    reset status bits unless the module specific reset quirks are activated.
    
    Let's just skip the reset status check for those modules as we only want
    to activate the reset quirks when doing a reset, and not on enable. This
    way we don't see the bogus "OCP softreset timed out" warnings during boot.
    
    Fixes: d46f9fbec719 ("bus: ti-sysc: Use optional clocks on for enable and wait for softreset bit")
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
index efb088df1276..88a751c11677 100644
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -970,9 +970,15 @@ static int sysc_enable_module(struct device *dev)
 			return error;
 		}
 	}
-	error = sysc_wait_softreset(ddata);
-	if (error)
-		dev_warn(ddata->dev, "OCP softreset timed out\n");
+	/*
+	 * Some modules like i2c and hdq1w have unusable reset status unless
+	 * the module reset quirk is enabled. Skip status check on enable.
+	 */
+	if (!(ddata->cfg.quirks & SYSC_MODULE_QUIRK_ENA_RESETDONE)) {
+		error = sysc_wait_softreset(ddata);
+		if (error)
+			dev_warn(ddata->dev, "OCP softreset timed out\n");
+	}
 	if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET)
 		sysc_disable_opt_clocks(ddata);
 
@@ -1373,17 +1379,17 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
 	SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50030200, 0xffffffff,
 		   SYSC_QUIRK_OPT_CLKS_NEEDED),
 	SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff,
-		   SYSC_MODULE_QUIRK_HDQ1W),
+		   SYSC_MODULE_QUIRK_HDQ1W | SYSC_MODULE_QUIRK_ENA_RESETDONE),
 	SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff,
-		   SYSC_MODULE_QUIRK_HDQ1W),
+		   SYSC_MODULE_QUIRK_HDQ1W | SYSC_MODULE_QUIRK_ENA_RESETDONE),
 	SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000036, 0x000000ff,
-		   SYSC_MODULE_QUIRK_I2C),
+		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
 	SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x0000003c, 0x000000ff,
-		   SYSC_MODULE_QUIRK_I2C),
+		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
 	SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000040, 0x000000ff,
-		   SYSC_MODULE_QUIRK_I2C),
+		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
 	SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0,
-		   SYSC_MODULE_QUIRK_I2C),
+		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
 	SYSC_QUIRK("gpu", 0x50000000, 0x14, -ENODEV, -ENODEV, 0x00010201, 0xffffffff, 0),
 	SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff,
 		   SYSC_MODULE_QUIRK_SGX),
diff --git a/include/linux/platform_data/ti-sysc.h b/include/linux/platform_data/ti-sysc.h
index c59999ce044e..240dce553a0b 100644
--- a/include/linux/platform_data/ti-sysc.h
+++ b/include/linux/platform_data/ti-sysc.h
@@ -50,6 +50,7 @@ struct sysc_regbits {
 	s8 emufree_shift;
 };
 
+#define SYSC_MODULE_QUIRK_ENA_RESETDONE	BIT(25)
 #define SYSC_MODULE_QUIRK_PRUSS		BIT(24)
 #define SYSC_MODULE_QUIRK_DSS_RESET	BIT(23)
 #define SYSC_MODULE_QUIRK_RTC_UNLOCK	BIT(22)
commit b69fd00120f8e3348273323099669cb058668263
Author: Tony Lindgren <tony at atomide.com>
Date:   Mon Oct 26 10:08:47 2020 +0200

    ARM: OMAP2+: Fix missing select PM_GENERIC_DOMAINS_OF
    
    We should select also PM_GENERIC_DOMAINS_OF in addition to
    PM_GENERIC_DOMAINS to have device tree based PM domain providers
    enabled.
    
    Fixes: 58cbff023bfa ("soc: ti: omap-prm: Add basic power domain support")
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 68ba5adfaa23..3f62a0c9450d 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -106,6 +106,7 @@ config ARCH_OMAP2PLUS
 	select OMAP_GPMC
 	select PINCTRL
 	select PM_GENERIC_DOMAINS if PM
+	select PM_GENERIC_DOMAINS_OF if PM
 	select RESET_CONTROLLER
 	select SOC_BUS
 	select TI_SYSC
commit c20782ad4eb9dfa7f41cb2d85f218d0940f7cef1
Author: Tony Lindgren <tony at atomide.com>
Date:   Mon Oct 26 10:08:47 2020 +0200

    ARM: OMAP2+: Fix location for select PM_GENERIC_DOMAINS
    
    I accidentally misplaced select PM_GENERIC_DOMAINS, it should be
    selected for all the SoCs instead.
    
    Fixes: 58cbff023bfa ("soc: ti: omap-prm: Add basic power domain support")
    Signed-off-by: Tony Lindgren <tony at atomide.com>

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 3ee7bdff86b2..68ba5adfaa23 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -7,7 +7,6 @@ config ARCH_OMAP2
 	depends on ARCH_MULTI_V6
 	select ARCH_OMAP2PLUS
 	select CPU_V6
-	select PM_GENERIC_DOMAINS if PM
 	select SOC_HAS_OMAP2_SDRC
 
 config ARCH_OMAP3
@@ -106,6 +105,7 @@ config ARCH_OMAP2PLUS
 	select OMAP_DM_TIMER
 	select OMAP_GPMC
 	select PINCTRL
+	select PM_GENERIC_DOMAINS if PM
 	select RESET_CONTROLLER
 	select SOC_BUS
 	select TI_SYSC
commit fe5186cf12e30facfe261e9be6c7904a170bd822
Author: Vamshi K Sthambamkadi <vamshi.k.sthambamkadi at gmail.com>
Date:   Fri Oct 23 17:24:39 2020 +0530

    efivarfs: fix memory leak in efivarfs_create()
    
    kmemleak report:
      unreferenced object 0xffff9b8915fcb000 (size 4096):
      comm "efivarfs.sh", pid 2360, jiffies 4294920096 (age 48.264s)
      hex dump (first 32 bytes):
        2d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  -...............
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<00000000cc4d897c>] kmem_cache_alloc_trace+0x155/0x4b0
        [<000000007d1dfa72>] efivarfs_create+0x6e/0x1a0
        [<00000000e6ee18fc>] path_openat+0xe4b/0x1120
        [<000000000ad0414f>] do_filp_open+0x91/0x100
        [<00000000ce93a198>] do_sys_openat2+0x20c/0x2d0
        [<000000002a91be6d>] do_sys_open+0x46/0x80
        [<000000000a854999>] __x64_sys_openat+0x20/0x30
        [<00000000c50d89c9>] do_syscall_64+0x38/0x90
        [<00000000cecd6b5f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    In efivarfs_create(), inode->i_private is setup with efivar_entry
    object which is never freed.
    
    Cc: <stable at vger.kernel.org>
    Signed-off-by: Vamshi K Sthambamkadi <vamshi.k.sthambamkadi at gmail.com>
    Link: https://lore.kernel.org/r/20201023115429.GA2479@cosmos
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>

diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index 15880a68faad..f943fd0b0699 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -21,6 +21,7 @@ LIST_HEAD(efivarfs_list);
 static void efivarfs_evict_inode(struct inode *inode)
 {
 	clear_inode(inode);
+	kfree(inode->i_private);
 }
 
 static const struct super_operations efivarfs_ops = {
commit fbc81ec5b85d43a4b22e49ec0e643fa7dec2ea40
Author: Ard Biesheuvel <ardb at kernel.org>
Date:   Sat Oct 3 17:28:27 2020 +0200

    efi/arm: set HSCTLR Thumb2 bit correctly for HVC calls from HYP
    
    Commit
    
      db227c19e68db353 ("ARM: 8985/1: efi/decompressor: deal with HYP mode boot gracefully")
    
    updated the EFI entry code to permit firmware to invoke the EFI stub
    loader in HYP mode, with the MMU either enabled or disabled, neither
    of which is permitted by the EFI spec, but which does happen in the
    field.
    
    In the MMU on case, we remain in HYP mode as configured by the firmware,
    and rely on the fact that any HVC instruction issued in this mode will
    be dispatched via the SVC slot in the HYP vector table. However, this
    slot will point to a Thumb2 symbol if the kernel is built in Thumb2
    mode, and so we have to configure HSCTLR to ensure that the exception
    handlers are invoked in Thumb2 mode as well.
    
    Fixes: db227c19e68db353 ("ARM: 8985/1: efi/decompressor: deal with HYP mode boot gracefully")
    Signed-off-by: Ard Biesheuvel <ardb at kernel.org>

diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index 2e04ec5b5446..caa27322a0ab 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -1472,6 +1472,9 @@ ENTRY(efi_enter_kernel)
 		@ issued from HYP mode take us to the correct handler code. We
 		@ will disable the MMU before jumping to the kernel proper.
 		@
+ ARM(		bic	r1, r1, #(1 << 30)	) @ clear HSCTLR.TE
+ THUMB(		orr	r1, r1, #(1 << 30)	) @ set HSCTLR.TE
+		mcr	p15, 4, r1, c1, c0, 0
 		adr	r0, __hyp_reentry_vectors
 		mcr	p15, 4, r0, c12, c0, 0	@ set HYP vector base (HVBAR)
 		isb
commit 3d7772ea5602b88c7c7f0a50d512171a2eed6659
Author: Len Brown <len.brown at intel.com>
Date:   Wed Sep 30 20:58:15 2020 -0400

    tools/power turbostat: harden against cpu hotplug
    
    turbostat tends to get confused when CPUs are added and removed
    while it is running.
    
    There are races, such as checking the current cpu, and then
    reading a sysfs file that depends on that cpu number.
    
    Close the two issues that seem to come up the most.
    First, there is an infinite reset loop detector --
    change that to allow more resets before giving up.
    Secondly, one of those file reads didn't really need
    to exit the program on failure...
    
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 4122468fb73b..74d2fc6fc78a 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -1894,7 +1894,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
 	int i;
 
 	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
+		fprintf(outf, "get_counters: Could not migrate to CPU %d\n", cpu);
 		return -1;
 	}
 
@@ -2764,7 +2764,12 @@ int get_thread_siblings(struct cpu_topology *thiscpu)
 
 	sprintf(path,
 		"/sys/devices/system/cpu/cpu%d/topology/thread_siblings", cpu);
-	filep = fopen_or_die(path, "r");
+	filep = fopen(path, "r");
+
+	if (!filep) {
+		warnx("%s: open failed", path);
+		return -1;
+	}
 	do {
 		offset -= BITMASK_SIZE;
 		if (fscanf(filep, "%lx%c", &map, &character) != 2)
@@ -2877,7 +2882,7 @@ void re_initialize(void)
 {
 	free_all_buffers();
 	setup_all_buffers();
-	printf("turbostat: re-initialized with num_cpus %d\n", topo.num_cpus);
+	fprintf(outf, "turbostat: re-initialized with num_cpus %d\n", topo.num_cpus);
 }
 
 void set_max_cpu_num(void)
@@ -3331,7 +3336,7 @@ restart:
 	if (retval < -1) {
 		exit(retval);
 	} else if (retval == -1) {
-		if (restarted > 1) {
+		if (restarted > 10) {
 			exit(retval);
 		}
 		re_initialize();
@@ -3926,7 +3931,7 @@ int print_epb(struct thread_data *t, struct core_data *c, struct pkg_data *p)
 		return 0;
 
 	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
+		fprintf(outf, "print_epb: Could not migrate to CPU %d\n", cpu);
 		return -1;
 	}
 
@@ -3970,7 +3975,7 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p)
 		return 0;
 
 	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
+		fprintf(outf, "print_hwp: Could not migrate to CPU %d\n", cpu);
 		return -1;
 	}
 
@@ -4058,7 +4063,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data
 		return 0;
 
 	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
+		fprintf(outf, "print_perf_limit: Could not migrate to CPU %d\n", cpu);
 		return -1;
 	}
 
@@ -4439,7 +4444,7 @@ int print_thermal(struct thread_data *t, struct core_data *c, struct pkg_data *p
 		return 0;
 
 	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
+		fprintf(outf, "print_thermal: Could not migrate to CPU %d\n", cpu);
 		return -1;
 	}
 
@@ -4511,7 +4516,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
 
 	cpu = t->cpu_id;
 	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
+		fprintf(outf, "print_rapl: Could not migrate to CPU %d\n", cpu);
 		return -1;
 	}
 
commit 6ff7cb371c4bea3dba03a56d774da925e78a5087
Author: Len Brown <len.brown at intel.com>
Date:   Tue Sep 29 17:28:42 2020 -0400

    tools/power turbostat: adjust for temperature offset
    
    cpu1: MSR_IA32_TEMPERATURE_TARGET: 0x05640000 (95 C) (100 default - 5 offset)
    
    Account for the new "offset" field in MSR_TEMPERATURE_TARGET.
    While this field is usually zero, ignoring it results in over-stating
    the current temperature, both per-core and per-package.
    
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 0869f791ed14..4122468fb73b 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -4785,12 +4785,33 @@ double discover_bclk(unsigned int family, unsigned int model)
  * below this value, including the Digital Thermal Sensor (DTS),
  * Package Thermal Management Sensor (PTM), and thermal event thresholds.
  */
-int set_temperature_target(struct thread_data *t, struct core_data *c, struct pkg_data *p)
+int read_tcc_activation_temp()
 {
 	unsigned long long msr;
-	unsigned int target_c_local;
-	int cpu;
+	unsigned int tcc, target_c, offset_c;
+
+	/* Temperature Target MSR is Nehalem and newer only */
+	if (!do_nhm_platform_info)
+		return 0;
+
+	if (get_msr(base_cpu, MSR_IA32_TEMPERATURE_TARGET, &msr))
+		return 0;
 
+	target_c = (msr >> 16) & 0xFF;
+
+	offset_c = (msr >> 24) & 0xF;
+
+	tcc = target_c - offset_c;
+
+	if (!quiet)
+		fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C) (%d default - %d offset)\n",
+			base_cpu, msr, tcc, target_c, offset_c);
+
+	return tcc;
+}
+
+int set_temperature_target(struct thread_data *t, struct core_data *c, struct pkg_data *p)
+{
 	/* tcc_activation_temp is used only for dts or ptm */
 	if (!(do_dts || do_ptm))
 		return 0;
@@ -4799,43 +4820,18 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk
 	if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE) || !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE))
 		return 0;
 
-	cpu = t->cpu_id;
-	if (cpu_migrate(cpu)) {
-		fprintf(outf, "Could not migrate to CPU %d\n", cpu);
-		return -1;
-	}
-
 	if (tcc_activation_temp_override != 0) {
 		tcc_activation_temp = tcc_activation_temp_override;
-		fprintf(outf, "cpu%d: Using cmdline TCC Target (%d C)\n",
-			cpu, tcc_activation_temp);
+		fprintf(outf, "Using cmdline TCC Target (%d C)\n", tcc_activation_temp);
 		return 0;
 	}
 
-	/* Temperature Target MSR is Nehalem and newer only */
-	if (!do_nhm_platform_info)
-		goto guess;
-
-	if (get_msr(base_cpu, MSR_IA32_TEMPERATURE_TARGET, &msr))
-		goto guess;
-
-	target_c_local = (msr >> 16) & 0xFF;
-
-	if (!quiet)
-		fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C)\n",
-			cpu, msr, target_c_local);
-
-	if (!target_c_local)
-		goto guess;
-
-	tcc_activation_temp = target_c_local;
-
-	return 0;
+	tcc_activation_temp = read_tcc_activation_temp();
+	if (tcc_activation_temp)
+		return 0;
 
-guess:
 	tcc_activation_temp = TJMAX_DEFAULT;
-	fprintf(outf, "cpu%d: Guessing tjMax %d C, Please use -T to specify\n",
-		cpu, tcc_activation_temp);
+	fprintf(outf, "Guessing tjMax %d C, Please use -T to specify\n", tcc_activation_temp);
 
 	return 0;
 }
commit 1811977cb11354aef8cbd13e35ff50db716728a4
Author: Jiri Kosina <jkosina at suse.cz>
Date:   Wed Sep 30 22:52:31 2020 +0200

    HID: add support for Sega Saturn
    
    This device needs HID_QUIRK_MULTI_INPUT in order to be presented to userspace
    in a consistent way.
    
    Reported-and-tested-by: David Gámiz Jiménez <david.gamiz at gmail.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 81d99c47c2e5..28ecd635edc1 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -487,6 +487,7 @@
 #define USB_DEVICE_ID_PENPOWER		0x00f4
 
 #define USB_VENDOR_ID_GREENASIA		0x0e8f
+#define USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR 0x3010
 #define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD	0x3013
 
 #define USB_VENDOR_ID_GRETAGMACBETH	0x0971
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index 7a2be0205dfd..b154e11d43bf 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -83,6 +83,7 @@ static const struct hid_device_id hid_quirks[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER), HID_QUIRK_NO_INIT_REPORTS },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28), HID_QUIRK_NOGET },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_FUTABA, USB_DEVICE_ID_LED_DISPLAY), HID_QUIRK_NO_INIT_REPORTS },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR), HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD), HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
commit 652f3d00de523a17b0cebe7b90debccf13aa8c31
Author: Frank Yang <puilp0502 at gmail.com>
Date:   Fri Aug 21 03:16:50 2020 +0900

    HID: cypress: Support Varmilo Keyboards' media hotkeys
    
    The Varmilo VA104M Keyboard (04b4:07b1, reported as Varmilo Z104M)
    exposes media control hotkeys as a USB HID consumer control device, but
    these keys do not work in the current (5.8-rc1) kernel due to the
    incorrect HID report descriptor. Fix the problem by modifying the
    internal HID report descriptor.
    
    More specifically, the keyboard report descriptor specifies the
    logical boundary as 572~10754 (0x023c ~ 0x2a02) while the usage
    boundary is specified as 0~10754 (0x00 ~ 0x2a02). This results in an
    incorrect interpretation of input reports, causing inputs to be ignored.
    By setting the Logical Minimum to zero, we align the logical boundary
    with the Usage ID boundary.
    
    Some notes:
    
    * There seem to be multiple variants of the VA104M keyboard. This
      patch specifically targets 04b4:07b1 variant.
    
    * The device works out-of-the-box on Windows platform with the generic
      consumer control device driver (hidserv.inf). This suggests that
      Windows either ignores the Logical Minimum/Logical Maximum or
      interprets the Usage ID assignment differently from the linux
      implementation; Maybe there are other devices out there that only
      works on Windows due to this problem?
    
    Signed-off-by: Frank Yang <puilp0502 at gmail.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-cypress.c b/drivers/hid/hid-cypress.c
index a50ba4a4a1d7..b88f889b3932 100644
--- a/drivers/hid/hid-cypress.c
+++ b/drivers/hid/hid-cypress.c
@@ -23,19 +23,17 @@
 #define CP_2WHEEL_MOUSE_HACK		0x02
 #define CP_2WHEEL_MOUSE_HACK_ON		0x04
 
+#define VA_INVAL_LOGICAL_BOUNDARY	0x08
+
 /*
  * Some USB barcode readers from cypress have usage min and usage max in
  * the wrong order
  */
-static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+static __u8 *cp_rdesc_fixup(struct hid_device *hdev, __u8 *rdesc,
 		unsigned int *rsize)
 {
-	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
 	unsigned int i;
 
-	if (!(quirks & CP_RDESC_SWAPPED_MIN_MAX))
-		return rdesc;
-
 	if (*rsize < 4)
 		return rdesc;
 
@@ -48,6 +46,40 @@ static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 	return rdesc;
 }
 
+static __u8 *va_logical_boundary_fixup(struct hid_device *hdev, __u8 *rdesc,
+		unsigned int *rsize)
+{
+	/*
+	 * Varmilo VA104M (with VID Cypress and device ID 07B1) incorrectly
+	 * reports Logical Minimum of its Consumer Control device as 572
+	 * (0x02 0x3c). Fix this by setting its Logical Minimum to zero.
+	 */
+	if (*rsize == 25 &&
+			rdesc[0] == 0x05 && rdesc[1] == 0x0c &&
+			rdesc[2] == 0x09 && rdesc[3] == 0x01 &&
+			rdesc[6] == 0x19 && rdesc[7] == 0x00 &&
+			rdesc[11] == 0x16 && rdesc[12] == 0x3c && rdesc[13] == 0x02) {
+		hid_info(hdev,
+			 "fixing up varmilo VA104M consumer control report descriptor\n");
+		rdesc[12] = 0x00;
+		rdesc[13] = 0x00;
+	}
+	return rdesc;
+}
+
+static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+		unsigned int *rsize)
+{
+	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+
+	if (quirks & CP_RDESC_SWAPPED_MIN_MAX)
+		rdesc = cp_rdesc_fixup(hdev, rdesc, rsize);
+	if (quirks & VA_INVAL_LOGICAL_BOUNDARY)
+		rdesc = va_logical_boundary_fixup(hdev, rdesc, rsize);
+
+	return rdesc;
+}
+
 static int cp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
 		struct hid_field *field, struct hid_usage *usage,
 		unsigned long **bit, int *max)
@@ -128,6 +160,8 @@ static const struct hid_device_id cp_devices[] = {
 		.driver_data = CP_RDESC_SWAPPED_MIN_MAX },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE),
 		.driver_data = CP_2WHEEL_MOUSE_HACK },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1),
+		.driver_data = VA_INVAL_LOGICAL_BOUNDARY },
 	{ }
 };
 MODULE_DEVICE_TABLE(hid, cp_devices);
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 49d68bbf4852..81d99c47c2e5 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -331,6 +331,8 @@
 #define USB_DEVICE_ID_CYPRESS_BARCODE_4	0xed81
 #define USB_DEVICE_ID_CYPRESS_TRUETOUCH	0xc001
 
+#define USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1   0X07b1
+
 #define USB_VENDOR_ID_DATA_MODUL	0x7374
 #define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH	0x1201
 
commit 3c785a06dee99501a17f8e8cf29b2b7e3f1e94ea
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Oct 19 09:48:14 2020 +0200

    HID: ite: Replace ABS_MISC 120/121 events with touchpad on/off keypresses
    
    The usb-hid keyboard-dock for the Acer Switch 10 SW5-012 model declares
    an application and hid-usage page of 0x0088 for the INPUT(4) report which
    it sends. This reports contains 2 8-bit fields which are declared as
    HID_MAIN_ITEM_VARIABLE.
    
    The keyboard-touchpad combo never actually generates this report, except
    when the touchpad is toggled on/off with the Fn + F7 hotkey combo. The
    toggle on/off is handled inside the keyboard-dock, when the touchpad is
    toggled off it simply stops sending events.
    
    When the touchpad is toggled on/off an INPUT(4) report is generated with
    the first content byte set to 120/121, before this commit the kernel
    would report this as ABS_MISC 120/121 events.
    
    Patch the descriptor to replace the HID_MAIN_ITEM_VARIABLE with
    HID_MAIN_ITEM_RELATIVE (because no key-presss release events are send)
    and add mappings for the 0x00880078 and 0x00880079 usages to generate
    touchpad on/off key events when the touchpad is toggled on/off.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c
index 044a93f3c117..742c052b0110 100644
--- a/drivers/hid/hid-ite.c
+++ b/drivers/hid/hid-ite.c
@@ -11,6 +11,48 @@
 
 #include "hid-ids.h"
 
+#define QUIRK_TOUCHPAD_ON_OFF_REPORT		BIT(0)
+
+static __u8 *ite_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize)
+{
+	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+
+	if (quirks & QUIRK_TOUCHPAD_ON_OFF_REPORT) {
+		if (*rsize == 188 && rdesc[162] == 0x81 && rdesc[163] == 0x02) {
+			hid_info(hdev, "Fixing up ITE keyboard report descriptor\n");
+			rdesc[163] = HID_MAIN_ITEM_RELATIVE;
+		}
+	}
+
+	return rdesc;
+}
+
+static int ite_input_mapping(struct hid_device *hdev,
+		struct hid_input *hi, struct hid_field *field,
+		struct hid_usage *usage, unsigned long **bit,
+		int *max)
+{
+
+	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+
+	if ((quirks & QUIRK_TOUCHPAD_ON_OFF_REPORT) &&
+	    (usage->hid & HID_USAGE_PAGE) == 0x00880000) {
+		if (usage->hid == 0x00880078) {
+			/* Touchpad on, userspace expects F22 for this */
+			hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_F22);
+			return 1;
+		}
+		if (usage->hid == 0x00880079) {
+			/* Touchpad off, userspace expects F23 for this */
+			hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_F23);
+			return 1;
+		}
+		return -1;
+	}
+
+	return 0;
+}
+
 static int ite_event(struct hid_device *hdev, struct hid_field *field,
 		     struct hid_usage *usage, __s32 value)
 {
@@ -37,13 +79,27 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field,
 	return 0;
 }
 
+static int ite_probe(struct hid_device *hdev, const struct hid_device_id *id)
+{
+	int ret;
+
+	hid_set_drvdata(hdev, (void *)id->driver_data);
+
+	ret = hid_open_report(hdev);
+	if (ret)
+		return ret;
+
+	return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+}
+
 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) },
+		     USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012),
+	  .driver_data = QUIRK_TOUCHPAD_ON_OFF_REPORT },
 	/* ITE8910 USB kbd ctlr, with Synaptics touchpad connected to it. */
 	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
 		     USB_VENDOR_ID_SYNAPTICS,
@@ -55,6 +111,9 @@ MODULE_DEVICE_TABLE(hid, ite_devices);
 static struct hid_driver ite_driver = {
 	.name = "itetech",
 	.id_table = ite_devices,
+	.probe = ite_probe,
+	.report_fixup = ite_report_fixup,
+	.input_mapping = ite_input_mapping,
 	.event = ite_event,
 };
 module_hid_driver(ite_driver);
commit b59f38dbfd5d19eb7e03d8b639f0c0d385ba8cc5
Author: Harry Cutts <hcutts at chromium.org>
Date:   Wed Oct 21 06:56:12 2020 -0700

    HID: logitech-hidpp: Add PID for MX Anywhere 2
    
    It seems that the PID 0x4072 was missing from the list Logitech gave me
    for this mouse, as I found one with it in the wild (with which I tested
    this patch).
    
    Fixes: 4435ff2f09a2 ("HID: logitech: Enable high-resolution scrolling on Logitech mice")
    Signed-off-by: Harry Cutts <hcutts at chromium.org>
    Acked-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index b8b53dc95e86..730036650f7d 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -3947,6 +3947,7 @@ static const struct hid_device_id hidpp_devices[] = {
 	  LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
 	{ /* Mouse Logitech MX Anywhere 2 */
 	  LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
+	{ LDJ_DEVICE(0x4072), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
 	{ LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
 	{ LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
 	{ LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
commit 022fc5315b7aff69d3df2c953b892a6232642d50
Author: Martijn van de Streek <martijn at zeewinde.xyz>
Date:   Fri Oct 16 08:38:05 2020 +0200

    HID: uclogic: Add ID for Trust Flex Design Tablet
    
    The Trust Flex Design Tablet has an UGTizer USB ID and requires the same
    initialization as the UGTizer GP0610 to be detected as a graphics tablet
    instead of a mouse.
    
    Signed-off-by: Martijn van de Streek <martijn at zeewinde.xyz>
    Signed-off-by: Jiri Kosina <jkosina at suse.cz>

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index d69842f79fc6..49d68bbf4852 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -1298,6 +1298,7 @@
 
 #define USB_VENDOR_ID_UGTIZER			0x2179
 #define USB_DEVICE_ID_UGTIZER_TABLET_GP0610	0x0053
+#define USB_DEVICE_ID_UGTIZER_TABLET_GT5040	0x0077
 
 #define USB_VENDOR_ID_VIEWSONIC			0x0543
 #define USB_DEVICE_ID_VIEWSONIC_PD1011		0xe621
diff --git a/drivers/hid/hid-uclogic-core.c b/drivers/hid/hid-uclogic-core.c
index 86b568037cb8..8e9c9e646cb7 100644
--- a/drivers/hid/hid-uclogic-core.c
+++ b/drivers/hid/hid-uclogic-core.c
@@ -385,6 +385,8 @@ static const struct hid_device_id uclogic_devices[] = {
 				USB_DEVICE_ID_UCLOGIC_DRAWIMAGE_G3) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER,
 				USB_DEVICE_ID_UGTIZER_TABLET_GP0610) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER,
+				USB_DEVICE_ID_UGTIZER_TABLET_GT5040) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_UGEE,
 				USB_DEVICE_ID_UGEE_TABLET_G5) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_UGEE,
diff --git a/drivers/hid/hid-uclogic-params.c b/drivers/hid/hid-uclogic-params.c
index 7d20d1fcf8d2..d26d8cd98efc 100644
--- a/drivers/hid/hid-uclogic-params.c
+++ b/drivers/hid/hid-uclogic-params.c
@@ -997,6 +997,8 @@ int uclogic_params_init(struct uclogic_params *params,
 		break;
 	case VID_PID(USB_VENDOR_ID_UGTIZER,
 		     USB_DEVICE_ID_UGTIZER_TABLET_GP0610):
+	case VID_PID(USB_VENDOR_ID_UGTIZER,
+		     USB_DEVICE_ID_UGTIZER_TABLET_GT5040):
 	case VID_PID(USB_VENDOR_ID_UGEE,
 		     USB_DEVICE_ID_UGEE_XPPEN_TABLET_G540):
 	case VID_PID(USB_VENDOR_ID_UGEE,
commit 4be61e6b769fc3f97b58870aa4258e27968f07e1
Author: Alexander Monakov <amonakov at ispras.ru>
Date:   Sun Aug 23 23:27:02 2020 +0300

    tools/power turbostat: Build with _FILE_OFFSET_BITS=64
    
    For compatibility reasons, Glibc off_t is a 32-bit type on 32-bit x86
    unless _FILE_OFFSET_BITS=64 is defined. Add this define, as otherwise
    reading MSRs with index 0x80000000 and above attempts a pread with a
    negative offset, which fails.
    
    Signed-off-by: Alexander Monakov <amonakov at ispras.ru>
    Tested-by: Liwei Song <liwei.song at windriver.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/Makefile b/tools/power/x86/turbostat/Makefile
index d08765531bcb..f3e3c94ab9bd 100644
--- a/tools/power/x86/turbostat/Makefile
+++ b/tools/power/x86/turbostat/Makefile
@@ -12,6 +12,7 @@ turbostat : turbostat.c
 override CFLAGS +=	-O2 -Wall -I../../../include
 override CFLAGS +=	-DMSRHEADER='"../../../../arch/x86/include/asm/msr-index.h"'
 override CFLAGS +=	-DINTEL_FAMILY_HEADER='"../../../../arch/x86/include/asm/intel-family.h"'
+override CFLAGS +=	-D_FILE_OFFSET_BITS=64
 override CFLAGS +=	-D_FORTIFY_SOURCE=2
 
 %: %.c
commit 33eb82251af9be47a625ca1578f44e596a3a0ca9
Author: Kim Phillips <kim.phillips at amd.com>
Date:   Mon Aug 17 17:42:15 2020 -0500

    tools/power turbostat: Support AMD Family 19h
    
    Family 19h processors have the same RAPL (Running average power limit)
    hardware register interface as Family 17h processors.
    
    Change the family checks to succeed for Family 17h and above to enable
    core and package energy measurement on Family 19h machines.
    
    Also update the TDP to the largest found at the bottom of the page at
    amd.com->processors->servers->epyc->2nd-gen-epyc, i.e., the EPYC 7H12.
    
    Signed-off-by: Kim Phillips <kim.phillips at amd.com>
    Cc: Len Brown <len.brown at intel.com>
    Cc: Len Brown <lenb at kernel.org>
    Cc: linux-pm at vger.kernel.org
    Cc: linux-kernel at vger.kernel.org
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 629b809075c1..0869f791ed14 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -4162,13 +4162,8 @@ double get_tdp_intel(unsigned int model)
 
 double get_tdp_amd(unsigned int family)
 {
-	switch (family) {
-	case 0x17:
-	case 0x18:
-	default:
-		/* This is the max stock TDP of HEDT/Server Fam17h chips */
-		return 250.0;
-	}
+	/* This is the max stock TDP of HEDT/Server Fam17h+ chips */
+	return 280.0;
 }
 
 /*
@@ -4358,27 +4353,20 @@ void rapl_probe_amd(unsigned int family, unsigned int model)
 
 	if (max_extended_level >= 0x80000007) {
 		__cpuid(0x80000007, eax, ebx, ecx, edx);
-		/* RAPL (Fam 17h) */
+		/* RAPL (Fam 17h+) */
 		has_rapl = edx & (1 << 14);
 	}
 
-	if (!has_rapl)
+	if (!has_rapl || family < 0x17)
 		return;
 
-	switch (family) {
-	case 0x17: /* Zen, Zen+ */
-	case 0x18: /* Hygon Dhyana */
-		do_rapl = RAPL_AMD_F17H | RAPL_PER_CORE_ENERGY;
-		if (rapl_joules) {
-			BIC_PRESENT(BIC_Pkg_J);
-			BIC_PRESENT(BIC_Cor_J);
-		} else {
-			BIC_PRESENT(BIC_PkgWatt);
-			BIC_PRESENT(BIC_CorWatt);
-		}
-		break;
-	default:
-		return;
+	do_rapl = RAPL_AMD_F17H | RAPL_PER_CORE_ENERGY;
+	if (rapl_joules) {
+		BIC_PRESENT(BIC_Pkg_J);
+		BIC_PRESENT(BIC_Cor_J);
+	} else {
+		BIC_PRESENT(BIC_PkgWatt);
+		BIC_PRESENT(BIC_CorWatt);
 	}
 
 	if (get_msr(base_cpu, MSR_RAPL_PWR_UNIT, &msr))
commit 20de0dab238849414d33c81bc96e2db68cc61467
Author: Antti Laakso <antti.laakso at linux.intel.com>
Date:   Mon Aug 17 18:03:48 2020 +0300

    tools/power turbostat: Remove empty columns for Jacobsville
    
    Jacobsville doesn't have Package C2 and C6. Also
    Core and DRAM RAPL are not available. Adjust output
    accordingly.
    
    Signed-off-by: Antti Laakso <antti.laakso at linux.intel.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 7a6e91aedf0f..629b809075c1 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -2286,6 +2286,7 @@ int has_turbo_ratio_group_limits(int family, int model)
 	case INTEL_FAM6_ATOM_GOLDMONT:
 	case INTEL_FAM6_SKYLAKE_X:
 	case INTEL_FAM6_ATOM_GOLDMONT_D:
+	case INTEL_FAM6_ATOM_TREMONT_D:
 		return 1;
 	}
 	return 0;
@@ -3534,6 +3535,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
 	case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
 	case INTEL_FAM6_ATOM_GOLDMONT_D:	/* DNV */
 	case INTEL_FAM6_ATOM_TREMONT:	/* EHL */
+	case INTEL_FAM6_ATOM_TREMONT_D: /* JVL */
 		pkg_cstate_limits = glm_pkg_cstate_limits;
 		break;
 	default:
@@ -3616,6 +3618,17 @@ int is_ehl(unsigned int family, unsigned int model)
 	}
 	return 0;
 }
+int is_jvl(unsigned int family, unsigned int model)
+{
+	if (!genuine_intel)
+		return 0;
+
+	switch (model) {
+	case INTEL_FAM6_ATOM_TREMONT_D:
+		return 1;
+	}
+	return 0;
+}
 
 int has_turbo_ratio_limit(unsigned int family, unsigned int model)
 {
@@ -4227,6 +4240,14 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
 			BIC_PRESENT(BIC_GFXWatt);
 		}
 		break;
+	case INTEL_FAM6_ATOM_TREMONT_D:	/* JVL */
+		do_rapl = RAPL_PKG | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO;
+		BIC_PRESENT(BIC_PKG__);
+		if (rapl_joules)
+			BIC_PRESENT(BIC_Pkg_J);
+		else
+			BIC_PRESENT(BIC_PkgWatt);
+		break;
 	case INTEL_FAM6_SKYLAKE_L:	/* SKL */
 	case INTEL_FAM6_CANNONLAKE_L:	/* CNL */
 		do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO;
@@ -4629,6 +4650,7 @@ int has_snb_msrs(unsigned int family, unsigned int model)
 	case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
 	case INTEL_FAM6_ATOM_GOLDMONT_D:	/* DNV */
 	case INTEL_FAM6_ATOM_TREMONT:		/* EHL */
+	case INTEL_FAM6_ATOM_TREMONT_D:		/* JVL */
 		return 1;
 	}
 	return 0;
@@ -4958,9 +4980,6 @@ unsigned int intel_model_duplicates(unsigned int model)
 	case INTEL_FAM6_ALDERLAKE:
 		return INTEL_FAM6_CANNONLAKE_L;
 
-	case INTEL_FAM6_ATOM_TREMONT_D:
-		return INTEL_FAM6_ATOM_GOLDMONT_D;
-
 	case INTEL_FAM6_ATOM_TREMONT_L:
 		return INTEL_FAM6_ATOM_TREMONT;
 
@@ -5214,6 +5233,14 @@ void process_cpuid()
 		BIC_PRESENT(BIC_Mod_c6);
 		use_c1_residency_msr = 1;
 	}
+	if (is_jvl(family, model)) {
+		BIC_NOT_PRESENT(BIC_CPU_c3);
+		BIC_NOT_PRESENT(BIC_CPU_c7);
+		BIC_NOT_PRESENT(BIC_Pkgpc2);
+		BIC_NOT_PRESENT(BIC_Pkgpc3);
+		BIC_NOT_PRESENT(BIC_Pkgpc6);
+		BIC_NOT_PRESENT(BIC_Pkgpc7);
+	}
 	if (is_dnv(family, model)) {
 		BIC_PRESENT(BIC_CPU_c1);
 		BIC_NOT_PRESENT(BIC_CPU_c3);
commit b4b9156953fea108a9540c262e48eafeeff99ab0
Author: Rafael Antognolli <rafael.antognolli at intel.com>
Date:   Wed Apr 22 15:02:07 2020 -0700

    tools/power turbostat: Add a new GFXAMHz column that exposes gt_act_freq_mhz.
    
    The column already present called GFXMHz reads from gt_cur_freq_mhz,
    which represents the GT frequency that was requested, but power
    management might not be able to do that. So the new column will display
    what the actual frequency GT is running at.
    
    Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 72c0b19db36e..7a6e91aedf0f 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -79,6 +79,7 @@ unsigned long long  gfx_cur_rc6_ms;
 unsigned long long cpuidle_cur_cpu_lpi_us;
 unsigned long long cpuidle_cur_sys_lpi_us;
 unsigned int gfx_cur_mhz;
+unsigned int gfx_act_mhz;
 unsigned int tcc_activation_temp;
 unsigned int tcc_activation_temp_override;
 double rapl_power_units, rapl_time_units;
@@ -210,6 +211,7 @@ struct pkg_data {
 	unsigned long long pkg_both_core_gfxe_c0;
 	long long gfx_rc6_ms;
 	unsigned int gfx_mhz;
+	unsigned int gfx_act_mhz;
 	unsigned int package_id;
 	unsigned long long energy_pkg;	/* MSR_PKG_ENERGY_STATUS */
 	unsigned long long energy_dram;	/* MSR_DRAM_ENERGY_STATUS */
@@ -558,6 +560,7 @@ struct msr_counter bic[] = {
 	{ 0x0, "APIC" },
 	{ 0x0, "X2APIC" },
 	{ 0x0, "Die" },
+	{ 0x0, "GFXAMHz" },
 };
 
 #define MAX_BIC (sizeof(bic) / sizeof(struct msr_counter))
@@ -612,6 +615,7 @@ struct msr_counter bic[] = {
 #define	BIC_APIC	(1ULL << 48)
 #define	BIC_X2APIC	(1ULL << 49)
 #define	BIC_Die		(1ULL << 50)
+#define	BIC_GFXACTMHz	(1ULL << 51)
 
 #define BIC_DISABLED_BY_DEFAULT	(BIC_USEC | BIC_TOD | BIC_APIC | BIC_X2APIC)
 
@@ -831,6 +835,9 @@ void print_header(char *delim)
 	if (DO_BIC(BIC_GFXMHz))
 		outp += sprintf(outp, "%sGFXMHz", (printed++ ? delim : ""));
 
+	if (DO_BIC(BIC_GFXACTMHz))
+		outp += sprintf(outp, "%sGFXAMHz", (printed++ ? delim : ""));
+
 	if (DO_BIC(BIC_Totl_c0))
 		outp += sprintf(outp, "%sTotl%%C0", (printed++ ? delim : ""));
 	if (DO_BIC(BIC_Any_c0))
@@ -1198,6 +1205,10 @@ int format_counters(struct thread_data *t, struct core_data *c,
 	if (DO_BIC(BIC_GFXMHz))
 		outp += sprintf(outp, "%s%d", (printed++ ? delim : ""), p->gfx_mhz);
 
+	/* GFXACTMHz */
+	if (DO_BIC(BIC_GFXACTMHz))
+		outp += sprintf(outp, "%s%d", (printed++ ? delim : ""), p->gfx_act_mhz);
+
 	/* Totl%C0, Any%C0 GFX%C0 CPUGFX% */
 	if (DO_BIC(BIC_Totl_c0))
 		outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_wtd_core_c0/tsc);
@@ -1349,6 +1360,7 @@ delta_package(struct pkg_data *new, struct pkg_data *old)
 		old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms;
 
 	old->gfx_mhz = new->gfx_mhz;
+	old->gfx_act_mhz = new->gfx_act_mhz;
 
 	old->energy_pkg = new->energy_pkg - old->energy_pkg;
 	old->energy_cores = new->energy_cores - old->energy_cores;
@@ -1565,6 +1577,7 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data
 
 	p->gfx_rc6_ms = 0;
 	p->gfx_mhz = 0;
+	p->gfx_act_mhz = 0;
 	for (i = 0, mp = sys.tp; mp; i++, mp = mp->next)
 		t->counter[i] = 0;
 
@@ -1660,6 +1673,7 @@ int sum_counters(struct thread_data *t, struct core_data *c,
 
 	average.packages.gfx_rc6_ms = p->gfx_rc6_ms;
 	average.packages.gfx_mhz = p->gfx_mhz;
+	average.packages.gfx_act_mhz = p->gfx_act_mhz;
 
 	average.packages.pkg_temp_c = MAX(average.packages.pkg_temp_c, p->pkg_temp_c);
 
@@ -2108,6 +2122,9 @@ retry:
 	if (DO_BIC(BIC_GFXMHz))
 		p->gfx_mhz = gfx_cur_mhz;
 
+	if (DO_BIC(BIC_GFXACTMHz))
+		p->gfx_act_mhz = gfx_act_mhz;
+
 	for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) {
 		if (get_mp(cpu, mp, &p->counter[i]))
 			return -10;
@@ -3018,6 +3035,33 @@ int snapshot_gfx_mhz(void)
 	return 0;
 }
 
+/*
+ * snapshot_gfx_cur_mhz()
+ *
+ * record snapshot of
+ * /sys/class/graphics/fb0/device/drm/card0/gt_act_freq_mhz
+ *
+ * return 1 if config change requires a restart, else return 0
+ */
+int snapshot_gfx_act_mhz(void)
+{
+	static FILE *fp;
+	int retval;
+
+	if (fp == NULL)
+		fp = fopen_or_die("/sys/class/graphics/fb0/device/drm/card0/gt_act_freq_mhz", "r");
+	else {
+		rewind(fp);
+		fflush(fp);
+	}
+
+	retval = fscanf(fp, "%d", &gfx_act_mhz);
+	if (retval != 1)
+		err(1, "GFX ACT MHz");
+
+	return 0;
+}
+
 /*
  * snapshot_cpu_lpi()
  *
@@ -3083,6 +3127,9 @@ int snapshot_proc_sysfs_files(void)
 	if (DO_BIC(BIC_GFXMHz))
 		snapshot_gfx_mhz();
 
+	if (DO_BIC(BIC_GFXACTMHz))
+		snapshot_gfx_act_mhz();
+
 	if (DO_BIC(BIC_CPU_LPI))
 		snapshot_cpu_lpi_us();
 
@@ -5236,6 +5283,9 @@ void process_cpuid()
 	if (!access("/sys/class/graphics/fb0/device/drm/card0/gt_cur_freq_mhz", R_OK))
 		BIC_PRESENT(BIC_GFXMHz);
 
+	if (!access("/sys/class/graphics/fb0/device/drm/card0/gt_act_freq_mhz", R_OK))
+		BIC_PRESENT(BIC_GFXACTMHz);
+
 	if (!access("/sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us", R_OK))
 		BIC_PRESENT(BIC_CPU_LPI);
 	else
commit 0936cdfbb527a4fa2559292069ebff2e8cf2c843
Author: Ondřej Lysoněk <olysonek at redhat.com>
Date:   Fri Mar 27 08:27:12 2020 +0100

    tools/power x86_energy_perf_policy: Input/output error in a VM
    
    I've encountered an issue with x86_energy_perf_policy. If I run it on a
    machine that I'm told is a qemu-kvm virtual machine running inside a
    privileged container, I get the following error:
    
    x86_energy_perf_policy: /dev/cpu/0/msr offset 0x1ad read failed: Input/output error
    
    I get the same error in a Digital Ocean droplet, so that might be a
    similar environment.
    
    I created the following patch which is intended to give a more
    user-friendly message. It's based on a patch for turbostat from Prarit
    Bhargava that was posted some time ago. The patch is "[v2] turbostat:
    Running on virtual machine is not supported" [1].
    
    Given my limited knowledge of the topic, I can't say with confidence
    that this is the right solution, though (that's why this is not an
    official patch submission). Also, I'm not sure what the convention with
    exit codes is in this tool. Also, instead of the error message, perhaps
    the tool should just not print anything in this case, which is how it
    behaves in a "regular" VM?
    
    [1] https://patchwork.kernel.org/patch/9868587/
    
    Signed-off-by: Ondřej Lysoněk <olysonek at redhat.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c b/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c
index 3fe1eed900d4..ff6c6661f075 100644
--- a/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c
+++ b/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c
@@ -622,6 +622,57 @@ void cmdline(int argc, char **argv)
 	}
 }
 
+/*
+ * Open a file, and exit on failure
+ */
+FILE *fopen_or_die(const char *path, const char *mode)
+{
+	FILE *filep = fopen(path, "r");
+
+	if (!filep)
+		err(1, "%s: open failed", path);
+	return filep;
+}
+
+void err_on_hypervisor(void)
+{
+	FILE *cpuinfo;
+	char *flags, *hypervisor;
+	char *buffer;
+
+	/* On VMs /proc/cpuinfo contains a "flags" entry for hypervisor */
+	cpuinfo = fopen_or_die("/proc/cpuinfo", "ro");
+
+	buffer = malloc(4096);
+	if (!buffer) {
+		fclose(cpuinfo);
+		err(-ENOMEM, "buffer malloc fail");
+	}
+
+	if (!fread(buffer, 1024, 1, cpuinfo)) {
+		fclose(cpuinfo);
+		free(buffer);
+		err(1, "Reading /proc/cpuinfo failed");
+	}
+
+	flags = strstr(buffer, "flags");
+	rewind(cpuinfo);
+	fseek(cpuinfo, flags - buffer, SEEK_SET);
+	if (!fgets(buffer, 4096, cpuinfo)) {
+		fclose(cpuinfo);
+		free(buffer);
+		err(1, "Reading /proc/cpuinfo failed");
+	}
+	fclose(cpuinfo);
+
+	hypervisor = strstr(buffer, "hypervisor");
+
+	free(buffer);
+
+	if (hypervisor)
+		err(-1,
+		    "not supported on this virtual machine");
+}
 
 int get_msr(int cpu, int offset, unsigned long long *msr)
 {
@@ -635,8 +686,10 @@ int get_msr(int cpu, int offset, unsigned long long *msr)
 		err(-1, "%s open failed, try chown or chmod +r /dev/cpu/*/msr, or run as root", pathname);
 
 	retval = pread(fd, msr, sizeof(*msr), offset);
-	if (retval != sizeof(*msr))
+	if (retval != sizeof(*msr)) {
+		err_on_hypervisor();
 		err(-1, "%s offset 0x%llx read failed", pathname, (unsigned long long)offset);
+	}
 
 	if (debug > 1)
 		fprintf(stderr, "get_msr(cpu%d, 0x%X, 0x%llX)\n", cpu, offset, *msr);
@@ -1086,18 +1139,6 @@ int update_cpu_msrs(int cpu)
 	return 0;
 }
 
-/*
- * Open a file, and exit on failure
- */
-FILE *fopen_or_die(const char *path, const char *mode)
-{
-	FILE *filep = fopen(path, "r");
-
-	if (!filep)
-		err(1, "%s: open failed", path);
-	return filep;
-}
-
 unsigned int get_pkg_num(int cpu)
 {
 	FILE *fp;
commit c315a09b1b0f491c27d46e9d05f397023a44fb81
Author: Len Brown <len.brown at intel.com>
Date:   Thu Aug 13 19:18:22 2020 -0400

    tools/power turbostat: Skip pc8, pc9, pc10 columns, if they are disabled
    
    Like we skip PC3 and PC6 columns when the package C-state limit
    disables them, skip PC8/PC9/CP10 under analogous conditions.
    
    Reported-by: Zhang Rui <rui.zhang at intel.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 4ee4e3067681..72c0b19db36e 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -5186,9 +5186,12 @@ void process_cpuid()
 		BIC_NOT_PRESENT(BIC_Pkgpc7);
 	}
 	if (has_c8910_msrs(family, model)) {
-		BIC_PRESENT(BIC_Pkgpc8);
-		BIC_PRESENT(BIC_Pkgpc9);
-		BIC_PRESENT(BIC_Pkgpc10);
+		if (pkg_cstate_limit >= PCL__8)
+			BIC_PRESENT(BIC_Pkgpc8);
+		if (pkg_cstate_limit >= PCL__9)
+			BIC_PRESENT(BIC_Pkgpc9);
+		if (pkg_cstate_limit >= PCL_10)
+			BIC_PRESENT(BIC_Pkgpc10);
 	}
 	do_irtl_hsw = has_c8910_msrs(family, model);
 	if (has_skl_msrs(family, model)) {
commit e7af1ed3fa4756e8df8270a8635d852a94266061
Author: Len Brown <len.brown at intel.com>
Date:   Thu Aug 13 19:06:03 2020 -0400

    tools/power turbostat: Support additional CPU model numbers
    
    Initial support for models recently added to intel-family.h.
    
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 56b93e0d9415..4ee4e3067681 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -4906,6 +4906,9 @@ unsigned int intel_model_duplicates(unsigned int model)
 	case INTEL_FAM6_ICELAKE_NNPI:
 	case INTEL_FAM6_TIGERLAKE_L:
 	case INTEL_FAM6_TIGERLAKE:
+	case INTEL_FAM6_ROCKETLAKE:
+	case INTEL_FAM6_LAKEFIELD:
+	case INTEL_FAM6_ALDERLAKE:
 		return INTEL_FAM6_CANNONLAKE_L;
 
 	case INTEL_FAM6_ATOM_TREMONT_D:
@@ -4915,6 +4918,7 @@ unsigned int intel_model_duplicates(unsigned int model)
 		return INTEL_FAM6_ATOM_TREMONT;
 
 	case INTEL_FAM6_ICELAKE_X:
+	case INTEL_FAM6_SAPPHIRERAPIDS_X:
 		return INTEL_FAM6_SKYLAKE_X;
 	}
 	return model;
commit fecb3bc839df64761cc63c9ee9b45c1cad36aee8
Author: David Arcari <darcari at redhat.com>
Date:   Mon Aug 10 10:43:30 2020 -0400

    tools/power turbostat: Fix output formatting for ACPI CST enumeration
    
    turbostat formatting is broken with ACPI CST for enumeration.  The
    problem is that the CX_ACPI% is eight characters long which does not
    work with tab formatting.  One simple solution is to remove the underbar
    from the state name such that C1_ACPI will be displayed as C1ACPI.
    
    Signed-off-by: David Arcari <darcari at redhat.com>
    Cc: Len Brown <lenb at kernel.org>
    Cc: linux-kernel at vger.kernel.org
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 151a70f2311b..56b93e0d9415 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -3682,6 +3682,20 @@ int has_config_tdp(unsigned int family, unsigned int model)
 	}
 }
 
+static void
+remove_underbar(char *s)
+{
+	char *to = s;
+
+	while (*s) {
+		if (*s != '_')
+			*to++ = *s;
+		s++;
+	}
+
+	*to = 0;
+}
+
 static void
 dump_cstate_pstate_config_info(unsigned int family, unsigned int model)
 {
@@ -3764,6 +3778,8 @@ dump_sysfs_cstate_config(void)
 		*sp = '\0';
 		fclose(input);
 
+		remove_underbar(name_buf);
+
 		sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/desc",
 			base_cpu, state);
 		input = fopen(path, "r");
@@ -5830,6 +5846,8 @@ void probe_sysfs(void)
 		*sp = '%';
 		*(sp + 1) = '\0';
 
+		remove_underbar(name_buf);
+
 		fclose(input);
 
 		sprintf(path, "cpuidle/state%d/time", state);
@@ -5857,6 +5875,8 @@ void probe_sysfs(void)
 		*sp = '\0';
 		fclose(input);
 
+		remove_underbar(name_buf);
+
 		sprintf(path, "cpuidle/state%d/usage", state);
 
 		if (is_deferred_skip(name_buf))
commit b88cad57d4d32bb5c53cd8e0ce3a1971062142af
Author: Alexander A. Klimov <grandmaster at al2klimov.de>
Date:   Wed Jul 8 12:55:30 2020 +0200

    tools/power turbostat: Replace HTTP links with HTTPS ones: TURBOSTAT UTILITY
    
    Rationale:
    Reduces attack surface on kernel devs opening the links for MITM
    as HTTPS traffic is much harder to manipulate.
    
    Deterministic algorithm:
    For each file:
      If not .svg:
        For each line:
          If doesn't contain `\bxmlns\b`:
            For each link, `\bhttp://[^# \t\r\n]*(?:\w|/)`:
              If neither `\bgnu\.org/license`, nor `\bmozilla\.org/MPL\b`:
                If both the HTTP and HTTPS versions
                return 200 OK and serve the same content:
                  Replace HTTP with HTTPS.
    
    Signed-off-by: Alexander A. Klimov <grandmaster at al2klimov.de>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8
index a6db83a88e85..f6b7e85b121c 100644
--- a/tools/power/x86/turbostat/turbostat.8
+++ b/tools/power/x86/turbostat/turbostat.8
@@ -335,7 +335,7 @@ that they count at TSC rate, which is true on all processors tested to date.
 
 .SH REFERENCES
 Volume 3B: System Programming Guide"
-http://www.intel.com/products/processor/manuals/
+https://www.intel.com/products/processor/manuals/
 
 .SH FILES
 .ta
commit 8201a0285789fade1c5b031914577e2b27a64f05
Author: Prarit Bhargava <prarit at redhat.com>
Date:   Mon Jun 29 15:26:57 2020 -0400

    tools/power turbostat: Use sched_getcpu() instead of hardcoded cpu 0
    
    Disabling cpu 0 results in an error
    
    turbostat: /sys/devices/system/cpu/cpu0/topology/thread_siblings: open failed: No such file or directory
    
    Use sched_getcpu() instead of a hardcoded cpu 0 to get the max cpu number.
    
    Signed-off-by: Prarit Bhargava <prarit at redhat.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 66c468262020..151a70f2311b 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -2865,12 +2865,19 @@ void re_initialize(void)
 void set_max_cpu_num(void)
 {
 	FILE *filep;
+	int base_cpu;
 	unsigned long dummy;
+	char pathname[64];
 
+	base_cpu = sched_getcpu();
+	if (base_cpu < 0)
+		err(1, "cannot find calling cpu ID");
+	sprintf(pathname,
+		"/sys/devices/system/cpu/cpu%d/topology/thread_siblings",
+		base_cpu);
+
+	filep = fopen_or_die(pathname, "r");
 	topo.max_cpu_num = 0;
-	filep = fopen_or_die(
-			"/sys/devices/system/cpu/cpu0/topology/thread_siblings",
-			"r");
 	while (fscanf(filep, "%lx,", &dummy) == 1)
 		topo.max_cpu_num += BITMASK_SIZE;
 	fclose(filep);
commit 9972d5d84d76982606806b2ce887f70c2f8ba60a
Author: Chen Yu <yu.c.chen at intel.com>
Date:   Sat Apr 18 16:32:05 2020 +0800

    tools/power turbostat: Enable accumulate RAPL display
    
    Enable the accumulated RAPL display by default.
    
    Signed-off-by: Chen Yu <yu.c.chen at intel.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index c1759f6c84a8..66c468262020 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -1169,14 +1169,7 @@ int format_counters(struct thread_data *t, struct core_data *c,
 		}
 	}
 
-	/*
-	 * If measurement interval exceeds minimum RAPL Joule Counter range,
-	 * indicate that results are suspect by printing "**" in fraction place.
-	 */
-	if (interval_float < rapl_joule_counter_range)
-		fmt8 = "%s%.2f";
-	else
-		fmt8 = "%6.0f**";
+	fmt8 = "%s%.2f";
 
 	if (DO_BIC(BIC_CorWatt) && (do_rapl & RAPL_PER_CORE_ENERGY))
 		outp += sprintf(outp, fmt8, (printed++ ? delim : ""), c->core_energy * rapl_energy_units / interval_float);
@@ -2069,39 +2062,39 @@ retry:
 		p->sys_lpi = cpuidle_cur_sys_lpi_us;
 
 	if (do_rapl & RAPL_PKG) {
-		if (get_msr(cpu, MSR_PKG_ENERGY_STATUS, &msr))
+		if (get_msr_sum(cpu, MSR_PKG_ENERGY_STATUS, &msr))
 			return -13;
-		p->energy_pkg = msr & 0xFFFFFFFF;
+		p->energy_pkg = msr;
 	}
 	if (do_rapl & RAPL_CORES_ENERGY_STATUS) {
-		if (get_msr(cpu, MSR_PP0_ENERGY_STATUS, &msr))
+		if (get_msr_sum(cpu, MSR_PP0_ENERGY_STATUS, &msr))
 			return -14;
-		p->energy_cores = msr & 0xFFFFFFFF;
+		p->energy_cores = msr;
 	}
 	if (do_rapl & RAPL_DRAM) {
-		if (get_msr(cpu, MSR_DRAM_ENERGY_STATUS, &msr))
+		if (get_msr_sum(cpu, MSR_DRAM_ENERGY_STATUS, &msr))
 			return -15;
-		p->energy_dram = msr & 0xFFFFFFFF;
+		p->energy_dram = msr;
 	}
 	if (do_rapl & RAPL_GFX) {
-		if (get_msr(cpu, MSR_PP1_ENERGY_STATUS, &msr))
+		if (get_msr_sum(cpu, MSR_PP1_ENERGY_STATUS, &msr))
 			return -16;
-		p->energy_gfx = msr & 0xFFFFFFFF;
+		p->energy_gfx = msr;
 	}
 	if (do_rapl & RAPL_PKG_PERF_STATUS) {
-		if (get_msr(cpu, MSR_PKG_PERF_STATUS, &msr))
+		if (get_msr_sum(cpu, MSR_PKG_PERF_STATUS, &msr))
 			return -16;
-		p->rapl_pkg_perf_status = msr & 0xFFFFFFFF;
+		p->rapl_pkg_perf_status = msr;
 	}
 	if (do_rapl & RAPL_DRAM_PERF_STATUS) {
-		if (get_msr(cpu, MSR_DRAM_PERF_STATUS, &msr))
+		if (get_msr_sum(cpu, MSR_DRAM_PERF_STATUS, &msr))
 			return -16;
-		p->rapl_dram_perf_status = msr & 0xFFFFFFFF;
+		p->rapl_dram_perf_status = msr;
 	}
 	if (do_rapl & RAPL_AMD_F17H) {
-		if (get_msr(cpu, MSR_PKG_ENERGY_STAT, &msr))
+		if (get_msr_sum(cpu, MSR_PKG_ENERGY_STAT, &msr))
 			return -13;
-		p->energy_pkg = msr & 0xFFFFFFFF;
+		p->energy_pkg = msr;
 	}
 	if (DO_BIC(BIC_PkgTmp)) {
 		if (get_msr(cpu, MSR_IA32_PACKAGE_THERM_STATUS, &msr))
@@ -6101,6 +6094,7 @@ int main(int argc, char **argv)
 		return 0;
 	}
 
+	msr_sum_record();
 	/*
 	 * if any params left, it must be a command to fork
 	 */
commit 87e15da95775a2ffb8c444e84f08ca982b758364
Author: Chen Yu <yu.c.chen at intel.com>
Date:   Sat Apr 18 16:31:57 2020 +0800

    tools/power turbostat: Introduce functions to accumulate RAPL consumption
    
    Since the RAPL Joule Counter is 32 bit, turbostat would
    only print a *star* instead of printing the actual energy
    consumed to indicate the overflow due to long duration.
    This does not meet the requirement from servers as the
    sampling time of turbostat is usually very long on servers.
    
    So maintain a set of MSR buffer, and update them
    periodically before the 32bit MSR register is wrapped round,
    so as to avoid the overflow.
    
    The idea is similar to the implementation of ktime_get():
    
    Periodical MSR timer:
    total_rapl_sum += (current_rapl_msr - last_rapl_msr);
    
    Using get_msr_sum() to get the accumulated RAPL:
    return (current_rapl_msr - last_rapl_msr) + total_rapl_sum;
    
    The accumulated RAPL mechanism will be turned on in next patch.
    
    Originally-by: Aaron Lu <aaron.lwe at gmail.com>
    Reviewed-by: Doug Smythies <dsmythies at telus.net>
    Tested-by: Doug Smythies <dsmythies at telus.net>
    Signed-off-by: Chen Yu <yu.c.chen at intel.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/Makefile b/tools/power/x86/turbostat/Makefile
index 2b6551269e43..d08765531bcb 100644
--- a/tools/power/x86/turbostat/Makefile
+++ b/tools/power/x86/turbostat/Makefile
@@ -16,7 +16,7 @@ override CFLAGS +=	-D_FORTIFY_SOURCE=2
 
 %: %.c
 	@mkdir -p $(BUILD_OUTPUT)
-	$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap
+	$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap -lrt
 
 .PHONY : clean
 clean :
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 29ec1018852d..c1759f6c84a8 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -259,6 +259,113 @@ struct msr_counter {
 #define	SYSFS_PERCPU	(1 << 1)
 };
 
+/*
+ * The accumulated sum of MSR is defined as a monotonic
+ * increasing MSR, it will be accumulated periodically,
+ * despite its register's bit width.
+ */
+enum {
+	IDX_PKG_ENERGY,
+	IDX_DRAM_ENERGY,
+	IDX_PP0_ENERGY,
+	IDX_PP1_ENERGY,
+	IDX_PKG_PERF,
+	IDX_DRAM_PERF,
+	IDX_COUNT,
+};
+
+int get_msr_sum(int cpu, off_t offset, unsigned long long *msr);
+
+struct msr_sum_array {
+	/* get_msr_sum() = sum + (get_msr() - last) */
+	struct {
+		/*The accumulated MSR value is updated by the timer*/
+		unsigned long long sum;
+		/*The MSR footprint recorded in last timer*/
+		unsigned long long last;
+	} entries[IDX_COUNT];
+};
+
+/* The percpu MSR sum array.*/
+struct msr_sum_array *per_cpu_msr_sum;
+
+int idx_to_offset(int idx)
+{
+	int offset;
+
+	switch (idx) {
+	case IDX_PKG_ENERGY:
+		offset = MSR_PKG_ENERGY_STATUS;
+		break;
+	case IDX_DRAM_ENERGY:
+		offset = MSR_DRAM_ENERGY_STATUS;
+		break;
+	case IDX_PP0_ENERGY:
+		offset = MSR_PP0_ENERGY_STATUS;
+		break;
+	case IDX_PP1_ENERGY:
+		offset = MSR_PP1_ENERGY_STATUS;
+		break;
+	case IDX_PKG_PERF:
+		offset = MSR_PKG_PERF_STATUS;
+		break;
+	case IDX_DRAM_PERF:
+		offset = MSR_DRAM_PERF_STATUS;
+		break;
+	default:
+		offset = -1;
+	}
+	return offset;
+}
+
+int offset_to_idx(int offset)
+{
+	int idx;
+
+	switch (offset) {
+	case MSR_PKG_ENERGY_STATUS:
+		idx = IDX_PKG_ENERGY;
+		break;
+	case MSR_DRAM_ENERGY_STATUS:
+		idx = IDX_DRAM_ENERGY;
+		break;
+	case MSR_PP0_ENERGY_STATUS:
+		idx = IDX_PP0_ENERGY;
+		break;
+	case MSR_PP1_ENERGY_STATUS:
+		idx = IDX_PP1_ENERGY;
+		break;
+	case MSR_PKG_PERF_STATUS:
+		idx = IDX_PKG_PERF;
+		break;
+	case MSR_DRAM_PERF_STATUS:
+		idx = IDX_DRAM_PERF;
+		break;
+	default:
+		idx = -1;
+	}
+	return idx;
+}
+
+int idx_valid(int idx)
+{
+	switch (idx) {
+	case IDX_PKG_ENERGY:
+		return do_rapl & RAPL_PKG;
+	case IDX_DRAM_ENERGY:
+		return do_rapl & RAPL_DRAM;
+	case IDX_PP0_ENERGY:
+		return do_rapl & RAPL_CORES_ENERGY_STATUS;
+	case IDX_PP1_ENERGY:
+		return do_rapl & RAPL_GFX;
+	case IDX_PKG_PERF:
+		return do_rapl & RAPL_PKG_PERF_STATUS;
+	case IDX_DRAM_PERF:
+		return do_rapl & RAPL_DRAM_PERF_STATUS;
+	default:
+		return 0;
+	}
+}
 struct sys_counters {
 	unsigned int added_thread_counters;
 	unsigned int added_core_counters;
@@ -1250,12 +1357,12 @@ delta_package(struct pkg_data *new, struct pkg_data *old)
 
 	old->gfx_mhz = new->gfx_mhz;
 
-	DELTA_WRAP32(new->energy_pkg, old->energy_pkg);
-	DELTA_WRAP32(new->energy_cores, old->energy_cores);
-	DELTA_WRAP32(new->energy_gfx, old->energy_gfx);
-	DELTA_WRAP32(new->energy_dram, old->energy_dram);
-	DELTA_WRAP32(new->rapl_pkg_perf_status, old->rapl_pkg_perf_status);
-	DELTA_WRAP32(new->rapl_dram_perf_status, old->rapl_dram_perf_status);
+	old->energy_pkg = new->energy_pkg - old->energy_pkg;
+	old->energy_cores = new->energy_cores - old->energy_cores;
+	old->energy_gfx = new->energy_gfx - old->energy_gfx;
+	old->energy_dram = new->energy_dram - old->energy_dram;
+	old->rapl_pkg_perf_status = new->rapl_pkg_perf_status - old->rapl_pkg_perf_status;
+	old->rapl_dram_perf_status = new->rapl_dram_perf_status - old->rapl_dram_perf_status;
 
 	for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) {
 		if (mp->format == FORMAT_RAW)
@@ -3053,6 +3160,111 @@ void do_sleep(void)
 	}
 }
 
+int get_msr_sum(int cpu, off_t offset, unsigned long long *msr)
+{
+	int ret, idx;
+	unsigned long long msr_cur, msr_last;
+
+	if (!per_cpu_msr_sum)
+		return 1;
+
+	idx = offset_to_idx(offset);
+	if (idx < 0)
+		return idx;
+	/* get_msr_sum() = sum + (get_msr() - last) */
+	ret = get_msr(cpu, offset, &msr_cur);
+	if (ret)
+		return ret;
+	msr_last = per_cpu_msr_sum[cpu].entries[idx].last;
+	DELTA_WRAP32(msr_cur, msr_last);
+	*msr = msr_last + per_cpu_msr_sum[cpu].entries[idx].sum;
+
+	return 0;
+}
+
+timer_t timerid;
+
+/* Timer callback, update the sum of MSRs periodically. */
+static int update_msr_sum(struct thread_data *t, struct core_data *c, struct pkg_data *p)
+{
+	int i, ret;
+	int cpu = t->cpu_id;
+
+	for (i = IDX_PKG_ENERGY; i < IDX_COUNT; i++) {
+		unsigned long long msr_cur, msr_last;
+		int offset;
+
+		if (!idx_valid(i))
+			continue;
+		offset = idx_to_offset(i);
+		if (offset < 0)
+			continue;
+		ret = get_msr(cpu, offset, &msr_cur);
+		if (ret) {
+			fprintf(outf, "Can not update msr(0x%x)\n", offset);
+			continue;
+		}
+
+		msr_last = per_cpu_msr_sum[cpu].entries[i].last;
+		per_cpu_msr_sum[cpu].entries[i].last = msr_cur & 0xffffffff;
+
+		DELTA_WRAP32(msr_cur, msr_last);
+		per_cpu_msr_sum[cpu].entries[i].sum += msr_last;
+	}
+	return 0;
+}
+
+static void
+msr_record_handler(union sigval v)
+{
+	for_all_cpus(update_msr_sum, EVEN_COUNTERS);
+}
+
+void msr_sum_record(void)
+{
+	struct itimerspec its;
+	struct sigevent sev;
+
+	per_cpu_msr_sum = calloc(topo.max_cpu_num + 1, sizeof(struct msr_sum_array));
+	if (!per_cpu_msr_sum) {
+		fprintf(outf, "Can not allocate memory for long time MSR.\n");
+		return;
+	}
+	/*
+	 * Signal handler might be restricted, so use thread notifier instead.
+	 */
+	memset(&sev, 0, sizeof(struct sigevent));
+	sev.sigev_notify = SIGEV_THREAD;
+	sev.sigev_notify_function = msr_record_handler;
+
+	sev.sigev_value.sival_ptr = &timerid;
+	if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {
+		fprintf(outf, "Can not create timer.\n");
+		goto release_msr;
+	}
+
+	its.it_value.tv_sec = 0;
+	its.it_value.tv_nsec = 1;
+	/*
+	 * A wraparound time has been calculated early.
+	 * Some sources state that the peak power for a
+	 * microprocessor is usually 1.5 times the TDP rating,
+	 * use 2 * TDP for safety.
+	 */
+	its.it_interval.tv_sec = rapl_joule_counter_range / 2;
+	its.it_interval.tv_nsec = 0;
+
+	if (timer_settime(timerid, 0, &its, NULL) == -1) {
+		fprintf(outf, "Can not set timer.\n");
+		goto release_timer;
+	}
+	return;
+
+ release_timer:
+	timer_delete(timerid);
+ release_msr:
+	free(per_cpu_msr_sum);
+}
 
 void turbostat_loop()
 {
commit 7c2ccc507bd44d17227930181f937b2066565349
Author: Chen Yu <yu.c.chen at intel.com>
Date:   Sat Apr 18 16:31:47 2020 +0800

    tools/power turbostat: Make the energy variable to be 64 bit
    
    Change the energy variable from 32bit to 64bit,
    so that it can record long time duration.
    After this conversion, adjust the DELTA_WRAP32() accordingly.
    
    Signed-off-by: Chen Yu <yu.c.chen at intel.com>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 4edad3fc760a..29ec1018852d 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -211,12 +211,12 @@ struct pkg_data {
 	long long gfx_rc6_ms;
 	unsigned int gfx_mhz;
 	unsigned int package_id;
-	unsigned int energy_pkg;	/* MSR_PKG_ENERGY_STATUS */
-	unsigned int energy_dram;	/* MSR_DRAM_ENERGY_STATUS */
-	unsigned int energy_cores;	/* MSR_PP0_ENERGY_STATUS */
-	unsigned int energy_gfx;	/* MSR_PP1_ENERGY_STATUS */
-	unsigned int rapl_pkg_perf_status;	/* MSR_PKG_PERF_STATUS */
-	unsigned int rapl_dram_perf_status;	/* MSR_DRAM_PERF_STATUS */
+	unsigned long long energy_pkg;	/* MSR_PKG_ENERGY_STATUS */
+	unsigned long long energy_dram;	/* MSR_DRAM_ENERGY_STATUS */
+	unsigned long long energy_cores;	/* MSR_PP0_ENERGY_STATUS */
+	unsigned long long energy_gfx;	/* MSR_PP1_ENERGY_STATUS */
+	unsigned long long rapl_pkg_perf_status;	/* MSR_PKG_PERF_STATUS */
+	unsigned long long rapl_dram_perf_status;	/* MSR_DRAM_PERF_STATUS */
 	unsigned int pkg_temp_c;
 	unsigned long long counter[MAX_ADDED_COUNTERS];
 } *package_even, *package_odd;
@@ -858,13 +858,13 @@ int dump_counters(struct thread_data *t, struct core_data *c,
 		outp += sprintf(outp, "pc10: %016llX\n", p->pc10);
 		outp += sprintf(outp, "cpu_lpi: %016llX\n", p->cpu_lpi);
 		outp += sprintf(outp, "sys_lpi: %016llX\n", p->sys_lpi);
-		outp += sprintf(outp, "Joules PKG: %0X\n", p->energy_pkg);
-		outp += sprintf(outp, "Joules COR: %0X\n", p->energy_cores);
-		outp += sprintf(outp, "Joules GFX: %0X\n", p->energy_gfx);
-		outp += sprintf(outp, "Joules RAM: %0X\n", p->energy_dram);
-		outp += sprintf(outp, "Throttle PKG: %0X\n",
+		outp += sprintf(outp, "Joules PKG: %0llX\n", p->energy_pkg);
+		outp += sprintf(outp, "Joules COR: %0llX\n", p->energy_cores);
+		outp += sprintf(outp, "Joules GFX: %0llX\n", p->energy_gfx);
+		outp += sprintf(outp, "Joules RAM: %0llX\n", p->energy_dram);
+		outp += sprintf(outp, "Throttle PKG: %0llX\n",
 			p->rapl_pkg_perf_status);
-		outp += sprintf(outp, "Throttle RAM: %0X\n",
+		outp += sprintf(outp, "Throttle RAM: %0llX\n",
 			p->rapl_dram_perf_status);
 		outp += sprintf(outp, "PTM: %dC\n", p->pkg_temp_c);
 
@@ -1210,11 +1210,7 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_
 }
 
 #define DELTA_WRAP32(new, old)			\
-	if (new > old) {			\
-		old = new - old;		\
-	} else {				\
-		old = 0x100000000 + new - old;	\
-	}
+	old = ((((unsigned long long)new << 32) - ((unsigned long long)old << 32)) >> 32);
 
 int
 delta_package(struct pkg_data *new, struct pkg_data *old)
commit 9aefc2cda6353f48708415d9adc5dff4deb73412
Author: Doug Smythies <doug.smythies at gmail.com>
Date:   Thu Mar 26 13:36:37 2020 -0700

    tools/power turbostat: Always print idle in the system configuration header
    
    If the --quiet option is not used, turbostat prints a useful system
    configuration header during startup.
    
    But inclusion of idle system configuration information in this header
    is currently a function of inclusion in the columns chosen to be displayed.
    
    Always list this idle system configuration.
    
    Signed-off-by: Doug Smythies <dsmythies at telus.net>
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 4c679568fda4..4edad3fc760a 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -3530,9 +3530,6 @@ dump_sysfs_cstate_config(void)
 	int state;
 	char *sp;
 
-	if (!DO_BIC(BIC_sysfs))
-		return;
-
 	if (access("/sys/devices/system/cpu/cpuidle", R_OK)) {
 		fprintf(outf, "cpuidle not loaded\n");
 		return;
commit d76bb7a09bb3b8711077912f3e80cfcf39cd9d0b
Author: Len Brown <len.brown at intel.com>
Date:   Wed May 27 00:38:38 2020 -0400

    tools/power turbostat: Print /dev/cpu_dma_latency
    
    Users are puzzled when they use tuned performance and all their
    C-states vanish.  Dump /dev/cpu_dma_latency and state
    whether the value is default, or constraining,
    to explain this situation.
    
    Signed-off-by: Len Brown <len.brown at intel.com>

diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 33b370865d16..4c679568fda4 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -4698,6 +4698,32 @@ unsigned int intel_model_duplicates(unsigned int model)
 	}
 	return model;
 }
+
+void print_dev_latency(void)
+{
+	char *path = "/dev/cpu_dma_latency";
+	int fd;
+	int value;
+	int retval;
+
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		warn("fopen %s\n", path);
+		return;
+	}
+
+	retval = read(fd, (void *)&value, sizeof(int));
+	if (retval != sizeof(int)) {
+		warn("read %s\n", path);
+		close(fd);
+		return;
+	}
+	fprintf(outf, "/dev/cpu_dma_latency: %d usec (%s)\n",
+		value, value == 2000000000 ? "default" : "constrained");
+
+	close(fd);
+}
+
 void process_cpuid()
 {
 	unsigned int eax, ebx, ecx, edx;
@@ -4966,6 +4992,8 @@ void process_cpuid()
 	if (!quiet)
 		dump_cstate_pstate_config_info(family, model);
 
+	if (!quiet)
+		print_dev_latency();
 	if (!quiet)
 		dump_sysfs_cstate_config();
 	if (!quiet)


More information about the openchrome-devel mailing list