Merge tag 'hardening-v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 14 Dec 2022 20:20:00 +0000 (12:20 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 14 Dec 2022 20:20:00 +0000 (12:20 -0800)
Pull kernel hardening updates from Kees Cook:

 - Convert flexible array members, fix -Wstringop-overflow warnings, and
   fix KCFI function type mismatches that went ignored by maintainers
   (Gustavo A. R. Silva, Nathan Chancellor, Kees Cook)

 - Remove the remaining side-effect users of ksize() by converting
   dma-buf, btrfs, and coredump to using kmalloc_size_roundup(), add
   more __alloc_size attributes, and introduce full testing of all
   allocator functions. Finally remove the ksize() side-effect so that
   each allocation-aware checker can finally behave without exceptions

 - Introduce oops_limit (default 10,000) and warn_limit (default off) to
   provide greater granularity of control for panic_on_oops and
   panic_on_warn (Jann Horn, Kees Cook)

 - Introduce overflows_type() and castable_to_type() helpers for cleaner
   overflow checking

 - Improve code generation for strscpy() and update str*() kern-doc

 - Convert strscpy and sigphash tests to KUnit, and expand memcpy tests

 - Always use a non-NULL argument for prepare_kernel_cred()

 - Disable structleak plugin in FORTIFY KUnit test (Anders Roxell)

 - Adjust orphan linker section checking to respect CONFIG_WERROR (Xin
   Li)

 - Make sure siginfo is cleared for forced SIGKILL (haifeng.xu)

 - Fix um vs FORTIFY warnings for always-NULL arguments

* tag 'hardening-v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: (31 commits)
  ksmbd: replace one-element arrays with flexible-array members
  hpet: Replace one-element array with flexible-array member
  um: virt-pci: Avoid GCC non-NULL warning
  signal: Initialize the info in ksignal
  lib: fortify_kunit: build without structleak plugin
  panic: Expose "warn_count" to sysfs
  panic: Introduce warn_limit
  panic: Consolidate open-coded panic_on_warn checks
  exit: Allow oops_limit to be disabled
  exit: Expose "oops_count" to sysfs
  exit: Put an upper limit on how often we can oops
  panic: Separate sysctl logic from CONFIG_SMP
  mm/pgtable: Fix multiple -Wstringop-overflow warnings
  mm: Make ksize() a reporting-only function
  kunit/fortify: Validate __alloc_size attribute results
  drm/sti: Fix return type of sti_{dvo,hda,hdmi}_connector_mode_valid()
  drm/fsl-dcu: Fix return type of fsl_dcu_drm_connector_mode_valid()
  driver core: Add __alloc_size hint to devm allocators
  overflow: Introduce overflows_type() and castable_to_type()
  coredump: Proactively round up to kmalloc bucket size
  ...

28 files changed:
1  2 
Documentation/admin-guide/sysctl/kernel.rst
Documentation/core-api/kernel-api.rst
MAINTAINERS
Makefile
arch/arm/boot/compressed/Makefile
arch/x86/boot/compressed/Makefile
drivers/gpu/drm/sti/sti_dvo.c
drivers/gpu/drm/sti/sti_hda.c
drivers/gpu/drm/sti/sti_hdmi.c
fs/btrfs/send.c
fs/cifs/cifsacl.c
fs/coredump.c
fs/ksmbd/smb2pdu.c
fs/nfsd/nfs4callback.c
include/linux/device.h
include/linux/fortify-string.h
init/Kconfig
kernel/panic.c
kernel/sched/core.c
kernel/signal.c
lib/Kconfig.debug
lib/Makefile
lib/memcpy_kunit.c
mm/kasan/kasan_test.c
mm/kasan/report.c
mm/kfence/report.c
mm/slab_common.c
scripts/kernel-doc

@@@ -139,8 -139,6 +139,8 @@@ Highest valid capability of the runnin
  ``CAP_LAST_CAP`` from the kernel.
  
  
 +.. _core_pattern:
 +
  core_pattern
  ============
  
        %f              executable filename
        %E              executable path
        %c              maximum size of core file by resource limit RLIMIT_CORE
 +      %C              CPU the task ran on
        %<OTHER>        both are dropped
        ========        ==========================================
  
@@@ -670,6 -667,15 +670,15 @@@ This is the default behavior
  an oops event is detected.
  
  
+ oops_limit
+ ==========
+ Number of kernel oopses after which the kernel should panic when
+ ``panic_on_oops`` is not set. Setting this to 0 disables checking
+ the count. Setting this to  1 has the same effect as setting
+ ``panic_on_oops=1``. The default value is 10000.
  osrelease, ostype & version
  ===========================
  
@@@ -1317,29 -1323,6 +1326,29 @@@ watchdog work to be queued by the watch
  watchdog — if enabled — can detect a hard lockup condition.
  
  
 +split_lock_mitigate (x86 only)
 +==============================
 +
 +On x86, each "split lock" imposes a system-wide performance penalty. On larger
 +systems, large numbers of split locks from unprivileged users can result in
 +denials of service to well-behaved and potentially more important users.
 +
 +The kernel mitigates these bad users by detecting split locks and imposing
 +penalties: forcing them to wait and only allowing one core to execute split
 +locks at a time.
 +
 +These mitigations can make those bad applications unbearably slow. Setting
 +split_lock_mitigate=0 may restore some application performance, but will also
 +increase system exposure to denial of service attacks from split lock users.
 +
 += ===================================================================
 +0 Disable the mitigation mode - just warns the split lock on kernel log
 +  and exposes the system to denials of service from the split lockers.
 +1 Enable the mitigation mode (this is the default) - penalizes the split
 +  lockers with intentional performance degradation.
 += ===================================================================
 +
 +
  stack_erasing
  =============
  
@@@ -1526,6 -1509,16 +1535,16 @@@ entry will default to 2 instead of 0
  2 Unprivileged calls to ``bpf()`` are disabled
  = =============================================================
  
+ warn_limit
+ ==========
+ Number of kernel warnings after which the kernel should panic when
+ ``panic_on_warn`` is not set. Setting this to 0 disables checking
+ the warning count. Setting this to 1 has the same effect as setting
+ ``panic_on_warn=1``. The default value is 0.
  watchdog
  ========
  
@@@ -36,6 -36,9 +36,9 @@@ String Conversion
  String Manipulation
  -------------------
  
+ .. kernel-doc:: include/linux/fortify-string.h
+    :internal:
  .. kernel-doc:: lib/string.c
     :export:
  
@@@ -171,6 -174,9 +174,6 @@@ Division Function
  .. kernel-doc:: include/linux/math64.h
     :internal:
  
 -.. kernel-doc:: lib/math/div64.c
 -   :functions: div_s64_rem div64_u64_rem div64_u64 div64_s64
 -
  .. kernel-doc:: lib/math/gcd.c
     :export:
  
diff --combined MAINTAINERS
@@@ -775,24 -775,6 +775,24 @@@ T:       git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/allwinner,sun4i-a10-csi.yaml
  F:    drivers/media/platform/sunxi/sun4i-csi/
  
 +ALLWINNER A31 CSI DRIVER
 +M:    Yong Deng <yong.deng@magewell.com>
 +M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
 +F:    drivers/media/platform/sunxi/sun6i-csi/
 +
 +ALLWINNER A31 ISP DRIVER
 +M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-isp.yaml
 +F:    drivers/staging/media/sunxi/sun6i-isp/
 +F:    drivers/staging/media/sunxi/sun6i-isp/uapi/sun6i-isp-config.h
 +
  ALLWINNER A31 MIPI CSI-2 BRIDGE DRIVER
  M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
  L:    linux-media@vger.kernel.org
@@@ -1111,16 -1093,6 +1111,16 @@@ S:    Maintaine
  F:    Documentation/hid/amd-sfh*
  F:    drivers/hid/amd-sfh-hid/
  
 +AMLOGIC DDR PMU DRIVER
 +M:    Jiucheng Xu <jiucheng.xu@amlogic.com>
 +L:    linux-amlogic@lists.infradead.org
 +S:    Supported
 +W:    http://www.amlogic.com
 +F:    Documentation/admin-guide/perf/meson-ddr-pmu.rst
 +F:    Documentation/devicetree/bindings/perf/amlogic,g12-ddr-pmu.yaml
 +F:    drivers/perf/amlogic/
 +F:    include/soc/amlogic/
 +
  AMPHION VPU CODEC V4L2 DRIVER
  M:    Ming Qian <ming.qian@nxp.com>
  M:    Shijie Qin <shijie.qin@nxp.com>
@@@ -1713,7 -1685,7 +1713,7 @@@ M:      Miquel Raynal <miquel.raynal@bootlin
  M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/memory-controllers/arm,pl353-smc.yaml
 +F:    Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml
  F:    drivers/memory/pl353-smc.c
  
  ARM PRIMECELL CLCD PL110 DRIVER
@@@ -1925,14 -1897,12 +1925,14 @@@ T:   git https://github.com/AsahiLinux/li
  F:    Documentation/devicetree/bindings/arm/apple.yaml
  F:    Documentation/devicetree/bindings/arm/apple/*
  F:    Documentation/devicetree/bindings/clock/apple,nco.yaml
 +F:    Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml
  F:    Documentation/devicetree/bindings/dma/apple,admac.yaml
  F:    Documentation/devicetree/bindings/i2c/apple,i2c.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/apple,*
  F:    Documentation/devicetree/bindings/iommu/apple,dart.yaml
  F:    Documentation/devicetree/bindings/iommu/apple,sart.yaml
  F:    Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml
 +F:    Documentation/devicetree/bindings/net/bluetooth/brcm,bcm4377-bluetooth.yaml
  F:    Documentation/devicetree/bindings/nvme/apple,nvme-ans.yaml
  F:    Documentation/devicetree/bindings/nvmem/apple,efuses.yaml
  F:    Documentation/devicetree/bindings/pci/apple,pcie.yaml
@@@ -1940,9 -1910,7 +1940,9 @@@ F:      Documentation/devicetree/bindings/pi
  F:    Documentation/devicetree/bindings/power/apple*
  F:    Documentation/devicetree/bindings/watchdog/apple,wdt.yaml
  F:    arch/arm64/boot/dts/apple/
 +F:    drivers/bluetooth/hci_bcm4377.c
  F:    drivers/clk/clk-apple-nco.c
 +F:    drivers/cpufreq/apple-soc-cpufreq.c
  F:    drivers/dma/apple-admac.c
  F:    drivers/i2c/busses/i2c-pasemi-core.c
  F:    drivers/i2c/busses/i2c-pasemi-platform.c
@@@ -2229,7 -2197,7 +2229,7 @@@ M:      Wei Xu <xuwei5@hisilicon.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  W:    http://www.hisilicon.com
 -T:    git git://github.com/hisilicon/linux-hisi.git
 +T:    git https://github.com/hisilicon/linux-hisi.git
  F:    arch/arm/boot/dts/hi3*
  F:    arch/arm/boot/dts/hip*
  F:    arch/arm/boot/dts/hisi*
@@@ -2304,6 -2272,8 +2304,6 @@@ F:      drivers/clocksource/timer-ixp4xx.
  F:    drivers/crypto/ixp4xx_crypto.c
  F:    drivers/gpio/gpio-ixp4xx.c
  F:    drivers/irqchip/irq-ixp4xx.c
 -F:    include/linux/irqchip/irq-ixp4xx.h
 -F:    include/linux/platform_data/timer-ixp4xx.h
  
  ARM/INTEL KEEMBAY ARCHITECTURE
  M:    Paul J. Murphy <paul.j.murphy@intel.com>
@@@ -2371,8 -2341,6 +2371,8 @@@ M:      Gregory Clement <gregory.clement@boo
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
 +F:    Documentation/devicetree/bindings/arm/marvell/marvell,dove.txt
 +F:    Documentation/devicetree/bindings/arm/marvell/marvell,orion5x.txt
  F:    Documentation/devicetree/bindings/soc/dove/
  F:    arch/arm/boot/dts/dove*
  F:    arch/arm/boot/dts/orion5x*
@@@ -2389,7 -2357,6 +2389,7 @@@ M:      Sebastian Hesselbarth <sebastian.hes
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
 +F:    Documentation/devicetree/bindings/arm/marvell/
  F:    arch/arm/boot/dts/armada*
  F:    arch/arm/boot/dts/kirkwood*
  F:    arch/arm/configs/mvebu_*_defconfig
@@@ -2472,7 -2439,6 +2472,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Supported
  T:    git git://github.com/microchip-ung/linux-upstream.git
  F:    arch/arm64/boot/dts/microchip/
 +F:    drivers/net/ethernet/microchip/vcap/
  F:    drivers/pinctrl/pinctrl-microchip-sgpio.c
  N:    sparx5
  
@@@ -2654,7 -2620,7 +2654,7 @@@ W:      http://www.armlinux.org.uk
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <agross@kernel.org>
  M:    Bjorn Andersson <andersson@kernel.org>
 -R:    Konrad Dybcio <konrad.dybcio@somainline.org>
 +R:    Konrad Dybcio <konrad.dybcio@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@@@ -2725,7 -2691,7 +2725,7 @@@ F:      arch/arm/boot/dts/rtd
  F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
 -ARM/RENESAS ARCHITECTURE
 +ARM/RISC-V/RENESAS ARCHITECTURE
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  M:    Magnus Damm <magnus.damm@gmail.com>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -2733,6 -2699,7 +2733,6 @@@ S:      Supporte
  Q:    http://patchwork.kernel.org/project/linux-renesas-soc/list/
  C:    irc://irc.libera.chat/renesas-soc
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git next
 -F:    Documentation/devicetree/bindings/arm/renesas.yaml
  F:    Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml
  F:    Documentation/devicetree/bindings/soc/renesas/
  F:    arch/arm/boot/dts/emev2*
@@@ -2746,7 -2713,6 +2746,7 @@@ F:      arch/arm/configs/shmobile_defconfi
  F:    arch/arm/include/debug/renesas-scif.S
  F:    arch/arm/mach-shmobile/
  F:    arch/arm64/boot/dts/renesas/
 +F:    arch/riscv/boot/dts/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
  
@@@ -4018,7 -3984,7 +4018,7 @@@ M:      Rafał Miłecki <rafal@milecki.pl
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
  F:    arch/arm64/boot/dts/broadcom/bcmbca/*
  N:    bcmbca
@@@ -4043,7 -4009,7 +4043,7 @@@ R:      Broadcom internal kernel review lis
  L:    linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    drivers/pci/controller/pcie-brcmstb.c
  F:    drivers/staging/vc04_services
@@@ -4057,7 -4023,7 +4057,7 @@@ M:      Ray Jui <rjui@broadcom.com
  M:    Scott Branden <sbranden@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  S:    Maintained
 -T:    git git://github.com/broadcom/mach-bcm
 +T:    git https://github.com/broadcom/mach-bcm
  F:    arch/arm/mach-bcm/
  N:    bcm281*
  N:    bcm113*
@@@ -4122,7 -4088,7 +4122,7 @@@ M:      Florian Fainelli <f.fainelli@gmail.c
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    arch/arm/boot/dts/bcm7*.dts*
  F:    arch/arm/include/asm/hardware/cache-b15-rac.h
@@@ -4135,7 -4101,6 +4135,7 @@@ N:      bcm703
  N:    bcm7120
  
  BROADCOM BDC DRIVER
 +M:    Justin Chen <justinpopo6@gmail.com>
  M:    Al Cooper <alcooperx@gmail.com>
  L:    linux-usb@vger.kernel.org
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
@@@ -4155,7 -4120,7 +4155,7 @@@ M:      Florian Fainelli <f.fainelli@gmail.c
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mips@vger.kernel.org
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    arch/mips/bmips/*
  F:    arch/mips/boot/dts/brcm/bcm*.dts*
  F:    arch/mips/include/asm/mach-bmips/*
@@@ -4242,7 -4207,6 +4242,7 @@@ F:      Documentation/devicetree/bindings/se
  F:    drivers/tty/serial/8250/8250_bcm7271.c
  
  BROADCOM BRCMSTB USB EHCI DRIVER
 +M:    Justin Chen <justinpopo6@gmail.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-usb@vger.kernel.org
@@@ -4259,7 -4223,6 +4259,7 @@@ F:      Documentation/devicetree/bindings/us
  F:    drivers/usb/misc/brcmstb-usb-pinmap.c
  
  BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER
 +M:    Justin Chen <justinpopo6@gmail.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-kernel@vger.kernel.org
@@@ -4296,7 -4259,7 +4296,7 @@@ M:      Scott Branden <sbranden@broadcom.com
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    arch/arm64/boot/dts/broadcom/northstar2/*
  F:    arch/arm64/boot/dts/broadcom/stingray/*
  F:    drivers/clk/bcm/clk-ns*
@@@ -4366,7 -4329,7 +4366,7 @@@ M:      Florian Fainelli <f.fainelli@gmail.c
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    drivers/soc/bcm/bcm63xx/bcm-pmb.c
  F:    include/dt-bindings/soc/bcm-pmb.h
  
@@@ -4496,15 -4459,13 +4496,15 @@@ M:   Josef Bacik <josef@toxicpanda.com
  M:    David Sterba <dsterba@suse.com>
  L:    linux-btrfs@vger.kernel.org
  S:    Maintained
 -W:    http://btrfs.wiki.kernel.org/
 -Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 +W:    https://btrfs.readthedocs.io
 +W:    https://btrfs.wiki.kernel.org/
 +Q:    https://patchwork.kernel.org/project/linux-btrfs/list/
  C:    irc://irc.libera.chat/btrfs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git
  F:    Documentation/filesystems/btrfs.rst
  F:    fs/btrfs/
  F:    include/linux/btrfs*
 +F:    include/trace/events/btrfs.h
  F:    include/uapi/linux/btrfs*
  
  BTTV VIDEO4LINUX DRIVER
@@@ -4843,7 -4804,7 +4843,7 @@@ R:      Jeff Layton <jlayton@kernel.org
  L:    ceph-devel@vger.kernel.org
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://github.com/ceph/ceph-client.git
 +T:    git https://github.com/ceph/ceph-client.git
  F:    include/linux/ceph/
  F:    include/linux/crush/
  F:    net/ceph/
@@@ -4855,7 -4816,7 +4855,7 @@@ R:      Jeff Layton <jlayton@kernel.org
  L:    ceph-devel@vger.kernel.org
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://github.com/ceph/ceph-client.git
 +T:    git https://github.com/ceph/ceph-client.git
  F:    Documentation/filesystems/ceph.rst
  F:    fs/ceph/
  
@@@ -4945,7 -4906,7 +4945,7 @@@ F:      drivers/platform/chrome
  
  CHROMEOS EC CODEC DRIVER
  M:    Cheng-Yi Chiang <cychiang@chromium.org>
 -M:    Tzung-Bi Shih <tzungbi@google.com>
 +M:    Tzung-Bi Shih <tzungbi@kernel.org>
  R:    Guenter Roeck <groeck@chromium.org>
  L:    chrome-platform@lists.linux.dev
  S:    Maintained
@@@ -4975,12 -4936,6 +4975,12 @@@ S:    Maintaine
  F:    drivers/platform/chrome/cros_usbpd_notify.c
  F:    include/linux/platform_data/cros_usbpd_notify.h
  
 +CHROMEOS HPS DRIVER
 +M:    Dan Callaghan <dcallagh@chromium.org>
 +R:    Sami Kyöstilä <skyostil@chromium.org>
 +S:    Maintained
 +F:    drivers/platform/chrome/cros_hps_i2c.c
 +
  CHRONTEL CH7322 CEC DRIVER
  M:    Joe Tessler <jrt@google.com>
  L:    linux-media@vger.kernel.org
@@@ -5081,7 -5036,7 +5081,7 @@@ F:      drivers/scsi/snic
  
  CISCO VIC ETHERNET NIC DRIVER
  M:    Christian Benvenuti <benve@cisco.com>
 -M:    Govindarajulu Varadarajan <_govind@gmx.com>
 +M:    Satish Kharat <satishkh@cisco.com>
  S:    Supported
  F:    drivers/net/ethernet/cisco/enic/
  
@@@ -5311,7 -5266,6 +5311,7 @@@ F:      tools/testing/selftests/cgroup
  
  CONTROL GROUP - BLOCK IO CONTROLLER (BLKIO)
  M:    Tejun Heo <tj@kernel.org>
 +M:    Josef Bacik <josef@toxicpanda.com>
  M:    Jens Axboe <axboe@kernel.dk>
  L:    cgroups@vger.kernel.org
  L:    linux-block@vger.kernel.org
@@@ -5319,7 -5273,6 +5319,7 @@@ T:      git git://git.kernel.dk/linux-bloc
  F:    Documentation/admin-guide/cgroup-v1/blkio-controller.rst
  F:    block/bfq-cgroup.c
  F:    block/blk-cgroup.c
 +F:    block/blk-iocost.c
  F:    block/blk-iolatency.c
  F:    block/blk-throttle.c
  F:    include/linux/blk-cgroup.h
@@@ -5339,7 -5292,7 +5339,7 @@@ M:      Johannes Weiner <hannes@cmpxchg.org
  M:    Michal Hocko <mhocko@kernel.org>
  M:    Roman Gushchin <roman.gushchin@linux.dev>
  M:    Shakeel Butt <shakeelb@google.com>
 -R:    Muchun Song <songmuchun@bytedance.com>
 +R:    Muchun Song <muchun.song@linux.dev>
  L:    cgroups@vger.kernel.org
  L:    linux-mm@kvack.org
  S:    Maintained
@@@ -5542,6 -5495,14 +5542,6 @@@ M:     Jaya Kumar <jayakumar.alsa@gmail.com
  S:    Maintained
  F:    sound/pci/cs5535audio/
  
 -CSI DRIVERS FOR ALLWINNER V3s
 -M:    Yong Deng <yong.deng@magewell.com>
 -L:    linux-media@vger.kernel.org
 -S:    Maintained
 -T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
 -F:    drivers/media/platform/sunxi/sun6i-csi/
 -
  CTU CAN FD DRIVER
  M:    Pavel Pisa <pisa@cmp.felk.cvut.cz>
  M:    Ondrej Ille <ondrej.ille@gmail.com>
@@@ -5617,6 -5578,8 +5617,6 @@@ F:      drivers/scsi/cxgbi/cxgb3
  
  CXGB4 CRYPTO DRIVER (chcr)
  M:    Ayush Sawal <ayush.sawal@chelsio.com>
 -M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
 -M:    Rohit Maheshwari <rohitm@chelsio.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5624,6 -5587,8 +5624,6 @@@ F:      drivers/crypto/chelsi
  
  CXGB4 INLINE CRYPTO DRIVER
  M:    Ayush Sawal <ayush.sawal@chelsio.com>
 -M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
 -M:    Rohit Maheshwari <rohitm@chelsio.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5886,13 -5851,6 +5886,13 @@@ L:    Dell.Client.Kernel@dell.co
  S:    Maintained
  F:    drivers/platform/x86/dell/dell-wmi-descriptor.c
  
 +DELL WMI DDV DRIVER
 +M:    Armin Wolf <W_Armin@gmx.de>
 +S:    Maintained
 +F:    Documentation/ABI/testing/debugfs-dell-wmi-ddv
 +F:    Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
 +F:    drivers/platform/x86/dell/dell-wmi-ddv.c
 +
  DELL WMI SYSMAN DRIVER
  M:    Divya Bharathi <divya.bharathi@dell.com>
  M:    Prasanth Ksr <prasanth.ksr@dell.com>
@@@ -6068,12 -6026,11 +6068,12 @@@ F:   include/net/devlink.
  F:    include/uapi/linux/devlink.h
  F:    net/core/devlink.c
  
 -DH ELECTRONICS IMX6 DHCOM BOARD SUPPORT
 +DH ELECTRONICS IMX6 DHCOM/DHCOR BOARD SUPPORT
  M:    Christoph Niedermaier <cniedermaier@dh-electronics.com>
  L:    kernel@dh-electronics.com
  S:    Maintained
  F:    arch/arm/boot/dts/imx6*-dhcom-*
 +F:    arch/arm/boot/dts/imx6*-dhcor-*
  
  DH ELECTRONICS STM32MP1 DHCOM/DHCOR BOARD SUPPORT
  M:    Marek Vasut <marex@denx.de>
@@@ -6323,7 -6280,7 +6323,7 @@@ M:      Sakari Ailus <sakari.ailus@linux.int
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.txt
 +F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.yaml
  F:    drivers/media/i2c/dw9714.c
  
  DONGWOON DW9768 LENS VOICE COIL DRIVER
@@@ -6365,7 -6322,6 +6365,7 @@@ F:      drivers/net/ethernet/freescale/dpaa2
  F:    drivers/net/ethernet/freescale/dpaa2/Makefile
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth*
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-mac*
 +F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-xsk*
  F:    drivers/net/ethernet/freescale/dpaa2/dpkg.h
  F:    drivers/net/ethernet/freescale/dpaa2/dpmac*
  F:    drivers/net/ethernet/freescale/dpaa2/dpni*
@@@ -6543,12 -6499,6 +6543,12 @@@ S:    Orphan / Obsolet
  F:    drivers/gpu/drm/i810/
  F:    include/uapi/drm/i810_drm.h
  
 +DRM DRIVER FOR JADARD JD9365DA-H3 MIPI-DSI LCD PANELS
 +M:    Jagan Teki <jagan@edgeble.ai>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
 +F:    drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
 +
  DRM DRIVER FOR LOGICVC DISPLAY CONTROLLER
  M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
  S:    Supported
@@@ -6738,13 -6688,10 +6738,13 @@@ L:   dri-devel@lists.freedesktop.or
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/drm_aperture.c
 +F:    drivers/gpu/drm/tiny/ofdrm.c
  F:    drivers/gpu/drm/tiny/simpledrm.c
  F:    drivers/video/aperture.c
 +F:    drivers/video/nomodeset.c
  F:    include/drm/drm_aperture.h
  F:    include/linux/aperture.h
 +F:    include/video/nomodeset.h
  
  DRM DRIVER FOR SIS VIDEO CARDS
  S:    Orphan / Obsolete
@@@ -6873,15 -6820,6 +6873,15 @@@ F:    include/drm/drm
  F:    include/linux/vga*
  F:    include/uapi/drm/drm*
  
 +DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
 +M:    Oded Gabbay <ogabbay@kernel.org>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Maintained
 +C:    irc://irc.oftc.net/dri-devel
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
 +F:    Documentation/accel/
 +F:    drivers/accel/
 +
  DRM DRIVERS FOR ALLWINNER A10
  M:    Maxime Ripard <mripard@kernel.org>
  M:    Chen-Yu Tsai <wens@csie.org>
@@@ -7170,7 -7108,7 +7170,7 @@@ F:      drivers/gpu/drm/ttm
  F:    include/drm/ttm/
  
  DRM GPU SCHEDULER
 -M:    Andrey Grodzovsky <andrey.grodzovsky@amd.com>
 +M:    Luben Tuikov <luben.tuikov@amd.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -7418,9 -7356,9 +7418,9 @@@ F:      drivers/edac/thunderx_edac
  
  EDAC-CORE
  M:    Borislav Petkov <bp@alien8.de>
 -M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  M:    Tony Luck <tony.luck@intel.com>
  R:    James Morse <james.morse@arm.com>
 +R:    Mauro Carvalho Chehab <mchehab@kernel.org>
  R:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
  S:    Supported
@@@ -7537,7 -7475,8 +7537,7 @@@ S:      Maintaine
  F:    drivers/edac/pnd2_edac.[ch]
  
  EDAC-QCOM
 -M:    Channagoud Kadabi <ckadabi@codeaurora.org>
 -M:    Venkata Narendra Kumar Gutta <vnkgutta@codeaurora.org>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  L:    linux-edac@vger.kernel.org
  S:    Maintained
@@@ -7738,7 -7677,6 +7738,7 @@@ ETAS ES58X CAN/USB DRIVE
  M:    Vincent Mailhol <mailhol.vincent@wanadoo.fr>
  L:    linux-can@vger.kernel.org
  S:    Maintained
 +F:    Documentation/networking/devlink/etas_es58x.rst
  F:    drivers/net/can/usb/etas_es58x/
  
  ETHERNET BRIDGE
@@@ -7844,6 -7782,7 +7844,6 @@@ F:      Documentation/admin-guide/efi-stub.r
  F:    arch/*/include/asm/efi.h
  F:    arch/*/kernel/efi.c
  F:    arch/arm/boot/compressed/efi-header.S
 -F:    arch/arm64/kernel/efi-entry.S
  F:    arch/x86/platform/efi/
  F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
@@@ -8105,6 -8044,8 +8105,8 @@@ S:      Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    include/linux/fortify-string.h
  F:    lib/fortify_kunit.c
+ F:    lib/memcpy_kunit.c
+ F:    lib/strscpy_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
  K:    \b__NO_FORTIFY\b
@@@ -8241,10 -8182,7 +8243,10 @@@ S:    Maintaine
  F:    drivers/i2c/busses/i2c-cpm.c
  
  FREESCALE IMX / MXC FEC DRIVER
 -M:    Joakim Zhang <qiangqing.zhang@nxp.com>
 +M:    Wei Fang <wei.fang@nxp.com>
 +R:    Shenwei Wang <shenwei.wang@nxp.com>
 +R:    Clark Wang <xiaoning.wang@nxp.com>
 +R:    NXP Linux Team <linux-imx@nxp.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/fsl,fec.yaml
@@@ -8659,8 -8597,8 +8661,8 @@@ F:      include/asm-generic
  F:    include/uapi/asm-generic/
  
  GENERIC PHY FRAMEWORK
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
  M:    Vinod Koul <vkoul@kernel.org>
 +M:    Kishon Vijay Abraham I <kishon@kernel.org>
  L:    linux-phy@lists.infradead.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-phy/list/
@@@ -8803,7 -8741,6 +8805,7 @@@ GPIO IR Transmitte
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/irled/gpio-ir-tx.yaml
  F:    drivers/media/rc/gpio-ir-tx.c
  
  GPIO MOCKUP DRIVER
@@@ -9227,13 -9164,6 +9229,13 @@@ W:    http://www.highpoint-tech.co
  F:    Documentation/scsi/hptiop.rst
  F:    drivers/scsi/hptiop.c
  
 +HIMAX HX83112B TOUCHSCREEN SUPPORT
 +M:    Job Noorman <job@noorman.info>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml
 +F:    drivers/input/touchscreen/himax_hx83112b.c
 +
  HIPPI
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-hippi@sunsite.dk
@@@ -9282,7 -9212,7 +9284,7 @@@ W:      https://www.hisilicon.co
  F:    drivers/i2c/busses/i2c-hisi.c
  
  HISILICON LPC BUS DRIVER
 -M:    john.garry@huawei.com
 +M:    Jay Fang <f.fangjian@huawei.com>
  S:    Maintained
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/arm/hisilicon/low-pin-count.yaml
@@@ -9313,7 -9243,7 +9315,7 @@@ F:      drivers/misc/hisi_hikey_usb.
  
  HISILICON PMU DRIVER
  M:    Shaokun Zhang <zhangshaokun@hisilicon.com>
 -M:    Qi Liu <liuqi115@huawei.com>
 +M:    Jonathan Cameron <jonathan.cameron@huawei.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/admin-guide/perf/hisi-pcie-pmu.rst
@@@ -9362,7 -9292,7 +9364,7 @@@ F:      Documentation/devicetree/bindings/in
  F:    drivers/infiniband/hw/hns/
  
  HISILICON SAS Controller
 -M:    John Garry <john.garry@huawei.com>
 +M:    Xiang Chen <chenxiang66@hisilicon.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
@@@ -9406,7 -9336,7 +9408,7 @@@ S:      Maintaine
  F:    drivers/crypto/hisilicon/trng/trng.c
  
  HISILICON V3XX SPI NOR FLASH Controller Driver
 -M:    John Garry <john.garry@huawei.com>
 +M:    Jay Fang <f.fangjian@huawei.com>
  S:    Maintained
  W:    http://www.hisilicon.com
  F:    drivers/spi/spi-hisi-sfc-v3xx.c
@@@ -9431,7 -9361,7 +9433,7 @@@ F:      drivers/net/wireless/intersil/hostap
  HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
  L:    platform-driver-x86@vger.kernel.org
  S:    Orphan
 -F:    drivers/platform/x86/tc1100-wmi.c
 +F:    drivers/platform/x86/hp/tc1100-wmi.c
  
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
@@@ -9501,15 -9431,14 +9503,15 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/humidity/hts221*
  
  HUAWEI ETHERNET DRIVER
 +M:    Cai Huoqing <cai.huoqing@linux.dev>
  L:    netdev@vger.kernel.org
 -S:    Orphan
 +S:    Maintained
  F:    Documentation/networking/device_drivers/ethernet/huawei/hinic.rst
  F:    drivers/net/ethernet/huawei/hinic/
  
  HUGETLB SUBSYSTEM
  M:    Mike Kravetz <mike.kravetz@oracle.com>
 -M:    Muchun Song <songmuchun@bytedance.com>
 +M:    Muchun Song <muchun.song@linux.dev>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-kernel-mm-hugepages
@@@ -9573,6 -9502,7 +9575,6 @@@ F:      drivers/media/i2c/hi847.
  Hyper-V/Azure CORE AND DRIVERS
  M:    "K. Y. Srinivasan" <kys@microsoft.com>
  M:    Haiyang Zhang <haiyangz@microsoft.com>
 -M:    Stephen Hemminger <sthemmin@microsoft.com>
  M:    Wei Liu <wei.liu@kernel.org>
  M:    Dexuan Cui <decui@microsoft.com>
  L:    linux-hyperv@vger.kernel.org
@@@ -9606,7 -9536,6 +9608,7 @@@ F:      include/asm-generic/hyperv-tlfs.
  F:    include/asm-generic/mshyperv.h
  F:    include/clocksource/hyperv_timer.h
  F:    include/linux/hyperv.h
 +F:    include/net/mana
  F:    include/uapi/linux/hyperv.h
  F:    net/vmw_vsock/hyperv_transport.c
  F:    tools/hv/
@@@ -9770,7 -9699,8 +9772,7 @@@ F:      Documentation/devicetree/bindings/i3
  F:    drivers/i3c/master/i3c-master-cdns.c
  
  I3C DRIVER FOR SYNOPSYS DESIGNWARE
 -M:    Vitor Soares <vitor.soares@synopsys.com>
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml
  F:    drivers/i3c/master/dw*
  
@@@ -9843,10 -9773,7 +9845,10 @@@ S:    Supporte
  F:    drivers/pci/hotplug/rpaphp*
  
  IBM Power SRIOV Virtual NIC Device Driver
 -M:    Dany Madden <drt@linux.ibm.com>
 +M:    Haren Myneni <haren@linux.ibm.com>
 +M:    Rick Lindsley <ricklind@linux.ibm.com>
 +R:    Nick Child <nnac123@linux.ibm.com>
 +R:    Dany Madden <danymadden@us.ibm.com>
  R:    Thomas Falcon <tlfalcon@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -10092,11 -10019,6 +10094,11 @@@ F: Documentation/hwmon/ina2xx.rs
  F:    drivers/hwmon/ina2xx.c
  F:    include/linux/platform_data/ina2xx.h
  
 +INDEX OF FURTHER KERNEL DOCUMENTATION
 +M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +S:    Maintained
 +F:    Documentation/process/kernel-docs.rst
 +
  INDUSTRY PACK SUBSYSTEM (IPACK)
  M:    Samuel Iglesias Gonsalvez <siglesias@igalia.com>
  M:    Jens Taprogge <jens.taprogge@taprogge.org>
@@@ -10126,7 -10048,6 +10128,7 @@@ F:   drivers/infiniband
  F:    include/rdma/
  F:    include/trace/events/ib_mad.h
  F:    include/trace/events/ib_umad.h
 +F:    include/trace/misc/rdma.h
  F:    include/uapi/linux/if_infiniband.h
  F:    include/uapi/rdma/
  F:    samples/bpf/ibumad_kern.c
@@@ -10300,7 -10221,6 +10302,7 @@@ Q:   http://patchwork.freedesktop.org/pro
  B:    https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
  C:    irc://irc.oftc.net/intel-gfx
  T:    git git://anongit.freedesktop.org/drm-intel
 +F:    Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
  F:    Documentation/gpu/i915.rst
  F:    drivers/gpu/drm/i915/
  F:    include/drm/i915*
@@@ -10360,7 -10280,7 +10362,7 @@@ T:   git https://github.com/intel/gvt-lin
  F:    drivers/gpu/drm/i915/gvt/
  
  INTEL HID EVENT DRIVER
 -M:    Alex Hung <alex.hung@canonical.com>
 +M:    Alex Hung <alexhung@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    drivers/platform/x86/intel/hid.c
@@@ -10792,18 -10712,6 +10794,18 @@@ F: drivers/iommu/dma-iommu.
  F:    drivers/iommu/iova.c
  F:    include/linux/iova.h
  
 +IOMMUFD
 +M:    Jason Gunthorpe <jgg@nvidia.com>
 +M:    Kevin Tian <kevin.tian@intel.com>
 +L:    iommu@lists.linux.dev
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git
 +F:    Documentation/userspace-api/iommufd.rst
 +F:    drivers/iommu/iommufd/
 +F:    include/linux/iommufd.h
 +F:    include/uapi/linux/iommufd.h
 +F:    tools/testing/selftests/iommu/
 +
  IOMMU SUBSYSTEM
  M:    Joerg Roedel <joro@8bytes.org>
  M:    Will Deacon <will@kernel.org>
@@@ -10983,13 -10891,6 +10985,13 @@@ F: drivers/isdn/Makefil
  F:    drivers/isdn/hardware/
  F:    drivers/isdn/mISDN/
  
 +ISOFS FILESYSTEM
 +M:    Jan Kara <jack@suse.cz>
 +L:    linux-fsdevel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/filesystems/isofs.rst
 +F:    fs/isofs/
 +
  IT87 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -11051,9 -10952,9 +11053,9 @@@ F:   drivers/hwmon/jc42.
  JFS FILESYSTEM
  M:    Dave Kleikamp <shaggy@kernel.org>
  L:    jfs-discussion@lists.sourceforge.net
 -S:    Maintained
 +S:    Odd Fixes
  W:    http://jfs.sourceforge.net/
 -T:    git git://github.com/kleikamp/linux-shaggy.git
 +T:    git https://github.com/kleikamp/linux-shaggy.git
  F:    Documentation/admin-guide/jfs.rst
  F:    fs/jfs/
  
@@@ -11127,7 -11028,6 +11129,7 @@@ KCONFI
  M:    Masahiro Yamada <masahiroy@kernel.org>
  L:    linux-kbuild@vger.kernel.org
  S:    Maintained
 +Q:    https://patchwork.kernel.org/project/linux-kbuild/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig
  F:    Documentation/kbuild/kconfig*
  F:    scripts/Kconfig.include
@@@ -11185,12 -11085,10 +11187,12 @@@ F:        fs/autofs
  
  KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
  M:    Masahiro Yamada <masahiroy@kernel.org>
 -M:    Michal Marek <michal.lkml@markovi.net>
 +R:    Nathan Chancellor <nathan@kernel.org>
  R:    Nick Desaulniers <ndesaulniers@google.com>
 +R:    Nicolas Schier <nicolas@fjasle.eu>
  L:    linux-kbuild@vger.kernel.org
  S:    Maintained
 +Q:    https://patchwork.kernel.org/project/linux-kbuild/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git
  F:    Documentation/kbuild/
  F:    Makefile
@@@ -11208,6 -11106,8 +11210,8 @@@ M:   Kees Cook <keescook@chromium.org
  L:    linux-hardening@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
+ F:    Documentation/ABI/testing/sysfs-kernel-oops_count
+ F:    Documentation/ABI/testing/sysfs-kernel-warn_count
  F:    include/linux/overflow.h
  F:    include/linux/randomize_kstack.h
  F:    mm/usercopy.c
@@@ -11226,18 -11126,11 +11230,18 @@@ L:        linux-nfs@vger.kernel.or
  S:    Supported
  W:    http://nfs.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git
 +F:    fs/exportfs/
  F:    fs/lockd/
  F:    fs/nfs_common/
  F:    fs/nfsd/
  F:    include/linux/lockd/
  F:    include/linux/sunrpc/
 +F:    include/trace/events/rpcgss.h
 +F:    include/trace/events/rpcrdma.h
 +F:    include/trace/events/sunrpc.h
 +F:    include/trace/misc/fs.h
 +F:    include/trace/misc/nfs.h
 +F:    include/trace/misc/sunrpc.h
  F:    include/uapi/linux/nfsd/
  F:    include/uapi/linux/sunrpc/
  F:    net/sunrpc/
@@@ -11352,7 -11245,7 +11356,7 @@@ L:   kvm@vger.kernel.or
  L:    kvm-riscv@lists.infradead.org
  L:    linux-riscv@lists.infradead.org
  S:    Maintained
 -T:    git git://github.com/kvm-riscv/linux.git
 +T:    git https://github.com/kvm-riscv/linux.git
  F:    arch/riscv/include/asm/kvm*
  F:    arch/riscv/include/uapi/asm/kvm*
  F:    arch/riscv/kvm/
@@@ -11365,6 -11258,7 +11369,6 @@@ M:   Claudio Imbrenda <imbrenda@linux.ibm
  R:    David Hildenbrand <david@redhat.com>
  L:    kvm@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git
  F:    Documentation/virt/kvm/s390*
  F:    arch/s390/include/asm/gmap.h
@@@ -11959,7 -11853,7 +11963,7 @@@ M:   Eric Piel <eric.piel@tremplin-utc.ne
  S:    Maintained
  F:    Documentation/misc-devices/lis3lv02d.rst
  F:    drivers/misc/lis3lv02d/
 -F:    drivers/platform/x86/hp_accel.c
 +F:    drivers/platform/x86/hp/hp_accel.c
  
  LIST KUNIT TEST
  M:    David Gow <davidgow@google.com>
@@@ -12114,21 -12008,6 +12118,21 @@@ F: drivers/*/*loongarch
  F:    Documentation/loongarch/
  F:    Documentation/translations/zh_CN/loongarch/
  
 +LOONGSON-2 SOC SERIES GUTS DRIVER
 +M:    Yinbo Zhu <zhuyinbo@loongson.cn>
 +L:    loongarch@lists.linux.dev
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwinfo/loongson,ls2k-chipid.yaml
 +F:    drivers/soc/loongson/loongson2_guts.c
 +
 +LOONGSON-2 SOC SERIES PINCTRL DRIVER
 +M:    zhanghongchen <zhanghongchen@loongson.cn>
 +M:    Yinbo Zhu <zhuyinbo@loongson.cn>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
 +F:    drivers/pinctrl/pinctrl-loongson2.c
 +
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <sathya.prakash@broadcom.com>
  M:    Sreekanth Reddy <sreekanth.reddy@broadcom.com>
