The following commit has been merged in the master branch:
commit 521e23e0a4591e8e0734dd90732e3526822069af
Merge: 34c8b507d2b64e7b2e90fe7e0b8e2f9a4373aa8c
e39d14a760c039af0653e3df967e7525413924a0
Author: Stephen Rothwell <[email protected]>
Date: Tue May 13 13:05:15 2025 +1000
Merge branch 'main' of
git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
# Conflicts:
# MAINTAINERS
# drivers/infiniband/hw/irdma/main.c
diff --combined MAINTAINERS
index ae29f6c95c4cd,800d23264c94b..e6acb2514cea2
--- 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)
@@@ -6011,9 -5983,7 +6011,9 @@@ S: Supporte
T: git git://git.kernel.org/pub/scm/linux/kernel/git/a.hindborg/linux.git
configfs-next
F: fs/configfs/
F: include/linux/configfs.h
+F: rust/kernel/configfs.rs
F: samples/configfs/
+F: samples/rust/rust_configfs.rs
CONGATEC BOARD CONTROLLER MFD DRIVER
M: Thomas Richard <[email protected]>
@@@ -6178,7 -6148,6 +6178,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
@@@ -6192,7 -6161,6 +6192,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]>
@@@ -6277,12 -6245,6 +6277,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
@@@ -6593,15 -6555,6 +6593,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]
@@@ -8878,7 -8831,6 +8869,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
@@@ -9426,6 -9378,7 +9417,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]>
@@@ -9776,7 -9729,7 +9768,7 @@@ L: [email protected]
S: Maintained
W: https://github.com/libfuse/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git
-F: Documentation/filesystems/fuse.rst
+F: Documentation/filesystems/fuse*
F: fs/fuse/
F: include/uapi/linux/fuse.h
@@@ -10186,13 -10139,6 +10178,13 @@@ F: drivers/gpio/gpio-regmap.
F: include/linux/gpio/regmap.h
K: (devm_)?gpio_regmap_(un)?register
+GPIO SLOPPY LOGIC ANALYZER
+M: Wolfram Sang <[email protected]>
+S: Supported
+F: Documentation/dev-tools/gpio-sloppy-logic-analyzer.rst
+F: drivers/gpio/gpio-sloppy-logic-analyzer.c
+F: tools/gpio/gpio-sloppy-logic-analyzer.sh
+
GPIO SUBSYSTEM
M: Linus Walleij <[email protected]>
M: Bartosz Golaszewski <[email protected]>
@@@ -10789,7 -10735,6 +10781,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]>
@@@ -11284,6 -11229,7 +11276,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
@@@ -11956,7 -11902,7 +11948,7 @@@ F: Documentation/networking/device_driv
F: drivers/net/ethernet/intel/
F: drivers/net/ethernet/intel/*/
F: include/linux/avf/virtchnl.h
- F: include/linux/net/intel/iidc.h
+ F: include/linux/net/intel/*/
INTEL ETHERNET PROTOCOL DRIVER FOR RDMA
M: Mustafa Ismail <[email protected]>
@@@ -12186,7 -12132,7 +12178,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
@@@ -12955,7 -12901,7 +12947,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]>
@@@ -13186,17 -13132,6 +13178,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]
@@@ -14061,15 -13996,6 +14053,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]
@@@ -14538,7 -14464,7 +14530,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
@@@ -14700,6 -14626,7 +14692,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
@@@ -14864,7 -14791,7 +14856,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
@@@ -14985,7 -14912,7 +14977,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
@@@ -15138,7 -15065,7 +15130,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
@@@ -15503,7 -15430,6 +15495,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
@@@ -15562,45 -15488,24 +15554,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]>
@@@ -15609,18 -15514,6 +15601,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]>
@@@ -15646,19 -15539,6 +15638,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]>
@@@ -15667,30 -15547,6 +15659,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]>
@@@ -15704,19 -15560,6 +15696,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]>
@@@ -15736,10 -15579,7 +15728,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
@@@ -16714,7 -16554,7 +16706,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
@@@ -17437,7 -17277,6 +17429,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
@@@ -18033,23 -17872,6 +18025,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]
@@@ -18172,7 -17994,7 +18164,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
@@@ -18188,7 -18010,7 +18180,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
@@@ -18229,7 -18051,7 +18221,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
@@@ -18375,6 -18197,17 +18367,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]>
@@@ -18399,7 -18232,6 +18402,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]>
@@@ -18435,7 -18267,6 +18438,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
@@@ -18547,7 -18378,7 +18550,7 @@@ F: include/uapi/linux/ppdev.
PARAVIRT_OPS INTERFACE
M: Juergen Gross <[email protected]>
R: Ajay Kaher <[email protected]>
-R: Alexey Makhalov <[email protected]>
+R: Alexey Makhalov <[email protected]>
R: Broadcom internal kernel review list
<[email protected]>
L: [email protected]
L: [email protected]
@@@ -18613,13 -18444,6 +18616,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
@@@ -18663,7 -18487,7 +18666,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
@@@ -18833,7 -18657,7 +18836,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
@@@ -18884,7 -18708,7 +18887,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]
@@@ -19140,7 -18964,7 +19143,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
@@@ -20233,7 -20057,6 +20236,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
@@@ -20295,8 -20118,8 +20298,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]
@@@ -20879,14 -20702,14 +20882,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]
@@@ -21099,7 -20922,6 +21110,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
@@@ -21107,10 -20929,8 +21118,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
@@@ -22515,7 -22335,7 +22526,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]>
@@@ -22758,7 -22578,7 +22769,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
@@@ -22818,9 -22638,8 +22829,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
@@@ -22840,7 -22659,7 +22851,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
@@@ -23051,6 -22870,7 +23062,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
@@@ -23164,12 -22984,6 +23175,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]
@@@ -23183,22 -22997,6 +23194,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]>
@@@ -23757,13 -23555,6 +23768,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]
@@@ -23819,15 -23610,6 +23830,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]
@@@ -23934,7 -23716,6 +23945,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
@@@ -24526,13 -24307,6 +24537,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]
@@@ -24779,7 -24553,7 +24790,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
@@@ -24821,7 -24595,6 +24832,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
@@@ -25622,8 -25395,6 +25633,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
@@@ -26077,14 -25848,13 +26088,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]
@@@ -26102,7 -25872,7 +26113,7 @@@ F: drivers/misc/vmw_balloon.
VMWARE HYPERVISOR INTERFACE
M: Ajay Kaher <[email protected]>
-M: Alexey Makhalov <[email protected]>
+M: Alexey Makhalov <[email protected]>
R: Broadcom internal kernel review list
<[email protected]>
L: [email protected]
L: [email protected]
@@@ -26130,7 -25900,7 +26141,7 @@@ F: drivers/scsi/vmw_pvscsi.
VMWARE VIRTUAL PTP CLOCK DRIVER
M: Nick Shi <[email protected]>
R: Ajay Kaher <[email protected]>
-R: Alexey Makhalov <[email protected]>
+R: Alexey Makhalov <[email protected]>
R: Broadcom internal kernel review list
<[email protected]>
L: [email protected]
S: Supported
diff --combined drivers/infiniband/hw/irdma/main.c
index 7599e31b57436,abb532bc8ce4d..1e840bbd619d2
--- a/drivers/infiniband/hw/irdma/main.c
+++ b/drivers/infiniband/hw/irdma/main.c
@@@ -1,10 -1,8 +1,8 @@@
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/* Copyright (c) 2015 - 2021 Intel Corporation */
#include "main.h"
- #include "../../../net/ethernet/intel/ice/ice.h"
MODULE_ALIAS("i40iw");
- MODULE_AUTHOR("Intel Corporation, <[email protected]>");
MODULE_DESCRIPTION("Intel(R) Ethernet Protocol Driver for RDMA");
MODULE_LICENSE("Dual BSD/GPL");
@@@ -61,7 -59,7 +59,7 @@@ static void irdma_log_invalid_mtu(u16 m
}
static void irdma_fill_qos_info(struct irdma_l2params *l2params,
- struct iidc_qos_params *qos_info)
+ struct iidc_rdma_qos_params *qos_info)
{
int i;
@@@ -85,12 -83,13 +83,13 @@@
}
}
- static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event
*event)
+ static void irdma_iidc_event_handler(struct iidc_rdma_core_dev_info
*cdev_info,
+ struct iidc_rdma_event *event)
{
- struct irdma_device *iwdev = dev_get_drvdata(&pf->adev->dev);
+ struct irdma_device *iwdev = dev_get_drvdata(&cdev_info->adev->dev);
struct irdma_l2params l2params = {};
- if (*event->type & BIT(IIDC_EVENT_AFTER_MTU_CHANGE)) {
+ if (*event->type & BIT(IIDC_RDMA_EVENT_AFTER_MTU_CHANGE)) {
ibdev_dbg(&iwdev->ibdev, "CLNT: new MTU = %d\n",
iwdev->netdev->mtu);
if (iwdev->vsi.mtu != iwdev->netdev->mtu) {
l2params.mtu = iwdev->netdev->mtu;
@@@ -98,25 -97,26 +97,26 @@@
irdma_log_invalid_mtu(l2params.mtu, &iwdev->rf->sc_dev);
irdma_change_l2params(&iwdev->vsi, &l2params);
}
- } else if (*event->type & BIT(IIDC_EVENT_BEFORE_TC_CHANGE)) {
+ } else if (*event->type & BIT(IIDC_RDMA_EVENT_BEFORE_TC_CHANGE)) {
if (iwdev->vsi.tc_change_pending)
return;
irdma_prep_tc_change(iwdev);
- } else if (*event->type & BIT(IIDC_EVENT_AFTER_TC_CHANGE)) {
- struct iidc_qos_params qos_info = {};
+ } else if (*event->type & BIT(IIDC_RDMA_EVENT_AFTER_TC_CHANGE)) {
+ struct iidc_rdma_priv_dev_info *iidc_priv =
cdev_info->iidc_priv;
if (!iwdev->vsi.tc_change_pending)
return;
l2params.tc_changed = true;
ibdev_dbg(&iwdev->ibdev, "CLNT: TC Change\n");
- ice_get_qos_params(pf, &qos_info);
- irdma_fill_qos_info(&l2params, &qos_info);
+
+ irdma_fill_qos_info(&l2params, &iidc_priv->qos_info);
if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
- iwdev->dcb_vlan_mode = qos_info.num_tc > 1 &&
!l2params.dscp_mode;
+ iwdev->dcb_vlan_mode =
+ l2params.num_tc > 1 && !l2params.dscp_mode;
irdma_change_l2params(&iwdev->vsi, &l2params);
- } else if (*event->type & BIT(IIDC_EVENT_CRIT_ERR)) {
+ } else if (*event->type & BIT(IIDC_RDMA_EVENT_CRIT_ERR)) {
ibdev_warn(&iwdev->ibdev, "ICE OICR event notification: oicr =
0x%08x\n",
event->reg);
if (event->reg & IRDMAPFINT_OICR_PE_CRITERR_M) {
@@@ -151,10 -151,8 +151,8 @@@
*/
static void irdma_request_reset(struct irdma_pci_f *rf)
{
- struct ice_pf *pf = rf->cdev;
-
ibdev_warn(&rf->iwdev->ibdev, "Requesting a reset\n");
- ice_rdma_request_reset(pf, IIDC_PFR);
+ ice_rdma_request_reset(rf->cdev, IIDC_FUNC_RESET);
}
/**
@@@ -166,14 -164,15 +164,15 @@@ static int irdma_lan_register_qset(stru
struct irdma_ws_node *tc_node)
{
struct irdma_device *iwdev = vsi->back_vsi;
- struct ice_pf *pf = iwdev->rf->cdev;
+ struct iidc_rdma_core_dev_info *cdev_info;
struct iidc_rdma_qset_params qset = {};
int ret;
+ cdev_info = iwdev->rf->cdev;
qset.qs_handle = tc_node->qs_handle;
qset.tc = tc_node->traffic_class;
qset.vport_id = vsi->vsi_idx;
- ret = ice_add_rdma_qset(pf, &qset);
+ ret = ice_add_rdma_qset(cdev_info, &qset);
if (ret) {
ibdev_dbg(&iwdev->ibdev, "WS: LAN alloc_res for rdma qset
failed.\n");
return ret;
@@@ -194,19 -193,20 +193,20 @@@ static void irdma_lan_unregister_qset(s
struct irdma_ws_node *tc_node)
{
struct irdma_device *iwdev = vsi->back_vsi;
- struct ice_pf *pf = iwdev->rf->cdev;
+ struct iidc_rdma_core_dev_info *cdev_info;
struct iidc_rdma_qset_params qset = {};
+ cdev_info = iwdev->rf->cdev;
qset.qs_handle = tc_node->qs_handle;
qset.tc = tc_node->traffic_class;
qset.vport_id = vsi->vsi_idx;
qset.teid = tc_node->l2_sched_node_id;
- if (ice_del_rdma_qset(pf, &qset))
+ if (ice_del_rdma_qset(cdev_info, &qset))
ibdev_dbg(&iwdev->ibdev, "WS: LAN free_res for rdma qset
failed.\n");
}
- static int irdma_init_interrupts(struct irdma_pci_f *rf, struct ice_pf *pf)
+ static int irdma_init_interrupts(struct irdma_pci_f *rf, struct
iidc_rdma_core_dev_info *cdev)
{
int i;
@@@ -217,12 -217,12 +217,12 @@@
return -ENOMEM;
for (i = 0; i < rf->msix_count; i++)
- if (ice_alloc_rdma_qvector(pf, &rf->msix_entries[i]))
+ if (ice_alloc_rdma_qvector(cdev, &rf->msix_entries[i]))
break;
if (i < IRDMA_MIN_MSIX) {
- for (; i > 0; i--)
+ while (--i >= 0)
- ice_free_rdma_qvector(pf, &rf->msix_entries[i]);
+ ice_free_rdma_qvector(cdev, &rf->msix_entries[i]);
kfree(rf->msix_entries);
return -ENOMEM;
@@@ -233,56 -233,63 +233,65 @@@
return 0;
}
- static void irdma_deinit_interrupts(struct irdma_pci_f *rf, struct ice_pf *pf)
+ static void irdma_deinit_interrupts(struct irdma_pci_f *rf, struct
iidc_rdma_core_dev_info *cdev)
{
int i;
for (i = 0; i < rf->msix_count; i++)
- ice_free_rdma_qvector(pf, &rf->msix_entries[i]);
+ ice_free_rdma_qvector(cdev, &rf->msix_entries[i]);
kfree(rf->msix_entries);
}
static void irdma_remove(struct auxiliary_device *aux_dev)
{
- struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev,
- struct
iidc_auxiliary_dev,
- adev);
- struct ice_pf *pf = iidc_adev->pf;
struct irdma_device *iwdev = auxiliary_get_drvdata(aux_dev);
+ struct iidc_rdma_core_auxiliary_dev *iidc_adev;
+ struct iidc_rdma_core_dev_info *cdev_info;
+
+ iidc_adev = container_of(aux_dev, struct iidc_rdma_core_auxiliary_dev,
adev);
+ cdev_info = iidc_adev->cdev_info;
+ ice_rdma_update_vsi_filter(cdev_info, iwdev->vsi_num, false);
irdma_ib_unregister_device(iwdev);
- ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, false);
- irdma_deinit_interrupts(iwdev->rf, pf);
+ irdma_deinit_interrupts(iwdev->rf, cdev_info);
+ kfree(iwdev->rf);
+
- pr_debug("INIT: Gen2 PF[%d] device remove success\n",
PCI_FUNC(pf->pdev->devfn));
+ pr_debug("INIT: Gen2 PF[%d] device remove success\n",
PCI_FUNC(cdev_info->pdev->devfn));
}
- static void irdma_fill_device_info(struct irdma_device *iwdev, struct ice_pf
*pf,
- struct ice_vsi *vsi)
+ static void irdma_fill_device_info(struct irdma_device *iwdev,
+ struct iidc_rdma_core_dev_info *cdev_info)
{
+ struct iidc_rdma_priv_dev_info *iidc_priv = cdev_info->iidc_priv;
struct irdma_pci_f *rf = iwdev->rf;
- rf->cdev = pf;
+ rf->sc_dev.hw = &rf->hw;
+ rf->iwdev = iwdev;
+ rf->cdev = cdev_info;
+ rf->hw.hw_addr = iidc_priv->hw_addr;
+ rf->pcidev = cdev_info->pdev;
+ rf->hw.device = &rf->pcidev->dev;
+ rf->pf_id = iidc_priv->pf_id;
rf->gen_ops.register_qset = irdma_lan_register_qset;
rf->gen_ops.unregister_qset = irdma_lan_unregister_qset;
- rf->hw.hw_addr = pf->hw.hw_addr;
- rf->pcidev = pf->pdev;
- rf->pf_id = pf->hw.pf_id;
- rf->default_vsi.vsi_idx = vsi->vsi_num;
- rf->protocol_used = pf->rdma_mode & IIDC_RDMA_PROTOCOL_ROCEV2 ?
- IRDMA_ROCE_PROTOCOL_ONLY :
IRDMA_IWARP_PROTOCOL_ONLY;
+
+ rf->default_vsi.vsi_idx = iidc_priv->vport_id;
+ rf->protocol_used =
+ cdev_info->rdma_protocol == IIDC_RDMA_PROTOCOL_ROCEV2 ?
+ IRDMA_ROCE_PROTOCOL_ONLY : IRDMA_IWARP_PROTOCOL_ONLY;
rf->rdma_ver = IRDMA_GEN_2;
rf->rsrc_profile = IRDMA_HMC_PROFILE_DEFAULT;
rf->rst_to = IRDMA_RST_TIMEOUT_HZ;
rf->gen_ops.request_reset = irdma_request_reset;
rf->limits_sel = 7;
rf->iwdev = iwdev;
+
mutex_init(&iwdev->ah_tbl_lock);
- iwdev->netdev = vsi->netdev;
- iwdev->vsi_num = vsi->vsi_num;
+
+ iwdev->netdev = iidc_priv->netdev;
+ iwdev->vsi_num = iidc_priv->vport_id;
iwdev->init_state = INITIAL_STATE;
iwdev->roce_cwnd = IRDMA_ROCE_CWND_DEFAULT;
iwdev->roce_ackcreds = IRDMA_ROCE_ACKCREDS_DEFAULT;
@@@ -294,19 -301,18 +303,18 @@@
static int irdma_probe(struct auxiliary_device *aux_dev, const struct
auxiliary_device_id *id)
{
- struct iidc_auxiliary_dev *iidc_adev = container_of(aux_dev,
- struct
iidc_auxiliary_dev,
- adev);
- struct ice_pf *pf = iidc_adev->pf;
- struct ice_vsi *vsi = ice_get_main_vsi(pf);
- struct iidc_qos_params qos_info = {};
+ struct iidc_rdma_core_auxiliary_dev *iidc_adev;
+ struct iidc_rdma_core_dev_info *cdev_info;
+ struct iidc_rdma_priv_dev_info *iidc_priv;
+ struct irdma_l2params l2params = {};
struct irdma_device *iwdev;
struct irdma_pci_f *rf;
- struct irdma_l2params l2params = {};
int err;
- if (!vsi)
- return -EIO;
+ iidc_adev = container_of(aux_dev, struct iidc_rdma_core_auxiliary_dev,
adev);
+ cdev_info = iidc_adev->cdev_info;
+ iidc_priv = cdev_info->iidc_priv;
+
iwdev = ib_alloc_device(irdma_device, ibdev);
if (!iwdev)
return -ENOMEM;
@@@ -316,10 -322,10 +324,10 @@@
return -ENOMEM;
}
- irdma_fill_device_info(iwdev, pf, vsi);
+ irdma_fill_device_info(iwdev, cdev_info);
rf = iwdev->rf;
- err = irdma_init_interrupts(rf, pf);
+ err = irdma_init_interrupts(rf, cdev_info);
if (err)
goto err_init_interrupts;
@@@ -328,8 -334,7 +336,7 @@@
goto err_ctrl_init;
l2params.mtu = iwdev->netdev->mtu;
- ice_get_qos_params(pf, &qos_info);
- irdma_fill_qos_info(&l2params, &qos_info);
+ irdma_fill_qos_info(&l2params, &iidc_priv->qos_info);
if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
iwdev->dcb_vlan_mode = l2params.num_tc > 1 &&
!l2params.dscp_mode;
@@@ -341,7 -346,7 +348,7 @@@
if (err)
goto err_ibreg;
- ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, true);
+ ice_rdma_update_vsi_filter(cdev_info, iwdev->vsi_num, true);
ibdev_dbg(&iwdev->ibdev, "INIT: Gen2 PF[%d] device probe success\n",
PCI_FUNC(rf->pcidev->devfn));
auxiliary_set_drvdata(aux_dev, iwdev);
@@@ -353,7 -358,7 +360,7 @@@ err_ibreg
err_rt_init:
irdma_ctrl_deinit_hw(rf);
err_ctrl_init:
- irdma_deinit_interrupts(rf, pf);
+ irdma_deinit_interrupts(rf, cdev_info);
err_init_interrupts:
kfree(iwdev->rf);
ib_dealloc_device(&iwdev->ibdev);
@@@ -369,7 -374,7 +376,7 @@@ static const struct auxiliary_device_i
MODULE_DEVICE_TABLE(auxiliary, irdma_auxiliary_id_table);
- static struct iidc_auxiliary_drv irdma_auxiliary_drv = {
+ static struct iidc_rdma_core_auxiliary_drv irdma_auxiliary_drv = {
.adrv = {
.id_table = irdma_auxiliary_id_table,
.probe = irdma_probe,
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");
}
diff --combined tools/testing/selftests/Makefile
index 80fb84fa3cfcb,61bb8bf1b5074..a0a6ba47d6006
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@@ -71,6 -71,7 +71,7 @@@ TARGETS += net/hs
TARGETS += net/mptcp
TARGETS += net/netfilter
TARGETS += net/openvswitch
+ TARGETS += net/ovpn
TARGETS += net/packetdrill
TARGETS += net/rds
TARGETS += net/tcp_ao
@@@ -121,7 -122,6 +122,7 @@@ TARGETS += user_event
TARGETS += vDSO
TARGETS += mm
TARGETS += x86
+TARGETS += x86/bugs
TARGETS += zram
#Please keep the TARGETS list alphabetically sorted
# Run "make quicktest=1 run_tests" or
--
LinuxNextTracking