The following commit has been merged in the master branch:
commit bdbfcfc7415e5dbf990e1780a2906d208a8accb2
Merge: a88f9dd95d34a9b946913a135d9a55fd1506a5e6 
0b28182c73a3d013bcabbb890dc1070a8388f55a
Author: Stephen Rothwell <[email protected]>
Date:   Mon May 12 12:32:12 2025 +1000

    Merge branch 'main' of 
git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
    
    # Conflicts:
    #       MAINTAINERS

diff --combined MAINTAINERS
index b7addb6f1798c,890699d937b68..df1ff57a4fbd9
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@@ -528,7 -528,6 +528,7 @@@ ADP1653 FLASH CONTROLLER DRIVE
  M:    Sakari Ailus <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/adi,adp1653.txt
  F:    drivers/media/i2c/adp1653.c
  F:    include/media/i2c/adp1653.h
  
@@@ -1254,31 -1253,6 +1254,31 @@@ F:    Documentation/devicetree/bindings/pe
  F:    drivers/perf/amlogic/
  F:    include/soc/amlogic/
  
 +AMLOGIC ISP DRIVER
 +M:    Keke Li <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/admin-guide/media/c3-isp.dot
 +F:    Documentation/admin-guide/media/c3-isp.rst
 +F:    Documentation/devicetree/bindings/media/amlogic,c3-isp.yaml
 +F:    Documentation/userspace-api/media/v4l/metafmt-c3-isp.rst
 +F:    drivers/media/platform/amlogic/c3/isp/
 +F:    include/uapi/linux/media/amlogic/
 +
 +AMLOGIC MIPI ADAPTER DRIVER
 +M:    Keke Li <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/amlogic,c3-mipi-adapter.yaml
 +F:    drivers/media/platform/amlogic/c3/mipi-adapter/
 +
 +AMLOGIC MIPI CSI2 DRIVER
 +M:    Keke Li <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/amlogic,c3-mipi-csi2.yaml
 +F:    drivers/media/platform/amlogic/c3/mipi-csi2/
 +
  AMLOGIC PINCTRL DRIVER
  M:    Xianwei Zhao <[email protected]>
  L:    [email protected]