@@@ -12206,7 -12085,7 +12210,7 @@@ M:   Alexey Kodanev <alexey.kodanev@oracl
  L:    ltp@lists.linux.it (subscribers-only)
  S:    Maintained
  W:    http://linux-test-project.github.io/
 -T:    git git://github.com/linux-test-project/ltp.git
 +T:    git https://github.com/linux-test-project/ltp.git
  
  LYNX 28G SERDES PHY DRIVER
  M:    Ioana Ciornei <ioana.ciornei@nxp.com>
@@@ -12342,6 -12221,7 +12346,6 @@@ F:   arch/mips/boot/dts/img/pistachio
  
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <andrew@lunn.ch>
 -M:    Vivien Didelot <vivien.didelot@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
@@@ -12431,7 -12311,7 +12435,7 @@@ M:   Marcin Wojtas <mw@semihalf.com
  M:    Russell King <linux@armlinux.org.uk>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/marvell-pp2.txt
 +F:    Documentation/devicetree/bindings/net/marvell,pp2.yaml
  F:    drivers/net/ethernet/marvell/mvpp2/
  
  MARVELL MWIFIEX WIRELESS DRIVER
@@@ -12479,7 -12359,7 +12483,7 @@@ F:   Documentation/networking/device_driv
  F:    drivers/net/ethernet/marvell/octeontx2/af/
  
  MARVELL PRESTERA ETHERNET SWITCH DRIVER
 -M:    Taras Chornyi <tchornyi@marvell.com>
 +M:    Taras Chornyi <taras.chornyi@plvision.eu>
  S:    Supported
  W:    https://github.com/Marvell-switching/switchdev-prestera
  F:    drivers/net/ethernet/marvell/prestera/
@@@ -12841,7 -12721,7 +12845,7 @@@ F:   Documentation/admin-guide/media/imx7
  F:    Documentation/devicetree/bindings/media/nxp,imx-mipi-csi2.yaml
  F:    Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml
  F:    drivers/media/platform/nxp/imx-mipi-csis.c
 -F:    drivers/staging/media/imx/imx7-media-csi.c
 +F:    drivers/media/platform/nxp/imx7-media-csi.c
  
  MEDIA DRIVERS FOR HELENE
  M:    Abylay Ospan <aospan@netup.ru>
@@@ -13038,7 -12918,6 +13042,7 @@@ M:   Felix Fietkau <nbd@nbd.name
  M:    John Crispin <john@phrozen.org>
  M:    Sean Wang <sean.wang@mediatek.com>
  M:    Mark Lee <Mark-MC.Lee@mediatek.com>
 +M:    Lorenzo Bianconi <lorenzo@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
@@@ -13410,20 -13289,10 +13414,20 @@@ F:        include/linux/memory_hotplug.
  F:    include/linux/mm.h
  F:    include/linux/mmzone.h
  F:    include/linux/pagewalk.h
 -F:    include/linux/vmalloc.h
  F:    mm/
  F:    tools/testing/selftests/vm/
  
 +VMALLOC
 +M:    Andrew Morton <akpm@linux-foundation.org>
 +R:    Uladzislau Rezki <urezki@gmail.com>
 +R:    Christoph Hellwig <hch@infradead.org>
 +L:    linux-mm@kvack.org
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    include/linux/vmalloc.h
 +F:    mm/vmalloc.c
 +
  MEMORY HOT(UN)PLUG
  M:    David Hildenbrand <david@redhat.com>
  M:    Oscar Salvador <osalvador@suse.de>
@@@ -13511,7 -13380,7 +13515,7 @@@ MESON NAND CONTROLLER DRIVER FOR AMLOGI
  M:    Liang Yang <liang.yang@amlogic.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.txt
 +F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.yaml
  F:    drivers/mtd/nand/raw/meson_*
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
@@@ -13592,7 -13461,7 +13596,7 @@@ M:   Eugen Hristev <eugen.hristev@microch
  L:    linux-media@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/media/microchip,csi2dc.yaml
 -F:    drivers/media/platform/atmel/microchip-csi2dc.c
 +F:    drivers/media/platform/microchip/microchip-csi2dc.c
  
  MICROCHIP ECC DRIVER
  M:    Tudor Ambarus <tudor.ambarus@microchip.com>
@@@ -13619,10 -13488,8 +13623,10 @@@ L: linux-media@vger.kernel.or
  S:    Supported
  F:    Documentation/devicetree/bindings/media/atmel,isc.yaml
  F:    Documentation/devicetree/bindings/media/microchip,xisc.yaml
 -F:    drivers/media/platform/atmel/atmel-isc*
 -F:    drivers/media/platform/atmel/atmel-sama*-isc*
 +F:    drivers/staging/media/deprecated/atmel/atmel-isc*
 +F:    drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
 +F:    drivers/media/platform/microchip/microchip-isc*
 +F:    drivers/media/platform/microchip/microchip-sama*-isc*
  F:    include/linux/atmel-isc-media.h
  
  MICROCHIP ISI DRIVER
@@@ -13755,12 -13622,6 +13759,12 @@@ S: Supporte
  F:    drivers/misc/atmel-ssc.c
  F:    include/linux/atmel-ssc.h
  
 +MICROCHIP SOC DRIVERS
 +M:    Conor Dooley <conor@kernel.org>
 +S:    Supported
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    drivers/soc/microchip/
 +
  MICROCHIP USB251XB DRIVER
  M:    Richard Leitner <richard.leitner@skidata.com>
  L:    linux-usb@vger.kernel.org
@@@ -13805,15 -13666,6 +13809,15 @@@ F: drivers/scsi/smartpqi/smartpqi*.[ch
  F:    include/linux/cciss*.h
  F:    include/uapi/linux/cciss*.h
  
 +MICROSOFT MANA RDMA DRIVER
 +M:    Long Li <longli@microsoft.com>
 +M:    Ajay Sharma <sharmaajay@microsoft.com>
 +L:    linux-rdma@vger.kernel.org
 +S:    Supported
 +F:    drivers/infiniband/hw/mana/
 +F:    include/net/mana
 +F:    include/uapi/rdma/mana-abi.h
 +
  MICROSOFT SURFACE AGGREGATOR TABLET-MODE SWITCH
  M:    Maximilian Luz <luzmaximilian@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -14089,7 -13941,6 +14093,7 @@@ F:   include/uapi/linux/meye.
  
  MOTORCOMM PHY DRIVER
  M:    Peter Geis <pgwipeout@gmail.com>
 +M:    Frank <Frank.Sae@motor-comm.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/phy/motorcomm.c
@@@ -14468,6 -14319,7 +14472,6 @@@ F:   drivers/net/wireless
  
  NETWORKING [DSA]
  M:    Andrew Lunn <andrew@lunn.ch>
 -M:    Vivien Didelot <vivien.didelot@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Vladimir Oltean <olteanv@gmail.com>
  S:    Maintained
@@@ -14672,7 -14524,7 +14676,7 @@@ L:   linux-nilfs@vger.kernel.or
  S:    Supported
  W:    https://nilfs.sourceforge.io/
  W:    https://nilfs.osdn.jp/
 -T:    git git://github.com/konis/nilfs2.git
 +T:    git https://github.com/konis/nilfs2.git
  F:    Documentation/filesystems/nilfs2.rst
  F:    fs/nilfs2/
  F:    include/trace/events/nilfs2.h
@@@ -14861,12 -14713,6 +14865,12 @@@ F: drivers/nvme/target/auth.
  F:    drivers/nvme/target/fabrics-cmd-auth.c
  F:    include/linux/nvme-auth.h
  
 +NVM EXPRESS HARDWARE MONITORING SUPPORT
 +M:    Guenter Roeck <linux@roeck-us.net>
 +L:    linux-nvme@lists.infradead.org
 +S:    Supported
 +F:    drivers/nvme/host/hwmon.c
 +
  NVM EXPRESS FC TRANSPORT DRIVERS
  M:    James Smart <james.smart@broadcom.com>
  L:    linux-nvme@lists.infradead.org
@@@ -15324,13 -15170,6 +15328,13 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov08d10.c
  
 +OMNIVISION OV08X40 SENSOR DRIVER
 +M:    Jason Chen <jason.z.chen@intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/i2c/ov08x40.c
 +
  OMNIVISION OV13858 SENSOR DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -15369,14 -15208,6 +15373,14 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov2740.c
  
 +OMNIVISION OV4689 SENSOR DRIVER
 +M:    Mikhail Rudenko <mike.rudenko@gmail.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
 +F:    drivers/media/i2c/ov5647.c
 +
  OMNIVISION OV5640 SENSOR DRIVER
  M:    Steve Longerbeam <slongerbeam@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -15501,12 -15332,6 +15505,12 @@@ S: Maintaine
  F:    drivers/mtd/nand/onenand/
  F:    include/linux/mtd/onenand*.h
  
 +ONEXPLAYER FAN DRIVER
 +M:    Joaquín Ignacio Aramendía <samsagax@gmail.com>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hwmon/oxp-sensors.c
 +
  ONION OMEGA2+ BOARD
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
  L:    linux-mips@vger.kernel.org
@@@ -15605,7 -15430,6 +15609,7 @@@ S:   Maintaine
  W:    http://openvswitch.org
  F:    include/uapi/linux/openvswitch.h
  F:    net/openvswitch/
 +F:    tools/testing/selftests/net/openvswitch/
  
  OPERATING PERFORMANCE POINTS (OPP)
  M:    Viresh Kumar <vireshk@kernel.org>
@@@ -15797,7 -15621,7 +15801,7 @@@ F:   drivers/input/serio/gscps2.
  F:    drivers/input/serio/hp_sdc*
  F:    drivers/parisc/
  F:    drivers/parport/parport_gsc.*
 -F:    drivers/tty/serial/8250/8250_gsc.c
 +F:    drivers/tty/serial/8250/8250_parisc.c
  F:    drivers/video/console/sti*
  F:    drivers/video/fbdev/sti*
  F:    drivers/video/logo/logo_parisc*
@@@ -16019,7 -15843,7 +16023,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/*designware*
  
  PCI DRIVER FOR TI DRA7XX/J721E
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
 +M:    Vignesh Raghavendra <vigneshr@ti.com>
  L:    linux-omap@vger.kernel.org
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -16036,10 -15860,10 +16040,10 @@@ F:        Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pci-v3-semi.c
  
  PCI ENDPOINT SUBSYSTEM
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
  M:    Lorenzo Pieralisi <lpieralisi@kernel.org>
  R:    Krzysztof Wilczyński <kw@linux.com>
  R:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +R:    Kishon Vijay Abraham I <kishon@kernel.org>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
@@@ -16110,7 -15934,6 +16114,7 @@@ Q:   https://patchwork.kernel.org/project
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git
 +F:    Documentation/devicetree/bindings/pci/
  F:    drivers/pci/controller/
  F:    drivers/pci/pci-bridge-emul.c
  F:    drivers/pci/pci-bridge-emul.h
@@@ -16217,7 -16040,7 +16221,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/*microchip*
  
  PCIE DRIVER FOR QUALCOMM MSM
 -M:    Stanimir Varbanov <svarbanov@mm-sol.com>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -16307,8 -16130,7 +16311,8 @@@ F:   include/linux/peci-cpu.
  F:    include/linux/peci.h
  
  PENSANDO ETHERNET DRIVERS
 -M:    Shannon Nelson <snelson@pensando.io>
 +M:    Shannon Nelson <shannon.nelson@amd.com>
 +M:    Brett Creeley <brett.creeley@amd.com>
  M:    drivers@pensando.io
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -16466,7 -16288,7 +16470,7 @@@ M:   Sean Wang <sean.wang@kernel.org
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt65xx-pinctrl.yaml
 -F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6797-pinctrl.yaml
 +F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6779-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt8183-pinctrl.yaml
  F:    drivers/pinctrl/mediatek/
@@@ -16539,6 -16361,13 +16543,6 @@@ S:  Supporte
  F:    Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
  F:    drivers/input/keyboard/pinephone-keyboard.c
  
 -PKTCDVD DRIVER
 -M:    linux-block@vger.kernel.org
 -S:    Orphan
 -F:    drivers/block/pktcdvd.c
 -F:    include/linux/pktcdvd.h
 -F:    include/uapi/linux/pktcdvd.h
 -
  PLANTOWER PMS7003 AIR POLLUTION SENSOR DRIVER
  M:    Tomasz Duszynski <tduszyns@gmail.com>
  S:    Maintained
@@@ -16816,10 -16645,10 +16820,10 @@@ F:        net/psampl
  
  PSTORE FILESYSTEM
  M:    Kees Cook <keescook@chromium.org>
 -M:    Anton Vorontsov <anton@enomsg.org>
 -M:    Colin Cross <ccross@android.com>
 -M:    Tony Luck <tony.luck@intel.com>
 -S:    Maintained
 +R:    Tony Luck <tony.luck@intel.com>
 +R:    Guilherme G. Piccoli <gpiccoli@igalia.com>
 +L:    linux-hardening@vger.kernel.org
 +S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
  F:    Documentation/admin-guide/ramoops.rst
  F:    Documentation/admin-guide/pstore-blk.rst
@@@ -16840,7 -16669,6 +16844,7 @@@ F:   Documentation/driver-api/ptp.rs
  F:    drivers/net/phy/dp83640*
  F:    drivers/ptp/*
  F:    include/linux/ptp_cl*
 +K:    (?:\b|_)ptp(?:\b|_)
  
  PTP VIRTUAL CLOCK SUPPORT
  M:    Yangbo Lu <yangbo.lu@nxp.com>
@@@ -16866,6 -16694,7 +16870,6 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/admin-guide/media/pulse8-cec.rst
  F:    drivers/media/cec/usb/pulse8/
  
  PURELIFI PLFXLC DRIVER
@@@ -16896,7 -16725,6 +16900,7 @@@ PWM IR Transmitte
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/irled/pwm-ir-tx.yaml
  F:    drivers/media/rc/pwm-ir-tx.c
  
  PWM SUBSYSTEM
@@@ -16961,7 -16789,7 +16965,7 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Banajit Goswami <bgoswami@quicinc.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
 -F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml
 +F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr*
  F:    Documentation/devicetree/bindings/sound/qcom,*
  F:    drivers/soc/qcom/apr.c
  F:    include/dt-bindings/sound/qcom,wcd9335.h
@@@ -17319,8 -17147,7 +17323,8 @@@ F:   Documentation/devicetree/bindings/th
  F:    drivers/thermal/qcom/
  
  QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
 -M:    Stanimir Varbanov <stanimir.varbanov@linaro.org>
 +M:    Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
 +M:    Vikash Garodia <quic_vgarodia@quicinc.com>
  L:    linux-media@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -17385,7 -17212,7 +17389,7 @@@ R:   Dongsheng Yang <dongsheng.yang@easys
  L:    ceph-devel@vger.kernel.org
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://github.com/ceph/ceph-client.git
 +T:    git https://github.com/ceph/ceph-client.git
  F:    Documentation/ABI/testing/sysfs-bus-rbd
  F:    drivers/block/rbd.c
  F:    drivers/block/rbd_types.h
@@@ -17638,8 -17465,10 +17642,8 @@@ S:  Maintaine
  F:    drivers/net/wireless/realtek/rtw89/
  
  REDPINE WIRELESS DRIVER
 -M:    Amitkumar Karwar <amitkarwar@gmail.com>
 -M:    Siva Rebbagondla <siva8118@gmail.com>
  L:    linux-wireless@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/net/wireless/rsi/
  
  REGISTER MAP ABSTRACTION
@@@ -17884,7 -17713,7 +17888,7 @@@ F:   arch/riscv
  N:    riscv
  K:    riscv
  
 -RISC-V/MICROCHIP POLARFIRE SOC SUPPORT
 +RISC-V MICROCHIP FPGA SUPPORT
  M:    Conor Dooley <conor.dooley@microchip.com>
  M:    Daire McNamara <daire.mcnamara@microchip.com>
  L:    linux-riscv@lists.infradead.org
@@@ -17902,26 -17731,17 +17906,26 @@@ F:        Documentation/devicetree/bindings/us
  F:    arch/riscv/boot/dts/microchip/
  F:    drivers/char/hw_random/mpfs-rng.c
  F:    drivers/clk/microchip/clk-mpfs.c
 -F:    drivers/i2c/busses/i2c-microchip-core.c
 +F:    drivers/i2c/busses/i2c-microchip-corei2c.c
  F:    drivers/mailbox/mailbox-mpfs.c
  F:    drivers/pci/controller/pcie-microchip-host.c
  F:    drivers/reset/reset-mpfs.c
  F:    drivers/rtc/rtc-mpfs.c
 -F:    drivers/soc/microchip/
 +F:    drivers/soc/microchip/mpfs-sys-controller.c
  F:    drivers/spi/spi-microchip-core-qspi.c
  F:    drivers/spi/spi-microchip-core.c
  F:    drivers/usb/musb/mpfs.c
  F:    include/soc/microchip/mpfs.h
  
 +RISC-V MISC SOC SUPPORT
 +M:    Conor Dooley <conor@kernel.org>
 +L:    linux-riscv@lists.infradead.org
 +S:    Maintained
 +Q:    https://patchwork.kernel.org/project/linux-riscv/list/
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    Documentation/devicetree/bindings/riscv/
 +F:    arch/riscv/boot/dts/
 +
  RNBD BLOCK DRIVERS
  M:    Md. Haris Iqbal <haris.iqbal@ionos.com>
  M:    Jack Wang <jinpu.wang@ionos.com>
@@@ -17985,7 -17805,7 +17989,7 @@@ S:   Odd Fixe
  F:    drivers/tty/serial/rp2.*
  
  ROHM BD99954 CHARGER IC
 -R:    Matti Vaittinen <mazziesaccount@gmail.com>
 +M:    Matti Vaittinen <mazziesaccount@gmail.com>
  S:    Supported
  F:    drivers/power/supply/bd99954-charger.c
  F:    drivers/power/supply/bd99954-charger.h
@@@ -18008,7 -17828,7 +18012,7 @@@ F:   drivers/regulator/bd9571mwv-regulato
  F:    include/linux/mfd/bd9571mwv.h
  
  ROHM POWER MANAGEMENT IC DEVICE DRIVERS
 -R:    Matti Vaittinen <mazziesaccount@gmail.com>
 +M:    Matti Vaittinen <mazziesaccount@gmail.com>
  S:    Supported
  F:    drivers/clk/clk-bd718x7.c
  F:    drivers/gpio/gpio-bd71815.c
@@@ -18162,7 -17982,7 +18166,7 @@@ L:   linux-fbdev@vger.kernel.or
  S:    Maintained
  F:    drivers/video/fbdev/savage/
  
 -S390
 +S390 ARCHITECTURE
  M:    Heiko Carstens <hca@linux.ibm.com>
  M:    Vasily Gorbik <gor@linux.ibm.com>
  M:    Alexander Gordeev <agordeev@linux.ibm.com>
@@@ -18170,6 -17990,7 +18174,6 @@@ R:   Christian Borntraeger <borntraeger@l
  R:    Sven Schnelle <svens@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
  F:    Documentation/driver-api/s390-drivers.rst
  F:    Documentation/s390/
@@@ -18181,6 -18002,7 +18185,6 @@@ M:   Vineeth Vijayan <vneethv@linux.ibm.c
  M:    Peter Oberparleiter <oberpar@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/cio/
  
  S390 DASD DRIVER
@@@ -18188,6 -18010,7 +18192,6 @@@ M:   Stefan Haberland <sth@linux.ibm.com
  M:    Jan Hoeppner <hoeppner@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    block/partitions/ibm.c
  F:    drivers/s390/block/dasd*
  F:    include/linux/dasd_mod.h
@@@ -18197,6 -18020,7 +18201,6 @@@ M:   Matthew Rosato <mjrosato@linux.ibm.c
  M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/iommu/s390-iommu.c
  
  S390 IUCV NETWORK LAYER
@@@ -18205,6 -18029,7 +18209,6 @@@ M:   Wenjia Zhang <wenjia@linux.ibm.com
  L:    linux-s390@vger.kernel.org
  L:    netdev@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/*iucv*
  F:    include/net/iucv/
  F:    net/iucv/
@@@ -18215,22 -18040,15 +18219,22 @@@ M:        Wenjia Zhang <wenjia@linux.ibm.com
  L:    linux-s390@vger.kernel.org
  L:    netdev@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/
  
 +S390 MM
 +M:    Alexander Gordeev <agordeev@linux.ibm.com>
 +M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
 +F:    arch/s390/include/asm/pgtable.h
 +F:    arch/s390/mm
 +
  S390 PCI SUBSYSTEM
  M:    Niklas Schnelle <schnelle@linux.ibm.com>
  M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    arch/s390/pci/
  F:    drivers/pci/hotplug/s390_pci_hpc.c
  F:    Documentation/s390/pci.rst
@@@ -18241,6 -18059,7 +18245,6 @@@ M:   Halil Pasic <pasic@linux.ibm.com
  M:    Jason Herne <jjherne@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    Documentation/s390/vfio-ap*
  F:    drivers/s390/crypto/vfio_ap*
  
@@@ -18269,6 -18088,7 +18273,6 @@@ S390 ZCRYPT DRIVE
  M:    Harald Freudenberger <freude@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/crypto/
  
  S390 ZFCP DRIVER
@@@ -18276,6 -18096,7 +18280,6 @@@ M:   Steffen Maier <maier@linux.ibm.com
  M:    Benjamin Block <bblock@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/scsi/zfcp_*
  
  S3C ADC BATTERY DRIVER
@@@ -18314,6 -18135,7 +18318,6 @@@ L:   linux-media@vger.kernel.or
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/staging/media/deprecated/saa7146/
 -F:    include/media/drv-intf/saa7146*
  
  SAFESETID SECURITY MODULE
  M:    Micah Morton <mortonm@chromium.org>
@@@ -18393,6 -18215,7 +18397,6 @@@ F:   include/media/drv-intf/s3c_camif.
  
  SAMSUNG S3FWRN5 NFC DRIVER
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 -M:    Krzysztof Opasiak <k.opasiak@samsung.com>
  L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
@@@ -18653,7 -18476,6 +18657,7 @@@ K:   \bsecure_computin
  K:    \bTIF_SECCOMP\b
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
 +M:    Kamal Dasu <kdasu.kdev@gmail.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mmc@vger.kernel.org
@@@ -18664,7 -18486,6 +18668,7 @@@ SECURE DIGITAL HOST CONTROLLER INTERFAC
  M:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-mmc@vger.kernel.org
  S:    Supported
 +F:    Documentation/devicetree/bindings/mmc/sdhci-common.yaml
  F:    drivers/mmc/host/sdhci*
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) MICROCHIP DRIVER
@@@ -18849,6 -18670,7 +18853,6 @@@ M:   Wenjia Zhang <wenjia@linux.ibm.com
  M:    Jan Karcher <jaka@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    net/smc/
  
  SHARP GP2AP002A00F/GP2AP002S00F SENSOR DRIVER
@@@ -18959,6 -18781,7 +18963,6 @@@ M:   Palmer Dabbelt <palmer@dabbelt.com
  M:    Paul Walmsley <paul.walmsley@sifive.com>
  L:    linux-riscv@lists.infradead.org
  S:    Supported
 -T:    git git://github.com/sifive/riscv-linux.git
  N:    sifive
  K:    [^@]sifive
  
@@@ -18977,13 -18800,6 +18981,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml
  F:    drivers/dma/sf-pdma/
  
 +SIFIVE SOC DRIVERS
 +M:    Conor Dooley <conor@kernel.org>
 +L:    linux-riscv@lists.infradead.org
 +S:    Maintained
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 +F:    drivers/soc/sifive/
 +
  SILEAD TOUCHSCREEN DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
  L:    linux-input@vger.kernel.org
@@@ -19050,7 -18866,7 +19054,7 @@@ M:   Jason A. Donenfeld <Jason@zx2c4.com
  S:    Maintained
  F:    include/linux/siphash.h
  F:    lib/siphash.c
- F:    lib/test_siphash.c
+ F:    lib/siphash_kunit.c
  
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
@@@ -19074,7 -18890,7 +19078,7 @@@ F:   drivers/video/fbdev/sis
  F:    include/video/sisfb.h
  
  SIS I2C TOUCHSCREEN DRIVER
 -M:    Mika Penttilä <mika.penttila@nextfour.com>
 +M:    Mika Penttilä <mpenttil@redhat.com>
  L:    linux-input@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/input/touchscreen/sis_i2c.txt
@@@ -19217,7 -19033,7 +19221,7 @@@ M:   Jassi Brar <jaswinder.singh@linaro.o
  M:    Ilias Apalodimas <ilias.apalodimas@linaro.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/socionext-netsec.txt
 +F:    Documentation/devicetree/bindings/net/socionext,synquacer-netsec.yaml
  F:    drivers/net/ethernet/socionext/netsec.c
  
  SOCIONEXT (SNI) Synquacer SPI DRIVER
@@@ -19225,7 -19041,7 +19229,7 @@@ M:   Masahisa Kojima <masahisa.kojima@lin
  M:    Jassi Brar <jaswinder.singh@linaro.org>
  L:    linux-spi@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/spi/spi-synquacer.txt
 +F:    Documentation/devicetree/bindings/spi/socionext,synquacer-spi.yaml
  F:    drivers/spi/spi-synquacer.c
  
  SOCIONEXT SYNQUACER I2C DRIVER
@@@ -19372,7 -19188,7 +19376,7 @@@ M:   Manivannan Sadhasivam <manivannan.sa
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/imx290.txt
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
  F:    drivers/media/i2c/imx290.c
  
  SONY IMX319 SENSOR DRIVER
@@@ -19521,11 -19337,6 +19525,11 @@@ W: https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  F:    drivers/media/dvb-frontends/sp2*
  
 +SPANISH DOCUMENTATION
 +M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +S:    Maintained
 +F:    Documentation/translations/sp_SP/
 +
  SPARC + UltraSPARC (sparc/sparc64)
  M:    "David S. Miller" <davem@davemloft.net>
  L:    sparclinux@vger.kernel.org
@@@ -19669,7 -19480,7 +19673,7 @@@ M:   Sylvain Petinot <sylvain.petinot@fos
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.txt
 +F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.yaml
  F:    drivers/media/i2c/st-mipid02.c
  
  ST STM32 I2C/SMBUS DRIVER
@@@ -19692,16 -19503,6 +19696,16 @@@ S: Maintaine
  F:    Documentation/hwmon/stpddc60.rst
  F:    drivers/hwmon/pmbus/stpddc60.c
  
 +ST VGXY61 DRIVER
 +M:    Benjamin Mugnier <benjamin.mugnier@foss.st.com>
 +M:    Sylvain Petinot <sylvain.petinot@foss.st.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
 +F:    Documentation/userspace-api/media/drivers/st-vgxy61.rst
 +F:    drivers/media/i2c/st-vgxy61.c
 +
  ST VL53L0X ToF RANGER(I2C) IIO DRIVER
  M:    Song Qiang <songqiang1304521@gmail.com>
  L:    linux-iio@vger.kernel.org
@@@ -19717,7 -19518,6 +19721,7 @@@ S:   Supporte
  F:    Documentation/process/stable-kernel-rules.rst
  
  STAGING - ATOMISP DRIVER
 +M:    Hans de Goede <hdegoede@redhat.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  R:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -19801,11 -19601,6 +19805,11 @@@ M: Ion Badulescu <ionut@badula.org
  S:    Odd Fixes
  F:    drivers/net/ethernet/adaptec/starfire*
  
 +STARFIVE DEVICETREES
 +M:    Emil Renner Berthing <kernel@esmil.dk>
 +S:    Maintained
 +F:    arch/riscv/boot/dts/starfive/
 +
  STARFIVE JH7100 CLOCK DRIVERS
  M:    Emil Renner Berthing <kernel@esmil.dk>
  S:    Maintained
@@@ -19927,13 -19722,6 +19931,13 @@@ W: https://sunplus.atlassian.net/wiki/s
  F:    Documentation/devicetree/bindings/net/sunplus,sp7021-emac.yaml
  F:    drivers/net/ethernet/sunplus/
  
 +SUNPLUS MMC DRIVER
 +M:    Tony Huang <tonyhuang.sunplus@gmail.com>
 +M:    Li-hao Kuo <lhjeff911@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mmc/sunplus,mmc.yaml
 +F:    drivers/mmc/host/sunplus-mmc.c
 +
  SUNPLUS OCOTP DRIVER
  M:    Vincent Shih <vincent.sunplus@gmail.com>
  S:    Maintained
@@@ -20185,7 -19973,6 +20189,7 @@@ F:   drivers/clk/clk-sc[mp]i.
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
 +F:    drivers/powercap/arm_scmi_powercap.c
  F:    drivers/regulator/scmi-regulator.c
  F:    drivers/reset/reset-scmi.c
  F:    include/linux/sc[mp]i_protocol.h
@@@ -20520,7 -20307,7 +20524,7 @@@ M:   Chris Zankel <chris@zankel.net
  M:    Max Filippov <jcmvbkbc@gmail.com>
  L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
 -T:    git git://github.com/czankel/xtensa-linux.git
 +T:    git https://github.com/jcmvbkbc/linux-xtensa.git
  F:    arch/xtensa/
  F:    drivers/irqchip/irq-xtensa-*
  
@@@ -20870,6 -20657,7 +20874,6 @@@ W:   https://wireless.wiki.kernel.org/en/
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
  F:    drivers/net/wireless/ti/
 -F:    include/linux/wl12xx.h
  
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <jstultz@google.com>
@@@ -21397,6 -21185,15 +21401,6 @@@ S:  Maintaine
  F:    Documentation/usb/ehci.rst
  F:    drivers/usb/host/ehci*
  
 -USB GADGET/PERIPHERAL SUBSYSTEM
 -M:    Felipe Balbi <balbi@kernel.org>
 -L:    linux-usb@vger.kernel.org
 -S:    Maintained
 -W:    http://www.linux-usb.org/gadget
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -F:    drivers/usb/gadget/
 -F:    include/linux/usb/gadget*
 -
  USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
  M:    Jiri Kosina <jikos@kernel.org>
  M:    Benjamin Tissoires <benjamin.tissoires@redhat.com>
@@@ -21500,9 -21297,16 +21504,9 @@@ L:  linux-usb@vger.kernel.or
  L:    netdev@vger.kernel.org
  S:    Maintained
  W:    https://github.com/petkan/pegasus
 -T:    git git://github.com/petkan/pegasus.git
 +T:    git https://github.com/petkan/pegasus.git
  F:    drivers/net/usb/pegasus.*
  
 -USB PHY LAYER
 -M:    Felipe Balbi <balbi@kernel.org>
 -L:    linux-usb@vger.kernel.org
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -F:    drivers/usb/phy/
 -
  USB PRINTER DRIVER (usblp)
  M:    Pete Zaitcev <zaitcev@redhat.com>
  L:    linux-usb@vger.kernel.org
@@@ -21530,7 -21334,7 +21534,7 @@@ L:   linux-usb@vger.kernel.or
  L:    netdev@vger.kernel.org
  S:    Maintained
  W:    https://github.com/petkan/rtl8150
 -T:    git git://github.com/petkan/rtl8150.git
 +T:    git https://github.com/petkan/rtl8150.git
  F:    drivers/net/usb/rtl8150.c
  
  USB SERIAL SUBSYSTEM
@@@ -21933,12 -21737,6 +21937,12 @@@ F: include/linux/virtio*.
  F:    include/uapi/linux/virtio_*.h
  F:    tools/virtio/
  
 +VISL VIRTUAL STATELESS DECODER DRIVER
 +M:    Daniel Almeida <daniel.almeida@collabora.com>
 +L:    linux-media@vger.kernel.org
 +S:    Supported
 +F:    drivers/media/test-drivers/visl
 +
  IFCVF VIRTIO DATA PATH ACCELERATOR
  R:    Zhu Lingshan <lingshan.zhu@intel.com>
  F:    drivers/vdpa/ifcvf/
@@@ -22327,7 -22125,6 +22331,7 @@@ F:   Documentation/watchdog
  F:    drivers/watchdog/
  F:    include/linux/watchdog.h
  F:    include/uapi/linux/watchdog.h
 +F:    include/trace/events/watchdog.h
  
  WHISKEYCOVE PMIC GPIO DRIVER
  M:    Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
@@@ -22968,7 -22765,7 +22972,7 @@@ S:   Maintaine
  W:    http://mjpeg.sourceforge.net/driver-zoran/
  Q:    https://patchwork.linuxtv.org/project/linux-media/list/
  F:    Documentation/driver-api/media/drivers/zoran.rst
 -F:    drivers/staging/media/zoran/
 +F:    drivers/media/pci/zoran/
  
  ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
  M:    Minchan Kim <minchan@kernel.org>
diff --combined Makefile
+++ b/Makefile
@@@ -2,7 -2,7 +2,7 @@@
  VERSION = 6
  PATCHLEVEL = 1
  SUBLEVEL = 0
 -EXTRAVERSION = -rc1
 +EXTRAVERSION =
  NAME = Hurr durr I'ma ninja sloth
  
  # *DOCUMENTATION*
@@@ -562,7 -562,7 +562,7 @@@ KBUILD_AFLAGS   := -D__ASSEMBLY__ -fno-
  KBUILD_CFLAGS   := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
                   -Werror=implicit-function-declaration -Werror=implicit-int \
 -                 -Werror=return-type -Wno-format-security \
 +                 -Werror=return-type -Wno-format-security -funsigned-char \
                   -std=gnu11
  KBUILD_CPPFLAGS := -D__KERNEL__
  KBUILD_RUSTFLAGS := $(rust_common_flags) \
@@@ -966,10 -966,8 +966,10 @@@ LDFLAGS_vmlinux += --gc-section
  endif
  
  ifdef CONFIG_SHADOW_CALL_STACK
 +ifndef CONFIG_DYNAMIC_SCS
  CC_FLAGS_SCS  := -fsanitize=shadow-call-stack
  KBUILD_CFLAGS += $(CC_FLAGS_SCS)
 +endif
  export CC_FLAGS_SCS
  endif
  
@@@ -1120,7 -1118,7 +1120,7 @@@ endi
  # 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
+ LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
  endif
  
  # Align the bit size of userspace programs with the kernel
@@@ -1220,7 -1218,7 +1220,7 @@@ quiet_cmd_ar_vmlinux.a = AR      $
        cmd_ar_vmlinux.a = \
        rm -f $@; \
        $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
 -      $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)
 +      $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
  
  targets += vmlinux.a
  vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE
@@@ -1787,7 -1785,7 +1787,7 @@@ $(help-board-dirs): help-%
  # Documentation targets
  # ---------------------------------------------------------------------------
  DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \
 -             linkcheckdocs dochelp refcheckdocs
 +             linkcheckdocs dochelp refcheckdocs texinfodocs infodocs
  PHONY += $(DOC_TARGETS)
  $(DOC_TARGETS):
        $(Q)$(MAKE) $(build)=Documentation $@
@@@ -2003,9 -2001,7 +2003,9 @@@ clean: $(clean-dirs
        @find $(or $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
                \( -name '*.[aios]' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \
                -o -name '*.ko.*' \
 -              -o -name '*.dtb' -o -name '*.dtbo' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
 +              -o -name '*.dtb' -o -name '*.dtbo' \
 +              -o -name '*.dtb.S' -o -name '*.dtbo.S' \
 +              -o -name '*.dt.yaml' \
                -o -name '*.dwo' -o -name '*.lst' \
                -o -name '*.su' -o -name '*.mod' -o -name '*.usyms' \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
@@@ -27,7 -27,6 +27,7 @@@ KASAN_SANITIZE                := 
  
  # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
  KCOV_INSTRUMENT               := n
 +UBSAN_SANITIZE                := n
  
  #
  # Architecture dependencies
@@@ -124,7 -123,7 +124,7 @@@ LDFLAGS_vmlinux += --no-undefine
  LDFLAGS_vmlinux += -X
  # Report orphan sections
  ifdef CONFIG_LD_ORPHAN_WARN
- LDFLAGS_vmlinux += --orphan-handling=warn
+ LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
  endif
  # Next argument is a linker script
  LDFLAGS_vmlinux += -T
@@@ -164,3 -163,4 +164,3 @@@ $(obj)/piggy_data: $(obj)/../Image FORC
  $(obj)/piggy.o: $(obj)/piggy_data
  
  CFLAGS_font.o := -Dstatic=
 -AFLAGS_hyp-stub.o := -Wa,-march=armv7-a
@@@ -68,7 -68,7 +68,7 @@@ KBUILD_LDFLAGS += $(call ld-option,--no
  # address by the bootloader.
  LDFLAGS_vmlinux := -pie $(call ld-option, --no-dynamic-linker)
  ifdef CONFIG_LD_ORPHAN_WARN
- LDFLAGS_vmlinux += --orphan-handling=warn
+ LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
  endif
  LDFLAGS_vmlinux += -z noexecstack
  ifeq ($(CONFIG_LD_IS_BFD),y)
@@@ -100,7 -100,7 +100,7 @@@ vmlinux-objs-$(CONFIG_RANDOMIZE_BASE) +
  ifdef CONFIG_X86_64
        vmlinux-objs-y += $(obj)/ident_map_64.o
        vmlinux-objs-y += $(obj)/idt_64.o $(obj)/idt_handlers_64.o
 -      vmlinux-objs-y += $(obj)/mem_encrypt.o
 +      vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/mem_encrypt.o
        vmlinux-objs-y += $(obj)/pgtable_64.o
        vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev.o
  endif
  vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
  vmlinux-objs-$(CONFIG_INTEL_TDX_GUEST) += $(obj)/tdx.o $(obj)/tdcall.o
  
 -vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_thunk_$(BITS).o
  vmlinux-objs-$(CONFIG_EFI) += $(obj)/efi.o
 -efi-obj-$(CONFIG_EFI_STUB) = $(objtree)/drivers/firmware/efi/libstub/lib.a
 +vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_mixed.o
 +vmlinux-objs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
  
 -$(obj)/vmlinux: $(vmlinux-objs-y) $(efi-obj-y) FORCE
 +$(obj)/vmlinux: $(vmlinux-objs-y) FORCE
        $(call if_changed,ld)
  
  OBJCOPYFLAGS_vmlinux.bin :=  -R .comment -S
@@@ -288,7 -288,7 +288,7 @@@ static void sti_dvo_set_mode(struct drm
  
        DRM_DEBUG_DRIVER("\n");
  
 -      memcpy(&dvo->mode, mode, sizeof(struct drm_display_mode));
 +      drm_mode_copy(&dvo->mode, mode);
  
        /* According to the path used (main or aux), the dvo clocks should
         * have a different parent clock. */
@@@ -346,8 -346,9 +346,9 @@@ static int sti_dvo_connector_get_modes(
  
  #define CLK_TOLERANCE_HZ 50
  
- static int sti_dvo_connector_mode_valid(struct drm_connector *connector,
-                                       struct drm_display_mode *mode)
+ static enum drm_mode_status
+ sti_dvo_connector_mode_valid(struct drm_connector *connector,
+                            struct drm_display_mode *mode)
  {
        int target = mode->clock * 1000;
        int target_min = target - CLK_TOLERANCE_HZ;
@@@ -524,7 -524,7 +524,7 @@@ static void sti_hda_set_mode(struct drm
  
        DRM_DEBUG_DRIVER("\n");
  
 -      memcpy(&hda->mode, mode, sizeof(struct drm_display_mode));
 +      drm_mode_copy(&hda->mode, mode);
  
        if (!hda_get_mode_idx(hda->mode, &mode_idx)) {
                DRM_ERROR("Undefined mode\n");
@@@ -601,8 -601,9 +601,9 @@@ static int sti_hda_connector_get_modes(
  
  #define CLK_TOLERANCE_HZ 50
  
- static int sti_hda_connector_mode_valid(struct drm_connector *connector,
-                                       struct drm_display_mode *mode)
+ static enum drm_mode_status
+ sti_hda_connector_mode_valid(struct drm_connector *connector,
+                            struct drm_display_mode *mode)
  {
        int target = mode->clock * 1000;
        int target_min = target - CLK_TOLERANCE_HZ;
@@@ -941,7 -941,7 +941,7 @@@ static void sti_hdmi_set_mode(struct dr
        DRM_DEBUG_DRIVER("\n");
  
        /* Copy the drm display mode in the connector local structure */
 -      memcpy(&hdmi->mode, mode, sizeof(struct drm_display_mode));
 +      drm_mode_copy(&hdmi->mode, mode);
  
        /* Update clock framerate according to the selected mode */
        ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000);
@@@ -1004,8 -1004,9 +1004,9 @@@ fail
  
  #define CLK_TOLERANCE_HZ 50
  
- static int sti_hdmi_connector_mode_valid(struct drm_connector *connector,
-                                       struct drm_display_mode *mode)
+ static enum drm_mode_status
+ sti_hdmi_connector_mode_valid(struct drm_connector *connector,
+                             struct drm_display_mode *mode)
  {
        int target = mode->clock * 1000;
        int target_min = target - CLK_TOLERANCE_HZ;
diff --combined fs/btrfs/send.c
  #include "compression.h"
  #include "xattr.h"
  #include "print-tree.h"
 +#include "accessors.h"
 +#include "dir-item.h"
 +#include "file-item.h"
 +#include "ioctl.h"
 +#include "verity.h"
  
  /*
   * Maximum number of references an extent can have in order for us to attempt to
@@@ -39,7 -34,7 +39,7 @@@
   * avoid hitting limitations of the backreference walking code (taking a lot of
   * time and using too much memory for extents with large number of references).
   */
 -#define SEND_MAX_EXTENT_REFS  64
 +#define SEND_MAX_EXTENT_REFS  1024
  
  /*
   * A fs_path is a helper to dynamically build path names with unknown size.
@@@ -76,46 -71,13 +76,46 @@@ struct clone_root 
        struct btrfs_root *root;
        u64 ino;
        u64 offset;
 -
 -      u64 found_refs;
 +      u64 num_bytes;
 +      bool found_ref;
  };
  
  #define SEND_CTX_MAX_NAME_CACHE_SIZE 128
  #define SEND_CTX_NAME_CACHE_CLEAN_SIZE (SEND_CTX_MAX_NAME_CACHE_SIZE * 2)
  
 +/*
 + * Limit the root_ids array of struct backref_cache_entry to 12 elements.
 + * This makes the size of a cache entry to be exactly 128 bytes on x86_64.
 + * The most common case is to have a single root for cloning, which corresponds
 + * to the send root. Having the user specify more than 11 clone roots is not
 + * common, and in such rare cases we simply don't use caching if the number of
 + * cloning roots that lead down to a leaf is more than 12.
 + */
 +#define SEND_MAX_BACKREF_CACHE_ROOTS 12
 +
 +/*
 + * Max number of entries in the cache.
 + * With SEND_MAX_BACKREF_CACHE_ROOTS as 12, the size in bytes, excluding
 + * maple tree's internal nodes, is 16K.
 + */
 +#define SEND_MAX_BACKREF_CACHE_SIZE 128
 +
 +/*
 + * A backref cache entry maps a leaf to a list of IDs of roots from which the
 + * leaf is accessible and we can use for clone operations.
 + * With SEND_MAX_BACKREF_CACHE_ROOTS as 12, each cache entry is 128 bytes (on
 + * x86_64).
 + */
 +struct backref_cache_entry {
 +      /* List to link to the cache's lru list. */
 +      struct list_head list;
 +      /* The key for this entry in the cache. */
 +      u64 key;
 +      u64 root_ids[SEND_MAX_BACKREF_CACHE_ROOTS];
 +      /* Number of valid elements in the root_ids array. */
 +      int num_roots;
 +};
 +
  struct send_ctx {
        struct file *send_filp;
        loff_t send_off;
  
        struct rb_root rbtree_new_refs;
        struct rb_root rbtree_deleted_refs;
 +
 +      struct {
 +              u64 last_reloc_trans;
 +              struct list_head lru_list;
 +              struct maple_tree entries;
 +              /* Number of entries stored in the cache. */
 +              int size;
 +      } backref_cache;
  };
  
  struct pending_dir_move {
@@@ -394,7 -348,6 +394,7 @@@ static bool proto_cmd_ok(const struct s
        switch (sctx->proto) {
        case 1:  return cmd <= BTRFS_SEND_C_MAX_V1;
        case 2:  return cmd <= BTRFS_SEND_C_MAX_V2;
 +      case 3:  return cmd <= BTRFS_SEND_C_MAX_V3;
        default: return false;
        }
  }
@@@ -486,6 -439,11 +486,11 @@@ static int fs_path_ensure_buf(struct fs
        old_buf_len = p->buf_len;
  
        /*
+        * Allocate to the next largest kmalloc bucket size, to let
+        * the fast path happen most of the time.
+        */
+       len = kmalloc_size_roundup(len);
+       /*
         * First time the inline_buf does not suffice
         */
        if (p->buf == p->inline_buf) {
        if (!tmp_buf)
                return -ENOMEM;
        p->buf = tmp_buf;
-       /*
-        * The real size of the buffer is bigger, this will let the fast path
-        * happen most of the time
-        */
-       p->buf_len = ksize(p->buf);
+       p->buf_len = len;
  
        if (p->reversed) {
                tmp_buf = p->buf + old_buf_len - path_len - 1;
@@@ -1139,7 -1093,7 +1140,7 @@@ static int iterate_dir_item(struct btrf
                data_len = btrfs_dir_data_len(eb, di);
                btrfs_dir_item_key_to_cpu(eb, di, &di_key);
  
 -              if (btrfs_dir_type(eb, di) == BTRFS_FT_XATTR) {
 +              if (btrfs_dir_ftype(eb, di) == BTRFS_FT_XATTR) {
                        if (name_len > XATTR_NAME_MAX) {
                                ret = -ENAMETOOLONG;
                                goto out;
@@@ -1282,12 -1236,8 +1283,12 @@@ struct backref_ctx 
        /* may be truncated in case it's the last extent in a file */
        u64 extent_len;
  
 -      /* Just to check for bugs in backref resolving */
 -      int found_itself;
 +      /* The bytenr the file extent item we are processing refers to. */
 +      u64 bytenr;
 +      /* The owner (root id) of the data backref for the current extent. */
 +      u64 backref_owner;
 +      /* The offset of the data backref for the current extent. */
 +      u64 backref_offset;
  };
  
  static int __clone_root_cmp_bsearch(const void *key, const void *elt)
@@@ -1316,33 -1266,32 +1317,33 @@@ static int __clone_root_cmp_sort(const 
  
  /*
   * Called for every backref that is found for the current extent.
 - * Results are collected in sctx->clone_roots->ino/offset/found_refs
 + * Results are collected in sctx->clone_roots->ino/offset.
   */
 -static int __iterate_backrefs(u64 ino, u64 offset, u64 root, void *ctx_)
 +static int iterate_backrefs(u64 ino, u64 offset, u64 num_bytes, u64 root_id,
 +                          void *ctx_)
  {
        struct backref_ctx *bctx = ctx_;
 -      struct clone_root *found;
 +      struct clone_root *clone_root;
  
        /* First check if the root is in the list of accepted clone sources */
 -      found = bsearch((void *)(uintptr_t)root, bctx->sctx->clone_roots,
 -                      bctx->sctx->clone_roots_cnt,
 -                      sizeof(struct clone_root),
 -                      __clone_root_cmp_bsearch);
 -      if (!found)
 +      clone_root = bsearch((void *)(uintptr_t)root_id, bctx->sctx->clone_roots,
 +                           bctx->sctx->clone_roots_cnt,
 +                           sizeof(struct clone_root),
 +                           __clone_root_cmp_bsearch);
 +      if (!clone_root)
                return 0;
  
 -      if (found->root == bctx->sctx->send_root &&
 +      /* This is our own reference, bail out as we can't clone from it. */
 +      if (clone_root->root == bctx->sctx->send_root &&
            ino == bctx->cur_objectid &&
 -          offset == bctx->cur_offset) {
 -              bctx->found_itself = 1;
 -      }
 +          offset == bctx->cur_offset)
 +              return 0;
  
        /*
         * Make sure we don't consider clones from send_root that are
         * behind the current inode/offset.
         */
 -      if (found->root == bctx->sctx->send_root) {
 +      if (clone_root->root == bctx->sctx->send_root) {
                /*
                 * If the source inode was not yet processed we can't issue a
                 * clone operation, as the source extent does not exist yet at
        }
  
        bctx->found++;
 -      found->found_refs++;
 -      if (ino < found->ino) {
 -              found->ino = ino;
 -              found->offset = offset;
 -      } else if (found->ino == ino) {
 +      clone_root->found_ref = true;
 +
 +      /*
 +       * If the given backref refers to a file extent item with a larger
 +       * number of bytes than what we found before, use the new one so that
 +       * we clone more optimally and end up doing less writes and getting
 +       * less exclusive, non-shared extents at the destination.
 +       */
 +      if (num_bytes > clone_root->num_bytes) {
 +              clone_root->ino = ino;
 +              clone_root->offset = offset;
 +              clone_root->num_bytes = num_bytes;
 +
 +              /*
 +               * Found a perfect candidate, so there's no need to continue
 +               * backref walking.
 +               */
 +              if (num_bytes >= bctx->extent_len)
 +                      return BTRFS_ITERATE_EXTENT_INODES_STOP;
 +      }
 +
 +      return 0;
 +}
 +
 +static void empty_backref_cache(struct send_ctx *sctx)
 +{
 +      struct backref_cache_entry *entry;
 +      struct backref_cache_entry *tmp;
 +
 +      list_for_each_entry_safe(entry, tmp, &sctx->backref_cache.lru_list, list)
 +              kfree(entry);
 +
 +      INIT_LIST_HEAD(&sctx->backref_cache.lru_list);
 +      mtree_destroy(&sctx->backref_cache.entries);
 +      sctx->backref_cache.size = 0;
 +}
 +
 +static bool lookup_backref_cache(u64 leaf_bytenr, void *ctx,
 +                               const u64 **root_ids_ret, int *root_count_ret)
 +{
 +      struct backref_ctx *bctx = ctx;
 +      struct send_ctx *sctx = bctx->sctx;
 +      struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
 +      const u64 key = leaf_bytenr >> fs_info->sectorsize_bits;
 +      struct backref_cache_entry *entry;
 +
 +      if (sctx->backref_cache.size == 0)
 +              return false;
 +
 +      /*
 +       * If relocation happened since we first filled the cache, then we must
 +       * empty the cache and can not use it, because even though we operate on
 +       * read-only roots, their leaves and nodes may have been reallocated and
 +       * now be used for different nodes/leaves of the same tree or some other
 +       * tree.
 +       *
 +       * We are called from iterate_extent_inodes() while either holding a
 +       * transaction handle or holding fs_info->commit_root_sem, so no need
 +       * to take any lock here.
 +       */
 +      if (fs_info->last_reloc_trans > sctx->backref_cache.last_reloc_trans) {
 +              empty_backref_cache(sctx);
 +              return false;
 +      }
 +
 +      entry = mtree_load(&sctx->backref_cache.entries, key);
 +      if (!entry)
 +              return false;
 +
 +      *root_ids_ret = entry->root_ids;
 +      *root_count_ret = entry->num_roots;
 +      list_move_tail(&entry->list, &sctx->backref_cache.lru_list);
 +
 +      return true;
 +}
 +
 +static void store_backref_cache(u64 leaf_bytenr, const struct ulist *root_ids,
 +                              void *ctx)
 +{
 +      struct backref_ctx *bctx = ctx;
 +      struct send_ctx *sctx = bctx->sctx;
 +      struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
 +      struct backref_cache_entry *new_entry;
 +      struct ulist_iterator uiter;
 +      struct ulist_node *node;
 +      int ret;
 +
 +      /*
 +       * We're called while holding a transaction handle or while holding
 +       * fs_info->commit_root_sem (at iterate_extent_inodes()), so must do a
 +       * NOFS allocation.
 +       */
 +      new_entry = kmalloc(sizeof(struct backref_cache_entry), GFP_NOFS);
 +      /* No worries, cache is optional. */
 +      if (!new_entry)
 +              return;
 +
 +      new_entry->key = leaf_bytenr >> fs_info->sectorsize_bits;
 +      new_entry->num_roots = 0;
 +      ULIST_ITER_INIT(&uiter);
 +      while ((node = ulist_next(root_ids, &uiter)) != NULL) {
 +              const u64 root_id = node->val;
 +              struct clone_root *root;
 +
 +              root = bsearch((void *)(uintptr_t)root_id, sctx->clone_roots,
 +                             sctx->clone_roots_cnt, sizeof(struct clone_root),
 +                             __clone_root_cmp_bsearch);
 +              if (!root)
 +                      continue;
 +
 +              /* Too many roots, just exit, no worries as caching is optional. */
 +              if (new_entry->num_roots >= SEND_MAX_BACKREF_CACHE_ROOTS) {
 +                      kfree(new_entry);
 +                      return;
 +              }
 +
 +              new_entry->root_ids[new_entry->num_roots] = root_id;
 +              new_entry->num_roots++;
 +      }
 +
 +      /*
 +       * We may have not added any roots to the new cache entry, which means
 +       * none of the roots is part of the list of roots from which we are
 +       * allowed to clone. Cache the new entry as it's still useful to avoid
 +       * backref walking to determine which roots have a path to the leaf.
 +       */
 +
 +      if (sctx->backref_cache.size >= SEND_MAX_BACKREF_CACHE_SIZE) {
 +              struct backref_cache_entry *lru_entry;
 +              struct backref_cache_entry *mt_entry;
 +
 +              lru_entry = list_first_entry(&sctx->backref_cache.lru_list,
 +                                           struct backref_cache_entry, list);
 +              mt_entry = mtree_erase(&sctx->backref_cache.entries, lru_entry->key);
 +              ASSERT(mt_entry == lru_entry);
 +              list_del(&mt_entry->list);
 +              kfree(mt_entry);
 +              sctx->backref_cache.size--;
 +      }
 +
 +      ret = mtree_insert(&sctx->backref_cache.entries, new_entry->key,
 +                         new_entry, GFP_NOFS);
 +      ASSERT(ret == 0 || ret == -ENOMEM);
 +      if (ret) {
 +              /* Caching is optional, no worries. */
 +              kfree(new_entry);
 +              return;
 +      }
 +
 +      list_add_tail(&new_entry->list, &sctx->backref_cache.lru_list);
 +
 +      /*
 +       * We are called from iterate_extent_inodes() while either holding a
 +       * transaction handle or holding fs_info->commit_root_sem, so no need
 +       * to take any lock here.
 +       */
 +      if (sctx->backref_cache.size == 0)
 +              sctx->backref_cache.last_reloc_trans = fs_info->last_reloc_trans;
 +
 +      sctx->backref_cache.size++;
 +}
 +
 +static int check_extent_item(u64 bytenr, const struct btrfs_extent_item *ei,
 +                           const struct extent_buffer *leaf, void *ctx)
 +{
 +      const u64 refs = btrfs_extent_refs(leaf, ei);
 +      const struct backref_ctx *bctx = ctx;
 +      const struct send_ctx *sctx = bctx->sctx;
 +
 +      if (bytenr == bctx->bytenr) {
 +              const u64 flags = btrfs_extent_flags(leaf, ei);
 +
 +              if (WARN_ON(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
 +                      return -EUCLEAN;
 +
                /*
 -               * same extent found more then once in the same file.
 +               * If we have only one reference and only the send root as a
 +               * clone source - meaning no clone roots were given in the
 +               * struct btrfs_ioctl_send_args passed to the send ioctl - then
 +               * it's our reference and there's no point in doing backref
 +               * walking which is expensive, so exit early.
                 */
 -              if (found->offset > offset + bctx->extent_len)
 -                      found->offset = offset;
 +              if (refs == 1 && sctx->clone_roots_cnt == 1)
 +                      return -ENOENT;
        }
  
 +      /*
 +       * Backreference walking (iterate_extent_inodes() below) is currently
 +       * too expensive when an extent has a large number of references, both
 +       * in time spent and used memory. So for now just fallback to write
 +       * operations instead of clone operations when an extent has more than
 +       * a certain amount of references.
 +       */
 +      if (refs > SEND_MAX_EXTENT_REFS)
 +              return -ENOENT;
 +
        return 0;
  }
  
 +static bool skip_self_data_ref(u64 root, u64 ino, u64 offset, void *ctx)
 +{
 +      const struct backref_ctx *bctx = ctx;
 +
 +      if (ino == bctx->cur_objectid &&
 +          root == bctx->backref_owner &&
 +          offset == bctx->backref_offset)
 +              return true;
 +
 +      return false;
 +}
 +
  /*
   * Given an inode, offset and extent item, it finds a good clone for a clone
   * instruction. Returns -ENOENT when none could be found. The function makes
@@@ -1595,36 -1348,79 +1596,36 @@@ static int find_extent_clone(struct sen
        u64 logical;
        u64 disk_byte;
        u64 num_bytes;
 -      u64 extent_item_pos;
 -      u64 flags = 0;
        struct btrfs_file_extent_item *fi;
        struct extent_buffer *eb = path->nodes[0];
 -      struct backref_ctx backref_ctx = {0};
 +      struct backref_ctx backref_ctx = { 0 };
 +      struct btrfs_backref_walk_ctx backref_walk_ctx = { 0 };
        struct clone_root *cur_clone_root;
 -      struct btrfs_key found_key;
 -      struct btrfs_path *tmp_path;
 -      struct btrfs_extent_item *ei;
        int compressed;
        u32 i;
  
 -      tmp_path = alloc_path_for_send();
 -      if (!tmp_path)
 -              return -ENOMEM;
 +      /*
 +       * With fallocate we can get prealloc extents beyond the inode's i_size,
 +       * so we don't do anything here because clone operations can not clone
 +       * to a range beyond i_size without increasing the i_size of the
 +       * destination inode.
 +       */
 +      if (data_offset >= ino_size)
 +              return 0;
  
 -      /* We only use this path under the commit sem */
 -      tmp_path->need_commit_sem = 0;
 +      fi = btrfs_item_ptr(eb, path->slots[0], struct btrfs_file_extent_item);
 +      extent_type = btrfs_file_extent_type(eb, fi);
 +      if (extent_type == BTRFS_FILE_EXTENT_INLINE)
 +              return -ENOENT;
  
 -      if (data_offset >= ino_size) {
 -              /*
 -               * There may be extents that lie behind the file's size.
 -               * I at least had this in combination with snapshotting while
 -               * writing large files.
 -               */
 -              ret = 0;
 -              goto out;
 -      }
 +      disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
 +      if (disk_byte == 0)
 +              return -ENOENT;
  
 -      fi = btrfs_item_ptr(eb, path->slots[0],
 -                      struct btrfs_file_extent_item);
 -      extent_type = btrfs_file_extent_type(eb, fi);
 -      if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
 -              ret = -ENOENT;
 -              goto out;
 -      }
        compressed = btrfs_file_extent_compression(eb, fi);
 -
        num_bytes = btrfs_file_extent_num_bytes(eb, fi);
 -      disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
 -      if (disk_byte == 0) {
 -              ret = -ENOENT;
 -              goto out;
 -      }
        logical = disk_byte + btrfs_file_extent_offset(eb, fi);
  
 -      down_read(&fs_info->commit_root_sem);
 -      ret = extent_from_logical(fs_info, disk_byte, tmp_path,
 -                                &found_key, &flags);
 -      up_read(&fs_info->commit_root_sem);
 -
 -      if (ret < 0)
 -              goto out;
 -      if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
 -              ret = -EIO;
 -              goto out;
 -      }
 -
 -      ei = btrfs_item_ptr(tmp_path->nodes[0], tmp_path->slots[0],
 -                          struct btrfs_extent_item);
 -      /*
 -       * Backreference walking (iterate_extent_inodes() below) is currently
 -       * too expensive when an extent has a large number of references, both
 -       * in time spent and used memory. So for now just fallback to write
 -       * operations instead of clone operations when an extent has more than
 -       * a certain amount of references.
 -       */
 -      if (btrfs_extent_refs(tmp_path->nodes[0], ei) > SEND_MAX_EXTENT_REFS) {
 -              ret = -ENOENT;
 -              goto out;
 -      }
 -      btrfs_release_path(tmp_path);
 -
        /*
         * Setup the clone roots.
         */
                cur_clone_root = sctx->clone_roots + i;
                cur_clone_root->ino = (u64)-1;
                cur_clone_root->offset = 0;
 -              cur_clone_root->found_refs = 0;
 +              cur_clone_root->num_bytes = 0;
 +              cur_clone_root->found_ref = false;
        }
  
        backref_ctx.sctx = sctx;
 -      backref_ctx.found = 0;
        backref_ctx.cur_objectid = ino;
        backref_ctx.cur_offset = data_offset;
 -      backref_ctx.found_itself = 0;
 -      backref_ctx.extent_len = num_bytes;
 +      backref_ctx.bytenr = disk_byte;
 +      /*
 +       * Use the header owner and not the send root's id, because in case of a
 +       * snapshot we can have shared subtrees.
 +       */
 +      backref_ctx.backref_owner = btrfs_header_owner(eb);
 +      backref_ctx.backref_offset = data_offset - btrfs_file_extent_offset(eb, fi);
  
        /*
         * The last extent of a file may be too large due to page alignment.
         * We need to adjust extent_len in this case so that the checks in
 -       * __iterate_backrefs work.
 +       * iterate_backrefs() work.
         */
        if (data_offset + num_bytes >= ino_size)
                backref_ctx.extent_len = ino_size - data_offset;
 +      else
 +              backref_ctx.extent_len = num_bytes;
  
        /*
         * Now collect all backrefs.
         */
 +      backref_walk_ctx.bytenr = disk_byte;
        if (compressed == BTRFS_COMPRESS_NONE)
 -              extent_item_pos = logical - found_key.objectid;
 -      else
 -              extent_item_pos = 0;
 -      ret = iterate_extent_inodes(fs_info, found_key.objectid,
 -                                  extent_item_pos, 1, __iterate_backrefs,
 -                                  &backref_ctx, false);
 +              backref_walk_ctx.extent_item_pos = btrfs_file_extent_offset(eb, fi);
 +      backref_walk_ctx.fs_info = fs_info;
 +      backref_walk_ctx.cache_lookup = lookup_backref_cache;
 +      backref_walk_ctx.cache_store = store_backref_cache;
 +      backref_walk_ctx.indirect_ref_iterator = iterate_backrefs;
 +      backref_walk_ctx.check_extent_item = check_extent_item;
 +      backref_walk_ctx.user_ctx = &backref_ctx;
 +
 +      /*
 +       * If have a single clone root, then it's the send root and we can tell
 +       * the backref walking code to skip our own backref and not resolve it,
 +       * since we can not use it for cloning - the source and destination
 +       * ranges can't overlap and in case the leaf is shared through a subtree
 +       * due to snapshots, we can't use those other roots since they are not
 +       * in the list of clone roots.
 +       */
 +      if (sctx->clone_roots_cnt == 1)
 +              backref_walk_ctx.skip_data_ref = skip_self_data_ref;
  
 +      ret = iterate_extent_inodes(&backref_walk_ctx, true, iterate_backrefs,
 +                                  &backref_ctx);
        if (ret < 0)
 -              goto out;
 +              return ret;
  
        down_read(&fs_info->commit_root_sem);
        if (fs_info->last_reloc_trans > sctx->last_reloc_trans) {
                 * was already reallocated after the relocation.
                 */
                up_read(&fs_info->commit_root_sem);
 -              ret = -ENOENT;
 -              goto out;
 +              return -ENOENT;
        }
        up_read(&fs_info->commit_root_sem);
  
 -      if (!backref_ctx.found_itself) {
 -              /* found a bug in backref code? */
 -              ret = -EIO;
 -              btrfs_err(fs_info,
 -                        "did not find backref in send_root. inode=%llu, offset=%llu, disk_byte=%llu found extent=%llu",
 -                        ino, data_offset, disk_byte, found_key.objectid);
 -              goto out;
 -      }
 -
        btrfs_debug(fs_info,
                    "find_extent_clone: data_offset=%llu, ino=%llu, num_bytes=%llu, logical=%llu",
                    data_offset, ino, num_bytes, logical);
  
 -      if (!backref_ctx.found)
 +      if (!backref_ctx.found) {
                btrfs_debug(fs_info, "no clones found");
 +              return -ENOENT;
 +      }
  
        cur_clone_root = NULL;
        for (i = 0; i < sctx->clone_roots_cnt; i++) {
 -              if (sctx->clone_roots[i].found_refs) {
 -                      if (!cur_clone_root)
 -                              cur_clone_root = sctx->clone_roots + i;
 -                      else if (sctx->clone_roots[i].root == sctx->send_root)
 -                              /* prefer clones from send_root over others */
 -                              cur_clone_root = sctx->clone_roots + i;
 -              }
 +              struct clone_root *clone_root = &sctx->clone_roots[i];
 +
 +              if (!clone_root->found_ref)
 +                      continue;
 +
 +              /*
 +               * Choose the root from which we can clone more bytes, to
 +               * minimize write operations and therefore have more extent
 +               * sharing at the destination (the same as in the source).
 +               */
 +              if (!cur_clone_root ||
 +                  clone_root->num_bytes > cur_clone_root->num_bytes) {
 +                      cur_clone_root = clone_root;
  
 +                      /*
 +                       * We found an optimal clone candidate (any inode from
 +                       * any root is fine), so we're done.
 +                       */
 +                      if (clone_root->num_bytes >= backref_ctx.extent_len)
 +                              break;
 +              }
        }
  
        if (cur_clone_root) {
                ret = -ENOENT;
        }
  
 -out:
 -      btrfs_free_path(tmp_path);
        return ret;
  }
  
@@@ -1825,17 -1596,13 +1826,17 @@@ static int gen_unique_name(struct send_
                return -ENOMEM;
  
        while (1) {
 +              struct fscrypt_str tmp_name;
 +
                len = snprintf(tmp, sizeof(tmp), "o%llu-%llu-%llu",
                                ino, gen, idx);
                ASSERT(len < sizeof(tmp));
 +              tmp_name.name = tmp;
 +              tmp_name.len = strlen(tmp);
  
                di = btrfs_lookup_dir_item(NULL, sctx->send_root,
                                path, BTRFS_FIRST_FREE_OBJECTID,
 -                              tmp, strlen(tmp), 0);
 +                              &tmp_name, 0);
                btrfs_release_path(path);
                if (IS_ERR(di)) {
                        ret = PTR_ERR(di);
  
                di = btrfs_lookup_dir_item(NULL, sctx->parent_root,
                                path, BTRFS_FIRST_FREE_OBJECTID,
 -                              tmp, strlen(tmp), 0);
 +                              &tmp_name, 0);
                btrfs_release_path(path);
                if (IS_ERR(di)) {
                        ret = PTR_ERR(di);
@@@ -1985,13 -1752,13 +1986,13 @@@ static int lookup_dir_item_inode(struc
        struct btrfs_dir_item *di;
        struct btrfs_key key;
        struct btrfs_path *path;
 +      struct fscrypt_str name_str = FSTR_INIT((char *)name, name_len);
  
        path = alloc_path_for_send();
        if (!path)
                return -ENOMEM;
  
 -      di = btrfs_lookup_dir_item(NULL, root, path,
 -                      dir, name, name_len, 0);
 +      di = btrfs_lookup_dir_item(NULL, root, path, dir, &name_str, 0);
        if (IS_ERR_OR_NULL(di)) {
                ret = di ? PTR_ERR(di) : -ENOENT;
                goto out;
@@@ -5935,7 -5702,6 +5936,7 @@@ static int clone_range(struct send_ctx 
                u64 ext_len;
                u64 clone_len;
                u64 clone_data_offset;
 +              bool crossed_src_i_size = false;
  
                if (slot >= btrfs_header_nritems(leaf)) {
                        ret = btrfs_next_leaf(clone_root->root, path);
                if (key.offset >= clone_src_i_size)
                        break;
  
 -              if (key.offset + ext_len > clone_src_i_size)
 +              if (key.offset + ext_len > clone_src_i_size) {
                        ext_len = clone_src_i_size - key.offset;
 +                      crossed_src_i_size = true;
 +              }
  
                clone_data_offset = btrfs_file_extent_offset(leaf, ei);
                if (btrfs_file_extent_disk_bytenr(leaf, ei) == disk_byte) {
                                ret = send_clone(sctx, offset, clone_len,
                                                 clone_root);
                        }
 +              } else if (crossed_src_i_size && clone_len < len) {
 +                      /*
 +                       * If we are at i_size of the clone source inode and we
 +                       * can not clone from it, terminate the loop. This is
 +                       * to avoid sending two write operations, one with a
 +                       * length matching clone_len and the final one after
 +                       * this loop with a length of len - clone_len.
 +                       *
 +                       * When using encoded writes (BTRFS_SEND_FLAG_COMPRESSED
 +                       * was passed to the send ioctl), this helps avoid
 +                       * sending an encoded write for an offset that is not
 +                       * sector size aligned, in case the i_size of the source
 +                       * inode is not sector size aligned. That will make the
 +                       * receiver fallback to decompression of the data and
 +                       * writing it using regular buffered IO, therefore while
 +                       * not incorrect, it's not optimal due decompression and
 +                       * possible re-compression at the receiver.
 +                       */
 +                      break;
                } else {
                        ret = send_extent_data(sctx, dst_path, offset,
                                               clone_len);
@@@ -6725,9 -6470,7 +6726,9 @@@ static int finish_inode_if_needed(struc
                if (ret < 0)
                        goto out;
        }
 -      if (sctx->cur_inode_needs_verity) {
 +
 +      if (proto_cmd_ok(sctx, BTRFS_SEND_C_ENABLE_VERITY)
 +          && sctx->cur_inode_needs_verity) {
                ret = process_verity(sctx);
                if (ret < 0)
                        goto out;
@@@ -6923,19 -6666,17 +6924,19 @@@ static int changed_inode(struct send_ct
                        /*
                         * First, process the inode as if it was deleted.
                         */
 -                      sctx->cur_inode_gen = right_gen;
 -                      sctx->cur_inode_new = false;
 -                      sctx->cur_inode_deleted = true;
 -                      sctx->cur_inode_size = btrfs_inode_size(
 -                                      sctx->right_path->nodes[0], right_ii);
 -                      sctx->cur_inode_mode = btrfs_inode_mode(
 -                                      sctx->right_path->nodes[0], right_ii);
 -                      ret = process_all_refs(sctx,
 -                                      BTRFS_COMPARE_TREE_DELETED);
 -                      if (ret < 0)
 -                              goto out;
 +                      if (old_nlinks > 0) {
 +                              sctx->cur_inode_gen = right_gen;
 +                              sctx->cur_inode_new = false;
 +                              sctx->cur_inode_deleted = true;
 +                              sctx->cur_inode_size = btrfs_inode_size(
 +                                              sctx->right_path->nodes[0], right_ii);
 +                              sctx->cur_inode_mode = btrfs_inode_mode(
 +                                              sctx->right_path->nodes[0], right_ii);
 +                              ret = process_all_refs(sctx,
 +                                              BTRFS_COMPARE_TREE_DELETED);
 +                              if (ret < 0)
 +                                      goto out;
 +                      }
  
                        /*
                         * Now process the inode as if it was new.
@@@ -8096,9 -7837,6 +8097,9 @@@ long btrfs_ioctl_send(struct inode *ino
        INIT_RADIX_TREE(&sctx->name_cache, GFP_KERNEL);
        INIT_LIST_HEAD(&sctx->name_cache_list);
  
 +      INIT_LIST_HEAD(&sctx->backref_cache.lru_list);
 +      mt_init(&sctx->backref_cache.entries);
 +
        sctx->flags = arg->flags;
  
        if (arg->flags & BTRFS_SEND_FLAG_VERSION) {
        if (sctx->proto >= 2) {
                u32 send_buf_num_pages;
  
 -              sctx->send_max_size = ALIGN(SZ_16K + BTRFS_MAX_COMPRESSED, PAGE_SIZE);
 +              sctx->send_max_size = BTRFS_SEND_BUF_SIZE_V2;
                sctx->send_buf = vmalloc(sctx->send_max_size);
                if (!sctx->send_buf) {
                        ret = -ENOMEM;
@@@ -8361,8 -8099,6 +8362,8 @@@ out
  
                close_current_inode(sctx);
  
 +              empty_backref_cache(sctx);
 +
                kfree(sctx);
        }
  
diff --combined fs/cifs/cifsacl.c
@@@ -13,9 -13,6 +13,9 @@@
  #include <linux/string.h>
  #include <linux/keyctl.h>
  #include <linux/key-type.h>
 +#include <uapi/linux/posix_acl.h>
 +#include <linux/posix_acl.h>
 +#include <linux/posix_acl_xattr.h>
  #include <keys/user-type.h>
  #include "cifspdu.h"
  #include "cifsglob.h"
@@@ -23,8 -20,6 +23,8 @@@
  #include "cifsproto.h"
  #include "cifs_debug.h"
  #include "fs_context.h"
 +#include "cifs_fs_sb.h"
 +#include "cifs_unicode.h"
  
  /* security id for everyone/world system group */
  static const struct cifs_sid sid_everyone = {
@@@ -470,7 -465,7 +470,7 @@@ init_cifs_idmap(void
         * this is used to prevent malicious redirections from being installed
         * with add_key().
         */
-       cred = prepare_kernel_cred(NULL);
+       cred = prepare_kernel_cred(&init_task);
        if (!cred)
                return -ENOMEM;
  
@@@ -1673,137 -1668,3 +1673,137 @@@ id_mode_to_cifs_acl(struct inode *inode
        kfree(pntsd);
        return rc;
  }
 +
 +struct posix_acl *cifs_get_acl(struct user_namespace *mnt_userns,
 +                             struct dentry *dentry, int type)
 +{
 +#if defined(CONFIG_CIFS_ALLOW_INSECURE_LEGACY) && defined(CONFIG_CIFS_POSIX)
 +      struct posix_acl *acl = NULL;
 +      ssize_t rc = -EOPNOTSUPP;
 +      unsigned int xid;
 +      struct super_block *sb = dentry->d_sb;
 +      struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 +      struct tcon_link *tlink;
 +      struct cifs_tcon *pTcon;
 +      const char *full_path;
 +      void *page;
 +
 +      tlink = cifs_sb_tlink(cifs_sb);
 +      if (IS_ERR(tlink))
 +              return ERR_CAST(tlink);
 +      pTcon = tlink_tcon(tlink);
 +
 +      xid = get_xid();
 +      page = alloc_dentry_path();
 +
 +      full_path = build_path_from_dentry(dentry, page);
 +      if (IS_ERR(full_path)) {
 +              acl = ERR_CAST(full_path);
 +              goto out;
 +      }
 +
 +      /* return alt name if available as pseudo attr */
 +      switch (type) {
 +      case ACL_TYPE_ACCESS:
 +              if (sb->s_flags & SB_POSIXACL)
 +                      rc = cifs_do_get_acl(xid, pTcon, full_path, &acl,
 +                                           ACL_TYPE_ACCESS,
 +                                           cifs_sb->local_nls,
 +                                           cifs_remap(cifs_sb));
 +              break;
 +
 +      case ACL_TYPE_DEFAULT:
 +              if (sb->s_flags & SB_POSIXACL)
 +                      rc = cifs_do_get_acl(xid, pTcon, full_path, &acl,
 +                                           ACL_TYPE_DEFAULT,
 +                                           cifs_sb->local_nls,
 +                                           cifs_remap(cifs_sb));
 +              break;
 +      }
 +
 +      if (rc < 0) {
 +              if (rc == -EINVAL)
 +                      acl = ERR_PTR(-EOPNOTSUPP);
 +              else
 +                      acl = ERR_PTR(rc);
 +      }
 +
 +out:
 +      free_dentry_path(page);
 +      free_xid(xid);
 +      cifs_put_tlink(tlink);
 +      return acl;
 +#else
 +      return ERR_PTR(-EOPNOTSUPP);
 +#endif
 +}
 +
 +int cifs_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
 +               struct posix_acl *acl, int type)
 +{
 +#if defined(CONFIG_CIFS_ALLOW_INSECURE_LEGACY) && defined(CONFIG_CIFS_POSIX)
 +      int rc = -EOPNOTSUPP;
 +      unsigned int xid;
 +      struct super_block *sb = dentry->d_sb;
 +      struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 +      struct tcon_link *tlink;
 +      struct cifs_tcon *pTcon;
 +      const char *full_path;
 +      void *page;
 +
 +      tlink = cifs_sb_tlink(cifs_sb);
 +      if (IS_ERR(tlink))
 +              return PTR_ERR(tlink);
 +      pTcon = tlink_tcon(tlink);
 +
 +      xid = get_xid();
 +      page = alloc_dentry_path();
 +
 +      full_path = build_path_from_dentry(dentry, page);
 +      if (IS_ERR(full_path)) {
 +              rc = PTR_ERR(full_path);
 +              goto out;
 +      }
 +
 +      if (!acl)
 +              goto out;
 +
 +      /* return dos attributes as pseudo xattr */
 +      /* return alt name if available as pseudo attr */
 +
 +      /* if proc/fs/cifs/streamstoxattr is set then
 +              search server for EAs or streams to
 +              returns as xattrs */
 +      if (posix_acl_xattr_size(acl->a_count) > CIFSMaxBufSize) {
 +              cifs_dbg(FYI, "size of EA value too large\n");
 +              rc = -EOPNOTSUPP;
 +              goto out;
 +      }
 +
 +      switch (type) {
 +      case ACL_TYPE_ACCESS:
 +              if (sb->s_flags & SB_POSIXACL)
 +                      rc = cifs_do_set_acl(xid, pTcon, full_path, acl,
 +                                           ACL_TYPE_ACCESS,
 +                                           cifs_sb->local_nls,
 +                                           cifs_remap(cifs_sb));
 +              break;
 +
 +      case ACL_TYPE_DEFAULT:
 +              if (sb->s_flags & SB_POSIXACL)
 +                      rc = cifs_do_set_acl(xid, pTcon, full_path, acl,
 +                                           ACL_TYPE_DEFAULT,
 +                                           cifs_sb->local_nls,
 +                                           cifs_remap(cifs_sb));
 +              break;
 +      }
 +
 +out:
 +      free_dentry_path(page);
 +      free_xid(xid);
 +      cifs_put_tlink(tlink);
 +      return rc;
 +#else
 +      return -EOPNOTSUPP;
 +#endif
 +}
diff --combined fs/coredump.c
@@@ -68,7 -68,10 +68,10 @@@ struct core_name 
  
  static int expand_corename(struct core_name *cn, int size)
  {
-       char *corename = krealloc(cn->corename, size, GFP_KERNEL);
+       char *corename;
+       size = kmalloc_size_roundup(size);
+       corename = krealloc(cn->corename, size, GFP_KERNEL);
  
        if (!corename)
                return -ENOMEM;
@@@ -76,7 -79,7 +79,7 @@@
        if (size > core_name_size) /* racy but harmless */
                core_name_size = size;
  
-       cn->size = ksize(corename);
+       cn->size = size;
        cn->corename = corename;
        return 0;
  }
@@@ -325,10 -328,6 +328,10 @@@ static int format_corename(struct core_
                                err = cn_printf(cn, "%lu",
                                              rlimit(RLIMIT_CORE));
                                break;
 +                      /* CPU the task ran on */
 +                      case 'C':
 +                              err = cn_printf(cn, "%d", cprm->cpu);
 +                              break;
                        default:
                                break;
                        }
@@@ -529,6 -528,7 +532,6 @@@ void do_coredump(const kernel_siginfo_
        static atomic_t core_dump_count = ATOMIC_INIT(0);
        struct coredump_params cprm = {
                .siginfo = siginfo,
 -              .regs = signal_pt_regs(),
                .limit = rlimit(RLIMIT_CORE),
                /*
                 * We must use the same mm->flags while dumping core to avoid
                 */
                .mm_flags = mm->flags,
                .vma_meta = NULL,
 +              .cpu = raw_smp_processor_id(),
        };
  
        audit_core_dumps(siginfo->si_signo);
                 * filesystem.
                 */
                mnt_userns = file_mnt_user_ns(cprm.file);
 -              if (!uid_eq(i_uid_into_mnt(mnt_userns, inode),
 -                          current_fsuid())) {
 +              if (!vfsuid_eq_kuid(i_uid_into_vfsuid(mnt_userns, inode),
 +                                  current_fsuid())) {
                        pr_info_ratelimited("Core dump to %s aborted: cannot preserve file owner\n",
                                            cn.corename);
                        goto close_fail;
@@@ -857,7 -856,7 +860,7 @@@ static int dump_emit_page(struct coredu
        if (dump_interrupted())
                return 0;
        pos = file->f_pos;
 -      iov_iter_bvec(&iter, WRITE, &bvec, 1, PAGE_SIZE);
 +      iov_iter_bvec(&iter, ITER_SOURCE, &bvec, 1, PAGE_SIZE);
        n = __kernel_write_iter(cprm->file, &iter, &pos);
        if (n != PAGE_SIZE)
                return 0;
diff --combined fs/ksmbd/smb2pdu.c
@@@ -2487,9 -2487,9 +2487,9 @@@ static void ksmbd_acls_fattr(struct smb
        fattr->cf_dacls = NULL;
  
        if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
 -              fattr->cf_acls = get_acl(inode, ACL_TYPE_ACCESS);
 +              fattr->cf_acls = get_inode_acl(inode, ACL_TYPE_ACCESS);
                if (S_ISDIR(inode->i_mode))
 -                      fattr->cf_dacls = get_acl(inode, ACL_TYPE_DEFAULT);
 +                      fattr->cf_dacls = get_inode_acl(inode, ACL_TYPE_DEFAULT);
        }
  }
  
@@@ -2956,7 -2956,7 +2956,7 @@@ int smb2_open(struct ksmbd_work *work
                struct inode *inode = d_inode(path.dentry);
  
                posix_acl_rc = ksmbd_vfs_inherit_posix_acl(user_ns,
 -                                                         inode,
 +                                                         path.dentry,
                                                           d_inode(path.dentry->d_parent));
                if (posix_acl_rc)
                        ksmbd_debug(SMB, "inherit posix acl failed : %d\n", posix_acl_rc);
                        if (rc) {
                                if (posix_acl_rc)
                                        ksmbd_vfs_set_init_posix_acl(user_ns,
 -                                                                   inode);
 +                                                                   path.dentry);
  
                                if (test_share_config_flag(work->tcon->share_conf,
                                                           KSMBD_SHARE_FLAG_ACL_XATTR)) {
@@@ -3438,7 -3438,7 +3438,7 @@@ static int smb2_populate_readdir_entry(
                goto free_conv_name;
        }
  
-       struct_sz = readdir_info_level_struct_sz(info_level) - 1 + conv_len;
+       struct_sz = readdir_info_level_struct_sz(info_level) + conv_len;
        next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT);
        d_info->last_entry_off_align = next_entry_offset - struct_sz;
  
@@@ -3690,7 -3690,7 +3690,7 @@@ static int reserve_populate_dentry(stru
                return -EOPNOTSUPP;
  
        conv_len = (d_info->name_len + 1) * 2;
-       next_entry_offset = ALIGN(struct_sz - 1 + conv_len,
+       next_entry_offset = ALIGN(struct_sz + conv_len,
                                  KSMBD_DIR_INFO_ALIGNMENT);
  
        if (next_entry_offset > d_info->out_buf_len) {
diff --combined fs/nfsd/nfs4callback.c
@@@ -76,17 -76,6 +76,17 @@@ static __be32 *xdr_encode_empty_array(_
   * 1 Protocol"
   */
  
 +static void encode_uint32(struct xdr_stream *xdr, u32 n)
 +{
 +      WARN_ON_ONCE(xdr_stream_encode_u32(xdr, n) < 0);
 +}
 +
 +static void encode_bitmap4(struct xdr_stream *xdr, const __u32 *bitmap,
 +                         size_t len)
 +{
 +      WARN_ON_ONCE(xdr_stream_encode_uint32_array(xdr, bitmap, len) < 0);
 +}
 +
  /*
   *    nfs_cb_opnum4
   *
@@@ -340,24 -329,6 +340,24 @@@ static void encode_cb_recall4args(struc
  }
  
  /*
 + * CB_RECALLANY4args
 + *
 + *    struct CB_RECALLANY4args {
 + *            uint32_t        craa_objects_to_keep;
 + *            bitmap4         craa_type_mask;
 + *    };
 + */
 +static void
 +encode_cb_recallany4args(struct xdr_stream *xdr,
 +      struct nfs4_cb_compound_hdr *hdr, struct nfsd4_cb_recall_any *ra)
 +{
 +      encode_nfs_cb_opnum4(xdr, OP_CB_RECALL_ANY);
 +      encode_uint32(xdr, ra->ra_keep);
 +      encode_bitmap4(xdr, ra->ra_bmval, ARRAY_SIZE(ra->ra_bmval));
 +      hdr->nops++;
 +}
 +
 +/*
   * CB_SEQUENCE4args
   *
   *    struct CB_SEQUENCE4args {
@@@ -511,26 -482,6 +511,26 @@@ static void nfs4_xdr_enc_cb_recall(stru
        encode_cb_nops(&hdr);
  }
  
 +/*
 + * 20.6. Operation 8: CB_RECALL_ANY - Keep Any N Recallable Objects
 + */
 +static void
 +nfs4_xdr_enc_cb_recall_any(struct rpc_rqst *req,
 +              struct xdr_stream *xdr, const void *data)
 +{
 +      const struct nfsd4_callback *cb = data;
 +      struct nfsd4_cb_recall_any *ra;
 +      struct nfs4_cb_compound_hdr hdr = {
 +              .ident = cb->cb_clp->cl_cb_ident,
 +              .minorversion = cb->cb_clp->cl_minorversion,
 +      };
 +
 +      ra = container_of(cb, struct nfsd4_cb_recall_any, ra_cb);
 +      encode_cb_compound4args(xdr, &hdr);
 +      encode_cb_sequence4args(xdr, cb, &hdr);
 +      encode_cb_recallany4args(xdr, &hdr, ra);
 +      encode_cb_nops(&hdr);
 +}
  
  /*
   * NFSv4.0 and NFSv4.1 XDR decode functions
@@@ -569,28 -520,6 +569,28 @@@ static int nfs4_xdr_dec_cb_recall(struc
        return decode_cb_op_status(xdr, OP_CB_RECALL, &cb->cb_status);
  }
  
 +/*
 + * 20.6. Operation 8: CB_RECALL_ANY - Keep Any N Recallable Objects
 + */
 +static int
 +nfs4_xdr_dec_cb_recall_any(struct rpc_rqst *rqstp,
 +                                struct xdr_stream *xdr,
 +                                void *data)
 +{
 +      struct nfsd4_callback *cb = data;
 +      struct nfs4_cb_compound_hdr hdr;
 +      int status;
 +
 +      status = decode_cb_compound4res(xdr, &hdr);
 +      if (unlikely(status))
 +              return status;
 +      status = decode_cb_sequence4res(xdr, cb);
 +      if (unlikely(status || cb->cb_seq_status))
 +              return status;
 +      status =  decode_cb_op_status(xdr, OP_CB_RECALL_ANY, &cb->cb_status);
 +      return status;
 +}
 +
  #ifdef CONFIG_NFSD_PNFS
  /*
   * CB_LAYOUTRECALL4args
@@@ -854,7 -783,6 +854,7 @@@ static const struct rpc_procinfo nfs4_c
  #endif
        PROC(CB_NOTIFY_LOCK,    COMPOUND,       cb_notify_lock, cb_notify_lock),
        PROC(CB_OFFLOAD,        COMPOUND,       cb_offload,     cb_offload),
 +      PROC(CB_RECALL_ANY,     COMPOUND,       cb_recall_any,  cb_recall_any),
  };
  
  static unsigned int nfs4_cb_counts[ARRAY_SIZE(nfs4_cb_procedures)];
@@@ -942,7 -870,7 +942,7 @@@ static const struct cred *get_backchann
        } else {
                struct cred *kcred;
  
-               kcred = prepare_kernel_cred(NULL);
+               kcred = prepare_kernel_cred(&init_task);
                if (!kcred)
                        return NULL;
  
diff --combined include/linux/device.h
@@@ -197,9 -197,9 +197,9 @@@ void devres_remove_group(struct device 
  int devres_release_group(struct device *dev, void *id);
  
  /* managed devm_k.alloc/kfree for device drivers */
- void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) __malloc;
+ void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) __alloc_size(2);
  void *devm_krealloc(struct device *dev, void *ptr, size_t size,
-                   gfp_t gfp) __must_check;
+                   gfp_t gfp) __must_check __realloc_size(3);
  __printf(3, 0) char *devm_kvasprintf(struct device *dev, gfp_t gfp,
                                     const char *fmt, va_list ap) __malloc;
  __printf(3, 4) char *devm_kasprintf(struct device *dev, gfp_t gfp,
@@@ -226,7 -226,8 +226,8 @@@ static inline void *devm_kcalloc(struc
  void devm_kfree(struct device *dev, const void *p);
  char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp) __malloc;
  const char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp);
- void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp);
+ void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp)
+       __realloc_size(3);
  
  unsigned long devm_get_free_pages(struct device *dev,
                                  gfp_t gfp_mask, unsigned int order);
@@@ -378,8 -379,10 +379,8 @@@ struct dev_links_info 
   * @data:     Pointer to MSI device data
   */
  struct dev_msi_info {
 -#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
 -      struct irq_domain       *domain;
 -#endif
  #ifdef CONFIG_GENERIC_MSI_IRQ
 +      struct irq_domain       *domain;
        struct msi_device_data  *data;
  #endif
  };
@@@ -740,7 -743,7 +741,7 @@@ static inline void set_dev_node(struct 
  
  static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
  {
 -#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
 +#ifdef CONFIG_GENERIC_MSI_IRQ
        return dev->msi.domain;
  #else
        return NULL;
  
  static inline void dev_set_msi_domain(struct device *dev, struct irq_domain *d)
  {
 -#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
 +#ifdef CONFIG_GENERIC_MSI_IRQ
        dev->msi.domain = d;
  #endif
  }
@@@ -18,7 -18,7 +18,7 @@@ void __write_overflow_field(size_t avai
  
  #define __compiletime_strlen(p)                                       \
  ({                                                            \
-       unsigned char *__p = (unsigned char *)(p);              \
+       char *__p = (char *)(p);                                \
        size_t __ret = SIZE_MAX;                                \
        size_t __p_size = __member_size(p);                     \
        if (__p_size != SIZE_MAX &&                             \
@@@ -43,24 -43,11 +43,24 @@@ extern __kernel_size_t __underlying_str
  extern char *__underlying_strncat(char *p, const char *q, __kernel_size_t count) __RENAME(strncat);
  extern char *__underlying_strncpy(char *p, const char *q, __kernel_size_t size) __RENAME(strncpy);
  #else
 -#define __underlying_memchr   __builtin_memchr
 -#define __underlying_memcmp   __builtin_memcmp
 +
 +#if defined(__SANITIZE_MEMORY__)
 +/*
 + * For KMSAN builds all memcpy/memset/memmove calls should be replaced by the
 + * corresponding __msan_XXX functions.
 + */
 +#include <linux/kmsan_string.h>
 +#define __underlying_memcpy   __msan_memcpy
 +#define __underlying_memmove  __msan_memmove
 +#define __underlying_memset   __msan_memset
 +#else
  #define __underlying_memcpy   __builtin_memcpy
  #define __underlying_memmove  __builtin_memmove
  #define __underlying_memset   __builtin_memset
 +#endif
 +
 +#define __underlying_memchr   __builtin_memchr
 +#define __underlying_memcmp   __builtin_memcmp
  #define __underlying_strcat   __builtin_strcat
  #define __underlying_strcpy   __builtin_strcpy
  #define __underlying_strlen   __builtin_strlen
   * Instead, please choose an alternative, so that the expectation
   * of @p's contents is unambiguous:
   *
-  * +--------------------+-----------------+------------+
-  * | @p needs to be:    | padded to @size | not padded |
-  * +====================+=================+============+
-  * |     NUL-terminated | strscpy_pad()   | strscpy()  |
-  * +--------------------+-----------------+------------+
-  * | not NUL-terminated | strtomem_pad()  | strtomem() |
-  * +--------------------+-----------------+------------+
+  * +--------------------+--------------------+------------+
+  * | **p** needs to be: | padded to **size** | not padded |
+  * +====================+====================+============+
+  * |     NUL-terminated | strscpy_pad()      | strscpy()  |
+  * +--------------------+--------------------+------------+
+  * | not NUL-terminated | strtomem_pad()     | strtomem() |
+  * +--------------------+--------------------+------------+
   *
   * Note strscpy*()'s differing return values for detecting truncation,
   * and strtomem*()'s expectation that the destination is marked with
@@@ -144,6 -131,21 +144,21 @@@ char *strncpy(char * const POS p, cons
        return __underlying_strncpy(p, q, size);
  }
  
+ /**
+  * strcat - Append a string to an existing string
+  *
+  * @p: pointer to NUL-terminated string to append to
+  * @q: pointer to NUL-terminated source string to append from
+  *
+  * Do not use this function. While FORTIFY_SOURCE tries to avoid
+  * read and write overflows, this is only possible when the
+  * destination buffer size is known to the compiler. Prefer
+  * building the string with formatting, via scnprintf() or similar.
+  * At the very least, use strncat().
+  *
+  * Returns @p.
+  *
+  */
  __FORTIFY_INLINE __diagnose_as(__builtin_strcat, 1, 2)
  char *strcat(char * const POS p, const char *q)
  {
  }
  
  extern __kernel_size_t __real_strnlen(const char *, __kernel_size_t) __RENAME(strnlen);
+ /**
+  * strnlen - Return bounded count of characters in a NUL-terminated string
+  *
+  * @p: pointer to NUL-terminated string to count.
+  * @maxlen: maximum number of characters to count.
+  *
+  * Returns number of characters in @p (NOT including the final NUL), or
+  * @maxlen, if no NUL has been found up to there.
+  *
+  */
  __FORTIFY_INLINE __kernel_size_t strnlen(const char * const POS p, __kernel_size_t maxlen)
  {
        size_t p_size = __member_size(p);
   * possible for strlen() to be used on compile-time strings for use in
   * static initializers (i.e. as a constant expression).
   */
+ /**
+  * strlen - Return count of characters in a NUL-terminated string
+  *
+  * @p: pointer to NUL-terminated string to count.
+  *
+  * Do not use this function unless the string length is known at
+  * compile-time. When @p is unterminated, this function may crash
+  * or return unexpected counts that could lead to memory content
+  * exposures. Prefer strnlen().
+  *
+  * Returns number of characters in @p (NOT including the final NUL).
+  *
+  */
  #define strlen(p)                                                     \
        __builtin_choose_expr(__is_constexpr(__builtin_strlen(p)),      \
                __builtin_strlen(p), __fortify_strlen(p))
@@@ -200,8 -225,26 +238,26 @@@ __kernel_size_t __fortify_strlen(const 
        return ret;
  }
  
- /* defined after fortified strlen to reuse it */
+ /* Defined after fortified strlen() to reuse it. */
  extern size_t __real_strlcpy(char *, const char *, size_t) __RENAME(strlcpy);
+ /**
+  * strlcpy - Copy a string into another string buffer
+  *
+  * @p: pointer to destination of copy
+  * @q: pointer to NUL-terminated source string to copy
+  * @size: maximum number of bytes to write at @p
+  *
+  * If strlen(@q) >= @size, the copy of @q will be truncated at
+  * @size - 1 bytes. @p will always be NUL-terminated.
+  *
+  * Do not use this function. While FORTIFY_SOURCE tries to avoid
+  * over-reads when calculating strlen(@q), it is still possible.
+  * Prefer strscpy(), though note its different return values for
+  * detecting truncation.
+  *
+  * Returns total number of bytes written to @p, including terminating NUL.
+  *
+  */
  __FORTIFY_INLINE size_t strlcpy(char * const POS p, const char * const POS q, size_t size)
  {
        size_t p_size = __member_size(p);
        return q_len;
  }
  
- /* defined after fortified strnlen to reuse it */
+ /* Defined after fortified strnlen() to reuse it. */
  extern ssize_t __real_strscpy(char *, const char *, size_t) __RENAME(strscpy);
+ /**
+  * strscpy - Copy a C-string into a sized buffer
+  *
+  * @p: Where to copy the string to
+  * @q: Where to copy the string from
+  * @size: Size of destination buffer
+  *
+  * Copy the source string @p, or as much of it as fits, into the destination
+  * @q buffer. The behavior is undefined if the string buffers overlap. The
+  * destination @p buffer is always NUL terminated, unless it's zero-sized.
+  *
+  * Preferred to strlcpy() since the API doesn't require reading memory
+  * from the source @q string beyond the specified @size bytes, and since
+  * the return value is easier to error-check than strlcpy()'s.
+  * In addition, the implementation is robust to the string changing out
+  * from underneath it, unlike the current strlcpy() implementation.
+  *
+  * Preferred to strncpy() since it always returns a valid string, and
+  * doesn't unnecessarily force the tail of the destination buffer to be
+  * zero padded. If padding is desired please use strscpy_pad().
+  *
+  * Returns the number of characters copied in @p (not including the
+  * trailing %NUL) or -E2BIG if @size is 0 or the copy of @q was truncated.
+  */
  __FORTIFY_INLINE ssize_t strscpy(char * const POS p, const char * const POS q, size_t size)
  {
        size_t len;
        if (__compiletime_lessthan(p_size, size))
                __write_overflow();
  
+       /* Short-circuit for compile-time known-safe lengths. */
+       if (__compiletime_lessthan(p_size, SIZE_MAX)) {
+               len = __compiletime_strlen(q);
+               if (len < SIZE_MAX && __compiletime_lessthan(len, size)) {
+                       __underlying_memcpy(p, q, len + 1);
+                       return len;
+               }
+       }
        /*
         * This call protects from read overflow, because len will default to q
         * length if it smaller than size.
        return __real_strscpy(p, q, len);
  }
  
- /* defined after fortified strlen and strnlen to reuse them */
+ /**
+  * strncat - Append a string to an existing string
+  *
+  * @p: pointer to NUL-terminated string to append to
+  * @q: pointer to source string to append from
+  * @count: Maximum bytes to read from @q
+  *
+  * Appends at most @count bytes from @q (stopping at the first
+  * NUL byte) after the NUL-terminated string at @p. @p will be
+  * NUL-terminated.
+  *
+  * Do not use this function. While FORTIFY_SOURCE tries to avoid
+  * read and write overflows, this is only possible when the sizes
+  * of @p and @q are known to the compiler. Prefer building the
+  * string with formatting, via scnprintf() or similar.
+  *
+  * Returns @p.
+  *
+  */
+ /* Defined after fortified strlen() and strnlen() to reuse them. */
  __FORTIFY_INLINE __diagnose_as(__builtin_strncat, 1, 2, 3)
  char *strncat(char * const POS p, const char * const POS q, __kernel_size_t count)
  {
@@@ -573,7 -669,8 +682,8 @@@ __FORTIFY_INLINE void *memchr_inv(cons
        return __real_memchr_inv(p, c, size);
  }
  
- extern void *__real_kmemdup(const void *src, size_t len, gfp_t gfp) __RENAME(kmemdup);
+ extern void *__real_kmemdup(const void *src, size_t len, gfp_t gfp) __RENAME(kmemdup)
+                                                                   __realloc_size(2);
  __FORTIFY_INLINE void *kmemdup(const void * const POS0 p, size_t size, gfp_t gfp)
  {
        size_t p_size = __struct_size(p);
        return __real_kmemdup(p, size, gfp);
  }
  
+ /**
+  * strcpy - Copy a string into another string buffer
+  *
+  * @p: pointer to destination of copy
+  * @q: pointer to NUL-terminated source string to copy
+  *
+  * Do not use this function. While FORTIFY_SOURCE tries to avoid
+  * overflows, this is only possible when the sizes of @q and @p are
+  * known to the compiler. Prefer strscpy(), though note its different
+  * return values for detecting truncation.
+  *
+  * Returns @p.
+  *
+  */
  /* Defined after fortified strlen to reuse it. */
  __FORTIFY_INLINE __diagnose_as(__builtin_strcpy, 1, 2)
  char *strcpy(char * const POS p, const char * const POS q)
diff --combined init/Kconfig
@@@ -66,7 -66,7 +66,7 @@@ config RUST_IS_AVAILABL
          This shows whether a suitable Rust toolchain is available (found).
  
          Please see Documentation/rust/quick-start.rst for instructions on how
 -        to satify the build requirements of Rust support.
 +        to satisfy the build requirements of Rust support.
  
          In particular, the Makefile target 'rustavailable' is useful to check
          why the Rust toolchain is not being detected.
@@@ -87,7 -87,7 +87,7 @@@ config CC_HAS_ASM_GOTO_OUTPU
  config CC_HAS_ASM_GOTO_TIED_OUTPUT
        depends on CC_HAS_ASM_GOTO_OUTPUT
        # Detect buggy gcc and clang, fixed in gcc-11 clang-14.
 -      def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .\n": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null)
 +      def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null)
  
  config TOOLS_SUPPORT_RELR
        def_bool $(success,env "CC=$(CC)" "LD=$(LD)" "NM=$(NM)" "OBJCOPY=$(OBJCOPY)" $(srctree)/scripts/tools-support-relr.sh)
@@@ -159,10 -159,12 +159,12 @@@ config WERRO
        help
          A kernel build should not cause any compiler warnings, and this
          enables the '-Werror' (for C) and '-Dwarnings' (for Rust) flags
-         to enforce that rule by default.
+         to enforce that rule by default. Certain warnings from other tools
+         such as the linker may be upgraded to errors with this option as
+         well.
  
-         However, if you have a new (or very old) compiler with odd and
-         unusual warnings, or you have some architecture with problems,
+         However, if you have a new (or very old) compiler or linker with odd
+         and unusual warnings, or you have some architecture with problems,
          you may need to disable this config option in order to
          successfully build the kernel.
  
@@@ -1454,6 -1456,13 +1456,13 @@@ config LD_ORPHAN_WAR
        def_bool y
        depends on ARCH_WANT_LD_ORPHAN_WARN
        depends on $(ld-option,--orphan-handling=warn)
+       depends on $(ld-option,--orphan-handling=error)
+ config LD_ORPHAN_WARN_LEVEL
+         string
+         depends on LD_ORPHAN_WARN
+         default "error" if WERROR
+         default "warn"
  
  config SYSCTL
        bool
@@@ -1723,19 -1732,6 +1732,19 @@@ config KALLSYM
          symbolic stack backtraces. This increases the size of the kernel
          somewhat, as all symbols have to be loaded into the kernel image.
  
 +config KALLSYMS_SELFTEST
 +      bool "Test the basic functions and performance of kallsyms"
 +      depends on KALLSYMS
 +      default n
 +      help
 +        Test the basic functions and performance of some interfaces, such as
 +        kallsyms_lookup_name. It also calculates the compression rate of the
 +        kallsyms compression algorithm for the current symbol set.
 +
 +        Start self-test automatically after system startup. Suggest executing
 +        "dmesg | grep kallsyms_selftest" to collect test results. "finish" is
 +        displayed in the last line, indicating that the test is complete.
 +
  config KALLSYMS_ALL
        bool "Include all symbols in kallsyms"
        depends on DEBUG_KERNEL && KALLSYMS
diff --combined kernel/panic.c
@@@ -25,7 -25,6 +25,7 @@@
  #include <linux/kexec.h>
  #include <linux/panic_notifier.h>
  #include <linux/sched.h>
 +#include <linux/string_helpers.h>
  #include <linux/sysrq.h>
  #include <linux/init.h>
  #include <linux/nmi.h>
@@@ -33,6 -32,7 +33,7 @@@
  #include <linux/bug.h>
  #include <linux/ratelimit.h>
  #include <linux/debugfs.h>
+ #include <linux/sysfs.h>
  #include <trace/events/error_report.h>
  #include <asm/sections.h>
  
@@@ -59,6 -59,7 +60,7 @@@ bool crash_kexec_post_notifiers
  int panic_on_warn __read_mostly;
  unsigned long panic_on_taint;
  bool panic_on_taint_nousertaint = false;
+ static unsigned int warn_limit __read_mostly;
  
  int panic_timeout = CONFIG_PANIC_TIMEOUT;
  EXPORT_SYMBOL_GPL(panic_timeout);
@@@ -76,8 -77,9 +78,9 @@@ ATOMIC_NOTIFIER_HEAD(panic_notifier_lis
  
  EXPORT_SYMBOL(panic_notifier_list);
  
- #if defined(CONFIG_SMP) && defined(CONFIG_SYSCTL)
+ #ifdef CONFIG_SYSCTL
  static struct ctl_table kern_panic_table[] = {
+ #ifdef CONFIG_SMP
        {
                .procname       = "oops_all_cpu_backtrace",
                .data           = &sysctl_oops_all_cpu_backtrace,
                .extra1         = SYSCTL_ZERO,
                .extra2         = SYSCTL_ONE,
        },
+ #endif
+       {
+               .procname       = "warn_limit",
+               .data           = &warn_limit,
+               .maxlen         = sizeof(warn_limit),
+               .mode           = 0644,
+               .proc_handler   = proc_douintvec,
+       },
        { }
  };
  
@@@ -98,6 -108,25 +109,25 @@@ static __init int kernel_panic_sysctls_
  late_initcall(kernel_panic_sysctls_init);
  #endif
  
+ static atomic_t warn_count = ATOMIC_INIT(0);
+ #ifdef CONFIG_SYSFS
+ static ssize_t warn_count_show(struct kobject *kobj, struct kobj_attribute *attr,
+                              char *page)
+ {
+       return sysfs_emit(page, "%d\n", atomic_read(&warn_count));
+ }
+ static struct kobj_attribute warn_count_attr = __ATTR_RO(warn_count);
+ static __init int kernel_panic_sysfs_init(void)
+ {
+       sysfs_add_file_to_group(kernel_kobj, &warn_count_attr.attr, NULL);
+       return 0;
+ }
+ late_initcall(kernel_panic_sysfs_init);
+ #endif
  static long no_blink(int state)
  {
        return 0;
@@@ -200,6 -229,16 +230,16 @@@ static void panic_print_sys_info(bool c
                ftrace_dump(DUMP_ALL);
  }
  
+ void check_panic_on_warn(const char *origin)
+ {
+       if (panic_on_warn)
+               panic("%s: panic_on_warn set ...\n", origin);
+       if (atomic_inc_return(&warn_count) >= READ_ONCE(warn_limit) && warn_limit)
+               panic("%s: system warned too often (kernel.warn_limit is %d)",
+                     origin, warn_limit);
+ }
  /**
   *    panic - halt the system
   *    @fmt: The text string to print
@@@ -618,8 -657,7 +658,7 @@@ void __warn(const char *file, int line
        if (regs)
                show_regs(regs);
  
-       if (panic_on_warn)
-               panic("panic_on_warn set ...\n");
+       check_panic_on_warn("kernel");
  
        if (!regs)
                dump_stack();
@@@ -745,8 -783,8 +784,8 @@@ static int __init panic_on_taint_setup(
        if (s && !strcmp(s, "nousertaint"))
                panic_on_taint_nousertaint = true;
  
 -      pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%sabled\n",
 -              panic_on_taint, panic_on_taint_nousertaint ? "en" : "dis");
 +      pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%s\n",
 +              panic_on_taint, str_enabled_disabled(panic_on_taint_nousertaint));
  
        return 0;
  }
diff --combined kernel/sched/core.c
@@@ -1392,7 -1392,7 +1392,7 @@@ static inline void uclamp_idle_reset(st
        if (!(rq->uclamp_flags & UCLAMP_FLAG_IDLE))
                return;
  
 -      WRITE_ONCE(rq->uclamp[clamp_id].value, clamp_value);
 +      uclamp_rq_set(rq, clamp_id, clamp_value);
  }
  
  static inline
@@@ -1543,8 -1543,8 +1543,8 @@@ static inline void uclamp_rq_inc_id(str
        if (bucket->tasks == 1 || uc_se->value > bucket->value)
                bucket->value = uc_se->value;
  
 -      if (uc_se->value > READ_ONCE(uc_rq->value))
 -              WRITE_ONCE(uc_rq->value, uc_se->value);
 +      if (uc_se->value > uclamp_rq_get(rq, clamp_id))
 +              uclamp_rq_set(rq, clamp_id, uc_se->value);
  }
  
  /*
@@@ -1610,7 -1610,7 +1610,7 @@@ static inline void uclamp_rq_dec_id(str
        if (likely(bucket->tasks))
                return;
  
 -      rq_clamp = READ_ONCE(uc_rq->value);
 +      rq_clamp = uclamp_rq_get(rq, clamp_id);
        /*
         * Defensive programming: this should never happen. If it happens,
         * e.g. due to future modification, warn and fixup the expected value.
        SCHED_WARN_ON(bucket->value > rq_clamp);
        if (bucket->value >= rq_clamp) {
                bkt_clamp = uclamp_rq_max_value(rq, clamp_id, uc_se->value);
 -              WRITE_ONCE(uc_rq->value, bkt_clamp);
 +              uclamp_rq_set(rq, clamp_id, bkt_clamp);
        }
  }
  
@@@ -2053,7 -2053,7 +2053,7 @@@ static inline void enqueue_task(struct 
  
        if (!(flags & ENQUEUE_RESTORE)) {
                sched_info_enqueue(rq, p);
 -              psi_enqueue(p, flags & ENQUEUE_WAKEUP);
 +              psi_enqueue(p, (flags & ENQUEUE_WAKEUP) && !(flags & ENQUEUE_MIGRATED));
        }
  
        uclamp_rq_inc(rq, p);
@@@ -2189,18 -2189,14 +2189,18 @@@ void check_preempt_curr(struct rq *rq, 
  #ifdef CONFIG_SMP
  
  static void
 -__do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask, u32 flags);
 +__do_set_cpus_allowed(struct task_struct *p, struct affinity_context *ctx);
  
  static int __set_cpus_allowed_ptr(struct task_struct *p,
 -                                const struct cpumask *new_mask,
 -                                u32 flags);
 +                                struct affinity_context *ctx);
  
  static void migrate_disable_switch(struct rq *rq, struct task_struct *p)
  {
 +      struct affinity_context ac = {
 +              .new_mask  = cpumask_of(rq->cpu),
 +              .flags     = SCA_MIGRATE_DISABLE,
 +      };
 +
        if (likely(!p->migration_disabled))
                return;
  
        /*
         * Violates locking rules! see comment in __do_set_cpus_allowed().
         */
 -      __do_set_cpus_allowed(p, cpumask_of(rq->cpu), SCA_MIGRATE_DISABLE);
 +      __do_set_cpus_allowed(p, &ac);
  }
  
  void migrate_disable(void)
@@@ -2232,10 -2228,6 +2232,10 @@@ EXPORT_SYMBOL_GPL(migrate_disable)
  void migrate_enable(void)
  {
        struct task_struct *p = current;
 +      struct affinity_context ac = {
 +              .new_mask  = &p->cpus_mask,
 +              .flags     = SCA_MIGRATE_ENABLE,
 +      };
  
        if (p->migration_disabled > 1) {
                p->migration_disabled--;
         */
        preempt_disable();
        if (p->cpus_ptr != &p->cpus_mask)
 -              __set_cpus_allowed_ptr(p, &p->cpus_mask, SCA_MIGRATE_ENABLE);
 +              __set_cpus_allowed_ptr(p, &ac);
        /*
         * Mustn't clear migration_disabled() until cpus_ptr points back at the
         * regular cpus_mask, otherwise things that race (eg.
@@@ -2531,25 -2523,19 +2531,25 @@@ out_unlock
   * sched_class::set_cpus_allowed must do the below, but is not required to
   * actually call this function.
   */
 -void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask, u32 flags)
 +void set_cpus_allowed_common(struct task_struct *p, struct affinity_context *ctx)
  {
 -      if (flags & (SCA_MIGRATE_ENABLE | SCA_MIGRATE_DISABLE)) {
 -              p->cpus_ptr = new_mask;
 +      if (ctx->flags & (SCA_MIGRATE_ENABLE | SCA_MIGRATE_DISABLE)) {
 +              p->cpus_ptr = ctx->new_mask;
                return;
        }
  
 -      cpumask_copy(&p->cpus_mask, new_mask);
 -      p->nr_cpus_allowed = cpumask_weight(new_mask);
 +      cpumask_copy(&p->cpus_mask, ctx->new_mask);
 +      p->nr_cpus_allowed = cpumask_weight(ctx->new_mask);
 +
 +      /*
 +       * Swap in a new user_cpus_ptr if SCA_USER flag set
 +       */
 +      if (ctx->flags & SCA_USER)
 +              swap(p->user_cpus_ptr, ctx->user_mask);
  }
  
  static void
 -__do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask, u32 flags)
 +__do_set_cpus_allowed(struct task_struct *p, struct affinity_context *ctx)
  {
        struct rq *rq = task_rq(p);
        bool queued, running;
         *
         * XXX do further audits, this smells like something putrid.
         */
 -      if (flags & SCA_MIGRATE_DISABLE)
 +      if (ctx->flags & SCA_MIGRATE_DISABLE)
                SCHED_WARN_ON(!p->on_cpu);
        else
                lockdep_assert_held(&p->pi_lock);
        if (running)
                put_prev_task(rq, p);
  
 -      p->sched_class->set_cpus_allowed(p, new_mask, flags);
 +      p->sched_class->set_cpus_allowed(p, ctx);
  
        if (queued)
                enqueue_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK);
                set_next_task(rq, p);
  }
  
 +/*
 + * Used for kthread_bind() and select_fallback_rq(), in both cases the user
 + * affinity (if any) should be destroyed too.
 + */
  void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask)
  {
 -      __do_set_cpus_allowed(p, new_mask, 0);
 +      struct affinity_context ac = {
 +              .new_mask  = new_mask,
 +              .user_mask = NULL,
 +              .flags     = SCA_USER,  /* clear the user requested mask */
 +      };
 +
 +      __do_set_cpus_allowed(p, &ac);
 +      kfree(ac.user_mask);
  }
  
  int dup_user_cpus_ptr(struct task_struct *dst, struct task_struct *src,
                      int node)
  {
 +      unsigned long flags;
 +
        if (!src->user_cpus_ptr)
                return 0;
  
        if (!dst->user_cpus_ptr)
                return -ENOMEM;
  
 +      /* Use pi_lock to protect content of user_cpus_ptr */
 +      raw_spin_lock_irqsave(&src->pi_lock, flags);
        cpumask_copy(dst->user_cpus_ptr, src->user_cpus_ptr);
 +      raw_spin_unlock_irqrestore(&src->pi_lock, flags);
        return 0;
  }
  
@@@ -2720,8 -2690,6 +2720,8 @@@ void release_user_cpus_ptr(struct task_
   */
  static int affine_move_task(struct rq *rq, struct task_struct *p, struct rq_flags *rf,
                            int dest_cpu, unsigned int flags)
 +      __releases(rq->lock)
 +      __releases(p->pi_lock)
  {
        struct set_affinity_pending my_pending = { }, *pending = NULL;
        bool stop_pending, complete = false;
   * Called with both p->pi_lock and rq->lock held; drops both before returning.
   */
  static int __set_cpus_allowed_ptr_locked(struct task_struct *p,
 -                                       const struct cpumask *new_mask,
 -                                       u32 flags,
 +                                       struct affinity_context *ctx,
                                         struct rq *rq,
                                         struct rq_flags *rf)
        __releases(rq->lock)
        const struct cpumask *cpu_allowed_mask = task_cpu_possible_mask(p);
        const struct cpumask *cpu_valid_mask = cpu_active_mask;
        bool kthread = p->flags & PF_KTHREAD;
 -      struct cpumask *user_mask = NULL;
        unsigned int dest_cpu;
        int ret = 0;
  
                cpu_valid_mask = cpu_online_mask;
        }
  
 -      if (!kthread && !cpumask_subset(new_mask, cpu_allowed_mask)) {
 +      if (!kthread && !cpumask_subset(ctx->new_mask, cpu_allowed_mask)) {
                ret = -EINVAL;
                goto out;
        }
         * Must re-check here, to close a race against __kthread_bind(),
         * sched_setaffinity() is not guaranteed to observe the flag.
         */
 -      if ((flags & SCA_CHECK) && (p->flags & PF_NO_SETAFFINITY)) {
 +      if ((ctx->flags & SCA_CHECK) && (p->flags & PF_NO_SETAFFINITY)) {
                ret = -EINVAL;
                goto out;
        }
  
 -      if (!(flags & SCA_MIGRATE_ENABLE)) {
 -              if (cpumask_equal(&p->cpus_mask, new_mask))
 +      if (!(ctx->flags & SCA_MIGRATE_ENABLE)) {
 +              if (cpumask_equal(&p->cpus_mask, ctx->new_mask))
                        goto out;
  
                if (WARN_ON_ONCE(p == current &&
                                 is_migration_disabled(p) &&
 -                               !cpumask_test_cpu(task_cpu(p), new_mask))) {
 +                               !cpumask_test_cpu(task_cpu(p), ctx->new_mask))) {
                        ret = -EBUSY;
                        goto out;
                }
         * for groups of tasks (ie. cpuset), so that load balancing is not
         * immediately required to distribute the tasks within their new mask.
         */
 -      dest_cpu = cpumask_any_and_distribute(cpu_valid_mask, new_mask);
 +      dest_cpu = cpumask_any_and_distribute(cpu_valid_mask, ctx->new_mask);
        if (dest_cpu >= nr_cpu_ids) {
                ret = -EINVAL;
                goto out;
        }
  
 -      __do_set_cpus_allowed(p, new_mask, flags);
 -
 -      if (flags & SCA_USER)
 -              user_mask = clear_user_cpus_ptr(p);
 -
 -      ret = affine_move_task(rq, p, rf, dest_cpu, flags);
 -
 -      kfree(user_mask);
 +      __do_set_cpus_allowed(p, ctx);
  
 -      return ret;
 +      return affine_move_task(rq, p, rf, dest_cpu, ctx->flags);
  
  out:
        task_rq_unlock(rq, p, rf);
   * call is not atomic; no spinlocks may be held.
   */
  static int __set_cpus_allowed_ptr(struct task_struct *p,
 -                                const struct cpumask *new_mask, u32 flags)
 +                                struct affinity_context *ctx)
  {
        struct rq_flags rf;
        struct rq *rq;
  
        rq = task_rq_lock(p, &rf);
 -      return __set_cpus_allowed_ptr_locked(p, new_mask, flags, rq, &rf);
 +      /*
 +       * Masking should be skipped if SCA_USER or any of the SCA_MIGRATE_*
 +       * flags are set.
 +       */
 +      if (p->user_cpus_ptr &&
 +          !(ctx->flags & (SCA_USER | SCA_MIGRATE_ENABLE | SCA_MIGRATE_DISABLE)) &&
 +          cpumask_and(rq->scratch_mask, ctx->new_mask, p->user_cpus_ptr))
 +              ctx->new_mask = rq->scratch_mask;
 +
 +      return __set_cpus_allowed_ptr_locked(p, ctx, rq, &rf);
  }
  
  int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask)
  {
 -      return __set_cpus_allowed_ptr(p, new_mask, 0);
 +      struct affinity_context ac = {
 +              .new_mask  = new_mask,
 +              .flags     = 0,
 +      };
 +
 +      return __set_cpus_allowed_ptr(p, &ac);
  }
  EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr);
  
  /*
   * Change a given task's CPU affinity to the intersection of its current
 - * affinity mask and @subset_mask, writing the resulting mask to @new_mask
 - * and pointing @p->user_cpus_ptr to a copy of the old mask.
 + * affinity mask and @subset_mask, writing the resulting mask to @new_mask.
 + * If user_cpus_ptr is defined, use it as the basis for restricting CPU
 + * affinity or use cpu_online_mask instead.
 + *
   * If the resulting mask is empty, leave the affinity unchanged and return
   * -EINVAL.
   */
@@@ -2991,14 -2952,17 +2991,14 @@@ static int restrict_cpus_allowed_ptr(st
                                     struct cpumask *new_mask,
                                     const struct cpumask *subset_mask)
  {
 -      struct cpumask *user_mask = NULL;
 +      struct affinity_context ac = {
 +              .new_mask  = new_mask,
 +              .flags     = 0,
 +      };
        struct rq_flags rf;
        struct rq *rq;
        int err;
  
 -      if (!p->user_cpus_ptr) {
 -              user_mask = kmalloc(cpumask_size(), GFP_KERNEL);
 -              if (!user_mask)
 -                      return -ENOMEM;
 -      }
 -
        rq = task_rq_lock(p, &rf);
  
        /*
                goto err_unlock;
        }
  
 -      if (!cpumask_and(new_mask, &p->cpus_mask, subset_mask)) {
 +      if (!cpumask_and(new_mask, task_user_cpus(p), subset_mask)) {
                err = -EINVAL;
                goto err_unlock;
        }
  
 -      /*
 -       * We're about to butcher the task affinity, so keep track of what
 -       * the user asked for in case we're able to restore it later on.
 -       */
 -      if (user_mask) {
 -              cpumask_copy(user_mask, p->cpus_ptr);
 -              p->user_cpus_ptr = user_mask;
 -      }
 -
 -      return __set_cpus_allowed_ptr_locked(p, new_mask, 0, rq, &rf);
 +      return __set_cpus_allowed_ptr_locked(p, &ac, rq, &rf);
  
  err_unlock:
        task_rq_unlock(rq, p, &rf);
 -      kfree(user_mask);
        return err;
  }
  
  /*
   * Restrict the CPU affinity of task @p so that it is a subset of
 - * task_cpu_possible_mask() and point @p->user_cpu_ptr to a copy of the
 + * task_cpu_possible_mask() and point @p->user_cpus_ptr to a copy of the
   * old affinity mask. If the resulting mask is empty, we warn and walk
   * up the cpuset hierarchy until we find a suitable mask.
   */
@@@ -3069,29 -3043,34 +3069,29 @@@ out_free_mask
  }
  
  static int
 -__sched_setaffinity(struct task_struct *p, const struct cpumask *mask);
 +__sched_setaffinity(struct task_struct *p, struct affinity_context *ctx);
  
  /*
   * Restore the affinity of a task @p which was previously restricted by a
 - * call to force_compatible_cpus_allowed_ptr(). This will clear (and free)
 - * @p->user_cpus_ptr.
 + * call to force_compatible_cpus_allowed_ptr().
   *
   * It is the caller's responsibility to serialise this with any calls to
   * force_compatible_cpus_allowed_ptr(@p).
   */
  void relax_compatible_cpus_allowed_ptr(struct task_struct *p)
  {
 -      struct cpumask *user_mask = p->user_cpus_ptr;
 -      unsigned long flags;
 +      struct affinity_context ac = {
 +              .new_mask  = task_user_cpus(p),
 +              .flags     = 0,
 +      };
 +      int ret;
  
        /*
 -       * Try to restore the old affinity mask. If this fails, then
 -       * we free the mask explicitly to avoid it being inherited across
 -       * a subsequent fork().
 +       * Try to restore the old affinity mask with __sched_setaffinity().
 +       * Cpuset masking will be done there too.
         */
 -      if (!user_mask || !__sched_setaffinity(p, user_mask))
 -              return;
 -
 -      raw_spin_lock_irqsave(&p->pi_lock, flags);
 -      user_mask = clear_user_cpus_ptr(p);
 -      raw_spin_unlock_irqrestore(&p->pi_lock, flags);
 -
 -      kfree(user_mask);
 +      ret = __sched_setaffinity(p, &ac);
 +      WARN_ON_ONCE(ret);
  }
  
  void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
@@@ -3569,9 -3548,10 +3569,9 @@@ void sched_set_stop_task(int cpu, struc
  #else /* CONFIG_SMP */
  
  static inline int __set_cpus_allowed_ptr(struct task_struct *p,
 -                                       const struct cpumask *new_mask,
 -                                       u32 flags)
 +                                       struct affinity_context *ctx)
  {
 -      return set_cpus_allowed_ptr(p, new_mask);
 +      return set_cpus_allowed_ptr(p, ctx->new_mask);
  }
  
  static inline void migrate_disable_switch(struct rq *rq, struct task_struct *p) { }
@@@ -3739,6 -3719,13 +3739,6 @@@ void sched_ttwu_pending(void *arg
        if (!llist)
                return;
  
 -      /*
 -       * rq::ttwu_pending racy indication of out-standing wakeups.
 -       * Races such that false-negatives are possible, since they
 -       * are shorter lived that false-positives would be.
 -       */
 -      WRITE_ONCE(rq->ttwu_pending, 0);
 -
        rq_lock_irqsave(rq, &rf);
        update_rq_clock(rq);
  
                ttwu_do_activate(rq, p, p->sched_remote_wakeup ? WF_MIGRATED : 0, &rf);
        }
  
 +      /*
 +       * Must be after enqueueing at least once task such that
 +       * idle_cpu() does not observe a false-negative -- if it does,
 +       * it is possible for select_idle_siblings() to stack a number
 +       * of tasks on this CPU during that window.
 +       *
 +       * It is ok to clear ttwu_pending when another task pending.
 +       * We will receive IPI after local irq enabled and then enqueue it.
 +       * Since now nr_running > 0, idle_cpu() will always get correct result.
 +       */
 +      WRITE_ONCE(rq->ttwu_pending, 0);
        rq_unlock_irqrestore(rq, &rf);
  }
  
        return success;
  }
  
 +static bool __task_needs_rq_lock(struct task_struct *p)
 +{
 +      unsigned int state = READ_ONCE(p->__state);
 +
 +      /*
 +       * Since pi->lock blocks try_to_wake_up(), we don't need rq->lock when
 +       * the task is blocked. Make sure to check @state since ttwu() can drop
 +       * locks at the end, see ttwu_queue_wakelist().
 +       */
 +      if (state == TASK_RUNNING || state == TASK_WAKING)
 +              return true;
 +
 +      /*
 +       * Ensure we load p->on_rq after p->__state, otherwise it would be
 +       * possible to, falsely, observe p->on_rq == 0.
 +       *
 +       * See try_to_wake_up() for a longer comment.
 +       */
 +      smp_rmb();
 +      if (p->on_rq)
 +              return true;
 +
 +#ifdef CONFIG_SMP
 +      /*
 +       * Ensure the task has finished __schedule() and will not be referenced
 +       * anymore. Again, see try_to_wake_up() for a longer comment.
 +       */
 +      smp_rmb();
 +      smp_cond_load_acquire(&p->on_cpu, !VAL);
 +#endif
 +
 +      return false;
 +}
 +
  /**
   * task_call_func - Invoke a function on task in fixed state
   * @p: Process for which the function is to be invoked, can be @current.
  int task_call_func(struct task_struct *p, task_call_f func, void *arg)
  {
        struct rq *rq = NULL;
 -      unsigned int state;
        struct rq_flags rf;
        int ret;
  
        raw_spin_lock_irqsave(&p->pi_lock, rf.flags);
  
 -      state = READ_ONCE(p->__state);
 -
 -      /*
 -       * Ensure we load p->on_rq after p->__state, otherwise it would be
 -       * possible to, falsely, observe p->on_rq == 0.
 -       *
 -       * See try_to_wake_up() for a longer comment.
 -       */
 -      smp_rmb();
 -
 -      /*
 -       * Since pi->lock blocks try_to_wake_up(), we don't need rq->lock when
 -       * the task is blocked. Make sure to check @state since ttwu() can drop
 -       * locks at the end, see ttwu_queue_wakelist().
 -       */
 -      if (state == TASK_RUNNING || state == TASK_WAKING || p->on_rq)
 +      if (__task_needs_rq_lock(p))
                rq = __task_rq_lock(p, &rf);
  
        /*
@@@ -4443,7 -4401,7 +4443,7 @@@ static void reset_memory_tiering(void
        }
  }
  
 -int sysctl_numa_balancing(struct ctl_table *table, int write,
 +static int sysctl_numa_balancing(struct ctl_table *table, int write,
                          void *buffer, size_t *lenp, loff_t *ppos)
  {
        struct ctl_table t;
@@@ -4570,17 -4528,6 +4570,17 @@@ static struct ctl_table sched_core_sysc
                .proc_handler   = sysctl_sched_uclamp_handler,
        },
  #endif /* CONFIG_UCLAMP_TASK */
 +#ifdef CONFIG_NUMA_BALANCING
 +      {
 +              .procname       = "numa_balancing",
 +              .data           = NULL, /* filled in by handler */
 +              .maxlen         = sizeof(unsigned int),
 +              .mode           = 0644,
 +              .proc_handler   = sysctl_numa_balancing,
 +              .extra1         = SYSCTL_ZERO,
 +              .extra2         = SYSCTL_FOUR,
 +      },
 +#endif /* CONFIG_NUMA_BALANCING */
        {}
  };
  static int __init sched_core_sysctl_init(void)
@@@ -4876,10 -4823,10 +4876,10 @@@ static inline void finish_task(struct t
  
  #ifdef CONFIG_SMP
  
 -static void do_balance_callbacks(struct rq *rq, struct callback_head *head)
 +static void do_balance_callbacks(struct rq *rq, struct balance_callback *head)
  {
        void (*func)(struct rq *rq);
 -      struct callback_head *next;
 +      struct balance_callback *next;
  
        lockdep_assert_rq_held(rq);
  
@@@ -4906,15 -4853,15 +4906,15 @@@ static void balance_push(struct rq *rq)
   * This abuse is tolerated because it places all the unlikely/odd cases behind
   * a single test, namely: rq->balance_callback == NULL.
   */
 -struct callback_head balance_push_callback = {
 +struct balance_callback balance_push_callback = {
        .next = NULL,
 -      .func = (void (*)(struct callback_head *))balance_push,
 +      .func = balance_push,
  };
  
 -static inline struct callback_head *
 +static inline struct balance_callback *
  __splice_balance_callbacks(struct rq *rq, bool split)
  {
 -      struct callback_head *head = rq->balance_callback;
 +      struct balance_callback *head = rq->balance_callback;
  
        if (likely(!head))
                return NULL;
        return head;
  }
  
 -static inline struct callback_head *splice_balance_callbacks(struct rq *rq)
 +static inline struct balance_callback *splice_balance_callbacks(struct rq *rq)
  {
        return __splice_balance_callbacks(rq, true);
  }
@@@ -4946,7 -4893,7 +4946,7 @@@ static void __balance_callbacks(struct 
        do_balance_callbacks(rq, __splice_balance_callbacks(rq, false));
  }
  
 -static inline void balance_callbacks(struct rq *rq, struct callback_head *head)
 +static inline void balance_callbacks(struct rq *rq, struct balance_callback *head)
  {
        unsigned long flags;
  
@@@ -4963,12 -4910,12 +4963,12 @@@ static inline void __balance_callbacks(
  {
  }
  
 -static inline struct callback_head *splice_balance_callbacks(struct rq *rq)
 +static inline struct balance_callback *splice_balance_callbacks(struct rq *rq)
  {
        return NULL;
  }
  
 -static inline void balance_callbacks(struct rq *rq, struct callback_head *head)
 +static inline void balance_callbacks(struct rq *rq, struct balance_callback *head)
  {
  }
  
@@@ -5782,8 -5729,7 +5782,7 @@@ static noinline void __schedule_bug(str
                pr_err("Preemption disabled at:");
                print_ip_sym(KERN_ERR, preempt_disable_ip);
        }
-       if (panic_on_warn)
-               panic("scheduling while atomic\n");
+       check_panic_on_warn("scheduling while atomic");
  
        dump_stack();
        add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
@@@ -6241,7 -6187,7 +6240,7 @@@ static void sched_core_balance(struct r
        preempt_enable();
  }
  
 -static DEFINE_PER_CPU(struct callback_head, core_balance_head);
 +static DEFINE_PER_CPU(struct balance_callback, core_balance_head);
  
  static void queue_core_balance(struct rq *rq)
  {
@@@ -7472,7 -7418,7 +7471,7 @@@ static int __sched_setscheduler(struct 
        int oldpolicy = -1, policy = attr->sched_policy;
        int retval, oldprio, newprio, queued, running;
        const struct sched_class *prev_class;
 -      struct callback_head *head;
 +      struct balance_callback *head;
        struct rq_flags rf;
        int reset_on_fork;
        int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE | DEQUEUE_NOCLOCK;
@@@ -8141,7 -8087,7 +8140,7 @@@ int dl_task_check_affinity(struct task_
  #endif
  
  static int
 -__sched_setaffinity(struct task_struct *p, const struct cpumask *mask)
 +__sched_setaffinity(struct task_struct *p, struct affinity_context *ctx)
  {
        int retval;
        cpumask_var_t cpus_allowed, new_mask;
        }
  
        cpuset_cpus_allowed(p, cpus_allowed);
 -      cpumask_and(new_mask, mask, cpus_allowed);
 +      cpumask_and(new_mask, ctx->new_mask, cpus_allowed);
 +
 +      ctx->new_mask = new_mask;
 +      ctx->flags |= SCA_CHECK;
  
        retval = dl_task_check_affinity(p, new_mask);
        if (retval)
                goto out_free_new_mask;
 -again:
 -      retval = __set_cpus_allowed_ptr(p, new_mask, SCA_CHECK | SCA_USER);
 +
 +      retval = __set_cpus_allowed_ptr(p, ctx);
        if (retval)
                goto out_free_new_mask;
  
                 * Just reset the cpumask to the cpuset's cpus_allowed.
                 */
                cpumask_copy(new_mask, cpus_allowed);
 -              goto again;
 +
 +              /*
 +               * If SCA_USER is set, a 2nd call to __set_cpus_allowed_ptr()
 +               * will restore the previous user_cpus_ptr value.
 +               *
 +               * In the unlikely event a previous user_cpus_ptr exists,
 +               * we need to further restrict the mask to what is allowed
 +               * by that old user_cpus_ptr.
 +               */
 +              if (unlikely((ctx->flags & SCA_USER) && ctx->user_mask)) {
 +                      bool empty = !cpumask_and(new_mask, new_mask,
 +                                                ctx->user_mask);
 +
 +                      if (WARN_ON_ONCE(empty))
 +                              cpumask_copy(new_mask, cpus_allowed);
 +              }
 +              __set_cpus_allowed_ptr(p, ctx);
 +              retval = -EINVAL;
        }
  
  out_free_new_mask:
@@@ -8204,8 -8130,6 +8203,8 @@@ out_free_cpus_allowed
  
  long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
  {
 +      struct affinity_context ac;
 +      struct cpumask *user_mask;
        struct task_struct *p;
        int retval;
  
        if (retval)
                goto out_put_task;
  
 -      retval = __sched_setaffinity(p, in_mask);
 +      user_mask = kmalloc(cpumask_size(), GFP_KERNEL);
 +      if (!user_mask) {
 +              retval = -ENOMEM;
 +              goto out_put_task;
 +      }
 +      cpumask_copy(user_mask, in_mask);
 +      ac = (struct affinity_context){
 +              .new_mask  = in_mask,
 +              .user_mask = user_mask,
 +              .flags     = SCA_USER,
 +      };
 +
 +      retval = __sched_setaffinity(p, &ac);
 +      kfree(ac.user_mask);
 +
  out_put_task:
        put_task_struct(p);
        return retval;
@@@ -9035,12 -8945,6 +9034,12 @@@ void show_state_filter(unsigned int sta
   */
  void __init init_idle(struct task_struct *idle, int cpu)
  {
 +#ifdef CONFIG_SMP
 +      struct affinity_context ac = (struct affinity_context) {
 +              .new_mask  = cpumask_of(cpu),
 +              .flags     = 0,
 +      };
 +#endif
        struct rq *rq = cpu_rq(cpu);
        unsigned long flags;
  
         *
         * And since this is boot we can forgo the serialization.
         */
 -      set_cpus_allowed_common(idle, cpumask_of(cpu), 0);
 +      set_cpus_allowed_common(idle, &ac);
  #endif
        /*
         * We're having a chicken and egg problem, even though we are
@@@ -9852,7 -9756,6 +9851,7 @@@ void __init sched_init(void
  
                rq->core_cookie = 0UL;
  #endif
 +              zalloc_cpumask_var_node(&rq->scratch_mask, GFP_KERNEL, cpu_to_node(i));
        }
  
        set_load_weight(&init_task, false);
diff --combined kernel/signal.c
@@@ -1255,7 -1255,7 +1255,7 @@@ int send_signal_locked(int sig, struct 
  
  static void print_fatal_signal(int signr)
  {
 -      struct pt_regs *regs = signal_pt_regs();
 +      struct pt_regs *regs = task_pt_regs(current);
        pr_info("potentially unexpected fatal signal %d.\n", signr);
  
  #if defined(__i386__) && !defined(__arch_um__)
@@@ -2693,6 -2693,7 +2693,7 @@@ relock
                /* Has this task already been marked for death? */
                if ((signal->flags & SIGNAL_GROUP_EXIT) ||
                     signal->group_exec_task) {
+                       clear_siginfo(&ksig->info);
                        ksig->info.si_signo = signr = SIGKILL;
                        sigdelset(&current->pending.signal, SIGKILL);
                        trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
diff --combined lib/Kconfig.debug
@@@ -395,15 -395,13 +395,15 @@@ endif # DEBUG_INF
  config FRAME_WARN
        int "Warn for stack frames larger than"
        range 0 8192
 +      default 0 if KMSAN
        default 2048 if GCC_PLUGIN_LATENT_ENTROPY
        default 2048 if PARISC
        default 1536 if (!64BIT && XTENSA)
 +      default 1280 if KASAN && !64BIT
        default 1024 if !64BIT
        default 2048 if 64BIT
        help
 -        Tell gcc to warn at build time for stack frames larger than this.
 +        Tell the compiler to warn at build time for stack frames larger than this.
          Setting this too low will cause a lot of warnings.
          Setting it to 0 disables the warning.
  
@@@ -1717,16 -1715,6 +1717,16 @@@ config LATENCYTO
          Enable this option if you want to use the LatencyTOP tool
          to find out which userspace is blocking on what kernel operations.
  
 +config DEBUG_CGROUP_REF
 +      bool "Disable inlining of cgroup css reference count functions"
 +      depends on DEBUG_KERNEL
 +      depends on CGROUPS
 +      depends on KPROBES
 +      default n
 +      help
 +        Force cgroup css reference count functions to not be inlined so
 +        that they can be kprobed for debugging.
 +
  source "kernel/trace/Kconfig"
  
  config PROVIDE_OHCI1394_DMA_INIT
@@@ -1885,14 -1873,8 +1885,14 @@@ config NETDEV_NOTIFIER_ERROR_INJEC
          If unsure, say N.
  
  config FUNCTION_ERROR_INJECTION
 -      def_bool y
 +      bool "Fault-injections of functions"
        depends on HAVE_FUNCTION_ERROR_INJECTION && KPROBES
 +      help
 +        Add fault injections into various functions that are annotated with
 +        ALLOW_ERROR_INJECTION() in the kernel. BPF may also modify the return
 +        value of theses functions. This is useful to test error paths of code.
 +
 +        If unsure, say N
  
  config FAULT_INJECTION
        bool "Fault-injection framework"
@@@ -2124,7 -2106,6 +2124,7 @@@ config KPROBES_SANITY_TES
        depends on DEBUG_KERNEL
        depends on KPROBES
        depends on KUNIT
 +      select STACKTRACE if ARCH_CORRECT_STACKTRACE_ON_KRETPROBE
        default KUNIT_ALL_TESTS
        help
          This option provides for testing basic kprobes functionality on
@@@ -2234,9 -2215,6 +2234,6 @@@ config STRING_SELFTES
  config TEST_STRING_HELPERS
        tristate "Test functions located in the string_helpers module at runtime"
  
- config TEST_STRSCPY
-       tristate "Test strscpy*() family of functions at runtime"
  config TEST_KSTRTOX
        tristate "Test kstrto*() family of functions at runtime"
  
@@@ -2259,11 -2237,6 +2256,11 @@@ config TEST_UUI
  config TEST_XARRAY
        tristate "Test the XArray code at runtime"
  
 +config TEST_MAPLE_TREE
 +      depends on DEBUG_KERNEL
 +      select DEBUG_MAPLE_TREE
 +      tristate "Test the Maple Tree code at runtime"
 +
  config TEST_RHASHTABLE
        tristate "Perform selftest on resizable hash table"
        help
  
          If unsure, say N.
  
- config TEST_SIPHASH
-       tristate "Perform selftest on siphash functions"
-       help
-         Enable this option to test the kernel's siphash (<linux/siphash.h>) hash
-         functions on boot (or module load).
-         This is intended to help people writing architecture-specific
-         optimized versions.  If unsure, say N.
  config TEST_IDA
        tristate "Perform selftest on IDA functions"
  
@@@ -2607,6 -2571,22 +2595,22 @@@ config HW_BREAKPOINT_KUNIT_TES
  
          If unsure, say N.
  
+ config STRSCPY_KUNIT_TEST
+       tristate "Test strscpy*() family of functions at runtime" if !KUNIT_ALL_TESTS
+       depends on KUNIT
+       default KUNIT_ALL_TESTS
+ config SIPHASH_KUNIT_TEST
+       tristate "Perform selftest on siphash functions" if !KUNIT_ALL_TESTS
+       depends on KUNIT
+       default KUNIT_ALL_TESTS
+       help
+         Enable this option to test the kernel's siphash (<linux/siphash.h>) hash
+         functions on boot (or module load).
+         This is intended to help people writing architecture-specific
+         optimized versions.  If unsure, say N.
  config TEST_UDELAY
        tristate "udelay test driver"
        help
@@@ -2824,22 -2804,6 +2828,22 @@@ config RUST_OVERFLOW_CHECK
  
          If unsure, say Y.
  
 +config RUST_BUILD_ASSERT_ALLOW
 +      bool "Allow unoptimized build-time assertions"
 +      depends on RUST
 +      help
 +        Controls how are `build_error!` and `build_assert!` handled during build.
 +
 +        If calls to them exist in the binary, it may indicate a violated invariant
 +        or that the optimizer failed to verify the invariant during compilation.
 +
 +        This should not happen, thus by default the build is aborted. However,
 +        as an escape hatch, you can choose Y here to ignore them during build
 +        and let the check be carried at runtime (with `panic!` being called if
 +        the check fails).
 +
 +        If unsure, say N.
 +
  endmenu # "Rust"
  
  source "Documentation/Kconfig"
diff --combined lib/Makefile
@@@ -62,7 -62,6 +62,6 @@@ obj-$(CONFIG_TEST_BITOPS) += test_bitop
  CFLAGS_test_bitops.o += -Werror
  obj-$(CONFIG_CPUMASK_KUNIT_TEST) += cpumask_kunit.o
  obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o
- obj-$(CONFIG_TEST_SIPHASH) += test_siphash.o
  obj-$(CONFIG_HASH_KUNIT_TEST) += test_hash.o
  obj-$(CONFIG_TEST_IDA) += test_ida.o
  obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
@@@ -82,10 -81,8 +81,9 @@@ obj-$(CONFIG_TEST_DYNAMIC_DEBUG) += tes
  obj-$(CONFIG_TEST_PRINTF) += test_printf.o
  obj-$(CONFIG_TEST_SCANF) += test_scanf.o
  obj-$(CONFIG_TEST_BITMAP) += test_bitmap.o
- obj-$(CONFIG_TEST_STRSCPY) += test_strscpy.o
  obj-$(CONFIG_TEST_UUID) += test_uuid.o
  obj-$(CONFIG_TEST_XARRAY) += test_xarray.o
 +obj-$(CONFIG_TEST_MAPLE_TREE) += test_maple_tree.o
  obj-$(CONFIG_TEST_PARMAN) += test_parman.o
  obj-$(CONFIG_TEST_KMOD) += test_kmod.o
  obj-$(CONFIG_TEST_DEBUG_VIRTUAL) += test_debug_virtual.o
@@@ -377,10 -374,15 +375,15 @@@ obj-$(CONFIG_CMDLINE_KUNIT_TEST) += cmd
  obj-$(CONFIG_SLUB_KUNIT_TEST) += slub_kunit.o
  obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_kunit.o
  obj-$(CONFIG_IS_SIGNED_TYPE_KUNIT_TEST) += is_signed_type_kunit.o
+ CFLAGS_overflow_kunit.o = $(call cc-disable-warning, tautological-constant-out-of-range-compare)
  obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o
  CFLAGS_stackinit_kunit.o += $(call cc-disable-warning, switch-unreachable)
  obj-$(CONFIG_STACKINIT_KUNIT_TEST) += stackinit_kunit.o
+ CFLAGS_fortify_kunit.o += $(call cc-disable-warning, unsequenced)
+ CFLAGS_fortify_kunit.o += $(DISABLE_STRUCTLEAK_PLUGIN)
  obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
+ obj-$(CONFIG_STRSCPY_KUNIT_TEST) += strscpy_kunit.o
+ obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o
  
  obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
  
diff --combined lib/memcpy_kunit.c
@@@ -105,8 -105,6 +105,8 @@@ static void memcpy_test(struct kunit *t
  #undef TEST_OP
  }
  
 +static unsigned char larger_array [2048];
 +
  static void memmove_test(struct kunit *test)
  {
  #define TEST_OP "memmove"
        ptr = &overlap.data[2];
        memmove(ptr, overlap.data, 5);
        compare("overlapping write", overlap, overlap_expected);
 +
 +      /* Verify larger overlapping moves. */
 +      larger_array[256] = 0xAAu;
 +      /*
 +       * Test a backwards overlapping memmove first. 256 and 1024 are
 +       * important for i386 to use rep movsl.
 +       */
 +      memmove(larger_array, larger_array + 256, 1024);
 +      KUNIT_ASSERT_EQ(test, larger_array[0], 0xAAu);
 +      KUNIT_ASSERT_EQ(test, larger_array[256], 0x00);
 +      KUNIT_ASSERT_NULL(test,
 +              memchr(larger_array + 1, 0xaa, ARRAY_SIZE(larger_array) - 1));
 +      /* Test a forwards overlapping memmove. */
 +      larger_array[0] = 0xBBu;
 +      memmove(larger_array + 256, larger_array, 1024);
 +      KUNIT_ASSERT_EQ(test, larger_array[0], 0xBBu);
 +      KUNIT_ASSERT_EQ(test, larger_array[256], 0xBBu);
 +      KUNIT_ASSERT_NULL(test, memchr(larger_array + 1, 0xBBu, 256 - 1));
 +      KUNIT_ASSERT_NULL(test,
 +              memchr(larger_array + 257, 0xBBu, ARRAY_SIZE(larger_array) - 257));
  #undef TEST_OP
  }
  
@@@ -292,6 -270,208 +292,208 @@@ static void memset_test(struct kunit *t
  #undef TEST_OP
  }
  
+ static u8 large_src[1024];
+ static u8 large_dst[2048];
+ static const u8 large_zero[2048];
+ static void set_random_nonzero(struct kunit *test, u8 *byte)
+ {
+       int failed_rng = 0;
+       while (*byte == 0) {
+               get_random_bytes(byte, 1);
+               KUNIT_ASSERT_LT_MSG(test, failed_rng++, 100,
+                                   "Is the RNG broken?");
+       }
+ }
+ static void init_large(struct kunit *test)
+ {
+       /* Get many bit patterns. */
+       get_random_bytes(large_src, ARRAY_SIZE(large_src));
+       /* Make sure we have non-zero edges. */
+       set_random_nonzero(test, &large_src[0]);
+       set_random_nonzero(test, &large_src[ARRAY_SIZE(large_src) - 1]);
+       /* Explicitly zero the entire destination. */
+       memset(large_dst, 0, ARRAY_SIZE(large_dst));
+ }
+ /*
+  * Instead of an indirect function call for "copy" or a giant macro,
+  * use a bool to pick memcpy or memmove.
+  */
+ static void copy_large_test(struct kunit *test, bool use_memmove)
+ {
+       init_large(test);
+       /* Copy a growing number of non-overlapping bytes ... */
+       for (int bytes = 1; bytes <= ARRAY_SIZE(large_src); bytes++) {
+               /* Over a shifting destination window ... */
+               for (int offset = 0; offset < ARRAY_SIZE(large_src); offset++) {
+                       int right_zero_pos = offset + bytes;
+                       int right_zero_size = ARRAY_SIZE(large_dst) - right_zero_pos;
+                       /* Copy! */
+                       if (use_memmove)
+                               memmove(large_dst + offset, large_src, bytes);
+                       else
+                               memcpy(large_dst + offset, large_src, bytes);
+                       /* Did we touch anything before the copy area? */
+                       KUNIT_ASSERT_EQ_MSG(test,
+                               memcmp(large_dst, large_zero, offset), 0,
+                               "with size %d at offset %d", bytes, offset);
+                       /* Did we touch anything after the copy area? */
+                       KUNIT_ASSERT_EQ_MSG(test,
+                               memcmp(&large_dst[right_zero_pos], large_zero, right_zero_size), 0,
+                               "with size %d at offset %d", bytes, offset);
+                       /* Are we byte-for-byte exact across the copy? */
+                       KUNIT_ASSERT_EQ_MSG(test,
+                               memcmp(large_dst + offset, large_src, bytes), 0,
+                               "with size %d at offset %d", bytes, offset);
+                       /* Zero out what we copied for the next cycle. */
+                       memset(large_dst + offset, 0, bytes);
+               }
+               /* Avoid stall warnings if this loop gets slow. */
+               cond_resched();
+       }
+ }
+ static void memcpy_large_test(struct kunit *test)
+ {
+       copy_large_test(test, false);
+ }
+ static void memmove_large_test(struct kunit *test)
+ {
+       copy_large_test(test, true);
+ }
+ /*
+  * On the assumption that boundary conditions are going to be the most
+  * sensitive, instead of taking a full step (inc) each iteration,
+  * take single index steps for at least the first "inc"-many indexes
+  * from the "start" and at least the last "inc"-many indexes before
+  * the "end". When in the middle, take full "inc"-wide steps. For
+  * example, calling next_step(idx, 1, 15, 3) with idx starting at 0
+  * would see the following pattern: 1 2 3 4 7 10 11 12 13 14 15.
+  */
+ static int next_step(int idx, int start, int end, int inc)
+ {
+       start += inc;
+       end -= inc;
+       if (idx < start || idx + inc > end)
+               inc = 1;
+       return idx + inc;
+ }
+ static void inner_loop(struct kunit *test, int bytes, int d_off, int s_off)
+ {
+       int left_zero_pos, left_zero_size;
+       int right_zero_pos, right_zero_size;
+       int src_pos, src_orig_pos, src_size;
+       int pos;
+       /* Place the source in the destination buffer. */
+       memcpy(&large_dst[s_off], large_src, bytes);
+       /* Copy to destination offset. */
+       memmove(&large_dst[d_off], &large_dst[s_off], bytes);
+       /* Make sure destination entirely matches. */
+       KUNIT_ASSERT_EQ_MSG(test, memcmp(&large_dst[d_off], large_src, bytes), 0,
+               "with size %d at src offset %d and dest offset %d",
+               bytes, s_off, d_off);
+       /* Calculate the expected zero spans. */
+       if (s_off < d_off) {
+               left_zero_pos = 0;
+               left_zero_size = s_off;
+               right_zero_pos = d_off + bytes;
+               right_zero_size = ARRAY_SIZE(large_dst) - right_zero_pos;
+               src_pos = s_off;
+               src_orig_pos = 0;
+               src_size = d_off - s_off;
+       } else {
+               left_zero_pos = 0;
+               left_zero_size = d_off;
+               right_zero_pos = s_off + bytes;
+               right_zero_size = ARRAY_SIZE(large_dst) - right_zero_pos;
+               src_pos = d_off + bytes;
+               src_orig_pos = src_pos - s_off;
+               src_size = right_zero_pos - src_pos;
+       }
+       /* Check non-overlapping source is unchanged.*/
+       KUNIT_ASSERT_EQ_MSG(test,
+               memcmp(&large_dst[src_pos], &large_src[src_orig_pos], src_size), 0,
+               "with size %d at src offset %d and dest offset %d",
+               bytes, s_off, d_off);
+       /* Check leading buffer contents are zero. */
+       KUNIT_ASSERT_EQ_MSG(test,
+               memcmp(&large_dst[left_zero_pos], large_zero, left_zero_size), 0,
+               "with size %d at src offset %d and dest offset %d",
+               bytes, s_off, d_off);
+       /* Check trailing buffer contents are zero. */
+       KUNIT_ASSERT_EQ_MSG(test,
+               memcmp(&large_dst[right_zero_pos], large_zero, right_zero_size), 0,
+               "with size %d at src offset %d and dest offset %d",
+               bytes, s_off, d_off);
+       /* Zero out everything not already zeroed.*/
+       pos = left_zero_pos + left_zero_size;
+       memset(&large_dst[pos], 0, right_zero_pos - pos);
+ }
+ static void memmove_overlap_test(struct kunit *test)
+ {
+       /*
+        * Running all possible offset and overlap combinations takes a
+        * very long time. Instead, only check up to 128 bytes offset
+        * into the destination buffer (which should result in crossing
+        * cachelines), with a step size of 1 through 7 to try to skip some
+        * redundancy.
+        */
+       static const int offset_max = 128; /* less than ARRAY_SIZE(large_src); */
+       static const int bytes_step = 7;
+       static const int window_step = 7;
+       static const int bytes_start = 1;
+       static const int bytes_end = ARRAY_SIZE(large_src) + 1;
+       init_large(test);
+       /* Copy a growing number of overlapping bytes ... */
+       for (int bytes = bytes_start; bytes < bytes_end;
+            bytes = next_step(bytes, bytes_start, bytes_end, bytes_step)) {
+               /* Over a shifting destination window ... */
+               for (int d_off = 0; d_off < offset_max; d_off++) {
+                       int s_start = max(d_off - bytes, 0);
+                       int s_end = min_t(int, d_off + bytes, ARRAY_SIZE(large_src));
+                       /* Over a shifting source window ... */
+                       for (int s_off = s_start; s_off < s_end;
+                            s_off = next_step(s_off, s_start, s_end, window_step))
+                               inner_loop(test, bytes, d_off, s_off);
+                       /* Avoid stall warnings. */
+                       cond_resched();
+               }
+       }
+ }
  static void strtomem_test(struct kunit *test)
  {
        static const char input[sizeof(unsigned long)] = "hi";
  static struct kunit_case memcpy_test_cases[] = {
        KUNIT_CASE(memset_test),
        KUNIT_CASE(memcpy_test),
+       KUNIT_CASE(memcpy_large_test),
        KUNIT_CASE(memmove_test),
+       KUNIT_CASE(memmove_large_test),
+       KUNIT_CASE(memmove_overlap_test),
        KUNIT_CASE(strtomem_test),
        {}
  };
diff --combined mm/kasan/kasan_test.c
@@@ -5,12 -5,8 +5,12 @@@
   * Author: Andrey Ryabinin <a.ryabinin@samsung.com>
   */
  
 +#define pr_fmt(fmt) "kasan_test: " fmt
 +
 +#include <kunit/test.h>
  #include <linux/bitops.h>
  #include <linux/delay.h>
 +#include <linux/io.h>
  #include <linux/kasan.h>
  #include <linux/kernel.h>
  #include <linux/mm.h>
  #include <linux/module.h>
  #include <linux/printk.h>
  #include <linux/random.h>
 +#include <linux/set_memory.h>
  #include <linux/slab.h>
  #include <linux/string.h>
 +#include <linux/tracepoint.h>
  #include <linux/uaccess.h>
 -#include <linux/io.h>
  #include <linux/vmalloc.h>
 -#include <linux/set_memory.h>
 +#include <trace/events/printk.h>
  
  #include <asm/page.h>
  
 -#include <kunit/test.h>
 -
  #include "kasan.h"
  
  #define OOB_TAG_OFF (IS_ENABLED(CONFIG_KASAN_GENERIC) ? 0 : KASAN_GRANULE_SIZE)
  
 +static bool multishot;
 +
 +/* Fields set based on lines observed in the console. */
 +static struct {
 +      bool report_found;
 +      bool async_fault;
 +} test_status;
 +
  /*
   * Some tests use these global variables to store return values from function
   * calls that could otherwise be eliminated by the compiler as dead code.
  void *kasan_ptr_result;
  int kasan_int_result;
  
 -static struct kunit_resource resource;
 -static struct kunit_kasan_status test_status;
 -static bool multishot;
 +/* Probe for console output: obtains test_status lines of interest. */
 +static void probe_console(void *ignore, const char *buf, size_t len)
 +{
 +      if (strnstr(buf, "BUG: KASAN: ", len))
 +              WRITE_ONCE(test_status.report_found, true);
 +      else if (strnstr(buf, "Asynchronous fault: ", len))
 +              WRITE_ONCE(test_status.async_fault, true);
 +}
  
 -/*
 - * Temporarily enable multi-shot mode. Otherwise, KASAN would only report the
 - * first detected bug and panic the kernel if panic_on_warn is enabled. For
 - * hardware tag-based KASAN also allow tag checking to be reenabled for each
 - * test, see the comment for KUNIT_EXPECT_KASAN_FAIL().
 - */
 -static int kasan_test_init(struct kunit *test)
 +static void register_tracepoints(struct tracepoint *tp, void *ignore)
 +{
 +      check_trace_callback_type_console(probe_console);
 +      if (!strcmp(tp->name, "console"))
 +              WARN_ON(tracepoint_probe_register(tp, probe_console, NULL));
 +}
 +
 +static void unregister_tracepoints(struct tracepoint *tp, void *ignore)
 +{
 +      if (!strcmp(tp->name, "console"))
 +              tracepoint_probe_unregister(tp, probe_console, NULL);
 +}
 +
 +static int kasan_suite_init(struct kunit_suite *suite)
  {
        if (!kasan_enabled()) {
 -              kunit_err(test, "can't run KASAN tests with KASAN disabled");
 +              pr_err("Can't run KASAN tests with KASAN disabled");
                return -1;
        }
  
 +      /* Stop failing KUnit tests on KASAN reports. */
 +      kasan_kunit_test_suite_start();
 +
 +      /*
 +       * Temporarily enable multi-shot mode. Otherwise, KASAN would only
 +       * report the first detected bug and panic the kernel if panic_on_warn
 +       * is enabled.
 +       */
        multishot = kasan_save_enable_multi_shot();
 -      test_status.report_found = false;
 -      test_status.sync_fault = false;
 -      kunit_add_named_resource(test, NULL, NULL, &resource,
 -                                      "kasan_status", &test_status);
 +
 +      /*
 +       * Because we want to be able to build the test as a module, we need to
 +       * iterate through all known tracepoints, since the static registration
 +       * won't work here.
 +       */
 +      for_each_kernel_tracepoint(register_tracepoints, NULL);
        return 0;
  }
  
 -static void kasan_test_exit(struct kunit *test)
 +static void kasan_suite_exit(struct kunit_suite *suite)
  {
 +      kasan_kunit_test_suite_end();
        kasan_restore_multi_shot(multishot);
 -      KUNIT_EXPECT_FALSE(test, test_status.report_found);
 +      for_each_kernel_tracepoint(unregister_tracepoints, NULL);
 +      tracepoint_synchronize_unregister();
 +}
 +
 +static void kasan_test_exit(struct kunit *test)
 +{
 +      KUNIT_EXPECT_FALSE(test, READ_ONCE(test_status.report_found));
  }
  
  /**
        if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) &&                         \
            kasan_sync_fault_possible()) {                              \
                if (READ_ONCE(test_status.report_found) &&              \
 -                  READ_ONCE(test_status.sync_fault))                  \
 +                  !READ_ONCE(test_status.async_fault))                \
                        kasan_enable_tagging();                         \
                migrate_enable();                                       \
        }                                                               \
        WRITE_ONCE(test_status.report_found, false);                    \
 +      WRITE_ONCE(test_status.async_fault, false);                     \
  } while (0)
  
  #define KASAN_TEST_NEEDS_CONFIG_ON(test, config) do {                 \
@@@ -825,23 -783,30 +825,30 @@@ static void kasan_global_oob_left(struc
        KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);
  }
  
- /* Check that ksize() makes the whole object accessible. */
+ /* Check that ksize() does NOT unpoison whole object. */
  static void ksize_unpoisons_memory(struct kunit *test)
  {
        char *ptr;
-       size_t size = 123, real_size;
+       size_t size = 128 - KASAN_GRANULE_SIZE - 5;
+       size_t real_size;
  
        ptr = kmalloc(size, GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
        real_size = ksize(ptr);
+       KUNIT_EXPECT_GT(test, real_size, size);
  
        OPTIMIZER_HIDE_VAR(ptr);
  
-       /* This access shouldn't trigger a KASAN report. */
-       ptr[size] = 'x';
+       /* These accesses shouldn't trigger a KASAN report. */
+       ptr[0] = 'x';
+       ptr[size - 1] = 'x';
  
-       /* This one must. */
-       KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[real_size]);
+       /* These must trigger a KASAN report. */
+       if (IS_ENABLED(CONFIG_KASAN_GENERIC))
+               KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[size]);
+       KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[size + 5]);
+       KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[real_size - 1]);
  
        kfree(ptr);
  }
@@@ -1145,67 -1110,6 +1152,67 @@@ static void kmalloc_double_kzfree(struc
        KUNIT_EXPECT_KASAN_FAIL(test, kfree_sensitive(ptr));
  }
  
 +/*
 + * The two tests below check that Generic KASAN prints auxiliary stack traces
 + * for RCU callbacks and workqueues. The reports need to be inspected manually.
 + *
 + * These tests are still enabled for other KASAN modes to make sure that all
 + * modes report bad accesses in tested scenarios.
 + */
 +
 +static struct kasan_rcu_info {
 +      int i;
 +      struct rcu_head rcu;
 +} *global_rcu_ptr;
 +
 +static void rcu_uaf_reclaim(struct rcu_head *rp)
 +{
 +      struct kasan_rcu_info *fp =
 +              container_of(rp, struct kasan_rcu_info, rcu);
 +
 +      kfree(fp);
 +      ((volatile struct kasan_rcu_info *)fp)->i;
 +}
 +
 +static void rcu_uaf(struct kunit *test)
 +{
 +      struct kasan_rcu_info *ptr;
 +
 +      ptr = kmalloc(sizeof(struct kasan_rcu_info), GFP_KERNEL);
 +      KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
 +
 +      global_rcu_ptr = rcu_dereference_protected(
 +                              (struct kasan_rcu_info __rcu *)ptr, NULL);
 +
 +      KUNIT_EXPECT_KASAN_FAIL(test,
 +              call_rcu(&global_rcu_ptr->rcu, rcu_uaf_reclaim);
 +              rcu_barrier());
 +}
 +
 +static void workqueue_uaf_work(struct work_struct *work)
 +{
 +      kfree(work);
 +}
 +
 +static void workqueue_uaf(struct kunit *test)
 +{
 +      struct workqueue_struct *workqueue;
 +      struct work_struct *work;
 +
 +      workqueue = create_workqueue("kasan_workqueue_test");
 +      KUNIT_ASSERT_NOT_ERR_OR_NULL(test, workqueue);
 +
 +      work = kmalloc(sizeof(struct work_struct), GFP_KERNEL);
 +      KUNIT_ASSERT_NOT_ERR_OR_NULL(test, work);
 +
 +      INIT_WORK(work, workqueue_uaf_work);
 +      queue_work(workqueue, work);
 +      destroy_workqueue(workqueue);
 +
 +      KUNIT_EXPECT_KASAN_FAIL(test,
 +              ((volatile struct work_struct *)work)->data);
 +}
 +
  static void vmalloc_helpers_tags(struct kunit *test)
  {
        void *ptr;
@@@ -1402,7 -1306,7 +1409,7 @@@ static void match_all_not_assigned(stru
        KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
  
        for (i = 0; i < 256; i++) {
 -              size = prandom_u32_max(1024) + 1;
 +              size = get_random_u32_inclusive(1, 1024);
                ptr = kmalloc(size, GFP_KERNEL);
                KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
                KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
        }
  
        for (i = 0; i < 256; i++) {
 -              order = prandom_u32_max(4) + 1;
 +              order = get_random_u32_inclusive(1, 4);
                pages = alloc_pages(GFP_KERNEL, order);
                ptr = page_address(pages);
                KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
                return;
  
        for (i = 0; i < 256; i++) {
 -              size = prandom_u32_max(1024) + 1;
 +              size = get_random_u32_inclusive(1, 1024);
                ptr = vmalloc(size);
                KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
                KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
@@@ -1537,8 -1441,6 +1544,8 @@@ static struct kunit_case kasan_kunit_te
        KUNIT_CASE(kasan_bitops_generic),
        KUNIT_CASE(kasan_bitops_tags),
        KUNIT_CASE(kmalloc_double_kzfree),
 +      KUNIT_CASE(rcu_uaf),
 +      KUNIT_CASE(workqueue_uaf),
        KUNIT_CASE(vmalloc_helpers_tags),
        KUNIT_CASE(vmalloc_oob),
        KUNIT_CASE(vmap_tags),
  
  static struct kunit_suite kasan_kunit_test_suite = {
        .name = "kasan",
 -      .init = kasan_test_init,
        .test_cases = kasan_kunit_test_cases,
        .exit = kasan_test_exit,
 +      .suite_init = kasan_suite_init,
 +      .suite_exit = kasan_suite_exit,
  };
  
  kunit_test_suite(kasan_kunit_test_suite);
diff --combined mm/kasan/report.c
@@@ -9,7 -9,6 +9,7 @@@
   *        Andrey Konovalov <andreyknvl@gmail.com>
   */
  
 +#include <kunit/test.h>
  #include <linux/bitops.h>
  #include <linux/ftrace.h>
  #include <linux/init.h>
@@@ -31,6 -30,8 +31,6 @@@
  
  #include <asm/sections.h>
  
 -#include <kunit/test.h>
 -
  #include "kasan.h"
  #include "../slab.h"
  
@@@ -114,63 -115,40 +114,63 @@@ EXPORT_SYMBOL_GPL(kasan_restore_multi_s
  #endif
  
  #if IS_ENABLED(CONFIG_KASAN_KUNIT_TEST)
 -static void update_kunit_status(bool sync)
 +
 +/*
 + * Whether the KASAN KUnit test suite is currently being executed.
 + * Updated in kasan_test.c.
 + */
 +bool kasan_kunit_executing;
 +
 +void kasan_kunit_test_suite_start(void)
 +{
 +      WRITE_ONCE(kasan_kunit_executing, true);
 +}
 +EXPORT_SYMBOL_GPL(kasan_kunit_test_suite_start);
 +
 +void kasan_kunit_test_suite_end(void)
 +{
 +      WRITE_ONCE(kasan_kunit_executing, false);
 +}
 +EXPORT_SYMBOL_GPL(kasan_kunit_test_suite_end);
 +
 +static bool kasan_kunit_test_suite_executing(void)
 +{
 +      return READ_ONCE(kasan_kunit_executing);
 +}
 +
 +#else /* CONFIG_KASAN_KUNIT_TEST */
 +
 +static inline bool kasan_kunit_test_suite_executing(void) { return false; }
 +
 +#endif /* CONFIG_KASAN_KUNIT_TEST */
 +
 +#if IS_ENABLED(CONFIG_KUNIT)
 +
 +static void fail_non_kasan_kunit_test(void)
  {
        struct kunit *test;
 -      struct kunit_resource *resource;
 -      struct kunit_kasan_status *status;
  
 -      test = current->kunit_test;
 -      if (!test)
 +      if (kasan_kunit_test_suite_executing())
                return;
  
 -      resource = kunit_find_named_resource(test, "kasan_status");
 -      if (!resource) {
 +      test = current->kunit_test;
 +      if (test)
                kunit_set_failure(test);
 -              return;
 -      }
 +}
  
 -      status = (struct kunit_kasan_status *)resource->data;
 -      WRITE_ONCE(status->report_found, true);
 -      WRITE_ONCE(status->sync_fault, sync);
 +#else /* CONFIG_KUNIT */
  
 -      kunit_put_resource(resource);
 -}
 -#else
 -static void update_kunit_status(bool sync) { }
 -#endif
 +static inline void fail_non_kasan_kunit_test(void) { }
 +
 +#endif /* CONFIG_KUNIT */
  
  static DEFINE_SPINLOCK(report_lock);
  
  static void start_report(unsigned long *flags, bool sync)
  {
 +      fail_non_kasan_kunit_test();
        /* Respect the /proc/sys/kernel/traceoff_on_warning interface. */
        disable_trace_on_warning();
 -      /* Update status of the currently running KASAN test. */
 -      update_kunit_status(sync);
        /* Do not allow LOCKDEP mangling KASAN reports. */
        lockdep_off();
        /* Make sure we don't end up in loop. */
@@@ -186,8 -164,8 +186,8 @@@ static void end_report(unsigned long *f
                                       (unsigned long)addr);
        pr_err("==================================================================\n");
        spin_unlock_irqrestore(&report_lock, *flags);
-       if (panic_on_warn && !test_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags))
-               panic("panic_on_warn set ...\n");
+       if (!test_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags))
+               check_panic_on_warn("KASAN");
        if (kasan_arg_fault == KASAN_ARG_FAULT_PANIC)
                panic("kasan.fault=panic set ...\n");
        add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
diff --combined mm/kfence/report.c
@@@ -75,23 -75,18 +75,23 @@@ static int get_stack_skipnr(const unsig
  
                if (str_has_prefix(buf, ARCH_FUNC_PREFIX "kfence_") ||
                    str_has_prefix(buf, ARCH_FUNC_PREFIX "__kfence_") ||
 +                  str_has_prefix(buf, ARCH_FUNC_PREFIX "__kmem_cache_free") ||
                    !strncmp(buf, ARCH_FUNC_PREFIX "__slab_free", len)) {
                        /*
 -                       * In case of tail calls from any of the below
 -                       * to any of the above.
 +                       * In case of tail calls from any of the below to any of
 +                       * the above, optimized by the compiler such that the
 +                       * stack trace would omit the initial entry point below.
                         */
                        fallback = skipnr + 1;
                }
  
 -              /* Also the *_bulk() variants by only checking prefixes. */
 +              /*
 +               * The below list should only include the initial entry points
 +               * into the slab allocators. Includes the *_bulk() variants by
 +               * checking prefixes.
 +               */
                if (str_has_prefix(buf, ARCH_FUNC_PREFIX "kfree") ||
                    str_has_prefix(buf, ARCH_FUNC_PREFIX "kmem_cache_free") ||
 -                  str_has_prefix(buf, ARCH_FUNC_PREFIX "__kmem_cache_free") ||
                    str_has_prefix(buf, ARCH_FUNC_PREFIX "__kmalloc") ||
                    str_has_prefix(buf, ARCH_FUNC_PREFIX "kmem_cache_alloc"))
                        goto found;
@@@ -273,8 -268,7 +273,7 @@@ void kfence_report_error(unsigned long 
  
        lockdep_on();
  
-       if (panic_on_warn)
-               panic("panic_on_warn set ...\n");
+       check_panic_on_warn("KFENCE");
  
        /* We encountered a memory safety error, taint the kernel! */
        add_taint(TAINT_BAD_PAGE, LOCKDEP_STILL_OK);
diff --combined mm/slab_common.c
@@@ -143,10 -143,8 +143,10 @@@ int slab_unmergeable(struct kmem_cache 
        if (s->ctor)
                return 1;
  
 +#ifdef CONFIG_HARDENED_USERCOPY
        if (s->usersize)
                return 1;
 +#endif
  
        /*
         * We may have set a slab to be unmergeable during bootstrap.
@@@ -225,10 -223,8 +225,10 @@@ static struct kmem_cache *create_cache(
        s->size = s->object_size = object_size;
        s->align = align;
        s->ctor = ctor;
 +#ifdef CONFIG_HARDENED_USERCOPY
        s->useroffset = useroffset;
        s->usersize = usersize;
 +#endif
  
        err = __kmem_cache_create(s, flags);
        if (err)
@@@ -321,8 -317,7 +321,8 @@@ kmem_cache_create_usercopy(const char *
        flags &= CACHE_CREATE_MASK;
  
        /* Fail closed on bad usersize of useroffset values. */
 -      if (WARN_ON(!usersize && useroffset) ||
 +      if (!IS_ENABLED(CONFIG_HARDENED_USERCOPY) ||
 +          WARN_ON(!usersize && useroffset) ||
            WARN_ON(size < usersize || size - usersize < useroffset))
                usersize = useroffset = 0;
  
@@@ -600,8 -595,8 +600,8 @@@ void kmem_dump_obj(void *object
                ptroffset = ((char *)object - (char *)kp.kp_objp) - kp.kp_data_offset;
                pr_cont(" pointer offset %lu", ptroffset);
        }
 -      if (kp.kp_slab_cache && kp.kp_slab_cache->usersize)
 -              pr_cont(" size %u", kp.kp_slab_cache->usersize);
 +      if (kp.kp_slab_cache && kp.kp_slab_cache->object_size)
 +              pr_cont(" size %u", kp.kp_slab_cache->object_size);
        if (kp.kp_ret)
                pr_cont(" allocated at %pS\n", kp.kp_ret);
        else
@@@ -645,10 -640,8 +645,10 @@@ void __init create_boot_cache(struct km
                align = max(align, size);
        s->align = calculate_alignment(flags, align, size);
  
 +#ifdef CONFIG_HARDENED_USERCOPY
        s->useroffset = useroffset;
        s->usersize = usersize;
 +#endif
  
        err = __kmem_cache_create(s, flags);
  
@@@ -773,16 -766,10 +773,16 @@@ EXPORT_SYMBOL(kmalloc_size_roundup)
  #define KMALLOC_CGROUP_NAME(sz)
  #endif
  
 +#ifndef CONFIG_SLUB_TINY
 +#define KMALLOC_RCL_NAME(sz)  .name[KMALLOC_RECLAIM] = "kmalloc-rcl-" #sz,
 +#else
 +#define KMALLOC_RCL_NAME(sz)
 +#endif
 +
  #define INIT_KMALLOC_INFO(__size, __short_size)                       \
  {                                                             \
        .name[KMALLOC_NORMAL]  = "kmalloc-" #__short_size,      \
 -      .name[KMALLOC_RECLAIM] = "kmalloc-rcl-" #__short_size,  \
 +      KMALLOC_RCL_NAME(__short_size)                          \
        KMALLOC_CGROUP_NAME(__short_size)                       \
        KMALLOC_DMA_NAME(__short_size)                          \
        .size = __size,                                         \
@@@ -868,7 -855,7 +868,7 @@@ void __init setup_kmalloc_cache_index_t
  static void __init
  new_kmalloc_cache(int idx, enum kmalloc_cache_type type, slab_flags_t flags)
  {
 -      if (type == KMALLOC_RECLAIM) {
 +      if ((KMALLOC_RECLAIM != KMALLOC_NORMAL) && (type == KMALLOC_RECLAIM)) {
                flags |= SLAB_RECLAIM_ACCOUNT;
        } else if (IS_ENABLED(CONFIG_MEMCG_KMEM) && (type == KMALLOC_CGROUP)) {
                if (mem_cgroup_kmem_disabled()) {
@@@ -954,7 -941,7 +954,7 @@@ void *__do_kmalloc_node(size_t size, gf
  
        if (unlikely(size > KMALLOC_MAX_CACHE_SIZE)) {
                ret = __kmalloc_large_node(size, flags, node);
 -              trace_kmalloc(_RET_IP_, ret, size,
 +              trace_kmalloc(caller, ret, size,
                              PAGE_SIZE << get_order(size), flags, node);
                return ret;
        }
  
        ret = __kmem_cache_alloc_node(s, flags, node, size, caller);
        ret = kasan_kmalloc(s, ret, size, flags);
 -      trace_kmalloc(_RET_IP_, ret, size, s->size, flags, node);
 +      trace_kmalloc(caller, ret, size, s->size, flags, node);
        return ret;
  }
  
@@@ -1023,7 -1010,7 +1023,7 @@@ EXPORT_SYMBOL(kfree)
  
  /**
   * __ksize -- Report full size of underlying allocation
 - * @objp: pointer to the object
 + * @object: pointer to the object
   *
   * This should only be used internally to query the true size of allocations.
   * It is not meant to be a way to discover the usable size of an allocation
   * the originally requested allocation size may trigger KASAN, UBSAN_BOUNDS,
   * and/or FORTIFY_SOURCE.
   *
 - * Return: size of the actual memory used by @objp in bytes
 + * Return: size of the actual memory used by @object in bytes
   */
  size_t __ksize(const void *object)
  {
                return folio_size(folio);
        }
  
 +#ifdef CONFIG_SLUB_DEBUG
 +      skip_orig_size_check(folio_slab(folio)->slab_cache, object);
 +#endif
 +
        return slab_ksize(folio_slab(folio)->slab_cache);
  }
  
 -#ifdef CONFIG_TRACING
  void *kmalloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size)
  {
        void *ret = __kmem_cache_alloc_node(s, gfpflags, NUMA_NO_NODE,
@@@ -1080,6 -1064,7 +1080,6 @@@ void *kmalloc_node_trace(struct kmem_ca
        return ret;
  }
  EXPORT_SYMBOL(kmalloc_node_trace);
 -#endif /* !CONFIG_TRACING */
  #endif /* !CONFIG_SLOB */
  
  gfp_t kmalloc_fix_flags(gfp_t flags)
@@@ -1348,11 -1333,11 +1348,11 @@@ __do_krealloc(const void *p, size_t new
        void *ret;
        size_t ks;
  
-       /* Don't use instrumented ksize to allow precise KASAN poisoning. */
+       /* Check for double-free before calling ksize. */
        if (likely(!ZERO_OR_NULL_PTR(p))) {
                if (!kasan_check_byte(p))
                        return NULL;
-               ks = kfence_ksize(p) ?: __ksize(p);
+               ks = ksize(p);
        } else
                ks = 0;
  
@@@ -1420,21 -1405,35 +1420,21 @@@ void kfree_sensitive(const void *p
        void *mem = (void *)p;
  
        ks = ksize(mem);
-       if (ks)
+       if (ks) {
+               kasan_unpoison_range(mem, ks);
                memzero_explicit(mem, ks);
+       }
        kfree(mem);
  }
  EXPORT_SYMBOL(kfree_sensitive);
  
 -/**
 - * ksize - get the actual amount of memory allocated for a given object
 - * @objp: Pointer to the object
 - *
 - * kmalloc may internally round up allocations and return more memory
 - * than requested. ksize() can be used to determine the actual amount of
 - * memory allocated. The caller may use this additional memory, even though
 - * a smaller amount of memory was initially specified with the kmalloc call.
 - * The caller must guarantee that objp points to a valid object previously
 - * allocated with either kmalloc() or kmem_cache_alloc(). The object
 - * must not be freed during the duration of the call.
 - *
 - * Return: size of the actual memory used by @objp in bytes
 - */
  size_t ksize(const void *objp)
  {
-       size_t size;
        /*
-        * We need to first check that the pointer to the object is valid, and
-        * only then unpoison the memory. The report printed from ksize() is
-        * more useful, then when it's printed later when the behaviour could
-        * be undefined due to a potential use-after-free or double-free.
+        * We need to first check that the pointer to the object is valid.
+        * The KASAN report printed from ksize() is more useful, then when
+        * it's printed later when the behaviour could be undefined due to
+        * a potential use-after-free or double-free.
         *
         * We use kasan_check_byte(), which is supported for the hardware
         * tag-based KASAN mode, unlike kasan_check_read/write().
        if (unlikely(ZERO_OR_NULL_PTR(objp)) || !kasan_check_byte(objp))
                return 0;
  
-       size = kfence_ksize(objp) ?: __ksize(objp);
-       /*
-        * We assume that ksize callers could use whole allocated area,
-        * so we need to unpoison this area.
-        */
-       kasan_unpoison_range(objp, size);
-       return size;
+       return kfence_ksize(objp) ?: __ksize(objp);
  }
  EXPORT_SYMBOL(ksize);
  
diff --combined scripts/kernel-doc
@@@ -256,7 -256,6 +256,7 @@@ my $doc_inline_sect = '\s*\*\s*(@\s*[\w
  my $doc_inline_end = '^\s*\*/\s*$';
  my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
  my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
 +my $export_symbol_ns = '^\s*EXPORT_SYMBOL_NS(_GPL)?\s*\(\s*(\w+)\s*,\s*\w+\)\s*;';
  my $function_pointer = qr{([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)};
  my $attribute = qr{__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)}i;
  
@@@ -867,53 -866,48 +867,53 @@@ sub output_function_rst(%) 
        print "\n";
      }
  
 -    print "**Parameters**\n\n";
 +    #
 +    # Put our descriptive text into a container (thus an HTML <div>) to help
 +    # set the function prototypes apart.
 +    #
 +    print ".. container:: kernelindent\n\n";
      $lineprefix = "  ";
 +    print $lineprefix . "**Parameters**\n\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
        my $parameter_name = $parameter;
        $parameter_name =~ s/\[.*//;
        $type = $args{'parametertypes'}{$parameter};
  
        if ($type ne "") {
 -          print "``$type``\n";
 +          print $lineprefix . "``$type``\n";
        } else {
 -          print "``$parameter``\n";
 +          print $lineprefix . "``$parameter``\n";
        }
  
          print_lineno($parameterdesc_start_lines{$parameter_name});
  
 +      $lineprefix = "    ";
        if (defined($args{'parameterdescs'}{$parameter_name}) &&
            $args{'parameterdescs'}{$parameter_name} ne $undescribed) {
            output_highlight_rst($args{'parameterdescs'}{$parameter_name});
        } else {
 -          print "  *undescribed*\n";
 +          print $lineprefix . "*undescribed*\n";
        }
 +      $lineprefix = "  ";
        print "\n";
      }
  
 -    $lineprefix = $oldprefix;
      output_section_rst(@_);
 +    $lineprefix = $oldprefix;
  }
  
  sub output_section_rst(%) {
      my %args = %{$_[0]};
      my $section;
      my $oldprefix = $lineprefix;
 -    $lineprefix = "";
  
      foreach $section (@{$args{'sectionlist'}}) {
 -      print "**$section**\n\n";
 +      print $lineprefix . "**$section**\n\n";
          print_lineno($section_start_lines{$section});
        output_highlight_rst($args{'sections'}{$section});
        print "\n";
      }
      print "\n";
 -    $lineprefix = $oldprefix;
  }
  
  sub output_enum_rst(%) {
      my ($parameter);
      my $oldprefix = $lineprefix;
      my $count;
 +    my $outer;
  
      if ($sphinx_major < 3) {
        my $name = "enum " . $args{'enum'};
        print "\n\n.. c:enum:: " . $name . "\n\n";
      }
      print_lineno($declaration_start_line);
 -    $lineprefix = "   ";
 +    $lineprefix = "  ";
      output_highlight_rst($args{'purpose'});
      print "\n";
  
 -    print "**Constants**\n\n";
 -    $lineprefix = "  ";
 +    print ".. container:: kernelindent\n\n";
 +    $outer = $lineprefix . "  ";
 +    $lineprefix = $outer . "  ";
 +    print $outer . "**Constants**\n\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
 -      print "``$parameter``\n";
 +      print $outer . "``$parameter``\n";
 +
        if ($args{'parameterdescs'}{$parameter} ne $undescribed) {
            output_highlight_rst($args{'parameterdescs'}{$parameter});
        } else {
 -          print "  *undescribed*\n";
 +          print $lineprefix . "*undescribed*\n";
        }
        print "\n";
      }
 -
 +    print "\n";
      $lineprefix = $oldprefix;
      output_section_rst(@_);
  }
@@@ -992,19 -982,18 +992,19 @@@ sub output_struct_rst(%) 
        }
      }
      print_lineno($declaration_start_line);
 -    $lineprefix = "   ";
 +    $lineprefix = "  ";
      output_highlight_rst($args{'purpose'});
      print "\n";
  
 -    print "**Definition**\n\n";
 -    print "::\n\n";
 +    print ".. container:: kernelindent\n\n";
 +    print $lineprefix . "**Definition**::\n\n";
      my $declaration = $args{'definition'};
 -    $declaration =~ s/\t/  /g;
 -    print "  " . $args{'type'} . " " . $args{'struct'} . " {\n$declaration  };\n\n";
 +    $lineprefix = $lineprefix . "  ";
 +    $declaration =~ s/\t/$lineprefix/g;
 +    print $lineprefix . $args{'type'} . " " . $args{'struct'} . " {\n$declaration" . $lineprefix . "};\n\n";
  
 -    print "**Members**\n\n";
      $lineprefix = "  ";
 +    print $lineprefix . "**Members**\n\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
        ($parameter =~ /^#/) && next;
  
        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
        $type = $args{'parametertypes'}{$parameter};
          print_lineno($parameterdesc_start_lines{$parameter_name});
 -      print "``" . $parameter . "``\n";
 +      print $lineprefix . "``" . $parameter . "``\n";
 +      $lineprefix = "    ";
        output_highlight_rst($args{'parameterdescs'}{$parameter_name});
 +      $lineprefix = "  ";
        print "\n";
      }
      print "\n";
@@@ -1461,6 -1448,8 +1461,8 @@@ sub create_parameterlist($$$$) 
      foreach my $arg (split($splitter, $args)) {
        # strip comments
        $arg =~ s/\/\*.*\*\///;
+       # ignore argument attributes
+       $arg =~ s/\sPOS0?\s/ /;
        # strip leading/trailing spaces
        $arg =~ s/^\s*//;
        $arg =~ s/\s*$//;
@@@ -1670,6 -1659,7 +1672,7 @@@ sub dump_function($$) 
      $prototype =~ s/^__inline +//;
      $prototype =~ s/^__always_inline +//;
      $prototype =~ s/^noinline +//;
+     $prototype =~ s/^__FORTIFY_INLINE +//;
      $prototype =~ s/__init +//;
      $prototype =~ s/__init_or_module +//;
      $prototype =~ s/__deprecated +//;
      $prototype =~ s/__weak +//;
      $prototype =~ s/__sched +//;
      $prototype =~ s/__printf\s*\(\s*\d*\s*,\s*\d*\s*\) +//;
-     $prototype =~ s/__alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\) +//;
+     $prototype =~ s/__(?:re)?alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\) +//;
+     $prototype =~ s/__diagnose_as\s*\(\s*\S+\s*(?:,\s*\d+\s*)*\) +//;
      my $define = $prototype =~ s/^#\s*define\s+//; #ak added
      $prototype =~ s/__attribute_const__ +//;
      $prototype =~ s/__attribute__\s*\(\(
@@@ -1961,10 -1952,6 +1965,10 @@@ sub process_export_file($) 
            next if (defined($nosymbol_table{$2}));
            $function_table{$2} = 1;
        }
 +      if (/$export_symbol_ns/) {
 +          next if (defined($nosymbol_table{$2}));
 +          $function_table{$2} = 1;
 +      }
      }
  
      close(IN);
@@@ -2436,12 -2423,12 +2440,12 @@@ found on PATH
  =item -export
  
  Only output documentation for the symbols that have been exported using
 -EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL() in any input FILE or -export-file FILE.
 +EXPORT_SYMBOL() and related macros in any input FILE or -export-file FILE.
  
  =item -internal
  
  Only output documentation for the symbols that have NOT been exported using
 -EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL() in any input FILE or -export-file FILE.
 +EXPORT_SYMBOL() and related macros in any input FILE or -export-file FILE.
  
  =item -function NAME
  
@@@ -2468,7 -2455,8 +2472,7 @@@ Do not output DOC: sections
  
  =item -export-file FILE
  
 -Specify an additional FILE in which to look for EXPORT_SYMBOL() and
 -EXPORT_SYMBOL_GPL().
 +Specify an additional FILE in which to look for EXPORT_SYMBOL information.
  
  To be used with -export or -internal.