@@@ -1613,14 -1587,14 +1613,14 @@@ M:   Lars-Peter Clausen <[email protected]
  L:    [email protected]
  S:    Supported
  W:    https://ez.analog.com/linux-software-drivers
 -F:    Documentation/devicetree/bindings/media/i2c/adv7180.yaml
 +F:    Documentation/devicetree/bindings/media/i2c/adi,adv7180.yaml
  F:    drivers/media/i2c/adv7180.c
  
  ANALOG DEVICES INC ADV748X DRIVER
  M:    Kieran Bingham <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/i2c/adv748x.yaml
 +F:    Documentation/devicetree/bindings/media/i2c/adi,adv748x.yaml
  F:    drivers/media/i2c/adv748x/*
  
  ANALOG DEVICES INC ADV7511 DRIVER
@@@ -1633,7 -1607,7 +1633,7 @@@ ANALOG DEVICES INC ADV7604 DRIVE
  M:    Hans Verkuil <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/i2c/adv7604.yaml
 +F:    Documentation/devicetree/bindings/media/i2c/adi,adv7604.yaml
  F:    drivers/media/i2c/adv7604*
  
  ANALOG DEVICES INC ADV7842 DRIVER
@@@ -3090,10 -3064,10 +3090,10 @@@ F:   arch/arm/include/debug/renesas-scif.
  F:    arch/arm/mach-shmobile/
  F:    arch/arm64/boot/dts/renesas/
  F:    arch/riscv/boot/dts/renesas/
 -F:    drivers/nvmem/rcar-efuse.c
  F:    drivers/pmdomain/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
 +N:    rcar
  K:    \brenesas,
  
  ARM/RISCPC ARCHITECTURE
@@@ -3460,7 -3434,7 +3460,7 @@@ M:      Alexey Charkov <[email protected]
  M:    Krzysztof Kozlowski <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Odd Fixes
 -F:    Documentation/devicetree/bindings/i2c/i2c-wmt.txt
 +F:    Documentation/devicetree/bindings/i2c/wm,wm8505-i2c.yaml
  F:    arch/arm/boot/dts/vt8500/
  F:    arch/arm/mach-vt8500/
  F:    drivers/clocksource/timer-vt8500.c
@@@ -5917,8 -5891,6 +5917,8 @@@ F:      include/dt-bindings/clock
  F:    include/linux/clk-pr*
  F:    include/linux/clk/
  F:    include/linux/of_clk.h
 +F:    rust/helpers/clk.c
 +F:    rust/kernel/clk.rs
  X:    drivers/clk/clkdev.c
  
  COMMON INTERNET FILE SYSTEM CLIENT (CIFS and SMB3)
@@@ -6176,7 -6148,6 +6176,7 @@@ F:      drivers/cpufreq
  F:    include/linux/cpufreq.h
  F:    include/linux/sched/cpufreq.h
  F:    kernel/sched/cpufreq*.c
 +F:    rust/kernel/cpufreq.rs
  F:    tools/testing/selftests/cpufreq/
  
  CPU HOTPLUG
@@@ -6190,7 -6161,6 +6190,7 @@@ F:      include/linux/cpuhotplug.
  F:    include/linux/smpboot.h
  F:    kernel/cpu.c
  F:    kernel/smpboot.*
 +F:    rust/kernel/cpu.rs
  
  CPU IDLE TIME MANAGEMENT FRAMEWORK
  M:    "Rafael J. Wysocki" <[email protected]>
@@@ -6275,12 -6245,6 +6275,12 @@@ L:    [email protected]
  S:    Maintained
  F:    drivers/cpuidle/cpuidle-riscv-sbi.c
  
 +CPUMASK API [RUST]
 +M:    Viresh Kumar <[email protected]>
 +R:    Yury Norov <[email protected]>
 +S:    Maintained
 +F:    rust/kernel/cpumask.rs
 +
  CRAMFS FILESYSTEM
  M:    Nicolas Pitre <[email protected]>
  S:    Maintained
@@@ -6591,15 -6555,6 +6591,6 @@@ S:     Maintaine
  F:    Documentation/scsi/dc395x.rst
  F:    drivers/scsi/dc395x.*
  
- DCCP PROTOCOL
- L:    [email protected]
- S:    Orphan
- W:    http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp
- F:    include/linux/dccp.h
- F:    include/linux/tfrc.h
- F:    include/uapi/linux/dccp.h
- F:    net/dccp/
- 
  DEBUGOBJECTS:
  M:    Thomas Gleixner <[email protected]>
  L:    [email protected]
@@@ -8876,7 -8831,6 +8867,7 @@@ F:      include/linux/elf.
  F:    include/uapi/linux/auxvec.h
  F:    include/uapi/linux/binfmts.h
  F:    include/uapi/linux/elf.h
 +F:    mm/vma_exec.c
  F:    tools/testing/selftests/exec/
  N:    asm/elf.h
  N:    binfmt
@@@ -9424,6 -9378,7 +9415,7 @@@ F:      Documentation/devicetree/bindings/ne
  F:    drivers/net/ethernet/freescale/enetc/
  F:    include/linux/fsl/enetc_mdio.h
  F:    include/linux/fsl/netc_global.h
+ F:    include/linux/fsl/ntmp.h
  
  FREESCALE eTSEC ETHERNET DRIVER (GIANFAR)
  M:    Claudiu Manoil <[email protected]>
@@@ -10780,7 -10735,6 +10772,7 @@@ W:   http://www.hisilicon.co
  F:    Documentation/admin-guide/perf/hisi-pcie-pmu.rst
  F:    Documentation/admin-guide/perf/hisi-pmu.rst
  F:    drivers/perf/hisilicon
 +F:    tools/perf/pmu-events/arch/arm64/hisilicon/
  
  HISILICON PTT DRIVER
  M:    Yicong Yang <[email protected]>
@@@ -11275,6 -11229,7 +11267,6 @@@ S:   Maintaine
  F:    drivers/i2c/busses/i2c-cht-wc.c
  
  I2C/SMBUS ISMT DRIVER
 -M:    Seth Heasley <[email protected]>
  M:    Neil Horman <[email protected]>
  L:    [email protected]
  F:    Documentation/i2c/busses/i2c-ismt.rst
@@@ -12177,7 -12132,7 +12169,7 @@@ M:   Andy Shevchenko <[email protected]
  L:    [email protected]
  S:    Supported
  F:    arch/x86/include/asm/intel-mid.h
 -F:    arch/x86/pci/intel_mid_pci.c
 +F:    arch/x86/pci/intel_mid.c
  F:    arch/x86/platform/intel-mid/
  F:    drivers/dma/hsu/
  F:    drivers/extcon/extcon-intel-mrfld.c
@@@ -12946,7 -12901,7 +12938,7 @@@ W:   http://kernelnewbies.org/KernelJanit
  KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
  M:    Chuck Lever <[email protected]>
  M:    Jeff Layton <[email protected]>
 -R:    Neil Brown <[email protected]>
 +R:    NeilBrown <[email protected]>
  R:    Olga Kornievskaia <[email protected]>
  R:    Dai Ngo <[email protected]>
  R:    Tom Talpey <[email protected]>
@@@ -13177,17 -13132,6 +13169,17 @@@ F: include/linux/kexec.
  F:    include/uapi/linux/kexec.h
  F:    kernel/kexec*
  
 +KEXEC HANDOVER (KHO)
 +M:    Alexander Graf <[email protected]>
 +M:    Mike Rapoport <[email protected]>
 +M:    Changyuan Lyu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/admin-guide/mm/kho.rst
 +F:    Documentation/core-api/kho/*
 +F:    include/linux/kexec_handover.h
 +F:    kernel/kexec_handover.c
 +
  KEYS-ENCRYPTED
  M:    Mimi Zohar <[email protected]>
  L:    [email protected]
@@@ -14052,15 -13996,6 +14044,15 @@@ L: [email protected]
  S:    Maintained
  F:    drivers/scsi/sym53c8xx_2/
  
 +LT3074 HARDWARE MONITOR DRIVER
 +M:    Cedric Encarnacion <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/hwmon/pmbus/adi,lt3074.yaml
 +F:    Documentation/hwmon/lt3074.rst
 +F:    drivers/hwmon/pmbus/lt3074.c
 +
  LTC1660 DAC DRIVER
  M:    Marcus Folkesson <[email protected]>
  L:    [email protected]
@@@ -14529,7 -14464,7 +14521,7 @@@ M:   Ramesh Shanmugasundaram <rashanmu@gm
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media.git
 -F:    Documentation/devicetree/bindings/media/i2c/max2175.txt
 +F:    Documentation/devicetree/bindings/media/i2c/maxim,max2175.txt
  F:    Documentation/userspace-api/media/drivers/max2175.rst
  F:    drivers/media/i2c/max2175*
  F:    include/uapi/linux/max2175.h
@@@ -14691,6 -14626,7 +14683,6 @@@ F:   Documentation/devicetree/bindings/*/
  F:    Documentation/devicetree/bindings/*/maxim,max77693.yaml
  F:    Documentation/devicetree/bindings/*/maxim,max77705*.yaml
  F:    Documentation/devicetree/bindings/*/maxim,max77843.yaml
 -F:    Documentation/devicetree/bindings/clock/maxim,max77686.txt
  F:    drivers/leds/leds-max77705.c
  F:    drivers/*/*max77843.c
  F:    drivers/*/max14577*.c
@@@ -14855,7 -14791,7 +14847,7 @@@ L:   [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media.git
  F:    Documentation/admin-guide/media/imx.rst
 -F:    Documentation/devicetree/bindings/media/imx.txt
 +F:    Documentation/devicetree/bindings/media/fsl,imx6-mipi-csi2.yaml
  F:    drivers/staging/media/imx/
  F:    include/linux/imx-media.h
  F:    include/media/imx.h
@@@ -14976,7 -14912,7 +14968,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    Documentation/devicetree/bindings/media/renesas,isp.yaml
  F:    Documentation/devicetree/bindings/media/renesas,vin.yaml
  F:    drivers/media/platform/renesas/rcar-csi2.c
 -F:    drivers/media/platform/renesas/rcar-isp.c
 +F:    drivers/media/platform/renesas/rcar-isp/
  F:    drivers/media/platform/renesas/rcar-vin/
  
  MEDIA DRIVERS FOR RENESAS - VSP1
@@@ -15129,7 -15065,7 +15121,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/platform/mediatek/jpeg/
  
  MEDIATEK KEYPAD DRIVER
 -M:    Mattijs Korpershoek <[email protected]>
 +M:    Mattijs Korpershoek <[email protected]>
  S:    Supported
  F:    Documentation/devicetree/bindings/input/mediatek,mt6779-keypad.yaml
  F:    drivers/input/keyboard/mt6779-keypad.c
@@@ -15494,7 -15430,6 +15486,7 @@@ M:   Mike Rapoport <[email protected]
  L:    [email protected]
  S:    Maintained
  F:    Documentation/core-api/boot-time-mm.rst
 +F:    Documentation/core-api/kho/bindings/memblock/*
  F:    include/linux/memblock.h
  F:    mm/memblock.c
  F:    mm/mm_init.c
@@@ -15553,45 -15488,24 +15545,45 @@@ F:        Documentation/mm
  F:    include/linux/gfp.h
  F:    include/linux/gfp_types.h
  F:    include/linux/memfd.h
 -F:    include/linux/memory.h
  F:    include/linux/memory_hotplug.h
  F:    include/linux/memory-tiers.h
  F:    include/linux/mempolicy.h
  F:    include/linux/mempool.h
  F:    include/linux/memremap.h
 -F:    include/linux/mm.h
 -F:    include/linux/mm_*.h
  F:    include/linux/mmzone.h
  F:    include/linux/mmu_notifier.h
  F:    include/linux/pagewalk.h
 -F:    include/linux/rmap.h
  F:    include/trace/events/ksm.h
  F:    mm/
  F:    tools/mm/
  F:    tools/testing/selftests/mm/
  N:    include/linux/page[-_]*
  
 +MEMORY MANAGEMENT - CORE
 +M:    Andrew Morton <[email protected]>
 +M:    David Hildenbrand <[email protected]>
 +R:    Lorenzo Stoakes <[email protected]>
 +R:    Liam R. Howlett <[email protected]>
 +R:    Vlastimil Babka <[email protected]>
 +R:    Mike Rapoport <[email protected]>
 +R:    Suren Baghdasaryan <[email protected]>
 +R:    Michal Hocko <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    include/linux/memory.h
 +F:    include/linux/mm.h
 +F:    include/linux/mm_*.h
 +F:    include/linux/mmdebug.h
 +F:    include/linux/pagewalk.h
 +F:    mm/Kconfig
 +F:    mm/debug.c
 +F:    mm/init-mm.c
 +F:    mm/memory.c
 +F:    mm/pagewalk.c
 +F:    mm/util.c
 +
  MEMORY MANAGEMENT - EXECMEM
  M:    Andrew Morton <[email protected]>
  M:    Mike Rapoport <[email protected]>
@@@ -15600,18 -15514,6 +15592,18 @@@ S: Maintaine
  F:    include/linux/execmem.h
  F:    mm/execmem.c
  
 +MEMORY MANAGEMENT - GUP (GET USER PAGES)
 +M:    Andrew Morton <[email protected]>
 +M:    David Hildenbrand <[email protected]>
 +R:    Jason Gunthorpe <[email protected]>
 +R:    John Hubbard <[email protected]>
 +R:    Peter Xu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    mm/gup.c
 +
  MEMORY MANAGEMENT - NUMA MEMBLOCKS AND NUMA EMULATION
  M:    Andrew Morton <[email protected]>
  M:    Mike Rapoport <[email protected]>
@@@ -15637,19 -15539,6 +15629,19 @@@ F: mm/page_alloc.
  F:    include/linux/gfp.h
  F:    include/linux/compaction.h
  
 +MEMORY MANAGEMENT - RMAP (REVERSE MAPPING)
 +M:    Andrew Morton <[email protected]>
 +M:    David Hildenbrand <[email protected]>
 +M:    Lorenzo Stoakes <[email protected]>
 +R:    Rik van Riel <[email protected]>
 +R:    Liam R. Howlett <[email protected]>
 +R:    Vlastimil Babka <[email protected]>
 +R:    Harry Yoo <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    include/linux/rmap.h
 +F:    mm/rmap.c
 +
  MEMORY MANAGEMENT - SECRETMEM
  M:    Andrew Morton <[email protected]>
  M:    Mike Rapoport <[email protected]>
@@@ -15658,30 -15547,6 +15650,30 @@@ S: Maintaine
  F:    include/linux/secretmem.h
  F:    mm/secretmem.c
  
 +MEMORY MANAGEMENT - THP (TRANSPARENT HUGE PAGE)
 +M:    Andrew Morton <[email protected]>
 +M:    David Hildenbrand <[email protected]>
 +R:    Zi Yan <[email protected]>
 +R:    Baolin Wang <[email protected]>
 +R:    Lorenzo Stoakes <[email protected]>
 +R:    Liam R. Howlett <[email protected]>
 +R:    Nico Pache <[email protected]>
 +R:    Ryan Roberts <[email protected]>
 +R:    Dev Jain <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    Documentation/admin-guide/mm/transhuge.rst
 +F:    include/linux/huge_mm.h
 +F:    include/linux/khugepaged.h
 +F:    include/trace/events/huge_memory.h
 +F:    mm/huge_memory.c
 +F:    mm/khugepaged.c
 +F:    tools/testing/selftests/mm/khugepaged.c
 +F:    tools/testing/selftests/mm/split_huge_page_test.c
 +F:    tools/testing/selftests/mm/transhuge-stress.c
 +
  MEMORY MANAGEMENT - USERFAULTFD
  M:    Andrew Morton <[email protected]>
  R:    Peter Xu <[email protected]>
@@@ -15695,19 -15560,6 +15687,19 @@@ F: include/uapi/linux/userfaultfd.
  F:    mm/userfaultfd.c
  F:    tools/testing/selftests/mm/uffd-*.[ch]
  
 +MEMORY MANAGEMENT - RUST
 +M:    Alice Ryhl <[email protected]>
 +R:    Lorenzo Stoakes <[email protected]>
 +R:    Liam R. Howlett <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    rust/helpers/mm.c
 +F:    rust/kernel/mm.rs
 +F:    rust/kernel/mm/
 +
  MEMORY MAPPING
  M:    Andrew Morton <[email protected]>
  M:    Liam R. Howlett <[email protected]>
@@@ -15727,10 -15579,7 +15719,10 @@@ F: mm/mremap.
  F:    mm/mseal.c
  F:    mm/vma.c
  F:    mm/vma.h
 +F:    mm/vma_exec.c
 +F:    mm/vma_init.c
  F:    mm/vma_internal.h
 +F:    tools/testing/selftests/mm/merge.c
  F:    tools/testing/vma/
  
  MEMORY MAPPING - LOCKING
@@@ -16705,7 -16554,7 +16697,7 @@@ M:   Laurent Pinchart <laurent.pinchart@i
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media.git
 -F:    Documentation/devicetree/bindings/media/i2c/mt9v032.txt
 +F:    Documentation/devicetree/bindings/media/i2c/aptina,mt9v032.txt
  F:    drivers/media/i2c/mt9v032.c
  F:    include/media/i2c/mt9v032.h
  
@@@ -17428,7 -17277,6 +17420,7 @@@ M:   Pavel Machek <[email protected]
  M:    Sakari Ailus <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/adi,ad5820.yaml
  F:    drivers/media/i2c/ad5820.c
  F:    drivers/media/i2c/et8ek8
  
@@@ -18024,23 -17872,6 +18016,23 @@@ T: git git://linuxtv.org/media.gi
  F:    Documentation/devicetree/bindings/media/i2c/ovti,ov02a10.yaml
  F:    drivers/media/i2c/ov02a10.c
  
 +OMNIVISION OV02C10 SENSOR DRIVER
 +M:    Hans de Goede <[email protected]>
 +R:    Bryan O'Donoghue <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media.git
 +F:    drivers/media/i2c/ov02c10.c
 +
 +OMNIVISION OV02E10 SENSOR DRIVER
 +M:    Bryan O'Donoghue <[email protected]>
 +M:    Hans de Goede <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov02e10.yaml
 +F:    drivers/media/i2c/ov02e10.c
 +
  OMNIVISION OV08D10 SENSOR DRIVER
  M:    Jimmy Su <[email protected]>
  L:    [email protected]
@@@ -18163,7 -17994,7 +18155,7 @@@ OMNIVISION OV7670 SENSOR DRIVE
  L:    [email protected]
  S:    Orphan
  T:    git git://linuxtv.org/media.git
 -F:    Documentation/devicetree/bindings/media/i2c/ov7670.txt
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov7670.txt
  F:    drivers/media/i2c/ov7670.c
  
  OMNIVISION OV772x SENSOR DRIVER
@@@ -18179,7 -18010,7 +18171,7 @@@ OMNIVISION OV7740 SENSOR DRIVE
  L:    [email protected]
  S:    Orphan
  T:    git git://linuxtv.org/media.git
 -F:    Documentation/devicetree/bindings/media/i2c/ov7740.txt
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov7740.txt
  F:    drivers/media/i2c/ov7740.c
  
  OMNIVISION OV8856 SENSOR DRIVER
@@@ -18220,7 -18051,7 +18212,7 @@@ R:   Sylwester Nawrocki <s.nawrocki@samsu
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media.git
 -F:    Documentation/devicetree/bindings/media/i2c/ov9650.txt
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov9650.txt
  F:    drivers/media/i2c/ov9650.c
  
  OMNIVISION OV9734 SENSOR DRIVER
@@@ -18366,6 -18197,17 +18358,17 @@@ F: arch/openrisc
  F:    drivers/irqchip/irq-ompic.c
  F:    drivers/irqchip/irq-or1k-*
  
+ OPENVPN DATA CHANNEL OFFLOAD
+ M:    Antonio Quartulli <[email protected]>
+ L:    [email protected] (subscribers-only)
+ L:    [email protected]
+ S:    Supported
+ T:    git https://github.com/OpenVPN/linux-kernel-ovpn.git
+ F:    Documentation/netlink/specs/ovpn.yaml
+ F:    drivers/net/ovpn/
+ F:    include/uapi/linux/ovpn.h
+ F:    tools/testing/selftests/net/ovpn/
+ 
  OPENVSWITCH
  M:    Aaron Conole <[email protected]>
  M:    Eelco Chaudron <[email protected]>
@@@ -18390,7 -18232,6 +18393,7 @@@ F:   Documentation/devicetree/bindings/op
  F:    Documentation/power/opp.rst
  F:    drivers/opp/
  F:    include/linux/pm_opp.h
 +F:    rust/kernel/opp.rs
  
  OPL4 DRIVER
  M:    Clemens Ladisch <[email protected]>
@@@ -18426,7 -18267,6 +18429,7 @@@ S:   Maintaine
  W:    https://linuxtv.org
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov2659.txt
  F:    drivers/media/i2c/ov2659.c
  F:    include/media/i2c/ov2659.h
  
@@@ -18604,13 -18444,6 +18607,13 @@@ S: Maintaine
  F:    Documentation/hwmon/pc87427.rst
  F:    drivers/hwmon/pc87427.c
  
 +MAX77705 HARDWARE MONITORING DRIVER
 +M:    Dzmitry Sankouski <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/hwmon/max77705.rst
 +F:    drivers/hwmon/max77705-hwmon.c
 +
  PCA9532 LED DRIVER
  M:    Riku Voipio <[email protected]>
  S:    Maintained
@@@ -18654,7 -18487,7 +18657,7 @@@ M:   Thomas Petazzoni <thomas.petazzoni@b
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pci/pci-armada8k.txt
 +F:    Documentation/devicetree/bindings/pci/marvell,armada8k-pcie.yaml
  F:    drivers/pci/controller/dwc/pcie-armada8k.c
  
  PCI DRIVER FOR CADENCE PCIE IP
@@@ -18824,7 -18657,7 +18827,7 @@@ F:   drivers/pci/controller/pcie-xilinx-c
  
  PCI ENDPOINT SUBSYSTEM
  M:    Manivannan Sadhasivam <[email protected]>
 -M:    Krzysztof Wilczyński <[email protected]>
 +M:    Krzysztof Wilczyński <[email protected]>
  R:    Kishon Vijay Abraham I <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -18875,7 -18708,7 +18878,7 @@@ F:   drivers/pci/controller/pci-xgene-msi
  
  PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
  M:    Lorenzo Pieralisi <[email protected]>
 -M:    Krzysztof Wilczyński <[email protected]>
 +M:    Krzysztof Wilczyński <[email protected]>
  M:    Manivannan Sadhasivam <[email protected]>
  R:    Rob Herring <[email protected]>
  L:    [email protected]
@@@ -19131,7 -18964,7 +19134,7 @@@ F:   drivers/net/ethernet/pensando
  PER-CPU MEMORY ALLOCATOR
  M:    Dennis Zhou <[email protected]>
  M:    Tejun Heo <[email protected]>
 -M:    Christoph Lameter <[email protected]>
 +M:    Christoph Lameter <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu.git
@@@ -20224,7 -20057,6 +20227,7 @@@ QUALCOMM IRIS VIDEO ACCELERATOR DRIVE
  M:    Vikash Garodia <[email protected]>
  M:    Dikshita Agarwal <[email protected]>
  R:    Abhinav Kumar <[email protected]>
 +R:    Bryan O'Donoghue <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -20286,8 -20118,8 +20289,8 @@@ F:   Documentation/devicetree/bindings/us
  F:    drivers/usb/typec/tcpm/qcom/
  
  QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
 -M:    Stanimir Varbanov <[email protected]>
  M:    Vikash Garodia <[email protected]>
 +M:    Dikshita Agarwal <[email protected]>
  R:    Bryan O'Donoghue <[email protected]>
  L:    [email protected]
  L:    [email protected]
@@@ -20870,14 -20702,14 +20873,22 @@@ S:        Maintaine
  F:    Documentation/devicetree/bindings/usb/renesas,rzn1-usbf.yaml
  F:    drivers/usb/gadget/udc/renesas_usbf.c
  
+ RENESAS RZ/V2H(P) DWMAC GBETH GLUE LAYER DRIVER
+ M:    Lad Prabhakar <[email protected]>
+ L:    [email protected]
+ L:    [email protected]
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/net/renesas,r9a09g057-gbeth.yaml
+ F:    drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
+ 
 +RENESAS RZ/V2H(P) USB2PHY PORT RESET DRIVER
 +M:    Fabrizio Castro <[email protected]>
 +M:    Lad Prabhakar <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
 +F:    drivers/reset/reset-rzv2h-usb2phy.c
 +
  RENESAS RZ/V2M I2C DRIVER
  M:    Fabrizio Castro <[email protected]>
  L:    [email protected]
@@@ -21090,7 -20922,6 +21101,7 @@@ F:   Documentation/devicetree/bindings/fi
  F:    Documentation/devicetree/bindings/mailbox/thead,th1520-mbox.yaml
  F:    Documentation/devicetree/bindings/net/thead,th1520-gmac.yaml
  F:    Documentation/devicetree/bindings/pinctrl/thead,th1520-pinctrl.yaml
 +F:    Documentation/devicetree/bindings/reset/thead,th1520-reset.yaml
  F:    arch/riscv/boot/dts/thead/
  F:    drivers/clk/thead/clk-th1520-ap.c
  F:    drivers/firmware/thead,th1520-aon.c
@@@ -21098,10 -20929,8 +21109,10 @@@ F: drivers/mailbox/mailbox-th1520.
  F:    drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
  F:    drivers/pinctrl/pinctrl-th1520.c
  F:    drivers/pmdomain/thead/
 +F:    drivers/reset/reset-th1520.c
  F:    include/dt-bindings/clock/thead,th1520-clk-ap.h
  F:    include/dt-bindings/power/thead,th1520-power.h
 +F:    include/dt-bindings/reset/thead,th1520-reset.h
  F:    include/linux/firmware/thead/thead,th1520-aon.h
  
  RNBD BLOCK DRIVERS
@@@ -22506,7 -22335,7 +22517,7 @@@ F:   Documentation/devicetree/bindings/nv
  F:    drivers/nvmem/layouts/sl28vpd.c
  
  SLAB ALLOCATOR
 -M:    Christoph Lameter <[email protected]>
 +M:    Christoph Lameter <[email protected]>
  M:    David Rientjes <[email protected]>
  M:    Andrew Morton <[email protected]>
  M:    Vlastimil Babka <[email protected]>
@@@ -22749,7 -22578,7 +22760,7 @@@ M:   Dave Stevenson <dave.stevenson@raspb
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media.git
 -F:    Documentation/devicetree/bindings/media/i2c/imx219.yaml
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx219.yaml
  F:    drivers/media/i2c/imx219.c
  
  SONY IMX258 SENSOR DRIVER
@@@ -22809,9 -22638,8 +22820,9 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/imx334.c
  
  SONY IMX335 SENSOR DRIVER
 +M:    Kieran Bingham <[email protected]>
  L:    [email protected]
 -S:    Orphan
 +S:    Maintained
  T:    git git://linuxtv.org/media.git
  F:    Documentation/devicetree/bindings/media/i2c/sony,imx335.yaml
  F:    drivers/media/i2c/imx335.c
@@@ -22831,7 -22659,7 +22842,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/imx412.c
  
  SONY IMX415 SENSOR DRIVER
 -M:    Michael Riesch <[email protected]>
 +M:    Michael Riesch <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media.git
@@@ -23042,6 -22870,7 +23053,6 @@@ F:   drivers/accessibility/speakup
  
  SPEAR PLATFORM/CLOCK/PINCTRL SUPPORT
  M:    Viresh Kumar <[email protected]>
 -M:    Shiraz Hashim <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected]
  S:    Maintained
@@@ -23155,12 -22984,6 +23166,12 @@@ L: [email protected]
  S:    Maintained
  F:    drivers/i2c/busses/i2c-stm32*
  
 +ST STM32 OCTO MEMORY MANAGER
 +M:    Patrice Chotard <[email protected]>
 +S:    Maintained
 +F:    
Documentation/devicetree/bindings/memory-controllers/st,stm32mp25-omm.yaml
 +F:    drivers/memory/stm32_omm.c
 +
  ST STM32 SPI DRIVER
  M:    Alain Volmat <[email protected]>
  L:    [email protected]
@@@ -23174,22 -22997,6 +23185,22 @@@ S: Maintaine
  F:    Documentation/hwmon/stpddc60.rst
  F:    drivers/hwmon/pmbus/stpddc60.c
  
 +ST VD55G1 DRIVER
 +M:    Benjamin Mugnier <[email protected]>
 +M:    Sylvain Petinot <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/st,vd55g1.yaml
 +F:    drivers/media/i2c/vd55g1.c
 +
 +ST VD56G3 IMAGE SENSOR DRIVER
 +M:    Benjamin Mugnier <[email protected]>
 +M:    Sylvain Petinot <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/st,vd56g3.yaml
 +F:    drivers/media/i2c/vd56g3.c
 +
  ST VGXY61 DRIVER
  M:    Benjamin Mugnier <[email protected]>
  M:    Sylvain Petinot <[email protected]>
@@@ -23748,13 -23555,6 +23759,13 @@@ L: [email protected]
  S:    Supported
  F:    drivers/i2c/busses/i2c-designware-*
  
 +SYNOPSYS DESIGNWARE I2C DRIVER - AMDISP
 +M:    Nirujogi Pratap <[email protected]>
 +M:    Bin Du <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/i2c/busses/i2c-designware-amdisp.c
 +
  SYNOPSYS DESIGNWARE MMC/SD/SDIO DRIVER
  M:    Jaehoon Chung <[email protected]>
  L:    [email protected]
@@@ -23810,15 -23610,6 +23821,15 @@@ F: include/linux/sc[mp]i_protocol.
  F:    include/trace/events/scmi.h
  F:    include/uapi/linux/virtio_scmi.h
  
 +SYSTEM CONTROL MANAGEMENT INTERFACE (SCMI) i.MX Extension Message Protocol 
drivers
 +M:    Peng Fan <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/firmware/nxp,*scmi.yaml
 +F:    drivers/firmware/arm_scmi/vendors/imx/
 +
  SYSTEM RESET/SHUTDOWN DRIVERS
  M:    Sebastian Reichel <[email protected]>
  L:    [email protected]
@@@ -23925,7 -23716,6 +23936,7 @@@ L:   [email protected]
  S:    Maintained
  W:    https://linuxtv.org
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +F:    Documentation/devicetree/bindings/media/i2c/nxp,tda1997x.txt
  F:    drivers/media/i2c/tda1997x.*
  
  TDA827x MEDIA DRIVER
@@@ -24517,13 -24307,6 +24528,13 @@@ F: drivers/misc/tifm
  F:    drivers/mmc/host/tifm_sd.c
  F:    include/linux/tifm.h
  
 +TI FPC202 DUAL PORT CONTROLLER
 +M:    Romain Gantois <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/misc/ti,fpc202.yaml
 +F:    drivers/misc/ti_fpc202.c
 +
  TI FPD-LINK DRIVERS
  M:    Tomi Valkeinen <[email protected]>
  L:    [email protected]
@@@ -24770,7 -24553,7 +24781,7 @@@ TOSHIBA TC358743 DRIVE
  M:    Hans Verkuil <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/i2c/tc358743.txt
 +F:    Documentation/devicetree/bindings/media/i2c/toshiba,tc358743.txt
  F:    drivers/media/i2c/tc358743*
  F:    include/media/i2c/tc358743.h
  
@@@ -24812,7 -24595,6 +24823,7 @@@ F:   arch/arm64/boot/dts/freescale/fsl-*t
  F:    arch/arm64/boot/dts/freescale/imx*mba*.dts*
  F:    arch/arm64/boot/dts/freescale/imx*tqma*.dts*
  F:    arch/arm64/boot/dts/freescale/mba*.dtsi
 +F:    arch/arm64/boot/dts/freescale/tqma8*.dtsi
  F:    arch/arm64/boot/dts/freescale/tqml*.dts*
  F:    drivers/gpio/gpio-tqmx86.c
  F:    drivers/mfd/tqmx86.c
@@@ -25613,8 -25395,6 +25624,8 @@@ F:   drivers/media/i2c/mt
  F:    drivers/media/i2c/og*
  F:    drivers/media/i2c/ov*
  F:    drivers/media/i2c/s5*
 +F:    drivers/media/i2c/vd55g1.c
 +F:    drivers/media/i2c/vd56g3.c
  F:    drivers/media/i2c/vgxy61.c
  
  VF610 NAND DRIVER
@@@ -26068,14 -25848,13 +26079,14 @@@ F:        tools/testing/vsock
  
  VMALLOC
  M:    Andrew Morton <[email protected]>
 -R:    Uladzislau Rezki <[email protected]>
 +M:    Uladzislau Rezki <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    http://www.linux-mm.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
  F:    include/linux/vmalloc.h
  F:    mm/vmalloc.c
 +F:    lib/test_vmalloc.c
  
  VME SUBSYSTEM
  L:    [email protected]
diff --combined drivers/net/wireless/ath/ath12k/Kconfig
index 2d1eb22deda73,b3b15e1eb282b..1ea1af1b8f6c5
--- a/drivers/net/wireless/ath/ath12k/Kconfig
+++ b/drivers/net/wireless/ath/ath12k/Kconfig
@@@ -7,7 -7,7 +7,7 @@@ config ATH12
        select MHI_BUS
        select QRTR
        select QRTR_MHI
 -      select PCI_PWRCTL_PWRSEQ if HAVE_PWRCTL
 +      select PCI_PWRCTRL_PWRSEQ if HAVE_PWRCTRL
        help
          Enable support for Qualcomm Technologies Wi-Fi 7 (IEEE
          802.11be) family of chipsets, for example WCN7850 and
@@@ -15,6 -15,14 +15,14 @@@
  
          If you choose to build a module, it'll be called ath12k.
  
+ config ATH12K_AHB
+       bool "QTI ath12k AHB support"
+       depends on ATH12K && REMOTEPROC
+       select QCOM_MDT_LOADER
+       select QCOM_SCM
+       help
+         Enable support for Ath12k AHB bus chipsets, example IPQ5332.
+ 
  config ATH12K_DEBUG
        bool "ath12k debugging"
        depends on ATH12K
diff --combined include/linux/mm.h
index 38e16c984b9a6,8dc012e84033b..23b69b7f7a54a
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@@ -12,7 -12,6 +12,7 @@@
  #include <linux/rbtree.h>
  #include <linux/atomic.h>
  #include <linux/debug_locks.h>
 +#include <linux/compiler.h>
  #include <linux/mm_types.h>
  #include <linux/mmap_lock.h>
  #include <linux/range.h>
@@@ -386,7 -385,7 +386,7 @@@ extern unsigned int kobjsize(const voi
  #endif
  
  #ifdef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
 -# define VM_UFFD_MINOR_BIT    38
 +# define VM_UFFD_MINOR_BIT    41
  # define VM_UFFD_MINOR                BIT(VM_UFFD_MINOR_BIT)  /* UFFD minor 
faults */
  #else /* !CONFIG_HAVE_ARCH_USERFAULTFD_MINOR */
  # define VM_UFFD_MINOR                VM_NONE
@@@ -671,11 -670,204 +671,11 @@@ static inline void vma_numab_state_init
  static inline void vma_numab_state_free(struct vm_area_struct *vma) {}
  #endif /* CONFIG_NUMA_BALANCING */
  
 -#ifdef CONFIG_PER_VMA_LOCK
 -static inline void vma_lock_init(struct vm_area_struct *vma, bool 
reset_refcnt)
 -{
 -#ifdef CONFIG_DEBUG_LOCK_ALLOC
 -      static struct lock_class_key lockdep_key;
 -
 -      lockdep_init_map(&vma->vmlock_dep_map, "vm_lock", &lockdep_key, 0);
 -#endif
 -      if (reset_refcnt)
 -              refcount_set(&vma->vm_refcnt, 0);
 -      vma->vm_lock_seq = UINT_MAX;
 -}
 -
 -static inline bool is_vma_writer_only(int refcnt)
 -{
 -      /*
 -       * With a writer and no readers, refcnt is VMA_LOCK_OFFSET if the vma
 -       * is detached and (VMA_LOCK_OFFSET + 1) if it is attached. Waiting on
 -       * a detached vma happens only in vma_mark_detached() and is a rare
 -       * case, therefore most of the time there will be no unnecessary wakeup.
 -       */
 -      return refcnt & VMA_LOCK_OFFSET && refcnt <= VMA_LOCK_OFFSET + 1;
 -}
 -
 -static inline void vma_refcount_put(struct vm_area_struct *vma)
 -{
 -      /* Use a copy of vm_mm in case vma is freed after we drop vm_refcnt */
 -      struct mm_struct *mm = vma->vm_mm;
 -      int oldcnt;
 -
 -      rwsem_release(&vma->vmlock_dep_map, _RET_IP_);
 -      if (!__refcount_dec_and_test(&vma->vm_refcnt, &oldcnt)) {
 -
 -              if (is_vma_writer_only(oldcnt - 1))
 -                      rcuwait_wake_up(&mm->vma_writer_wait);
 -      }
 -}
 -
 -/*
 - * Try to read-lock a vma. The function is allowed to occasionally yield false
 - * locked result to avoid performance overhead, in which case we fall back to
 - * using mmap_lock. The function should never yield false unlocked result.
 - * False locked result is possible if mm_lock_seq overflows or if vma gets
 - * reused and attached to a different mm before we lock it.
 - * Returns the vma on success, NULL on failure to lock and EAGAIN if vma got
 - * detached.
 - */
 -static inline struct vm_area_struct *vma_start_read(struct mm_struct *mm,
 -                                                  struct vm_area_struct *vma)
 -{
 -      int oldcnt;
 -
 -      /*
 -       * Check before locking. A race might cause false locked result.
 -       * We can use READ_ONCE() for the mm_lock_seq here, and don't need
 -       * ACQUIRE semantics, because this is just a lockless check whose result
 -       * we don't rely on for anything - the mm_lock_seq read against which we
 -       * need ordering is below.
 -       */
 -      if (READ_ONCE(vma->vm_lock_seq) == READ_ONCE(mm->mm_lock_seq.sequence))
 -              return NULL;
 -
 -      /*
 -       * If VMA_LOCK_OFFSET is set, __refcount_inc_not_zero_limited_acquire()
 -       * will fail because VMA_REF_LIMIT is less than VMA_LOCK_OFFSET.
 -       * Acquire fence is required here to avoid reordering against later
 -       * vm_lock_seq check and checks inside lock_vma_under_rcu().
 -       */
 -      if (unlikely(!__refcount_inc_not_zero_limited_acquire(&vma->vm_refcnt, 
&oldcnt,
 -                                                            VMA_REF_LIMIT))) {
 -              /* return EAGAIN if vma got detached from under us */
 -              return oldcnt ? NULL : ERR_PTR(-EAGAIN);
 -      }
 -
 -      rwsem_acquire_read(&vma->vmlock_dep_map, 0, 1, _RET_IP_);
 -      /*
 -       * Overflow of vm_lock_seq/mm_lock_seq might produce false locked 
result.
 -       * False unlocked result is impossible because we modify and check
 -       * vma->vm_lock_seq under vma->vm_refcnt protection and mm->mm_lock_seq
 -       * modification invalidates all existing locks.
 -       *
 -       * We must use ACQUIRE semantics for the mm_lock_seq so that if we are
 -       * racing with vma_end_write_all(), we only start reading from the VMA
 -       * after it has been unlocked.
 -       * This pairs with RELEASE semantics in vma_end_write_all().
 -       */
 -      if (unlikely(vma->vm_lock_seq == raw_read_seqcount(&mm->mm_lock_seq))) {
 -              vma_refcount_put(vma);
 -              return NULL;
 -      }
 -
 -      return vma;
 -}
 -
  /*
 - * Use only while holding mmap read lock which guarantees that locking will 
not
 - * fail (nobody can concurrently write-lock the vma). vma_start_read() should
 - * not be used in such cases because it might fail due to mm_lock_seq 
overflow.
 - * This functionality is used to obtain vma read lock and drop the mmap read 
lock.
 + * These must be here rather than mmap_lock.h as dependent on vm_fault type,
 + * declared in this header.
   */
 -static inline bool vma_start_read_locked_nested(struct vm_area_struct *vma, 
int subclass)
 -{
 -      int oldcnt;
 -
 -      mmap_assert_locked(vma->vm_mm);
 -      if (unlikely(!__refcount_inc_not_zero_limited_acquire(&vma->vm_refcnt, 
&oldcnt,
 -                                                            VMA_REF_LIMIT)))
 -              return false;
 -
 -      rwsem_acquire_read(&vma->vmlock_dep_map, 0, 1, _RET_IP_);
 -      return true;
 -}
 -
 -/*
 - * Use only while holding mmap read lock which guarantees that locking will 
not
 - * fail (nobody can concurrently write-lock the vma). vma_start_read() should
 - * not be used in such cases because it might fail due to mm_lock_seq 
overflow.
 - * This functionality is used to obtain vma read lock and drop the mmap read 
lock.
 - */
 -static inline bool vma_start_read_locked(struct vm_area_struct *vma)
 -{
 -      return vma_start_read_locked_nested(vma, 0);
 -}
 -
 -static inline void vma_end_read(struct vm_area_struct *vma)
 -{
 -      vma_refcount_put(vma);
 -}
 -
 -/* WARNING! Can only be used if mmap_lock is expected to be write-locked */
 -static bool __is_vma_write_locked(struct vm_area_struct *vma, unsigned int 
*mm_lock_seq)
 -{
 -      mmap_assert_write_locked(vma->vm_mm);
 -
 -      /*
 -       * current task is holding mmap_write_lock, both vma->vm_lock_seq and
 -       * mm->mm_lock_seq can't be concurrently modified.
 -       */
 -      *mm_lock_seq = vma->vm_mm->mm_lock_seq.sequence;
 -      return (vma->vm_lock_seq == *mm_lock_seq);
 -}
 -
 -void __vma_start_write(struct vm_area_struct *vma, unsigned int mm_lock_seq);
 -
 -/*
 - * Begin writing to a VMA.
 - * Exclude concurrent readers under the per-VMA lock until the currently
 - * write-locked mmap_lock is dropped or downgraded.
 - */
 -static inline void vma_start_write(struct vm_area_struct *vma)
 -{
 -      unsigned int mm_lock_seq;
 -
 -      if (__is_vma_write_locked(vma, &mm_lock_seq))
 -              return;
 -
 -      __vma_start_write(vma, mm_lock_seq);
 -}
 -
 -static inline void vma_assert_write_locked(struct vm_area_struct *vma)
 -{
 -      unsigned int mm_lock_seq;
 -
 -      VM_BUG_ON_VMA(!__is_vma_write_locked(vma, &mm_lock_seq), vma);
 -}
 -
 -static inline void vma_assert_locked(struct vm_area_struct *vma)
 -{
 -      unsigned int mm_lock_seq;
 -
 -      VM_BUG_ON_VMA(refcount_read(&vma->vm_refcnt) <= 1 &&
 -                    !__is_vma_write_locked(vma, &mm_lock_seq), vma);
 -}
 -
 -/*
 - * WARNING: to avoid racing with vma_mark_attached()/vma_mark_detached(), 
these
 - * assertions should be made either under mmap_write_lock or when the object
 - * has been isolated under mmap_write_lock, ensuring no competing writers.
 - */
 -static inline void vma_assert_attached(struct vm_area_struct *vma)
 -{
 -      WARN_ON_ONCE(!refcount_read(&vma->vm_refcnt));
 -}
 -
 -static inline void vma_assert_detached(struct vm_area_struct *vma)
 -{
 -      WARN_ON_ONCE(refcount_read(&vma->vm_refcnt));
 -}
 -
 -static inline void vma_mark_attached(struct vm_area_struct *vma)
 -{
 -      vma_assert_write_locked(vma);
 -      vma_assert_detached(vma);
 -      refcount_set_release(&vma->vm_refcnt, 1);
 -}
 -
 -void vma_mark_detached(struct vm_area_struct *vma);
 -
 +#ifdef CONFIG_PER_VMA_LOCK
  static inline void release_fault_lock(struct vm_fault *vmf)
  {
        if (vmf->flags & FAULT_FLAG_VMA_LOCK)
@@@ -691,7 -883,36 +691,7 @@@ static inline void assert_fault_locked(
        else
                mmap_assert_locked(vmf->vma->vm_mm);
  }
 -
 -struct vm_area_struct *lock_vma_under_rcu(struct mm_struct *mm,
 -                                        unsigned long address);
 -
 -#else /* CONFIG_PER_VMA_LOCK */
 -
 -static inline void vma_lock_init(struct vm_area_struct *vma, bool 
reset_refcnt) {}
 -static inline struct vm_area_struct *vma_start_read(struct mm_struct *mm,
 -                                                  struct vm_area_struct *vma)
 -              { return NULL; }
 -static inline void vma_end_read(struct vm_area_struct *vma) {}
 -static inline void vma_start_write(struct vm_area_struct *vma) {}
 -static inline void vma_assert_write_locked(struct vm_area_struct *vma)
 -              { mmap_assert_write_locked(vma->vm_mm); }
 -static inline void vma_assert_attached(struct vm_area_struct *vma) {}
 -static inline void vma_assert_detached(struct vm_area_struct *vma) {}
 -static inline void vma_mark_attached(struct vm_area_struct *vma) {}
 -static inline void vma_mark_detached(struct vm_area_struct *vma) {}
 -
 -static inline struct vm_area_struct *lock_vma_under_rcu(struct mm_struct *mm,
 -              unsigned long address)
 -{
 -      return NULL;
 -}
 -
 -static inline void vma_assert_locked(struct vm_area_struct *vma)
 -{
 -      mmap_assert_locked(vma->vm_mm);
 -}
 -
 +#else
  static inline void release_fault_lock(struct vm_fault *vmf)
  {
        mmap_read_unlock(vmf->vma->vm_mm);
@@@ -701,6 -922,7 +701,6 @@@ static inline void assert_fault_locked(
  {
        mmap_assert_locked(vmf->vma->vm_mm);
  }
 -
  #endif /* CONFIG_PER_VMA_LOCK */
  
  extern const struct vm_operations_struct vma_dummy_vm_ops;
@@@ -1782,45 -2004,6 +1782,45 @@@ static inline struct folio *pfn_folio(u
        return page_folio(pfn_to_page(pfn));
  }
  
 +#ifdef CONFIG_MMU
 +static inline pte_t mk_pte(struct page *page, pgprot_t pgprot)
 +{
 +      return pfn_pte(page_to_pfn(page), pgprot);
 +}
 +
 +/**
 + * folio_mk_pte - Create a PTE for this folio
 + * @folio: The folio to create a PTE for
 + * @pgprot: The page protection bits to use
 + *
 + * Create a page table entry for the first page of this folio.
 + * This is suitable for passing to set_ptes().
 + *
 + * Return: A page table entry suitable for mapping this folio.
 + */
 +static inline pte_t folio_mk_pte(struct folio *folio, pgprot_t pgprot)
 +{
 +      return pfn_pte(folio_pfn(folio), pgprot);
 +}
 +
 +#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 +/**
 + * folio_mk_pmd - Create a PMD for this folio
 + * @folio: The folio to create a PMD for
 + * @pgprot: The page protection bits to use
 + *
 + * Create a page table entry for the first page of this folio.
 + * This is suitable for passing to set_pmd_at().
 + *
 + * Return: A page table entry suitable for mapping this folio.
 + */
 +static inline pmd_t folio_mk_pmd(struct folio *folio, pgprot_t pgprot)
 +{
 +      return pmd_mkhuge(pfn_pmd(folio_pfn(folio), pgprot));
 +}
 +#endif
 +#endif /* CONFIG_MMU */
 +
  static inline bool folio_has_pincount(const struct folio *folio)
  {
        if (IS_ENABLED(CONFIG_64BIT))
@@@ -2001,6 -2184,15 +2001,6 @@@ static inline long compound_nr(struct p
        return folio_large_nr_pages(folio);
  }
  
 -/**
 - * thp_nr_pages - The number of regular pages in this huge page.
 - * @page: The head page of a huge page.
 - */
 -static inline long thp_nr_pages(struct page *page)
 -{
 -      return folio_nr_pages((struct folio *)page);
 -}
 -
  /**
   * folio_next - Move to the next physical folio.
   * @folio: The folio we're currently operating on.
@@@ -2111,62 -2303,7 +2111,62 @@@ static inline bool folio_maybe_mapped_s
         */
        if (mapcount <= 1)
                return false;
 -      return folio_test_large_maybe_mapped_shared(folio);
 +      return test_bit(FOLIO_MM_IDS_SHARED_BITNUM, &folio->_mm_ids);
 +}
 +
 +/**
 + * folio_expected_ref_count - calculate the expected folio refcount
 + * @folio: the folio
 + *
 + * Calculate the expected folio refcount, taking references from the 
pagecache,
 + * swapcache, PG_private and page table mappings into account. Useful in
 + * combination with folio_ref_count() to detect unexpected references (e.g.,
 + * GUP or other temporary references).
 + *
 + * Does currently not consider references from the LRU cache. If the folio
 + * was isolated from the LRU (which is the case during migration or split),
 + * the LRU cache does not apply.
 + *
 + * Calling this function on an unmapped folio -- !folio_mapped() -- that is
 + * locked will return a stable result.
 + *
 + * Calling this function on a mapped folio will not result in a stable result,
 + * because nothing stops additional page table mappings from coming (e.g.,
 + * fork()) or going (e.g., munmap()).
 + *
 + * Calling this function without the folio lock will also not result in a
 + * stable result: for example, the folio might get dropped from the swapcache
 + * concurrently.
 + *
 + * However, even when called without the folio lock or on a mapped folio,
 + * this function can be used to detect unexpected references early (for 
example,
 + * if it makes sense to even lock the folio and unmap it).
 + *
 + * The caller must add any reference (e.g., from folio_try_get()) it might be
 + * holding itself to the result.
 + *
 + * Returns the expected folio refcount.
 + */
 +static inline int folio_expected_ref_count(const struct folio *folio)
 +{
 +      const int order = folio_order(folio);
 +      int ref_count = 0;
 +
 +      if (WARN_ON_ONCE(folio_test_slab(folio)))
 +              return 0;
 +
 +      if (folio_test_anon(folio)) {
 +              /* One reference per page from the swapcache. */
 +              ref_count += folio_test_swapcache(folio) << order;
 +      } else if (!((unsigned long)folio->mapping & PAGE_MAPPING_FLAGS)) {
 +              /* One reference per page from the pagecache. */
 +              ref_count += !!folio->mapping << order;
 +              /* One reference from PG_private. */
 +              ref_count += folio_test_private(folio);
 +      }
 +
 +      /* One reference per page table mapping. */
 +      return ref_count + folio_mapcount(folio);
  }
  
  #ifndef HAVE_ARCH_MAKE_FOLIO_ACCESSIBLE
@@@ -2269,6 -2406,7 +2269,6 @@@ static inline void clear_page_pfmemallo
  extern void pagefault_out_of_memory(void);
  
  #define offset_in_page(p)     ((unsigned long)(p) & ~PAGE_MASK)
 -#define offset_in_thp(page, p)        ((unsigned long)(p) & (thp_size(page) - 
1))
  #define offset_in_folio(folio, p) ((unsigned long)(p) & (folio_size(folio) - 
1))
  
  /*
@@@ -2629,7 -2767,7 +2629,7 @@@ static inline void update_hiwater_rss(s
  {
        unsigned long _rss = get_mm_rss(mm);
  
 -      if ((mm)->hiwater_rss < _rss)
 +      if (data_race(mm->hiwater_rss) < _rss)
                (mm)->hiwater_rss = _rss;
  }
  
@@@ -2979,10 -3117,9 +2979,10 @@@ static inline void pagetable_dtor_free(
        pagetable_free(ptdesc);
  }
  
 -static inline bool pagetable_pte_ctor(struct ptdesc *ptdesc)
 +static inline bool pagetable_pte_ctor(struct mm_struct *mm,
 +                                    struct ptdesc *ptdesc)
  {
 -      if (!ptlock_init(ptdesc))
 +      if (mm != &init_mm && !ptlock_init(ptdesc))
                return false;
        __pagetable_ctor(ptdesc);
        return true;
@@@ -3086,10 -3223,9 +3086,10 @@@ static inline spinlock_t *pmd_lock(stru
        return ptl;
  }
  
 -static inline bool pagetable_pmd_ctor(struct ptdesc *ptdesc)
 +static inline bool pagetable_pmd_ctor(struct mm_struct *mm,
 +                                    struct ptdesc *ptdesc)
  {
 -      if (!pmd_ptlock_init(ptdesc))
 +      if (mm != &init_mm && !pmd_ptlock_init(ptdesc))
                return false;
        ptdesc_pmd_pts_init(ptdesc);
        __pagetable_ctor(ptdesc);
@@@ -3278,6 -3414,7 +3278,6 @@@ void anon_vma_interval_tree_verify(stru
  extern int __vm_enough_memory(struct mm_struct *mm, long pages, int 
cap_sys_admin);
  extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
  extern void exit_mmap(struct mm_struct *);
 -int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift);
  bool mmap_read_lock_maybe_expand(struct mm_struct *mm, struct vm_area_struct 
*vma,
                                 unsigned long addr, bool write);
  
@@@ -4128,4 -4265,62 +4128,62 @@@ int arch_lock_shadow_stack_status(struc
  #define VM_SEALED_SYSMAP      VM_NONE
  #endif
  
+ /*
+  * DMA mapping IDs for page_pool
+  *
+  * When DMA-mapping a page, page_pool allocates an ID (from an xarray) and
+  * stashes it in the upper bits of page->pp_magic. We always want to be able 
to
+  * unambiguously identify page pool pages (using page_pool_page_is_pp()). 
Non-PP
+  * pages can have arbitrary kernel pointers stored in the same field as 
pp_magic
+  * (since it overlaps with page->lru.next), so we must ensure that we cannot
+  * mistake a valid kernel pointer with any of the values we write into this
+  * field.
+  *
+  * On architectures that set POISON_POINTER_DELTA, this is already ensured,
+  * since this value becomes part of PP_SIGNATURE; meaning we can just use the
+  * space between the PP_SIGNATURE value (without POISON_POINTER_DELTA), and 
the
+  * lowest bits of POISON_POINTER_DELTA. On arches where POISON_POINTER_DELTA 
is
+  * 0, we make sure that we leave the two topmost bits empty, as that 
guarantees
+  * we won't mistake a valid kernel pointer for a value we set, regardless of 
the
+  * VMSPLIT setting.
+  *
+  * Altogether, this means that the number of bits available is constrained by
+  * the size of an unsigned long (at the upper end, subtracting two bits per 
the
+  * above), and the definition of PP_SIGNATURE (with or without
+  * POISON_POINTER_DELTA).
+  */
+ #define PP_DMA_INDEX_SHIFT (1 + __fls(PP_SIGNATURE - POISON_POINTER_DELTA))
+ #if POISON_POINTER_DELTA > 0
+ /* PP_SIGNATURE includes POISON_POINTER_DELTA, so limit the size of the DMA
+  * index to not overlap with that if set
+  */
+ #define PP_DMA_INDEX_BITS MIN(32, __ffs(POISON_POINTER_DELTA) - 
PP_DMA_INDEX_SHIFT)
+ #else
+ /* Always leave out the topmost two; see above. */
+ #define PP_DMA_INDEX_BITS MIN(32, BITS_PER_LONG - PP_DMA_INDEX_SHIFT - 2)
+ #endif
+ 
+ #define PP_DMA_INDEX_MASK GENMASK(PP_DMA_INDEX_BITS + PP_DMA_INDEX_SHIFT - 1, 
\
+                                 PP_DMA_INDEX_SHIFT)
+ 
+ /* Mask used for checking in page_pool_page_is_pp() below. page->pp_magic is
+  * OR'ed with PP_SIGNATURE after the allocation in order to preserve bit 0 for
+  * the head page of compound page and bit 1 for pfmemalloc page, as well as 
the
+  * bits used for the DMA index. page_is_pfmemalloc() is checked in
+  * __page_pool_put_page() to avoid recycling the pfmemalloc page.
+  */
+ #define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL)
+ 
+ #ifdef CONFIG_PAGE_POOL
+ static inline bool page_pool_page_is_pp(struct page *page)
+ {
+       return (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;
+ }
+ #else
+ static inline bool page_pool_page_is_pp(struct page *page)
+ {
+       return false;
+ }
+ #endif
+ 
  #endif /* _LINUX_MM_H */
diff --combined include/net/sch_generic.h
index 1c05fed05f2bc,b6c177f7141c0..629368ab2787f
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@@ -803,6 -803,14 +803,14 @@@ static inline bool qdisc_tx_changing(co
        return false;
  }
  
+ /* "noqueue" qdisc identified by not having any enqueue, see noqueue_init() */
+ static inline bool qdisc_txq_has_no_queue(const struct netdev_queue *txq)
+ {
+       struct Qdisc *qdisc = rcu_access_pointer(txq->qdisc);
+ 
+       return qdisc->enqueue == NULL;
+ }
+ 
  /* Is the device using the noop qdisc on all queues?  */
  static inline bool qdisc_tx_is_noop(const struct net_device *dev)
  {
@@@ -1031,21 -1039,6 +1039,21 @@@ static inline struct sk_buff *__qdisc_d
        return skb;
  }
  
 +static inline struct sk_buff *qdisc_dequeue_internal(struct Qdisc *sch, bool 
direct)
 +{
 +      struct sk_buff *skb;
 +
 +      skb = __skb_dequeue(&sch->gso_skb);
 +      if (skb) {
 +              sch->q.qlen--;
 +              return skb;
 +      }
 +      if (direct)
 +              return __qdisc_dequeue_head(&sch->q);
 +      else
 +              return sch->dequeue(sch);
 +}
 +
  static inline struct sk_buff *qdisc_dequeue_head(struct Qdisc *sch)
  {
        struct sk_buff *skb = __qdisc_dequeue_head(&sch->q);
diff --combined include/trace/events/sunrpc.h
index 67db3f2953d5d,de214f1dea586..81f795150097f
--- a/include/trace/events/sunrpc.h
+++ b/include/trace/events/sunrpc.h
@@@ -21,7 -21,6 +21,6 @@@ TRACE_DEFINE_ENUM(SOCK_DGRAM)
  TRACE_DEFINE_ENUM(SOCK_RAW);
  TRACE_DEFINE_ENUM(SOCK_RDM);
  TRACE_DEFINE_ENUM(SOCK_SEQPACKET);
- TRACE_DEFINE_ENUM(SOCK_DCCP);
  TRACE_DEFINE_ENUM(SOCK_PACKET);
  
  #define show_socket_type(type)                                        \
@@@ -31,7 -30,6 +30,6 @@@
                { SOCK_RAW,             "RAW" },                \
                { SOCK_RDM,             "RDM" },                \
                { SOCK_SEQPACKET,       "SEQPACKET" },          \
-               { SOCK_DCCP,            "DCCP" },               \
                { SOCK_PACKET,          "PACKET" })
  
  /* This list is known to be incomplete, add new enums as needed. */
@@@ -2040,20 -2038,19 +2038,20 @@@ TRACE_EVENT(svc_xprt_dequeue
  
        TP_STRUCT__entry(
                SVC_XPRT_ENDPOINT_FIELDS(rqst->rq_xprt)
 -
                __field(unsigned long, wakeup)
 +              __field(unsigned long, qtime)
        ),
  
        TP_fast_assign(
 -              SVC_XPRT_ENDPOINT_ASSIGNMENTS(rqst->rq_xprt);
 +              ktime_t ktime = ktime_get();
  
 -              __entry->wakeup = ktime_to_us(ktime_sub(ktime_get(),
 -                                                      rqst->rq_qtime));
 +              SVC_XPRT_ENDPOINT_ASSIGNMENTS(rqst->rq_xprt);
 +              __entry->wakeup = ktime_to_us(ktime_sub(ktime, rqst->rq_qtime));
 +              __entry->qtime = ktime_to_us(ktime_sub(ktime, 
rqst->rq_xprt->xpt_qtime));
        ),
  
 -      TP_printk(SVC_XPRT_ENDPOINT_FORMAT " wakeup-us=%lu",
 -              SVC_XPRT_ENDPOINT_VARARGS, __entry->wakeup)
 +      TP_printk(SVC_XPRT_ENDPOINT_FORMAT " wakeup-us=%lu qtime-us=%lu",
 +              SVC_XPRT_ENDPOINT_VARARGS, __entry->wakeup, __entry->qtime)
  );
  
  DECLARE_EVENT_CLASS(svc_xprt_event,
diff --combined mm/page_alloc.c
index a6fe1e9b95941,2073c3fdf9c4c..401bf5036f0a4
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@@ -290,8 -290,7 +290,8 @@@ EXPORT_SYMBOL(nr_online_nodes)
  #endif
  
  static bool page_contains_unaccepted(struct page *page, unsigned int order);
 -static bool cond_accept_memory(struct zone *zone, unsigned int order);
 +static bool cond_accept_memory(struct zone *zone, unsigned int order,
 +                             int alloc_flags);
  static bool __free_unaccepted(struct page *page);
  
  int page_group_by_mobility_disabled __read_mostly;
@@@ -898,9 -897,7 +898,7 @@@ static inline bool page_expected_state(
  #ifdef CONFIG_MEMCG
                        page->memcg_data |
  #endif
- #ifdef CONFIG_PAGE_POOL
-                       ((page->pp_magic & ~0x3UL) == PP_SIGNATURE) |
- #endif
+                       page_pool_page_is_pp(page) |
                        (page->flags & check_flags)))
                return false;
  
@@@ -927,20 -924,24 +925,18 @@@ static const char *page_bad_reason(stru
        if (unlikely(page->memcg_data))
                bad_reason = "page still charged to cgroup";
  #endif
- #ifdef CONFIG_PAGE_POOL
-       if (unlikely((page->pp_magic & ~0x3UL) == PP_SIGNATURE))
+       if (unlikely(page_pool_page_is_pp(page)))
                bad_reason = "page_pool leak";
- #endif
        return bad_reason;
  }
  
 -static void free_page_is_bad_report(struct page *page)
 -{
 -      bad_page(page,
 -               page_bad_reason(page, PAGE_FLAGS_CHECK_AT_FREE));
 -}
 -
  static inline bool free_page_is_bad(struct page *page)
  {
        if (likely(page_expected_state(page, PAGE_FLAGS_CHECK_AT_FREE)))
                return false;
  
        /* Something has gone sideways, find it */
 -      free_page_is_bad_report(page);
 +      bad_page(page, page_bad_reason(page, PAGE_FLAGS_CHECK_AT_FREE));
        return true;
  }
  
@@@ -1146,9 -1147,14 +1142,9 @@@ static inline void pgalloc_tag_sub(stru
                __pgalloc_tag_sub(page, nr);
  }
  
 -static inline void pgalloc_tag_sub_pages(struct page *page, unsigned int nr)
 +/* When tag is not NULL, assuming mem_alloc_profiling_enabled */
 +static inline void pgalloc_tag_sub_pages(struct alloc_tag *tag, unsigned int 
nr)
  {
 -      struct alloc_tag *tag;
 -
 -      if (!mem_alloc_profiling_enabled())
 -              return;
 -
 -      tag = __pgalloc_tag_get(page);
        if (tag)
                this_cpu_sub(tag->counters->bytes, PAGE_SIZE * nr);
  }
@@@ -1158,7 -1164,7 +1154,7 @@@
  static inline void pgalloc_tag_add(struct page *page, struct task_struct 
*task,
                                   unsigned int nr) {}
  static inline void pgalloc_tag_sub(struct page *page, unsigned int nr) {}
 -static inline void pgalloc_tag_sub_pages(struct page *page, unsigned int nr) 
{}
 +static inline void pgalloc_tag_sub_pages(struct alloc_tag *tag, unsigned int 
nr) {}
  
  #endif /* CONFIG_MEM_ALLOC_PROFILING */
  
@@@ -2068,25 -2074,31 +2064,25 @@@ static bool should_try_claim_block(unsi
  
  /*
   * Check whether there is a suitable fallback freepage with requested order.
 - * Sets *claim_block to instruct the caller whether it should convert a whole
 - * pageblock to the returned migratetype.
 - * If only_claim is true, this function returns fallback_mt only if
 + * If claimable is true, this function returns fallback_mt only if
   * we would do this whole-block claiming. This would help to reduce
   * fragmentation due to mixed migratetype pages in one pageblock.
   */
  int find_suitable_fallback(struct free_area *area, unsigned int order,
 -                      int migratetype, bool only_claim, bool *claim_block)
 +                         int migratetype, bool claimable)
  {
        int i;
 -      int fallback_mt;
 +
 +      if (claimable && !should_try_claim_block(order, migratetype))
 +              return -2;
  
        if (area->nr_free == 0)
                return -1;
  
 -      *claim_block = false;
        for (i = 0; i < MIGRATE_PCPTYPES - 1 ; i++) {
 -              fallback_mt = fallbacks[migratetype][i];
 -              if (free_area_empty(area, fallback_mt))
 -                      continue;
 +              int fallback_mt = fallbacks[migratetype][i];
  
 -              if (should_try_claim_block(order, migratetype))
 -                      *claim_block = true;
 -
 -              if (*claim_block || !only_claim)
 +              if (!free_area_empty(area, fallback_mt))
                        return fallback_mt;
        }
  
@@@ -2183,6 -2195,7 +2179,6 @@@ __rmqueue_claim(struct zone *zone, int 
        int min_order = order;
        struct page *page;
        int fallback_mt;
 -      bool claim_block;
  
        /*
         * Do not steal pages from freelists belonging to other pageblocks
@@@ -2201,14 -2214,11 +2197,14 @@@
                                --current_order) {
                area = &(zone->free_area[current_order]);
                fallback_mt = find_suitable_fallback(area, current_order,
 -                              start_migratetype, false, &claim_block);
 +                                                   start_migratetype, true);
 +
 +              /* No block in that order */
                if (fallback_mt == -1)
                        continue;
  
 -              if (!claim_block)
 +              /* Advanced into orders too low to claim, abort */
 +              if (fallback_mt == -2)
                        break;
  
                page = get_page_from_free_area(area, fallback_mt);
@@@ -2236,11 -2246,12 +2232,11 @@@ __rmqueue_steal(struct zone *zone, int 
        int current_order;
        struct page *page;
        int fallback_mt;
 -      bool claim_block;
  
        for (current_order = order; current_order < NR_PAGE_ORDERS; 
current_order++) {
                area = &(zone->free_area[current_order]);
                fallback_mt = find_suitable_fallback(area, current_order,
 -                              start_migratetype, false, &claim_block);
 +                                                   start_migratetype, false);
                if (fallback_mt == -1)
                        continue;
  
@@@ -2661,10 -2672,10 +2657,10 @@@ static void free_frozen_page_commit(str
         * stops will be drained from vmstat refresh context.
         */
        if (order && order <= PAGE_ALLOC_COSTLY_ORDER) {
 -              free_high = (pcp->free_count >= batch &&
 +              free_high = (pcp->free_count >= (batch + pcp->high_min / 2) &&
                             (pcp->flags & PCPF_PREV_FREE_HIGH_ORDER) &&
                             (!(pcp->flags & PCPF_FREE_HIGH_BATCH) ||
 -                            pcp->count >= READ_ONCE(batch)));
 +                            pcp->count >= batch));
                pcp->flags |= PCPF_PREV_FREE_HIGH_ORDER;
        } else if (pcp->flags & PCPF_PREV_FREE_HIGH_ORDER) {
                pcp->flags &= ~PCPF_PREV_FREE_HIGH_ORDER;
@@@ -3543,7 -3554,7 +3539,7 @@@ get_page_from_freelist(gfp_t gfp_mask, 
  retry:
        /*
         * Scan zonelist, looking for a zone with enough free.
 -       * See also cpuset_node_allowed() comment in kernel/cgroup/cpuset.c.
 +       * See also cpuset_current_node_allowed() comment in 
kernel/cgroup/cpuset.c.
         */
        no_fallback = alloc_flags & ALLOC_NOFRAGMENT;
        z = ac->preferred_zoneref;
@@@ -3601,7 -3612,7 +3597,7 @@@
                        }
                }
  
 -              cond_accept_memory(zone, order);
 +              cond_accept_memory(zone, order, alloc_flags);
  
                /*
                 * Detect whether the number of free pages is below high
@@@ -3628,7 -3639,7 +3624,7 @@@ check_alloc_wmark
                                       gfp_mask)) {
                        int ret;
  
 -                      if (cond_accept_memory(zone, order))
 +                      if (cond_accept_memory(zone, order, alloc_flags))
                                goto try_this_zone;
  
                        /*
@@@ -3681,7 -3692,7 +3677,7 @@@ try_this_zone
  
                        return page;
                } else {
 -                      if (cond_accept_memory(zone, order))
 +                      if (cond_accept_memory(zone, order, alloc_flags))
                                goto try_this_zone;
  
                        /* Try again if zone has deferred pages */
@@@ -4230,7 -4241,7 +4226,7 @@@ gfp_to_alloc_flags(gfp_t gfp_mask, unsi
                /*
                 * Ignore cpuset mems for non-blocking __GFP_HIGH (probably
                 * GFP_ATOMIC) rather than fail, see the comment for
 -               * cpuset_node_allowed().
 +               * cpuset_current_node_allowed().
                 */
                if (alloc_flags & ALLOC_MIN_RESERVE)
                        alloc_flags &= ~ALLOC_CPUSET;
@@@ -4551,14 -4562,6 +4547,14 @@@ restart
        }
  
  retry:
 +      /*
 +       * Deal with possible cpuset update races or zonelist updates to avoid
 +       * infinite retries.
 +       */
 +      if (check_retry_cpuset(cpuset_mems_cookie, ac) ||
 +          check_retry_zonelist(zonelist_iter_cookie))
 +              goto restart;
 +
        /* Ensure kswapd doesn't accidentally go to sleep as long as we loop */
        if (alloc_flags & ALLOC_KSWAPD)
                wake_all_kswapds(order, gfp_mask, ac);
@@@ -4842,7 -4845,7 +4838,7 @@@ unsigned long alloc_pages_bulk_noprof(g
                        goto failed;
                }
  
 -              cond_accept_memory(zone, 0);
 +              cond_accept_memory(zone, 0, alloc_flags);
  retry_this_zone:
                mark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK) + 
nr_pages;
                if (zone_watermark_fast(zone, 0,  mark,
@@@ -4851,7 -4854,7 +4847,7 @@@
                        break;
                }
  
 -              if (cond_accept_memory(zone, 0))
 +              if (cond_accept_memory(zone, 0, alloc_flags))
                        goto retry_this_zone;
  
                /* Try again if zone has deferred pages */
@@@ -5058,13 -5061,11 +5054,13 @@@ static void ___free_pages(struct page *
  {
        /* get PageHead before we drop reference */
        int head = PageHead(page);
 +      /* get alloc tag in case the page is released by others */
 +      struct alloc_tag *tag = pgalloc_tag_get(page);
  
        if (put_page_testzero(page))
                __free_frozen_pages(page, order, fpi_flags);
        else if (!head) {
 -              pgalloc_tag_sub_pages(page, (1 << order) - 1);
 +              pgalloc_tag_sub_pages(tag, (1 << order) - 1);
                while (order-- > 0)
                        __free_frozen_pages(page + (1 << order), order,
                                            fpi_flags);
@@@ -6693,7 -6694,6 +6689,7 @@@ int alloc_contig_range_noprof(unsigned 
                .alloc_contig = true,
        };
        INIT_LIST_HEAD(&cc.migratepages);
 +      bool is_range_aligned;
  
        gfp_mask = current_gfp_context(gfp_mask);
        if (__alloc_contig_verify_gfp_mask(gfp_mask, (gfp_t *)&cc.gfp_mask))
@@@ -6782,14 -6782,7 +6778,14 @@@
                goto done;
        }
  
 -      if (!(gfp_mask & __GFP_COMP)) {
 +      /*
 +       * With __GFP_COMP and the requested order < MAX_PAGE_ORDER,
 +       * isolated free pages can have higher order than the requested
 +       * one. Use split_free_pages() to free out of range pages.
 +       */
 +      is_range_aligned = is_power_of_2(end - start);
 +      if (!(gfp_mask & __GFP_COMP) ||
 +              (is_range_aligned && ilog2(end - start) < MAX_PAGE_ORDER)) {
                split_free_pages(cc.freepages, gfp_mask);
  
                /* Free head and tail (if any) */
@@@ -6797,15 -6790,7 +6793,15 @@@
                        free_contig_range(outer_start, start - outer_start);
                if (end != outer_end)
                        free_contig_range(end, outer_end - end);
 -      } else if (start == outer_start && end == outer_end && 
is_power_of_2(end - start)) {
 +
 +              outer_start = start;
 +              outer_end = end;
 +
 +              if (!(gfp_mask & __GFP_COMP))
 +                      goto done;
 +      }
 +
 +      if (start == outer_start && end == outer_end && is_range_aligned) {
                struct page *head = pfn_to_page(start);
                int order = ilog2(end - start);
  
@@@ -7185,8 -7170,16 +7181,8 @@@ bool has_managed_dma(void
  
  #ifdef CONFIG_UNACCEPTED_MEMORY
  
 -/* Counts number of zones with unaccepted pages. */
 -static DEFINE_STATIC_KEY_FALSE(zones_with_unaccepted_pages);
 -
  static bool lazy_accept = true;
  
 -void unaccepted_cleanup_work(struct work_struct *work)
 -{
 -      static_branch_dec(&zones_with_unaccepted_pages);
 -}
 -
  static int __init accept_memory_parse(char *p)
  {
        if (!strcmp(p, "lazy")) {
@@@ -7211,7 -7204,11 +7207,7 @@@ static bool page_contains_unaccepted(st
  static void __accept_page(struct zone *zone, unsigned long *flags,
                          struct page *page)
  {
 -      bool last;
 -
        list_del(&page->lru);
 -      last = list_empty(&zone->unaccepted_pages);
 -
        account_freepages(zone, -MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE);
        __mod_zone_page_state(zone, NR_UNACCEPTED, -MAX_ORDER_NR_PAGES);
        __ClearPageUnaccepted(page);
@@@ -7220,6 -7217,28 +7216,6 @@@
        accept_memory(page_to_phys(page), PAGE_SIZE << MAX_PAGE_ORDER);
  
        __free_pages_ok(page, MAX_PAGE_ORDER, FPI_TO_TAIL);
 -
 -      if (last) {
 -              /*
 -               * There are two corner cases:
 -               *
 -               * - If allocation occurs during the CPU bring up,
 -               *   static_branch_dec() cannot be used directly as
 -               *   it causes a deadlock on cpu_hotplug_lock.
 -               *
 -               *   Instead, use schedule_work() to prevent deadlock.
 -               *
 -               * - If allocation occurs before workqueues are initialized,
 -               *   static_branch_dec() should be called directly.
 -               *
 -               *   Workqueues are initialized before CPU bring up, so this
 -               *   will not conflict with the first scenario.
 -               */
 -              if (system_wq)
 -                      schedule_work(&zone->unaccepted_cleanup);
 -              else
 -                      unaccepted_cleanup_work(&zone->unaccepted_cleanup);
 -      }
  }
  
  void accept_page(struct page *page)
@@@ -7256,17 -7275,20 +7252,17 @@@ static bool try_to_accept_memory_one(st
        return true;
  }
  
 -static inline bool has_unaccepted_memory(void)
 -{
 -      return static_branch_unlikely(&zones_with_unaccepted_pages);
 -}
 -
 -static bool cond_accept_memory(struct zone *zone, unsigned int order)
 +static bool cond_accept_memory(struct zone *zone, unsigned int order,
 +                             int alloc_flags)
  {
        long to_accept, wmark;
        bool ret = false;
  
 -      if (!has_unaccepted_memory())
 +      if (list_empty(&zone->unaccepted_pages))
                return false;
  
 -      if (list_empty(&zone->unaccepted_pages))
 +      /* Bailout, since try_to_accept_memory_one() needs to take a lock */
 +      if (alloc_flags & ALLOC_TRYLOCK)
                return false;
  
        wmark = promo_wmark_pages(zone);
@@@ -7299,17 -7321,22 +7295,17 @@@ static bool __free_unaccepted(struct pa
  {
        struct zone *zone = page_zone(page);
        unsigned long flags;
 -      bool first = false;
  
        if (!lazy_accept)
                return false;
  
        spin_lock_irqsave(&zone->lock, flags);
 -      first = list_empty(&zone->unaccepted_pages);
        list_add_tail(&page->lru, &zone->unaccepted_pages);
        account_freepages(zone, MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE);
        __mod_zone_page_state(zone, NR_UNACCEPTED, MAX_ORDER_NR_PAGES);
        __SetPageUnaccepted(page);
        spin_unlock_irqrestore(&zone->lock, flags);
  
 -      if (first)
 -              static_branch_inc(&zones_with_unaccepted_pages);
 -
        return true;
  }
  
@@@ -7320,8 -7347,7 +7316,8 @@@ static bool page_contains_unaccepted(st
        return false;
  }
  
 -static bool cond_accept_memory(struct zone *zone, unsigned int order)
 +static bool cond_accept_memory(struct zone *zone, unsigned int order,
 +                             int alloc_flags)
  {
        return false;
  }
@@@ -7392,6 -7418,11 +7388,6 @@@ struct page *try_alloc_pages_noprof(in
        if (!pcp_allowed_order(order))
                return NULL;
  
 -#ifdef CONFIG_UNACCEPTED_MEMORY
 -      /* Bailout, since try_to_accept_memory_one() needs to take a lock */
 -      if (has_unaccepted_memory())
 -              return NULL;
 -#endif
        /* Bailout, since _deferred_grow_zone() needs to take a lock */
        if (deferred_pages_enabled())
                return NULL;
diff --combined net/core/sock.c
index 1d9466a1f54e3,b64df2463300b..e02a78538e3e2
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@@ -148,8 -148,6 +148,8 @@@
  
  #include <linux/ethtool.h>
  
 +#include <uapi/linux/pidfd.h>
 +
  #include "dev.h"
  
  static DEFINE_MUTEX(proto_list_mutex);
@@@ -1881,7 -1879,6 +1881,7 @@@ int sk_getsockopt(struct sock *sk, int 
        {
                struct pid *peer_pid;
                struct file *pidfd_file = NULL;
 +              unsigned int flags = 0;
                int pidfd;
  
                if (len > sizeof(pidfd))
@@@ -1894,14 -1891,7 +1894,14 @@@
                if (!peer_pid)
                        return -ENODATA;
  
 -              pidfd = pidfd_prepare(peer_pid, 0, &pidfd_file);
 +              /* The use of PIDFD_STALE requires stashing of struct pid
 +               * on pidfs with pidfs_register_pid() and only AF_UNIX
 +               * were prepared for this.
 +               */
 +              if (sk->sk_family == AF_UNIX)
 +                      flags = PIDFD_STALE;
 +
 +              pidfd = pidfd_prepare(peer_pid, flags, &pidfd_file);
                put_pid(peer_pid);
                if (pidfd < 0)
                        return pidfd;
@@@ -2504,17 -2494,14 +2504,14 @@@ struct sock *sk_clone_lock(const struc
                 */
                if (!is_charged)
                        RCU_INIT_POINTER(newsk->sk_filter, NULL);
-               sk_free_unlock_clone(newsk);
-               newsk = NULL;
-               goto out;
+ 
+               goto free;
        }
+ 
        RCU_INIT_POINTER(newsk->sk_reuseport_cb, NULL);
  
-       if (bpf_sk_storage_clone(sk, newsk)) {
-               sk_free_unlock_clone(newsk);
-               newsk = NULL;
-               goto out;
-       }
+       if (bpf_sk_storage_clone(sk, newsk))
+               goto free;
  
        /* Clear sk_user_data if parent had the pointer tagged
         * as not suitable for copying when cloning.
@@@ -2544,18 -2531,17 +2541,17 @@@
                net_enable_timestamp();
  out:
        return newsk;
- }
- EXPORT_SYMBOL_GPL(sk_clone_lock);
- 
- void sk_free_unlock_clone(struct sock *sk)
- {
+ free:
        /* It is still raw copy of parent, so invalidate
-        * destructor and make plain sk_free() */
-       sk->sk_destruct = NULL;
-       bh_unlock_sock(sk);
-       sk_free(sk);
+        * destructor and make plain sk_free()
+        */
+       newsk->sk_destruct = NULL;
+       bh_unlock_sock(newsk);
+       sk_free(newsk);
+       newsk = NULL;
+       goto out;
  }
- EXPORT_SYMBOL_GPL(sk_free_unlock_clone);
+ EXPORT_SYMBOL_GPL(sk_clone_lock);
  
  static u32 sk_dst_gso_max_size(struct sock *sk, struct dst_entry *dst)
  {
@@@ -4014,7 -4000,7 +4010,7 @@@ static int assign_proto_idx(struct prot
  {
        prot->inuse_idx = find_first_zero_bit(proto_inuse_idx, PROTO_INUSE_NR);
  
-       if (unlikely(prot->inuse_idx == PROTO_INUSE_NR - 1)) {
+       if (unlikely(prot->inuse_idx == PROTO_INUSE_NR)) {
                pr_err("PROTO_INUSE_NR exhausted\n");
                return -ENOSPC;
        }
@@@ -4025,7 -4011,7 +4021,7 @@@
  
  static void release_proto_idx(struct proto *prot)
  {
-       if (prot->inuse_idx != PROTO_INUSE_NR - 1)
+       if (prot->inuse_idx != PROTO_INUSE_NR)
                clear_bit(prot->inuse_idx, proto_inuse_idx);
  }
  #else
diff --combined net/unix/af_unix.c
index 472f8aa9ea15d,2ab20821d6bb2..b744c0ae5507a
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@@ -100,7 -100,6 +100,7 @@@
  #include <linux/splice.h>
  #include <linux/string.h>
  #include <linux/uaccess.h>
 +#include <linux/pidfs.h>
  #include <net/af_unix.h>
  #include <net/net_namespace.h>
  #include <net/scm.h>
@@@ -644,9 -643,6 +644,9 @@@ static void unix_sock_destructor(struc
                return;
        }
  
 +      if (sk->sk_peer_pid)
 +              pidfs_put_pid(sk->sk_peer_pid);
 +
        if (u->addr)
                unix_release_addr(u->addr);
  
@@@ -738,48 -734,13 +738,48 @@@ static void unix_release_sock(struct so
                unix_gc();              /* Garbage collect fds */
  }
  
 -static void init_peercred(struct sock *sk)
 +struct unix_peercred {
 +      struct pid *peer_pid;
 +      const struct cred *peer_cred;
 +};
 +
 +static inline int prepare_peercred(struct unix_peercred *peercred)
  {
 -      sk->sk_peer_pid = get_pid(task_tgid(current));
 -      sk->sk_peer_cred = get_current_cred();
 +      struct pid *pid;
 +      int err;
 +
 +      pid = task_tgid(current);
 +      err = pidfs_register_pid(pid);
 +      if (likely(!err)) {
 +              peercred->peer_pid = get_pid(pid);
 +              peercred->peer_cred = get_current_cred();
 +      }
 +      return err;
  }
  
 -static void update_peercred(struct sock *sk)
 +static void drop_peercred(struct unix_peercred *peercred)
 +{
 +      const struct cred *cred = NULL;
 +      struct pid *pid = NULL;
 +
 +      might_sleep();
 +
 +      swap(peercred->peer_pid, pid);
 +      swap(peercred->peer_cred, cred);
 +
 +      pidfs_put_pid(pid);
 +      put_pid(pid);
 +      put_cred(cred);
 +}
 +
 +static inline void init_peercred(struct sock *sk,
 +                               const struct unix_peercred *peercred)
 +{
 +      sk->sk_peer_pid = peercred->peer_pid;
 +      sk->sk_peer_cred = peercred->peer_cred;
 +}
 +
 +static void update_peercred(struct sock *sk, struct unix_peercred *peercred)
  {
        const struct cred *old_cred;
        struct pid *old_pid;
@@@ -787,11 -748,11 +787,11 @@@
        spin_lock(&sk->sk_peer_lock);
        old_pid = sk->sk_peer_pid;
        old_cred = sk->sk_peer_cred;
 -      init_peercred(sk);
 +      init_peercred(sk, peercred);
        spin_unlock(&sk->sk_peer_lock);
  
 -      put_pid(old_pid);
 -      put_cred(old_cred);
 +      peercred->peer_pid = old_pid;
 +      peercred->peer_cred = old_cred;
  }
  
  static void copy_peercred(struct sock *sk, struct sock *peersk)
@@@ -800,7 -761,6 +800,7 @@@
  
        spin_lock(&sk->sk_peer_lock);
        sk->sk_peer_pid = get_pid(peersk->sk_peer_pid);
 +      pidfs_get_pid(sk->sk_peer_pid);
        sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
        spin_unlock(&sk->sk_peer_lock);
  }
@@@ -810,7 -770,6 +810,7 @@@ static int unix_listen(struct socket *s
        int err;
        struct sock *sk = sock->sk;
        struct unix_sock *u = unix_sk(sk);
 +      struct unix_peercred peercred = {};
  
        err = -EOPNOTSUPP;
        if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
@@@ -818,9 -777,6 +818,9 @@@
        err = -EINVAL;
        if (!READ_ONCE(u->addr))
                goto out;       /* No listens on an unbound socket */
 +      err = prepare_peercred(&peercred);
 +      if (err)
 +              goto out;
        unix_state_lock(sk);
        if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN)
                goto out_unlock;
@@@ -830,12 -786,11 +830,12 @@@
        WRITE_ONCE(sk->sk_state, TCP_LISTEN);
  
        /* set credentials so connect can copy them */
 -      update_peercred(sk);
 +      update_peercred(sk, &peercred);
        err = 0;
  
  out_unlock:
        unix_state_unlock(sk);
 +      drop_peercred(&peercred);
  out:
        return err;
  }
@@@ -995,13 -950,6 +995,6 @@@ static void unix_close(struct sock *sk
         */
  }
  
- static void unix_unhash(struct sock *sk)
- {
-       /* Nothing to do here, unix socket does not need a ->unhash().
-        * This is merely for sockmap.
-        */
- }
- 
  static bool unix_bpf_bypass_getsockopt(int level, int optname)
  {
        if (level == SOL_SOCKET) {
@@@ -1032,7 -980,6 +1025,6 @@@ struct proto unix_stream_proto = 
        .owner                  = THIS_MODULE,
        .obj_size               = sizeof(struct unix_sock),
        .close                  = unix_close,
-       .unhash                 = unix_unhash,
        .bpf_bypass_getsockopt  = unix_bpf_bypass_getsockopt,
  #ifdef CONFIG_BPF_SYSCALL
        .psock_update_sk_prot   = unix_stream_bpf_update_proto,
@@@ -1570,7 -1517,6 +1562,7 @@@ static int unix_stream_connect(struct s
        struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
        struct sock *sk = sock->sk, *newsk = NULL, *other = NULL;
        struct unix_sock *u = unix_sk(sk), *newu, *otheru;
 +      struct unix_peercred peercred = {};
        struct net *net = sock_net(sk);
        struct sk_buff *skb = NULL;
        unsigned char state;
@@@ -1607,10 -1553,6 +1599,10 @@@
                goto out;
        }
  
 +      err = prepare_peercred(&peercred);
 +      if (err)
 +              goto out;
 +
        /* Allocate skb for sending to listening sock */
        skb = sock_wmalloc(newsk, 1, 0, GFP_KERNEL);
        if (!skb) {
@@@ -1686,7 -1628,7 +1678,7 @@@ restart
        unix_peer(newsk)        = sk;
        newsk->sk_state         = TCP_ESTABLISHED;
        newsk->sk_type          = sk->sk_type;
 -      init_peercred(newsk);
 +      init_peercred(newsk, &peercred);
        newu = unix_sk(newsk);
        newu->listener = other;
        RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq);
@@@ -1745,33 -1687,20 +1737,33 @@@ out_free_skb
  out_free_sk:
        unix_release_sock(newsk, 0);
  out:
 +      drop_peercred(&peercred);
        return err;
  }
  
  static int unix_socketpair(struct socket *socka, struct socket *sockb)
  {
 +      struct unix_peercred ska_peercred = {}, skb_peercred = {};
        struct sock *ska = socka->sk, *skb = sockb->sk;
 +      int err;
 +
 +      err = prepare_peercred(&ska_peercred);
 +      if (err)
 +              return err;
 +
 +      err = prepare_peercred(&skb_peercred);
 +      if (err) {
 +              drop_peercred(&ska_peercred);
 +              return err;
 +      }
  
        /* Join our sockets back to back */
        sock_hold(ska);
        sock_hold(skb);
        unix_peer(ska) = skb;
        unix_peer(skb) = ska;
 -      init_peercred(ska);
 -      init_peercred(skb);
 +      init_peercred(ska, &ska_peercred);
 +      init_peercred(skb, &skb_peercred);
  
        ska->sk_state = TCP_ESTABLISHED;
        skb->sk_state = TCP_ESTABLISHED;
diff --combined scripts/checkpatch.pl
index e8afe3f765de5,298c8f8d77199..6aeeba36ffaf1
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@@ -151,24 -151,6 +151,24 @@@ EO
        exit($exitcode);
  }
  
 +my $DO_WHILE_0_ADVICE = q{
 +   do {} while (0) advice is over-stated in a few situations:
 +
 +   The more obvious case is macros, like MODULE_PARM_DESC, invoked at
 +   file-scope, where C disallows code (it must be in functions).  See
 +   $exceptions if you have one to add by name.
 +
 +   More troublesome is declarative macros used at top of new scope,
 +   like DECLARE_PER_CPU.  These might just compile with a do-while-0
 +   wrapper, but would be incorrect.  Most of these are handled by
 +   detecting struct,union,etc declaration primitives in $exceptions.
 +
 +   Theres also macros called inside an if (block), which "return" an
 +   expression.  These cannot do-while, and need a ({}) wrapper.
 +
 +   Enjoy this qualification while we work to improve our heuristics.
 +};
 +
  sub uniq {
        my %seen;
        return grep { !$seen{$_}++ } @_;
@@@ -4822,7 -4804,7 +4822,7 @@@ sub process 
                }
  
  # do not use BUG() or variants
-               if ($line =~ 
/\b(?!AA_|BUILD_|DCCP_|IDA_|KVM_|RWLOCK_|snd_|SPIN_)(?:[a-zA-Z_]*_)?BUG(?:_ON)?(?:_[A-Z_]+)?\s*\(/)
 {
+               if ($line =~ 
/\b(?!AA_|BUILD_|IDA_|KVM_|RWLOCK_|snd_|SPIN_)(?:[a-zA-Z_]*_)?BUG(?:_ON)?(?:_[A-Z_]+)?\s*\(/)
 {
                        my $msg_level = \&WARN;
                        $msg_level = \&CHK if ($file);
                        &{$msg_level}("AVOID_BUG",
@@@ -5901,9 -5883,9 +5901,9 @@@
                        }
                }
  
 -# multi-statement macros should be enclosed in a do while loop, grab the
 -# first statement and ensure its the whole macro if its not enclosed
 -# in a known good container
 +# Usually multi-statement macros should be enclosed in a do {} while
 +# (0) loop.  Grab the first statement and ensure its the whole macro
 +# if its not enclosed in a known good container
                if ($realfile !~ m@/vmlinux.lds.h$@ &&
                    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
                        my $ln = $linenr;
@@@ -5956,13 -5938,10 +5956,13 @@@
  
                        my $exceptions = qr{
                                $Declare|
 +                              # named exceptions
                                module_param_named|
                                MODULE_PARM_DESC|
                                DECLARE_PER_CPU|
                                DEFINE_PER_CPU|
 +                              static_assert|
 +                              # declaration primitives
                                __typeof__\(|
                                union|
                                struct|
@@@ -5997,11 -5976,11 +5997,11 @@@
                                        
ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
                                              "Macros starting with if should 
be enclosed by a do - while loop to avoid possible if/else logic defects\n" . 
"$herectx");
                                } elsif ($dstat =~ /;/) {
 -                                      
ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
 -                                            "Macros with multiple statements 
should be enclosed in a do - while loop\n" . "$herectx");
 +                                      
WARN("MULTISTATEMENT_MACRO_USE_DO_WHILE",
 +                                            "Non-declarative macros with 
multiple statements should be enclosed in a do - while loop\n" . "$herectx\nBUT 
SEE:\n$DO_WHILE_0_ADVICE");
                                } else {
                                        ERROR("COMPLEX_MACRO",
 -                                            "Macros with complex values 
should be enclosed in parentheses\n" . "$herectx");
 +                                            "Macros with complex values 
should be enclosed in parentheses\n" . "$herectx\nBUT 
SEE:\n$DO_WHILE_0_ADVICE");
                                }
  
                        }
@@@ -6045,7 -6024,7 +6045,7 @@@
                                }
  
  # check if this is an unused argument
 -                              if ($define_stmt !~ /\b$arg\b/) {
 +                              if ($define_stmt !~ /\b$arg\b/ && $define_stmt) 
{
                                        WARN("MACRO_ARG_UNUSED",
                                             "Argument '$arg' is not used in 
function-like macro\n" . "$herectx");
                                }

-- 
LinuxNextTracking

Reply via email to