Merge tag 'net-next-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 26 Apr 2023 23:07:23 +0000 (16:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 26 Apr 2023 23:07:23 +0000 (16:07 -0700)
Pull networking updates from Paolo Abeni:
 "Core:

   - Introduce a config option to tweak MAX_SKB_FRAGS. Increasing the
     default value allows for better BIG TCP performances

   - Reduce compound page head access for zero-copy data transfers

   - RPS/RFS improvements, avoiding unneeded NET_RX_SOFTIRQ when
     possible

   - Threaded NAPI improvements, adding defer skb free support and
     unneeded softirq avoidance

   - Address dst_entry reference count scalability issues, via false
     sharing avoidance and optimize refcount tracking

   - Add lockless accesses annotation to sk_err[_soft]

   - Optimize again the skb struct layout

   - Extends the skb drop reasons to make it usable by multiple
     subsystems

   - Better const qualifier awareness for socket casts

  BPF:

   - Add skb and XDP typed dynptrs which allow BPF programs for more
     ergonomic and less brittle iteration through data and
     variable-sized accesses

   - Add a new BPF netfilter program type and minimal support to hook
     BPF programs to netfilter hooks such as prerouting or forward

   - Add more precise memory usage reporting for all BPF map types

   - Adds support for using {FOU,GUE} encap with an ipip device
     operating in collect_md mode and add a set of BPF kfuncs for
     controlling encap params

   - Allow BPF programs to detect at load time whether a particular
     kfunc exists or not, and also add support for this in light
     skeleton

   - Bigger batch of BPF verifier improvements to prepare for upcoming
     BPF open-coded iterators allowing for less restrictive looping
     capabilities

   - Rework RCU enforcement in the verifier, add kptr_rcu and enforce
     BPF programs to NULL-check before passing such pointers into kfunc

   - Add support for kptrs in percpu hashmaps, percpu LRU hashmaps and
     in local storage maps

   - Enable RCU semantics for task BPF kptrs and allow referenced kptr
     tasks to be stored in BPF maps

   - Add support for refcounted local kptrs to the verifier for allowing
     shared ownership, useful for adding a node to both the BPF list and
     rbtree

   - Add BPF verifier support for ST instructions in
     convert_ctx_access() which will help new -mcpu=v4 clang flag to
     start emitting them

   - Add ARM32 USDT support to libbpf

   - Improve bpftool's visual program dump which produces the control
     flow graph in a DOT format by adding C source inline annotations

  Protocols:

   - IPv4: Allow adding to IPv4 address a 'protocol' tag. Such value
     indicates the provenance of the IP address

   - IPv6: optimize route lookup, dropping unneeded R/W lock acquisition

   - Add the handshake upcall mechanism, allowing the user-space to
     implement generic TLS handshake on kernel's behalf

   - Bridge: support per-{Port, VLAN} neighbor suppression, increasing
     resilience to nodes failures

   - SCTP: add support for Fair Capacity and Weighted Fair Queueing
     schedulers

   - MPTCP: delay first subflow allocation up to its first usage. This
     will allow for later better LSM interaction

   - xfrm: Remove inner/outer modes from input/output path. These are
     not needed anymore

   - WiFi:
      - reduced neighbor report (RNR) handling for AP mode
      - HW timestamping support
      - support for randomized auth/deauth TA for PASN privacy
      - per-link debugfs for multi-link
      - TC offload support for mac80211 drivers
      - mac80211 mesh fast-xmit and fast-rx support
      - enable Wi-Fi 7 (EHT) mesh support

  Netfilter:

   - Add nf_tables 'brouting' support, to force a packet to be routed
     instead of being bridged

   - Update bridge netfilter and ovs conntrack helpers to handle IPv6
     Jumbo packets properly, i.e. fetch the packet length from
     hop-by-hop extension header. This is needed for BIT TCP support

   - The iptables 32bit compat interface isn't compiled in by default
     anymore

   - Move ip(6)tables builtin icmp matches to the udptcp one. This has
     the advantage that icmp/icmpv6 match doesn't load the
     iptables/ip6tables modules anymore when iptables-nft is used

   - Extended netlink error report for netdevice in flowtables and
     netdev/chains. Allow for incrementally add/delete devices to netdev
     basechain. Allow to create netdev chain without device

  Driver API:

   - Remove redundant Device Control Error Reporting Enable, as PCI core
     has already error reporting enabled at enumeration time

   - Move Multicast DB netlink handlers to core, allowing devices other
     then bridge to use them

   - Allow the page_pool to directly recycle the pages from safely
     localized NAPI

   - Implement lockless TX queue stop/wake combo macros, allowing for
     further code de-duplication and sanitization

   - Add YNL support for user headers and struct attrs

   - Add partial YNL specification for devlink

   - Add partial YNL specification for ethtool

   - Add tc-mqprio and tc-taprio support for preemptible traffic classes

   - Add tx push buf len param to ethtool, specifies the maximum number
     of bytes of a transmitted packet a driver can push directly to the
     underlying device

   - Add basic LED support for switch/phy

   - Add NAPI documentation, stop relaying on external links

   - Convert dsa_master_ioctl() to netdev notifier. This is a
     preparatory work to make the hardware timestamping layer selectable
     by user space

   - Add transceiver support and improve the error messages for CAN-FD
     controllers

  New hardware / drivers:

   - Ethernet:
      - AMD/Pensando core device support
      - MediaTek MT7981 SoC
      - MediaTek MT7988 SoC
      - Broadcom BCM53134 embedded switch
      - Texas Instruments CPSW9G ethernet switch
      - Qualcomm EMAC3 DWMAC ethernet
      - StarFive JH7110 SoC
      - NXP CBTX ethernet PHY

   - WiFi:
      - Apple M1 Pro/Max devices
      - RealTek rtl8710bu/rtl8188gu
      - RealTek rtl8822bs, rtl8822cs and rtl8821cs SDIO chipset

   - Bluetooth:
      - Realtek RTL8821CS, RTL8851B, RTL8852BS
      - Mediatek MT7663, MT7922
      - NXP w8997
      - Actions Semi ATS2851
      - QTI WCN6855
      - Marvell 88W8997

   - Can:
      - STMicroelectronics bxcan stm32f429

  Drivers:

   - Ethernet NICs:
      - Intel (1G, icg):
         - add tracking and reporting of QBV config errors
         - add support for configuring max SDU for each Tx queue
      - Intel (100G, ice):
         - refactor mailbox overflow detection to support Scalable IOV
         - GNSS interface optimization
      - Intel (i40e):
         - support XDP multi-buffer
      - nVidia/Mellanox:
         - add the support for linux bridge multicast offload
         - enable TC offload for egress and engress MACVLAN over bond
         - add support for VxLAN GBP encap/decap flows offload
         - extend packet offload to fully support libreswan
         - support tunnel mode in mlx5 IPsec packet offload
         - extend XDP multi-buffer support
         - support MACsec VLAN offload
         - add support for dynamic msix vectors allocation
         - drop RX page_cache and fully use page_pool
         - implement thermal zone to report NIC temperature
      - Netronome/Corigine:
         - add support for multi-zone conntrack offload
      - Solarflare/Xilinx:
         - support offloading TC VLAN push/pop actions to the MAE
         - support TC decap rules
         - support unicast PTP

   - Other NICs:
      - Broadcom (bnxt): enforce software based freq adjustments only on
        shared PHC NIC
      - RealTek (r8169): refactor to addess ASPM issues during NAPI poll
      - Micrel (lan8841): add support for PTP_PF_PEROUT
      - Cadence (macb): enable PTP unicast
      - Engleder (tsnep): add XDP socket zero-copy support
      - virtio-net: implement exact header length guest feature
      - veth: add page_pool support for page recycling
      - vxlan: add MDB data path support
      - gve: add XDP support for GQI-QPL format
      - geneve: accept every ethertype
      - macvlan: allow some packets to bypass broadcast queue
      - mana: add support for jumbo frame

   - Ethernet high-speed switches:
      - Microchip (sparx5): Add support for TC flower templates

   - Ethernet embedded switches:
      - Broadcom (b54):
         - configure 6318 and 63268 RGMII ports
      - Marvell (mv88e6xxx):
         - faster C45 bus scan
      - Microchip:
         - lan966x:
            - add support for IS1 VCAP
            - better TX/RX from/to CPU performances
         - ksz9477: add ETS Qdisc support
         - ksz8: enhance static MAC table operations and error handling
         - sama7g5: add PTP capability
      - NXP (ocelot):
         - add support for external ports
         - add support for preemptible traffic classes
      - Texas Instruments:
         - add CPSWxG SGMII support for J7200 and J721E

   - Intel WiFi (iwlwifi):
      - preparation for Wi-Fi 7 EHT and multi-link support
      - EHT (Wi-Fi 7) sniffer support
      - hardware timestamping support for some devices/firwmares
      - TX beacon protection on newer hardware

   - Qualcomm 802.11ax WiFi (ath11k):
      - MU-MIMO parameters support
      - ack signal support for management packets

   - RealTek WiFi (rtw88):
      - SDIO bus support
      - better support for some SDIO devices (e.g. MAC address from
        efuse)

   - RealTek WiFi (rtw89):
      - HW scan support for 8852b
      - better support for 6 GHz scanning
      - support for various newer firmware APIs
      - framework firmware backwards compatibility

   - MediaTek WiFi (mt76):
      - P2P support
      - mesh A-MSDU support
      - EHT (Wi-Fi 7) support
      - coredump support"

* tag 'net-next-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (2078 commits)
  net: phy: hide the PHYLIB_LEDS knob
  net: phy: marvell-88x2222: remove unnecessary (void*) conversions
  tcp/udp: Fix memleaks of sk and zerocopy skbs with TX timestamp.
  net: amd: Fix link leak when verifying config failed
  net: phy: marvell: Fix inconsistent indenting in led_blink_set
  lan966x: Don't use xdp_frame when action is XDP_TX
  tsnep: Add XDP socket zero-copy TX support
  tsnep: Add XDP socket zero-copy RX support
  tsnep: Move skb receive action to separate function
  tsnep: Add functions for queue enable/disable
  tsnep: Rework TX/RX queue initialization
  tsnep: Replace modulo operation with mask
  net: phy: dp83867: Add led_brightness_set support
  net: phy: Fix reading LED reg property
  drivers: nfc: nfcsim: remove return value check of `dev_dir`
  net: phy: dp83867: Remove unnecessary (void*) conversions
  net: ethtool: coalesce: try to make user settings stick twice
  net: mana: Check if netdev/napi_alloc_frag returns single page
  net: mana: Rename mana_refill_rxoob and remove some empty lines
  net: veth: add page_pool stats
  ...

17 files changed:
1  2 
Documentation/devicetree/bindings/net/ti,k3-am654-cpsw-nuss.yaml
MAINTAINERS
arch/arm/boot/dts/armada-370-rd.dts
arch/mips/Kconfig
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
drivers/net/ieee802154/ca8210.c
drivers/net/tun.c
drivers/net/wireless/intel/iwlwifi/mvm/tt.c
drivers/scsi/cxgbi/libcxgbi.c
fs/dlm/lowcomms.c
include/linux/module.h
include/linux/sched.h
io_uring/rsrc.c
kernel/bpf/bpf_inode_storage.c
kernel/bpf/trampoline.c
kernel/cgroup/cgroup.c

@@@ -54,11 -54,12 +54,12 @@@ properties
  
    compatible:
      enum:
+       - ti,am642-cpsw-nuss
        - ti,am654-cpsw-nuss
        - ti,j7200-cpswxg-nuss
        - ti,j721e-cpsw-nuss
        - ti,j721e-cpswxg-nuss
-       - ti,am642-cpsw-nuss
+       - ti,j784s4-cpswxg-nuss
  
    reg:
      maxItems: 1
              description: CPSW port number
  
            phys:
-             maxItems: 1
-             description: phandle on phy-gmii-sel PHY
+             minItems: 1
+             items:
+               - description: CPSW MAC's PHY.
+               - description: Serdes PHY. Serdes PHY is required only if
+                              the Serdes has to be configured in the
+                              Single-Link configuration.
+           phy-names:
+             minItems: 1
+             items:
+               - const: mac
+               - const: serdes
  
            label:
              description: label associated with this port
@@@ -187,7 -198,9 +198,9 @@@ allOf
          properties:
            compatible:
              contains:
-               const: ti,j721e-cpswxg-nuss
+               enum:
+                 - ti,j721e-cpswxg-nuss
+                 - ti,j784s4-cpswxg-nuss
      then:
        properties:
          ethernet-ports:
            compatible:
              contains:
                enum:
-                 - ti,j721e-cpswxg-nuss
                  - ti,j7200-cpswxg-nuss
+                 - ti,j721e-cpswxg-nuss
+                 - ti,j784s4-cpswxg-nuss
      then:
        properties:
          ethernet-ports:
@@@ -222,6 -236,7 +236,6 @@@ additionalProperties: fals
  
  examples:
    - |
 -    #include <dt-bindings/pinctrl/k3.h>
      #include <dt-bindings/soc/ti,sci_pm_domain.h>
      #include <dt-bindings/net/ti-dp83867.h>
      #include <dt-bindings/interrupt-controller/irq.h>
diff --combined MAINTAINERS
@@@ -1041,6 -1041,15 +1041,15 @@@ F:    drivers/gpu/drm/amd/include/vi_struc
  F:    include/uapi/linux/kfd_ioctl.h
  F:    include/uapi/linux/kfd_sysfs.h
  
+ AMD PDS CORE DRIVER
+ M:    Shannon Nelson <shannon.nelson@amd.com>
+ M:    Brett Creeley <brett.creeley@amd.com>
+ L:    netdev@vger.kernel.org
+ S:    Supported
+ F:    Documentation/networking/device_drivers/ethernet/amd/pds_core.rst
+ F:    drivers/net/ethernet/amd/pds_core/
+ F:    include/linux/pds/
  AMD SPI DRIVER
  M:    Sanjay R Mehta <sanju.mehta@amd.com>
  S:    Maintained
@@@ -1071,7 -1080,7 +1080,7 @@@ M:      Naveen Krishna Chatradhi <naveenkris
  R:    Carlos Bilbao <carlos.bilbao@amd.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
 -F:    Documentation/x86/amd_hsmp.rst
 +F:    Documentation/arch/x86/amd_hsmp.rst
  F:    arch/x86/include/asm/amd_hsmp.h
  F:    arch/x86/include/uapi/asm/amd_hsmp.h
  F:    drivers/platform/x86/amd/hsmp.c
@@@ -1227,6 -1236,12 +1236,6 @@@ F:     Documentation/devicetree/bindings/ii
  F:    drivers/iio/addac/ad74413r.c
  F:    include/dt-bindings/iio/addac/adi,ad74413r.h
  
 -ANALOG DEVICES INC AD9389B DRIVER
 -M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
 -L:    linux-media@vger.kernel.org
 -S:    Maintained
 -F:    drivers/media/i2c/ad9389b*
 -
  ANALOG DEVICES INC ADA4250 DRIVER
  M:    Antoniu Miclaus <antoniu.miclaus@analog.com>
  L:    linux-iio@vger.kernel.org
@@@ -2269,7 -2284,7 +2278,7 @@@ F:      arch/arm/boot/dts/intel-ixp
  F:    arch/arm/mach-ixp4xx/
  F:    drivers/bus/intel-ixp4xx-eb.c
  F:    drivers/clocksource/timer-ixp4xx.c
 -F:    drivers/crypto/ixp4xx_crypto.c
 +F:    drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
  F:    drivers/gpio/gpio-ixp4xx.c
  F:    drivers/irqchip/irq-ixp4xx.c
  
@@@ -2598,12 -2613,6 +2607,12 @@@ F:    include/dt-bindings/*/qcom
  F:    include/linux/*/qcom*
  F:    include/linux/soc/qcom/
  
 +ARM/QUALCOMM CHROMEBOOK SUPPORT
 +R:    cros-qcom-dts-watchers@chromium.org
 +F:    arch/arm64/boot/dts/qcom/sc7180*
 +F:    arch/arm64/boot/dts/qcom/sc7280*
 +F:    arch/arm64/boot/dts/qcom/sdm845-cheza*
 +
  ARM/RDA MICRO ARCHITECTURE
  M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2654,7 -2663,6 +2663,7 @@@ F:      arch/arm64/boot/dts/renesas
  F:    arch/riscv/boot/dts/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
 +K:    \brenesas,
  
  ARM/RISCPC ARCHITECTURE
  M:    Russell King <linux@armlinux.org.uk>
@@@ -4432,6 -4440,13 +4441,13 @@@ S:    Maintaine
  F:    drivers/scsi/BusLogic.*
  F:    drivers/scsi/FlashPoint.*
  
+ BXCAN CAN NETWORK DRIVER
+ M:    Dario Binacchi <dario.binacchi@amarulasolutions.com>
+ L:    linux-can@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/net/can/st,stm32-bxcan.yaml
+ F:    drivers/net/can/bxcan.c
  C-MEDIA CMI8788 DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -5941,6 -5956,11 +5957,6 @@@ F:     drivers/devfreq/event
  F:    include/dt-bindings/pmu/exynos_ppmu.h
  F:    include/linux/devfreq-event.h
  
 -DEVICE NUMBER REGISTRY
 -M:    Torben Mathiasen <device@lanana.org>
 -S:    Maintained
 -W:    http://lanana.org/docs/device-list/index.html
 -
  DEVICE RESOURCE MANAGEMENT HELPERS
  M:    Hans de Goede <hdegoede@redhat.com>
  R:    Matti Vaittinen <mazziesaccount@gmail.com>
@@@ -6203,7 -6223,6 +6219,7 @@@ DOCUMENTATION REPORTING ISSUE
  M:    Thorsten Leemhuis <linux@leemhuis.info>
  L:    linux-doc@vger.kernel.org
  S:    Maintained
 +F:    Documentation/admin-guide/quickly-build-trimmed-linux.rst
  F:    Documentation/admin-guide/reporting-issues.rst
  
  DOCUMENTATION SCRIPTS
@@@ -6515,7 -6534,6 +6531,7 @@@ L:      linux-arm-msm@vger.kernel.or
  L:    dri-devel@lists.freedesktop.org
  L:    freedreno@lists.freedesktop.org
  S:    Maintained
 +B:    https://gitlab.freedesktop.org/drm/msm/-/issues
  T:    git https://gitlab.freedesktop.org/drm/msm.git
  F:    Documentation/devicetree/bindings/display/msm/
  F:    drivers/gpu/drm/msm/
@@@ -6535,13 -6553,6 +6551,13 @@@ T:    git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/panel/sony,acx424akp.yaml
  F:    drivers/gpu/drm/panel/panel-novatek-nt35560.c
  
 +DRM DRIVER FOR NOVATEK NT36523 PANELS
 +M:    Jianhua Lu <lujianhua000@gmail.com>
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/display/panel/novatek,nt36523.yaml
 +F:    drivers/gpu/drm/panel/panel-novatek-nt36523.c
 +
  DRM DRIVER FOR NOVATEK NT36672A PANELS
  M:    Sumit Semwal <sumit.semwal@linaro.org>
  S:    Maintained
@@@ -6622,16 -6633,6 +6638,16 @@@ T:    git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml
  F:    drivers/gpu/drm/panel/panel-samsung-db7430.c
  
 +DRM DRIVER FOR SAMSUNG MIPI DSIM BRIDGE
 +M:    Inki Dae <inki.dae@samsung.com>
 +M:    Jagan Teki <jagan@amarulasolutions.com>
 +M:    Marek Szyprowski <m.szyprowski@samsung.com>
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml
 +F:    drivers/gpu/drm/bridge/samsung-dsim.c
 +F:    include/drm/bridge/samsung-dsim.h
 +
  DRM DRIVER FOR SAMSUNG S6D27A1 PANELS
  M:    Markuss Broks <markuss.broks@gmail.com>
  S:    Maintained
@@@ -6839,7 -6840,6 +6855,7 @@@ S:      Maintaine
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/bridge/
  F:    drivers/gpu/drm/bridge/
 +F:    include/drm/drm_bridge.h
  
  DRM DRIVERS FOR EXYNOS
  M:    Inki Dae <inki.dae@samsung.com>
@@@ -6932,7 -6932,6 +6948,7 @@@ F:      drivers/phy/mediatek/phy-mtk-mipi
  
  DRM DRIVERS FOR NVIDIA TEGRA
  M:    Thierry Reding <thierry.reding@gmail.com>
 +M:    Mikko Perttunen <mperttunen@nvidia.com>
  L:    dri-devel@lists.freedesktop.org
  L:    linux-tegra@vger.kernel.org
  S:    Supported
@@@ -7061,7 -7060,7 +7077,7 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/xlnx/
  
  DRM PANEL DRIVERS
 -M:    Thierry Reding <thierry.reding@gmail.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  R:    Sam Ravnborg <sam@ravnborg.org>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
@@@ -7745,7 -7744,6 +7761,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    Documentation/filesystems/ext4/
  F:    fs/ext4/
  F:    include/trace/events/ext4.h
 +F:    include/uapi/linux/ext4.h
  
  Extended Verification Module (EVM)
  M:    Mimi Zohar <zohar@linux.ibm.com>
@@@ -8436,6 -8434,14 +8452,6 @@@ L:     platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/fujitsu-laptop.c
  
 -FUJITSU M-5MO LS CAMERA ISP DRIVER
 -M:    Kyungmin Park <kyungmin.park@samsung.com>
 -M:    Heungjun Kim <riverful.kim@samsung.com>
 -L:    linux-media@vger.kernel.org
 -S:    Maintained
 -F:    drivers/media/i2c/m5mols/
 -F:    include/media/i2c/m5mols.h
 -
  FUJITSU TABLET EXTRAS
  M:    Robert Gerlach <khnz@gmx.de>
  L:    platform-driver-x86@vger.kernel.org
@@@ -8700,7 -8706,7 +8716,7 @@@ F:      drivers/input/touchscreen/goodix
  
  GOOGLE ETHERNET DRIVERS
  M:    Jeroen de Borst <jeroendb@google.com>
- M:    Catherine Sullivan <csully@google.com>
+ M:    Praveen Kaligineedi <pkaligineedi@google.com>
  R:    Shailend Chand <shailend@google.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -8763,6 -8769,7 +8779,6 @@@ F:      Documentation/admin-guide/gpio
  F:    Documentation/devicetree/bindings/gpio/
  F:    Documentation/driver-api/gpio/
  F:    drivers/gpio/
 -F:    include/asm-generic/gpio.h
  F:    include/dt-bindings/gpio/
  F:    include/linux/gpio.h
  F:    include/linux/gpio/
@@@ -8949,6 -8956,17 +8965,17 @@@ Q:    http://patchwork.linuxtv.org/project
  T:    git git://linuxtv.org/anttip/media_tree.git
  F:    drivers/media/usb/hackrf/
  
+ HANDSHAKE UPCALL FOR TRANSPORT LAYER SECURITY
+ M:    Chuck Lever <chuck.lever@oracle.com>
+ L:    kernel-tls-handshake@lists.linux.dev
+ L:    netdev@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/netlink/specs/handshake.yaml
+ F:    Documentation/networking/tls-handshake.rst
+ F:    include/net/handshake.h
+ F:    include/trace/events/handshake.h
+ F:    net/handshake/
  HANTRO VPU CODEC DRIVER
  M:    Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
  M:    Philipp Zabel <p.zabel@pengutronix.de>
@@@ -9738,7 -9756,7 +9765,7 @@@ F:      include/linux/i3c
  IA64 (Itanium) PLATFORM
  L:    linux-ia64@vger.kernel.org
  S:    Orphan
 -F:    Documentation/ia64/
 +F:    Documentation/arch/ia64/
  F:    arch/ia64/
  
  IBM Operation Panel Input Driver
@@@ -10292,14 -10310,12 +10319,14 @@@ M:        Andy Shevchenko <andy@kernel.org
  L:    linux-gpio@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git
 +F:    drivers/gpio/gpio-elkhartlake.c
  F:    drivers/gpio/gpio-ich.c
  F:    drivers/gpio/gpio-merrifield.c
  F:    drivers/gpio/gpio-ml-ioh.c
  F:    drivers/gpio/gpio-pch.c
  F:    drivers/gpio/gpio-sch.c
  F:    drivers/gpio/gpio-sodaville.c
 +F:    drivers/gpio/gpio-tangier.c
  
  INTEL GVT-g DRIVERS (Intel GPU Virtualization)
  M:    Zhenyu Wang <zhenyuw@linux.intel.com>
@@@ -10392,7 -10408,7 +10419,7 @@@ INTEL IXP4XX CRYPTO SUPPOR
  M:    Corentin Labbe <clabbe@baylibre.com>
  L:    linux-crypto@vger.kernel.org
  S:    Maintained
 -F:    drivers/crypto/ixp4xx_crypto.c
 +F:    drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
  
  INTEL ISHTP ECLITE DRIVER
  M:    Sumesh K Naduvalath <sumesh.k.naduvalath@intel.com>
@@@ -10427,11 -10443,11 +10454,11 @@@ INTEL KEEM BAY OCS AES/SM4 CRYPTO DRIVE
  M:    Daniele Alessandrelli <daniele.alessandrelli@intel.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/crypto/intel,keembay-ocs-aes.yaml
 -F:    drivers/crypto/keembay/Kconfig
 -F:    drivers/crypto/keembay/Makefile
 -F:    drivers/crypto/keembay/keembay-ocs-aes-core.c
 -F:    drivers/crypto/keembay/ocs-aes.c
 -F:    drivers/crypto/keembay/ocs-aes.h
 +F:    drivers/crypto/intel/keembay/Kconfig
 +F:    drivers/crypto/intel/keembay/Makefile
 +F:    drivers/crypto/intel/keembay/keembay-ocs-aes-core.c
 +F:    drivers/crypto/intel/keembay/ocs-aes.c
 +F:    drivers/crypto/intel/keembay/ocs-aes.h
  
  INTEL KEEM BAY OCS ECC CRYPTO DRIVER
  M:    Daniele Alessandrelli <daniele.alessandrelli@intel.com>
@@@ -10439,20 -10455,20 +10466,20 @@@ M:        Prabhjot Khurana <prabhjot.khurana@i
  M:    Mark Gross <mgross@linux.intel.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/crypto/intel,keembay-ocs-ecc.yaml
 -F:    drivers/crypto/keembay/Kconfig
 -F:    drivers/crypto/keembay/Makefile
 -F:    drivers/crypto/keembay/keembay-ocs-ecc.c
 +F:    drivers/crypto/intel/keembay/Kconfig
 +F:    drivers/crypto/intel/keembay/Makefile
 +F:    drivers/crypto/intel/keembay/keembay-ocs-ecc.c
  
  INTEL KEEM BAY OCS HCU CRYPTO DRIVER
  M:    Daniele Alessandrelli <daniele.alessandrelli@intel.com>
  M:    Declan Murphy <declan.murphy@intel.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/crypto/intel,keembay-ocs-hcu.yaml
 -F:    drivers/crypto/keembay/Kconfig
 -F:    drivers/crypto/keembay/Makefile
 -F:    drivers/crypto/keembay/keembay-ocs-hcu-core.c
 -F:    drivers/crypto/keembay/ocs-hcu.c
 -F:    drivers/crypto/keembay/ocs-hcu.h
 +F:    drivers/crypto/intel/keembay/Kconfig
 +F:    drivers/crypto/intel/keembay/Makefile
 +F:    drivers/crypto/intel/keembay/keembay-ocs-hcu-core.c
 +F:    drivers/crypto/intel/keembay/ocs-hcu.c
 +F:    drivers/crypto/intel/keembay/ocs-hcu.h
  
  INTEL THUNDER BAY EMMC PHY DRIVER
  M:    Nandhini Srikandan <nandhini.srikandan@intel.com>
@@@ -10659,7 -10675,7 +10686,7 @@@ L:   tboot-devel@lists.sourceforge.ne
  S:    Supported
  W:    http://tboot.sourceforge.net
  T:    hg http://tboot.hg.sourceforge.net:8000/hgroot/tboot/tboot
 -F:    Documentation/x86/intel_txt.rst
 +F:    Documentation/arch/x86/intel_txt.rst
  F:    arch/x86/kernel/tboot.c
  F:    include/linux/tboot.h
  
@@@ -10670,7 -10686,7 +10697,7 @@@ L:   linux-sgx@vger.kernel.or
  S:    Supported
  Q:    https://patchwork.kernel.org/project/intel-sgx/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/sgx
 -F:    Documentation/x86/sgx.rst
 +F:    Documentation/arch/x86/sgx.rst
  F:    arch/x86/entry/vdso/vsgx.S
  F:    arch/x86/include/asm/sgx.h
  F:    arch/x86/include/uapi/asm/sgx.h
@@@ -12128,13 -12144,6 +12155,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
  F:    drivers/pinctrl/pinctrl-loongson2.c
  
 +LOONGSON GPIO DRIVER
 +M:    Yinbo Zhu <zhuyinbo@loongson.cn>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
 +F:    drivers/gpio/gpio-loongson-64bit.c
 +
  LOONGSON-2 SOC SERIES CLOCK DRIVER
  M:    Yinbo Zhu <zhuyinbo@loongson.cn>
  L:    linux-clk@vger.kernel.org
@@@ -12294,7 -12303,7 +12321,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git
  F:    Documentation/networking/mac80211-injection.rst
  F:    Documentation/networking/mac80211_hwsim/mac80211_hwsim.rst
- F:    drivers/net/wireless/mac80211_hwsim.[ch]
+ F:    drivers/net/wireless/virtual/mac80211_hwsim.[ch]
  F:    include/net/mac80211.h
  F:    net/mac80211/
  
@@@ -13061,6 -13070,14 +13088,14 @@@ L: netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
  
+ MEDIATEK ETHERNET PCS DRIVER
+ M:    Alexander Couzens <lynxis@fe80.eu>
+ M:    Daniel Golle <daniel@makrotopia.org>
+ L:    netdev@vger.kernel.org
+ S:    Maintained
+ F:    drivers/net/pcs/pcs-mtk-lynxi.c
+ F:    include/linux/pcs/pcs-mtk-lynxi.h
  MEDIATEK I2C CONTROLLER DRIVER
  M:    Qii Wang <qii.wang@mediatek.com>
  L:    linux-i2c@vger.kernel.org
@@@ -13185,8 -13202,11 +13220,11 @@@ MEDIATEK SWITCH DRIVE
  M:    Sean Wang <sean.wang@mediatek.com>
  M:    Landen Chao <Landen.Chao@mediatek.com>
  M:    DENG Qingfang <dqfext@gmail.com>
+ M:    Daniel Golle <daniel@makrotopia.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
+ F:    drivers/net/dsa/mt7530-mdio.c
+ F:    drivers/net/dsa/mt7530-mmio.c
  F:    drivers/net/dsa/mt7530.*
  F:    net/dsa/tag_mtk.c
  
@@@ -14157,13 -14177,6 +14195,13 @@@ S: Odd Fixe
  F:    Documentation/devicetree/bindings/net/ieee802154/mrf24j40.txt
  F:    drivers/net/ieee802154/mrf24j40.c
  
 +MSI EC DRIVER
 +M:    Nikita Kravets <teackot@gmail.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +W:    https://github.com/BeardOverflow/msi-ec
 +F:    drivers/platform/x86/msi-ec.*
 +
  MSI LAPTOP SUPPORT
  M:    "Lee, Chun-Yi" <jlee@suse.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -14208,6 -14221,14 +14246,6 @@@ L:  linux-mtd@lists.infradead.or
  S:    Maintained
  F:    drivers/mtd/devices/docg3*
  
 -MT9M032 APTINA SENSOR DRIVER
 -M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 -L:    linux-media@vger.kernel.org
 -S:    Maintained
 -T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/i2c/mt9m032.c
 -F:    include/media/i2c/mt9m032.h
 -
  MT9P031 APTINA CAMERA SENSOR
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
@@@ -14217,6 -14238,14 +14255,6 @@@ F:  Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/mt9p031.c
  F:    include/media/i2c/mt9p031.h
  
 -MT9T001 APTINA CAMERA SENSOR
 -M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 -L:    linux-media@vger.kernel.org
 -S:    Maintained
 -T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/i2c/mt9t001.c
 -F:    include/media/i2c/mt9t001.h
 -
  MT9T112 APTINA CAMERA SENSOR
  M:    Jacopo Mondi <jacopo@jmondi.org>
  L:    linux-media@vger.kernel.org
@@@ -14609,6 -14638,8 +14647,8 @@@ L:   mptcp@lists.linux.de
  S:    Maintained
  W:    https://github.com/multipath-tcp/mptcp_net-next/wiki
  B:    https://github.com/multipath-tcp/mptcp_net-next/issues
+ T:    git https://github.com/multipath-tcp/mptcp_net-next.git export-net
+ T:    git https://github.com/multipath-tcp/mptcp_net-next.git export
  F:    Documentation/networking/mptcp-sysctl.rst
  F:    include/net/mptcp.h
  F:    include/trace/events/mptcp.h
@@@ -14671,7 -14702,6 +14711,6 @@@ L:   netdev@vger.kernel.or
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/
  F:    drivers/nfc/
- F:    include/linux/platform_data/nfcmrvl.h
  F:    include/net/nfc/
  F:    include/uapi/linux/nfc.h
  F:    net/nfc/
@@@ -14754,7 -14784,7 +14793,7 @@@ F:   include/uapi/linux/nitro_enclaves.
  F:    samples/nitro_enclaves/
  
  NOHZ, DYNTICKS SUPPORT
 -M:    Frederic Weisbecker <fweisbec@gmail.com>
 +M:    Frederic Weisbecker <frederic@kernel.org>
  M:    Thomas Gleixner <tglx@linutronix.de>
  M:    Ingo Molnar <mingo@kernel.org>
  L:    linux-kernel@vger.kernel.org
@@@ -14969,13 -14999,6 +15008,13 @@@ F: Documentation/devicetree/bindings/cl
  F:    drivers/clk/imx/
  F:    include/dt-bindings/clock/imx*
  
 +NXP i.MX 8M ISI DRIVER
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/nxp,imx8-isi.yaml
 +F:    drivers/media/platform/nxp/imx8-isi/
 +
  NXP i.MX 8MQ DCSS DRIVER
  M:    Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
  R:    Lucas Stach <l.stach@pengutronix.de>
@@@ -15403,7 -15426,6 +15442,7 @@@ M:   Shunqian Zheng <zhengsq@rock-chips.c
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov2685.yaml
  F:    drivers/media/i2c/ov2685.c
  
  OMNIVISION OV2740 SENSOR DRIVER
@@@ -15495,7 -15517,7 +15534,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/ov7740.c
  
  OMNIVISION OV8856 SENSOR DRIVER
 -M:    Dongchun Zhu <dongchun.zhu@mediatek.com>
 +M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
@@@ -15638,6 -15660,13 +15677,13 @@@ L: netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/ptp/ptp_ocp.c
  
+ INTEL PTP DFL ToD DRIVER
+ M:    Tianfei Zhang <tianfei.zhang@intel.com>
+ L:    linux-fpga@vger.kernel.org
+ L:    netdev@vger.kernel.org
+ S:    Maintained
+ F:    drivers/ptp/ptp_dfl_tod.c
  OPENCORES I2C BUS DRIVER
  M:    Peter Korsgaard <peter@korsgaard.com>
  M:    Andrew Lunn <andrew@lunn.ch>
@@@ -15657,7 -15686,7 +15703,7 @@@ S:   Maintaine
  W:    http://openrisc.io
  T:    git https://github.com/openrisc/linux.git
  F:    Documentation/devicetree/bindings/openrisc/
 -F:    Documentation/openrisc/
 +F:    Documentation/arch/openrisc/
  F:    arch/openrisc/
  F:    drivers/irqchip/irq-ompic.c
  F:    drivers/irqchip/irq-or1k-*
@@@ -15853,7 -15882,7 +15899,7 @@@ W:   https://parisc.wiki.kernel.or
  Q:    http://patchwork.kernel.org/project/linux-parisc/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git
 -F:    Documentation/parisc/
 +F:    Documentation/arch/parisc/
  F:    arch/parisc/
  F:    drivers/char/agp/parisc-agp.c
  F:    drivers/input/misc/hp_sdc_rtc.c
@@@ -16346,6 -16375,12 +16392,6 @@@ S:  Maintaine
  F:    crypto/pcrypt.c
  F:    include/crypto/pcrypt.h
  
 -PEAQ WMI HOTKEYS DRIVER
 -M:    Hans de Goede <hdegoede@redhat.com>
 -L:    platform-driver-x86@vger.kernel.org
 -S:    Maintained
 -F:    drivers/platform/x86/peaq-wmi.c
 -
  PECI HARDWARE MONITORING DRIVERS
  M:    Iwona Winiarska <iwona.winiarska@intel.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -16782,9 -16817,8 +16828,8 @@@ F:   include/uapi/linux/if_pppol2tp.
  F:    net/l2tp/l2tp_ppp.c
  
  PPP PROTOCOL DRIVERS AND COMPRESSORS
- M:    Paul Mackerras <paulus@samba.org>
  L:    linux-ppp@vger.kernel.org
- S:    Maintained
+ S:    Orphan
  F:    drivers/net/ppp/ppp_*
  
  PPS SUPPORT
@@@ -17028,7 -17062,7 +17073,7 @@@ QAT DRIVE
  M:    Giovanni Cabiddu <giovanni.cabiddu@intel.com>
  L:    qat-linux@intel.com
  S:    Supported
 -F:    drivers/crypto/qat/
 +F:    drivers/crypto/intel/qat/
  
  QCOM AUDIO (ASoC) DRIVERS
  M:    Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
@@@ -17178,12 -17212,6 +17223,12 @@@ F: fs/qnx4
  F:    include/uapi/linux/qnx4_fs.h
  F:    include/uapi/linux/qnxtypes.h
  
 +QNX6 FILESYSTEM
 +S:    Orphan
 +F:    Documentation/filesystems/qnx6.rst
 +F:    fs/qnx6/
 +F:    include/linux/qnx6_fs.h
 +
  QORIQ DPAA2 FSL-MC BUS DRIVER
  M:    Stuart Yoder <stuyoder@gmail.com>
  M:    Laurentiu Tudor <laurentiu.tudor@nxp.com>
@@@ -17212,7 -17240,7 +17257,7 @@@ S:   Supporte
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
  F:    drivers/net/wireless/ath/ath10k/
- F:    Documentation/devicetree/bindings/net/wireless/qcom,ath10k.txt
+ F:    Documentation/devicetree/bindings/net/wireless/qcom,ath10k.yaml
  
  QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
  M:    Kalle Valo <kvalo@kernel.org>
@@@ -17248,7 -17276,6 +17293,7 @@@ F:   drivers/net/wwan/qcom_bam_dmux.
  QUALCOMM CAMERA SUBSYSTEM DRIVER
  M:    Robert Foss <rfoss@kernel.org>
  M:    Todor Tomov <todor.too@gmail.com>
 +M:    Bryan O'Donoghue <bryan.odonoghue@linaro.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/admin-guide/media/qcom_camss.rst
@@@ -17264,16 -17291,6 +17309,16 @@@ F: Documentation/devicetree/bindings/cl
  F:    drivers/clk/qcom/
  F:    include/dt-bindings/clock/qcom,*
  
 +QUALCOMM CLOUD AI (QAIC) DRIVER
 +M:    Jeffrey Hugo <quic_jhugo@quicinc.com>
 +L:    linux-arm-msm@vger.kernel.org
 +L:    dri-devel@lists.freedesktop.org
 +S:    Supported
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/accel/qaic/
 +F:    drivers/accel/qaic/
 +F:    include/uapi/drm/qaic_accel.h
 +
  QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
  M:    Bjorn Andersson <andersson@kernel.org>
  M:    Konrad Dybcio <konrad.dybcio@linaro.org>
@@@ -17296,7 -17313,6 +17341,7 @@@ M:   Thara Gopinath <thara.gopinath@gmail
  L:    linux-crypto@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/crypto/qcom-qce.yaml
  F:    drivers/crypto/qce/
  
  QUALCOMM EMAC GIGABIT ETHERNET DRIVER
@@@ -17310,7 -17326,7 +17355,7 @@@ M:   Vinod Koul <vkoul@kernel.org
  R:    Bhupesh Sharma <bhupesh.sharma@linaro.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
- F:    Documentation/devicetree/bindings/net/qcom,ethqos.txt
+ F:    Documentation/devicetree/bindings/net/qcom,ethqos.yaml
  F:    drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
  
  QUALCOMM FASTRPC DRIVER
@@@ -17570,7 -17586,7 +17615,7 @@@ F:   include/ras/ras_event.
  RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER
  L:    linux-wireless@vger.kernel.org
  S:    Orphan
- F:    drivers/net/wireless/ray*
+ F:    drivers/net/wireless/legacy/ray*
  
  RC-CORE / LIRC FRAMEWORK
  M:    Sean Young <sean@mess.org>
@@@ -17656,7 -17672,7 +17701,7 @@@ M:   Fenghua Yu <fenghua.yu@intel.com
  M:    Reinette Chatre <reinette.chatre@intel.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
 -F:    Documentation/x86/resctrl*
 +F:    Documentation/arch/x86/resctrl*
  F:    arch/x86/include/asm/resctrl.h
  F:    arch/x86/kernel/cpu/resctrl/
  F:    tools/testing/selftests/resctrl/
@@@ -17665,13 -17681,11 +17710,13 @@@ READ-COPY UPDATE (RCU
  M:    "Paul E. McKenney" <paulmck@kernel.org>
  M:    Frederic Weisbecker <frederic@kernel.org> (kernel/rcu/tree_nocb.h)
  M:    Neeraj Upadhyay <quic_neeraju@quicinc.com> (kernel/rcu/tasks.h)
 +M:    Joel Fernandes <joel@joelfernandes.org>
  M:    Josh Triplett <josh@joshtriplett.org>
 +M:    Boqun Feng <boqun.feng@gmail.com>
  R:    Steven Rostedt <rostedt@goodmis.org>
  R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  R:    Lai Jiangshan <jiangshanlai@gmail.com>
 -R:    Joel Fernandes <joel@joelfernandes.org>
 +R:    Zqiang <qiang1.zhang@intel.com>
  L:    rcu@vger.kernel.org
  S:    Supported
  W:    http://www.rdrop.com/users/paulmck/RCU/
@@@ -18526,7 -18540,6 +18571,7 @@@ M:   Sylwester Nawrocki <s.nawrocki@samsu
  M:    Andrzej Hajda <andrzej.hajda@intel.com>
  L:    linux-media@vger.kernel.org
  S:    Supported
 +F:    Documentation/devicetree/bindings/media/samsung,s5c73m3.yaml
  F:    drivers/media/i2c/s5c73m3/*
  
  SAMSUNG S5K5BAF CAMERA DRIVER
@@@ -18551,11 -18564,6 +18596,11 @@@ M: Sylwester Nawrocki <s.nawrocki@samsu
  L:    linux-media@vger.kernel.org
  S:    Supported
  Q:    https://patchwork.linuxtv.org/project/linux-media/list/
 +F:    Documentation/devicetree/bindings/media/samsung,exynos4210-csis.yaml
 +F:    Documentation/devicetree/bindings/media/samsung,exynos4210-fimc.yaml
 +F:    Documentation/devicetree/bindings/media/samsung,exynos4212-fimc-is.yaml
 +F:    Documentation/devicetree/bindings/media/samsung,exynos4212-fimc-lite.yaml
 +F:    Documentation/devicetree/bindings/media/samsung,fimc.yaml
  F:    drivers/media/platform/samsung/exynos4-is/
  
  SAMSUNG SOC CLOCK DRIVERS
@@@ -18859,8 -18867,8 +18904,8 @@@ S:   Supporte
  W:    https://selinuxproject.org
  W:    https://github.com/SELinuxProject
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git
 -F:    Documentation/ABI/obsolete/sysfs-selinux-checkreqprot
 -F:    Documentation/ABI/obsolete/sysfs-selinux-disable
 +F:    Documentation/ABI/removed/sysfs-selinux-checkreqprot
 +F:    Documentation/ABI/removed/sysfs-selinux-disable
  F:    Documentation/admin-guide/LSM/SELinux.rst
  F:    include/trace/events/avc.h
  F:    include/uapi/linux/selinux_netlink.h
@@@ -18946,14 -18954,6 +18991,14 @@@ S: Supporte
  F:    Documentation/networking/devlink/sfc.rst
  F:    drivers/net/ethernet/sfc/
  
 +SFCTEMP HWMON DRIVER
 +M:    Emil Renner Berthing <kernel@esmil.dk>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwmon/starfive,jh71x0-temp.yaml
 +F:    Documentation/hwmon/sfctemp.rst
 +F:    drivers/hwmon/sfctemp.c
 +
  SFF/SFP/SFP+ MODULE SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
  L:    netdev@vger.kernel.org
@@@ -19042,7 -19042,6 +19087,7 @@@ L:   linux-media@vger.kernel.or
  S:    Odd Fixes
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/silabs,si470x.yaml
  F:    drivers/media/radio/si470x/radio-si470x-i2c.c
  
  SI470X FM RADIO RECEIVER USB DRIVER
@@@ -19949,6 -19948,13 +19994,13 @@@ M: Emil Renner Berthing <kernel@esmil.d
  S:    Maintained
  F:    arch/riscv/boot/dts/starfive/
  
+ STARFIVE DWMAC GLUE LAYER
+ M:    Emil Renner Berthing <kernel@esmil.dk>
+ M:    Samin Guo <samin.guo@starfivetech.com>
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/net/starfive,jh7110-dwmac.yaml
+ F:    drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c
  STARFIVE JH7100 CLOCK DRIVERS
  M:    Emil Renner Berthing <kernel@esmil.dk>
  S:    Maintained
@@@ -20159,7 -20165,7 +20211,7 @@@ M:   John Paul Adrian Glaubitz <glaubitz@
  L:    linux-sh@vger.kernel.org
  S:    Maintained
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
 -F:    Documentation/sh/
 +F:    Documentation/arch/sh/
  F:    arch/sh/
  F:    drivers/sh/
  
@@@ -20219,7 -20225,7 +20271,7 @@@ M:   Vineet Gupta <vgupta@kernel.org
  L:    linux-snps-arc@lists.infradead.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git
 -F:    Documentation/arc/
 +F:    Documentation/arch/arc
  F:    Documentation/devicetree/bindings/arc/*
  F:    Documentation/devicetree/bindings/interrupt-controller/snps,arc*
  F:    arch/arc/
@@@ -20818,7 -20824,7 +20870,7 @@@ L:   linux-pm@vger.kernel.or
  S:    Maintained
  F:    Documentation/driver-api/thermal/power_allocator.rst
  F:    drivers/thermal/gov_power_allocator.c
 -F:    include/trace/events/thermal_power_allocator.h
 +F:    drivers/thermal/thermal_trace_ipa.h
  
  THINKPAD ACPI EXTRAS DRIVER
  M:    Henrique de Moraes Holschuh <hmh@hmh.eng.br>
@@@ -21115,6 -21121,7 +21167,6 @@@ F:   Documentation/hwmon/tmp401.rs
  F:    drivers/hwmon/tmp401.c
  
  TMP464 HARDWARE MONITOR DRIVER
 -M:    Agathe Porte <agathe.porte@nokia.com>
  M:    Guenter Roeck <linux@roeck-us.net>
  L:    linux-hwmon@vger.kernel.org
  S:    Maintained
@@@ -21277,14 -21284,6 +21329,14 @@@ S: Maintaine
  F:    Documentation/tools/rtla/
  F:    tools/tracing/rtla/
  
 +TECHNICAL ADVISORY BOARD PROCESS DOCS
 +M:    "Theodore Ts'o" <tytso@mit.edu>
 +M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 +L:    tech-board-discuss@lists.linux-foundation.org
 +S:    Maintained
 +F:    Documentation/process/researcher-guidelines.rst
 +F:    Documentation/process/contribution-maturity-model.rst
 +
  TRADITIONAL CHINESE DOCUMENTATION
  M:    Hu Haowen <src.res@email.cn>
  L:    linux-doc-tw-discuss@lists.sourceforge.net (moderated for non-subscribers)
@@@ -21839,7 -21838,7 +21891,7 @@@ USB WIRELESS RNDIS DRIVER (rndis_wlan
  M:    Jussi Kivilinna <jussi.kivilinna@iki.fi>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
- F:    drivers/net/wireless/rndis_wlan.c
+ F:    drivers/net/wireless/legacy/rndis_wlan.c
  
  USB XHCI DRIVER
  M:    Mathias Nyman <mathias.nyman@intel.com>
@@@ -22218,9 -22217,7 +22270,9 @@@ L:   virtualization@lists.linux-foundatio
  L:    netdev@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git
 +F:    kernel/vhost_task.c
  F:    drivers/vhost/
 +F:    include/linux/sched/vhost_task.h
  F:    include/linux/vhost_iotlb.h
  F:    include/uapi/linux/vhost.h
  
@@@ -22595,7 -22592,7 +22647,7 @@@ F:   drivers/input/misc/wistron_btns.
  WL3501 WIRELESS PCMCIA CARD DRIVER
  L:    linux-wireless@vger.kernel.org
  S:    Odd fixes
- F:    drivers/net/wireless/wl3501*
+ F:    drivers/net/wireless/legacy/wl3501*
  
  WOLFSON MICROELECTRONICS DRIVERS
  L:    patches@opensource.cirrus.com
@@@ -22694,7 -22691,7 +22746,7 @@@ L:   linux-kernel@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
  F:    Documentation/devicetree/bindings/x86/
 -F:    Documentation/x86/
 +F:    Documentation/arch/x86/
  F:    arch/x86/
  
  X86 ENTRY CODE
@@@ -22704,24 -22701,13 +22756,24 @@@ S:        Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/asm
  F:    arch/x86/entry/
  
 +X86 HARDWARE VULNERABILITIES
 +M:    Thomas Gleixner <tglx@linutronix.de>
 +M:    Borislav Petkov <bp@alien8.de>
 +M:    Peter Zijlstra <peterz@infradead.org>
 +M:    Josh Poimboeuf <jpoimboe@kernel.org>
 +R:    Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
 +S:    Maintained
 +F:    Documentation/admin-guide/hw-vuln/
 +F:    arch/x86/include/asm/nospec-branch.h
 +F:    arch/x86/kernel/cpu/bugs.c
 +
  X86 MCE INFRASTRUCTURE
  M:    Tony Luck <tony.luck@intel.com>
  M:    Borislav Petkov <bp@alien8.de>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-mce
 -F:    Documentation/x86/x86_64/machinecheck.rst
 +F:    Documentation/arch/x86/x86_64/machinecheck.rst
  F:    arch/x86/kernel/cpu/mce/*
  
  X86 MICROCODE UPDATE SUPPORT
@@@ -22743,7 -22729,7 +22795,7 @@@ M:   Hans de Goede <hdegoede@redhat.com
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
 -F:    drivers/platform/x86/x86-android-tablets.c
 +F:    drivers/platform/x86/x86-android-tablets/
  
  X86 PLATFORM DRIVERS
  M:    Hans de Goede <hdegoede@redhat.com>
@@@ -23092,6 -23078,7 +23144,6 @@@ F:   drivers/i2c/busses/i2c-xlp9xx.
  
  XRA1403 GPIO EXPANDER
  M:    Nandor Han <nandor.han@ge.com>
 -M:    Semi Malinen <semi.malinen@ge.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/gpio/gpio-xra1403.txt
@@@ -23249,6 -23236,13 +23301,13 @@@ L: linux-mm@kvack.or
  S:    Maintained
  F:    mm/zswap.c
  
+ NXP BLUETOOTH WIRELESS DRIVERS
+ M:    Amitkumar Karwar <amitkumar.karwar@nxp.com>
+ M:    Neeraj Kale <neeraj.sanjaykale@nxp.com>
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
+ F:    drivers/bluetooth/btnxpuart.c
  THE REST
  M:    Linus Torvalds <torvalds@linux-foundation.org>
  L:    linux-kernel@vger.kernel.org
@@@ -20,6 -20,7 +20,7 @@@
  /dts-v1/;
  #include <dt-bindings/input/input.h>
  #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/leds/common.h>
  #include <dt-bindings/gpio/gpio.h>
  #include "armada-370.dtsi"
  
        pinctrl-names = "default";
        phy0: ethernet-phy@0 {
                reg = <0>;
+               leds {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       led@0 {
+                               reg = <0>;
+                               color = <LED_COLOR_ID_WHITE>;
+                               function = LED_FUNCTION_WAN;
+                               default-state = "keep";
+                       };
+               };
        };
  
        switch: switch@10 {
  
                        port@5 {
                                reg = <5>;
 -                              label = "cpu";
                                ethernet = <&eth1>;
 +                              phy-mode = "rgmii-id";
                                fixed-link {
                                        speed = <1000>;
                                        full-duplex;
diff --combined arch/mips/Kconfig
@@@ -47,7 -47,6 +47,7 @@@ config MIP
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_TIME_VSYSCALL
        select GUP_GET_PXX_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
 +      select HAS_IOPORT if !NO_IOPORT_MAP || ISA
        select HAVE_ARCH_COMPILER_H
        select HAVE_ARCH_JUMP_LABEL
        select HAVE_ARCH_KGDB if MIPS_FP_SUPPORT
        select HAVE_DEBUG_STACKOVERFLOW
        select HAVE_DMA_CONTIGUOUS
        select HAVE_DYNAMIC_FTRACE
-       select HAVE_EBPF_JIT if !CPU_MICROMIPS && \
-                               !CPU_DADDI_WORKAROUNDS && \
-                               !CPU_R4000_WORKAROUNDS && \
-                               !CPU_R4400_WORKAROUNDS
+       select HAVE_EBPF_JIT if !CPU_MICROMIPS
        select HAVE_EXIT_THREAD
        select HAVE_FAST_GUP
        select HAVE_FTRACE_MCOUNT_RECORD
@@@ -4,6 -4,7 +4,7 @@@
  #include <linux/mlx5/device.h>
  #include <linux/mlx5/mlx5_ifc.h>
  #include <linux/xarray.h>
+ #include <linux/if_vlan.h>
  
  #include "en.h"
  #include "lib/aso.h"
@@@ -348,12 -349,21 +349,21 @@@ static void mlx5e_macsec_cleanup_sa(str
        sa->macsec_rule = NULL;
  }
  
+ static struct mlx5e_priv *macsec_netdev_priv(const struct net_device *dev)
+ {
+ #if IS_ENABLED(CONFIG_VLAN_8021Q)
+       if (is_vlan_dev(dev))
+               return netdev_priv(vlan_dev_priv(dev)->real_dev);
+ #endif
+       return netdev_priv(dev);
+ }
  static int mlx5e_macsec_init_sa(struct macsec_context *ctx,
                                struct mlx5e_macsec_sa *sa,
                                bool encrypt,
                                bool is_tx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        struct mlx5e_macsec *macsec = priv->macsec;
        struct mlx5_macsec_rule_attrs rule_attrs;
        struct mlx5_core_dev *mdev = priv->mdev;
@@@ -427,7 -437,7 +437,7 @@@ static int macsec_rx_sa_active_update(s
                                      struct mlx5e_macsec_sa *rx_sa,
                                      bool active)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        struct mlx5e_macsec *macsec = priv->macsec;
        int err = 0;
  
@@@ -508,9 -518,9 +518,9 @@@ static void update_macsec_epn(struct ml
  
  static int mlx5e_macsec_add_txsa(struct macsec_context *ctx)
  {
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_tx_sc *tx_sc = &ctx->secy->tx_sc;
        const struct macsec_tx_sa *ctx_tx_sa = ctx->sa.tx_sa;
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
        const struct macsec_secy *secy = ctx->secy;
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5_core_dev *mdev = priv->mdev;
@@@ -583,9 -593,9 +593,9 @@@ out
  
  static int mlx5e_macsec_upd_txsa(struct macsec_context *ctx)
  {
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_tx_sc *tx_sc = &ctx->secy->tx_sc;
        const struct macsec_tx_sa *ctx_tx_sa = ctx->sa.tx_sa;
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        u8 assoc_num = ctx->sa.assoc_num;
        struct mlx5e_macsec_sa *tx_sa;
@@@ -645,7 -655,7 +655,7 @@@ out
  
  static int mlx5e_macsec_del_txsa(struct macsec_context *ctx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        u8 assoc_num = ctx->sa.assoc_num;
        struct mlx5e_macsec_sa *tx_sa;
  
        mlx5e_macsec_cleanup_sa(macsec, tx_sa, true);
        mlx5_destroy_encryption_key(macsec->mdev, tx_sa->enc_key_id);
 -      kfree_rcu(tx_sa);
 +      kfree_rcu_mightsleep(tx_sa);
        macsec_device->tx_sa[assoc_num] = NULL;
  
  out:
@@@ -696,7 -706,7 +706,7 @@@ static u32 mlx5e_macsec_get_sa_from_has
  static int mlx5e_macsec_add_rxsc(struct macsec_context *ctx)
  {
        struct mlx5e_macsec_rx_sc_xarray_element *sc_xarray_element;
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_rx_sc *ctx_rx_sc = ctx->rx_sc;
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5e_macsec_rx_sc *rx_sc;
@@@ -776,7 -786,7 +786,7 @@@ out
  
  static int mlx5e_macsec_upd_rxsc(struct macsec_context *ctx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_rx_sc *ctx_rx_sc = ctx->rx_sc;
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5e_macsec_rx_sc *rx_sc;
@@@ -849,12 -859,12 +859,12 @@@ static void macsec_del_rxsc_ctx(struct 
        xa_erase(&macsec->sc_xarray, rx_sc->sc_xarray_element->fs_id);
        metadata_dst_free(rx_sc->md_dst);
        kfree(rx_sc->sc_xarray_element);
 -      kfree_rcu(rx_sc);
 +      kfree_rcu_mightsleep(rx_sc);
  }
  
  static int mlx5e_macsec_del_rxsc(struct macsec_context *ctx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5e_macsec_rx_sc *rx_sc;
        struct mlx5e_macsec *macsec;
@@@ -890,8 -900,8 +900,8 @@@ out
  
  static int mlx5e_macsec_add_rxsa(struct macsec_context *ctx)
  {
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_rx_sa *ctx_rx_sa = ctx->sa.rx_sa;
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5_core_dev *mdev = priv->mdev;
        u8 assoc_num = ctx->sa.assoc_num;
@@@ -976,8 -986,8 +986,8 @@@ out
  
  static int mlx5e_macsec_upd_rxsa(struct macsec_context *ctx)
  {
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_rx_sa *ctx_rx_sa = ctx->sa.rx_sa;
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        u8 assoc_num = ctx->sa.assoc_num;
        struct mlx5e_macsec_rx_sc *rx_sc;
@@@ -1033,7 -1043,7 +1043,7 @@@ out
  
  static int mlx5e_macsec_del_rxsa(struct macsec_context *ctx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        sci_t sci = ctx->sa.rx_sa->sc->sci;
        struct mlx5e_macsec_rx_sc *rx_sc;
@@@ -1085,7 -1095,7 +1095,7 @@@ out
  
  static int mlx5e_macsec_add_secy(struct macsec_context *ctx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct net_device *dev = ctx->secy->netdev;
        const struct net_device *netdev = ctx->netdev;
        struct mlx5e_macsec_device *macsec_device;
@@@ -1137,7 -1147,7 +1147,7 @@@ out
  static int macsec_upd_secy_hw_address(struct macsec_context *ctx,
                                      struct mlx5e_macsec_device *macsec_device)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct net_device *dev = ctx->secy->netdev;
        struct mlx5e_macsec *macsec = priv->macsec;
        struct mlx5e_macsec_rx_sc *rx_sc, *tmp;
@@@ -1184,8 -1194,8 +1194,8 @@@ out
   */
  static int mlx5e_macsec_upd_secy(struct macsec_context *ctx)
  {
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        const struct macsec_tx_sc *tx_sc = &ctx->secy->tx_sc;
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
        const struct net_device *dev = ctx->secy->netdev;
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5e_macsec_sa *tx_sa;
@@@ -1240,7 -1250,7 +1250,7 @@@ out
  
  static int mlx5e_macsec_del_secy(struct macsec_context *ctx)
  {
-       struct mlx5e_priv *priv = netdev_priv(ctx->netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
        struct mlx5e_macsec_device *macsec_device;
        struct mlx5e_macsec_rx_sc *rx_sc, *tmp;
        struct mlx5e_macsec_sa *tx_sa;
@@@ -1741,7 -1751,7 +1751,7 @@@ void mlx5e_macsec_offload_handle_rx_skb
  {
        struct mlx5e_macsec_rx_sc_xarray_element *sc_xarray_element;
        u32 macsec_meta_data = be32_to_cpu(cqe->ft_metadata);
-       struct mlx5e_priv *priv = netdev_priv(netdev);
+       struct mlx5e_priv *priv = macsec_netdev_priv(netdev);
        struct mlx5e_macsec_rx_sc *rx_sc;
        struct mlx5e_macsec *macsec;
        u32  fs_id;
@@@ -19,6 -19,9 +19,9 @@@
  #define MLXSW_THERMAL_ASIC_TEMP_NORM  75000   /* 75C */
  #define MLXSW_THERMAL_ASIC_TEMP_HIGH  85000   /* 85C */
  #define MLXSW_THERMAL_ASIC_TEMP_HOT   105000  /* 105C */
+ #define MLXSW_THERMAL_MODULE_TEMP_NORM        55000   /* 55C */
+ #define MLXSW_THERMAL_MODULE_TEMP_HIGH        65000   /* 65C */
+ #define MLXSW_THERMAL_MODULE_TEMP_HOT 80000   /* 80C */
  #define MLXSW_THERMAL_HYSTERESIS_TEMP 5000    /* 5C */
  #define MLXSW_THERMAL_MODULE_TEMP_SHIFT       (MLXSW_THERMAL_HYSTERESIS_TEMP * 2)
  #define MLXSW_THERMAL_MAX_STATE       10
@@@ -30,12 -33,6 +33,6 @@@ static char * const mlxsw_thermal_exter
        "mlxreg_fan",
  };
  
- enum mlxsw_thermal_trips {
-       MLXSW_THERMAL_TEMP_TRIP_NORM,
-       MLXSW_THERMAL_TEMP_TRIP_HIGH,
-       MLXSW_THERMAL_TEMP_TRIP_HOT,
- };
  struct mlxsw_cooling_states {
        int     min_state;
        int     max_state;
@@@ -59,6 -56,24 +56,24 @@@ static const struct thermal_trip defaul
        },
  };
  
+ static const struct thermal_trip default_thermal_module_trips[] = {
+       {       /* In range - 0-40% PWM */
+               .type           = THERMAL_TRIP_ACTIVE,
+               .temperature    = MLXSW_THERMAL_MODULE_TEMP_NORM,
+               .hysteresis     = MLXSW_THERMAL_HYSTERESIS_TEMP,
+       },
+       {
+               /* In range - 40-100% PWM */
+               .type           = THERMAL_TRIP_ACTIVE,
+               .temperature    = MLXSW_THERMAL_MODULE_TEMP_HIGH,
+               .hysteresis     = MLXSW_THERMAL_HYSTERESIS_TEMP,
+       },
+       {       /* Warning */
+               .type           = THERMAL_TRIP_HOT,
+               .temperature    = MLXSW_THERMAL_MODULE_TEMP_HOT,
+       },
+ };
  static const struct mlxsw_cooling_states default_cooling_states[] = {
        {
                .min_state      = 0,
@@@ -140,67 -155,10 +155,10 @@@ static int mlxsw_get_cooling_device_idx
        return -ENODEV;
  }
  
- static void
- mlxsw_thermal_module_trips_reset(struct mlxsw_thermal_module *tz)
- {
-       tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temperature = 0;
-       tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temperature = 0;
-       tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temperature = 0;
- }
- static int
- mlxsw_thermal_module_trips_update(struct device *dev, struct mlxsw_core *core,
-                                 struct mlxsw_thermal_module *tz,
-                                 int crit_temp, int emerg_temp)
- {
-       int err;
-       /* Do not try to query temperature thresholds directly from the module's
-        * EEPROM if we got valid thresholds from MTMP.
-        */
-       if (!emerg_temp || !crit_temp) {
-               err = mlxsw_env_module_temp_thresholds_get(core, tz->slot_index,
-                                                          tz->module,
-                                                          SFP_TEMP_HIGH_WARN,
-                                                          &crit_temp);
-               if (err)
-                       return err;
-               err = mlxsw_env_module_temp_thresholds_get(core, tz->slot_index,
-                                                          tz->module,
-                                                          SFP_TEMP_HIGH_ALARM,
-                                                          &emerg_temp);
-               if (err)
-                       return err;
-       }
-       if (crit_temp > emerg_temp) {
-               dev_warn(dev, "%s : Critical threshold %d is above emergency threshold %d\n",
-                        thermal_zone_device_type(tz->tzdev), crit_temp, emerg_temp);
-               return 0;
-       }
-       /* According to the system thermal requirements, the thermal zones are
-        * defined with three trip points. The critical and emergency
-        * temperature thresholds, provided by QSFP module are set as "active"
-        * and "hot" trip points, "normal" trip point is derived from "active"
-        * by subtracting double hysteresis value.
-        */
-       if (crit_temp >= MLXSW_THERMAL_MODULE_TEMP_SHIFT)
-               tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temperature = crit_temp -
-                                       MLXSW_THERMAL_MODULE_TEMP_SHIFT;
-       else
-               tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temperature = crit_temp;
-       tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temperature = crit_temp;
-       tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temperature = emerg_temp;
-       return 0;
- }
  static int mlxsw_thermal_bind(struct thermal_zone_device *tzdev,
                              struct thermal_cooling_device *cdev)
  {
 -      struct mlxsw_thermal *thermal = tzdev->devdata;
 +      struct mlxsw_thermal *thermal = thermal_zone_device_priv(tzdev);
        struct device *dev = thermal->bus_info->dev;
        int i, err;
  
  static int mlxsw_thermal_unbind(struct thermal_zone_device *tzdev,
                                struct thermal_cooling_device *cdev)
  {
 -      struct mlxsw_thermal *thermal = tzdev->devdata;
 +      struct mlxsw_thermal *thermal = thermal_zone_device_priv(tzdev);
        struct device *dev = thermal->bus_info->dev;
        int i;
        int err;
  static int mlxsw_thermal_get_temp(struct thermal_zone_device *tzdev,
                                  int *p_temp)
  {
 -      struct mlxsw_thermal *thermal = tzdev->devdata;
 +      struct mlxsw_thermal *thermal = thermal_zone_device_priv(tzdev);
        struct device *dev = thermal->bus_info->dev;
        char mtmp_pl[MLXSW_REG_MTMP_LEN];
        int temp;
@@@ -280,7 -238,7 +238,7 @@@ static struct thermal_zone_device_ops m
  static int mlxsw_thermal_module_bind(struct thermal_zone_device *tzdev,
                                     struct thermal_cooling_device *cdev)
  {
 -      struct mlxsw_thermal_module *tz = tzdev->devdata;
 +      struct mlxsw_thermal_module *tz = thermal_zone_device_priv(tzdev);
        struct mlxsw_thermal *thermal = tz->parent;
        int i, j, err;
  
@@@ -309,7 -267,7 +267,7 @@@ err_thermal_zone_bind_cooling_device
  static int mlxsw_thermal_module_unbind(struct thermal_zone_device *tzdev,
                                       struct thermal_cooling_device *cdev)
  {
 -      struct mlxsw_thermal_module *tz = tzdev->devdata;
 +      struct mlxsw_thermal_module *tz = thermal_zone_device_priv(tzdev);
        struct mlxsw_thermal *thermal = tz->parent;
        int i;
        int err;
        return err;
  }
  
- static void
- mlxsw_thermal_module_temp_and_thresholds_get(struct mlxsw_core *core,
-                                            u8 slot_index, u16 sensor_index,
-                                            int *p_temp, int *p_crit_temp,
-                                            int *p_emerg_temp)
- {
-       char mtmp_pl[MLXSW_REG_MTMP_LEN];
-       int err;
-       /* Read module temperature and thresholds. */
-       mlxsw_reg_mtmp_pack(mtmp_pl, slot_index, sensor_index,
-                           false, false);
-       err = mlxsw_reg_query(core, MLXSW_REG(mtmp), mtmp_pl);
-       if (err) {
-               /* Set temperature and thresholds to zero to avoid passing
-                * uninitialized data back to the caller.
-                */
-               *p_temp = 0;
-               *p_crit_temp = 0;
-               *p_emerg_temp = 0;
-               return;
-       }
-       mlxsw_reg_mtmp_unpack(mtmp_pl, p_temp, NULL, p_crit_temp, p_emerg_temp,
-                             NULL);
- }
  static int mlxsw_thermal_module_temp_get(struct thermal_zone_device *tzdev,
                                         int *p_temp)
  {
 -      struct mlxsw_thermal_module *tz = tzdev->devdata;
 +      struct mlxsw_thermal_module *tz = thermal_zone_device_priv(tzdev);
        struct mlxsw_thermal *thermal = tz->parent;
-       int temp, crit_temp, emerg_temp;
-       struct device *dev;
+       char mtmp_pl[MLXSW_REG_MTMP_LEN];
        u16 sensor_index;
+       int err;
  
-       dev = thermal->bus_info->dev;
        sensor_index = MLXSW_REG_MTMP_MODULE_INDEX_MIN + tz->module;
-       /* Read module temperature and thresholds. */
-       mlxsw_thermal_module_temp_and_thresholds_get(thermal->core,
-                                                    tz->slot_index,
-                                                    sensor_index, &temp,
-                                                    &crit_temp, &emerg_temp);
-       *p_temp = temp;
-       if (!temp)
-               return 0;
-       /* Update trip points. */
-       mlxsw_thermal_module_trips_update(dev, thermal->core, tz,
-                                         crit_temp, emerg_temp);
+       mlxsw_reg_mtmp_pack(mtmp_pl, tz->slot_index, sensor_index,
+                           false, false);
+       err = mlxsw_reg_query(thermal->core, MLXSW_REG(mtmp), mtmp_pl);
+       if (err)
+               return err;
+       mlxsw_reg_mtmp_unpack(mtmp_pl, p_temp, NULL, NULL, NULL, NULL);
        return 0;
  }
  
@@@ -390,7 -311,7 +311,7 @@@ static struct thermal_zone_device_ops m
  static int mlxsw_thermal_gearbox_temp_get(struct thermal_zone_device *tzdev,
                                          int *p_temp)
  {
 -      struct mlxsw_thermal_module *tz = tzdev->devdata;
 +      struct mlxsw_thermal_module *tz = thermal_zone_device_priv(tzdev);
        struct mlxsw_thermal *thermal = tz->parent;
        char mtmp_pl[MLXSW_REG_MTMP_LEN];
        u16 index;
@@@ -521,36 -442,26 +442,26 @@@ static void mlxsw_thermal_module_tz_fin
        thermal_zone_device_unregister(tzdev);
  }
  
- static int
+ static void
  mlxsw_thermal_module_init(struct device *dev, struct mlxsw_core *core,
                          struct mlxsw_thermal *thermal,
                          struct mlxsw_thermal_area *area, u8 module)
  {
        struct mlxsw_thermal_module *module_tz;
-       int dummy_temp, crit_temp, emerg_temp;
-       u16 sensor_index;
  
-       sensor_index = MLXSW_REG_MTMP_MODULE_INDEX_MIN + module;
        module_tz = &area->tz_module_arr[module];
        /* Skip if parent is already set (case of port split). */
        if (module_tz->parent)
-               return 0;
+               return;
        module_tz->module = module;
        module_tz->slot_index = area->slot_index;
        module_tz->parent = thermal;
-       memcpy(module_tz->trips, default_thermal_trips,
+       BUILD_BUG_ON(ARRAY_SIZE(default_thermal_module_trips) !=
+                    MLXSW_THERMAL_NUM_TRIPS);
+       memcpy(module_tz->trips, default_thermal_module_trips,
               sizeof(thermal->trips));
        memcpy(module_tz->cooling_states, default_cooling_states,
               sizeof(thermal->cooling_states));
-       /* Initialize all trip point. */
-       mlxsw_thermal_module_trips_reset(module_tz);
-       /* Read module temperature and thresholds. */
-       mlxsw_thermal_module_temp_and_thresholds_get(core, area->slot_index,
-                                                    sensor_index, &dummy_temp,
-                                                    &crit_temp, &emerg_temp);
-       /* Update trip point according to the module data. */
-       return mlxsw_thermal_module_trips_update(dev, core, module_tz,
-                                                crit_temp, emerg_temp);
  }
  
  static void mlxsw_thermal_module_fini(struct mlxsw_thermal_module *module_tz)
@@@ -589,11 -500,8 +500,8 @@@ mlxsw_thermal_modules_init(struct devic
        if (!area->tz_module_arr)
                return -ENOMEM;
  
-       for (i = 0; i < area->tz_module_num; i++) {
-               err = mlxsw_thermal_module_init(dev, core, thermal, area, i);
-               if (err)
-                       goto err_thermal_module_init;
-       }
+       for (i = 0; i < area->tz_module_num; i++)
+               mlxsw_thermal_module_init(dev, core, thermal, area, i);
  
        for (i = 0; i < area->tz_module_num; i++) {
                module_tz = &area->tz_module_arr[i];
        return 0;
  
  err_thermal_module_tz_init:
- err_thermal_module_init:
        for (i = area->tz_module_num - 1; i >= 0; i--)
                mlxsw_thermal_module_fini(&area->tz_module_arr[i]);
        kfree(area->tz_module_arr);
@@@ -51,7 -51,6 +51,7 @@@
  #include <linux/clk-provider.h>
  #include <linux/debugfs.h>
  #include <linux/delay.h>
 +#include <linux/gpio/consumer.h>
  #include <linux/gpio.h>
  #include <linux/ieee802154.h>
  #include <linux/io.h>
@@@ -2855,7 -2854,7 +2855,7 @@@ static int ca8210_interrupt_init(struc
        );
        if (ret) {
                dev_crit(&spi->dev, "request_irq %d failed\n", pdata->irq_id);
 -              gpio_unexport(pdata->gpio_irq);
 +              gpiod_unexport(gpio_to_desc(pdata->gpio_irq));
                gpio_free(pdata->gpio_irq);
        }
  
@@@ -3179,8 -3178,7 +3179,7 @@@ MODULE_DEVICE_TABLE(of, ca8210_of_ids)
  static struct spi_driver ca8210_spi_driver = {
        .driver = {
                .name =                 DRIVER_NAME,
-               .owner =                THIS_MODULE,
-               .of_match_table =       of_match_ptr(ca8210_of_ids),
+               .of_match_table =       ca8210_of_ids,
        },
        .probe  =                       ca8210_probe,
        .remove =                       ca8210_remove
diff --combined drivers/net/tun.c
@@@ -1486,8 -1486,7 +1486,8 @@@ static struct sk_buff *tun_napi_alloc_f
        skb->truesize += skb->data_len;
  
        for (i = 1; i < it->nr_segs; i++) {
 -              size_t fragsz = it->iov[i].iov_len;
 +              const struct iovec *iov = iter_iov(it);
 +              size_t fragsz = iov->iov_len;
                struct page *page;
                void *frag;
  
@@@ -3464,6 -3463,8 +3464,8 @@@ static int tun_chr_open(struct inode *i
  
        sock_set_flag(&tfile->sk, SOCK_ZEROCOPY);
  
+       /* tun groks IOCB_NOWAIT just fine, mark it as such */
+       file->f_mode |= FMODE_NOWAIT;
        return 0;
  }
  
@@@ -1,6 -1,6 +1,6 @@@
  // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  /*
-  * Copyright (C) 2012-2014, 2019-2021 Intel Corporation
+  * Copyright (C) 2012-2014, 2019-2022 Intel Corporation
   * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
   * Copyright (C) 2015-2016 Intel Deutschland GmbH
   */
@@@ -334,7 -334,7 +334,7 @@@ static void iwl_mvm_tt_smps_iterator(vo
        if (vif->type != NL80211_IFTYPE_STATION)
                return;
  
-       iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT, smps_mode);
+       iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT, smps_mode, 0);
  }
  
  static void iwl_mvm_tt_tx_protection(struct iwl_mvm *mvm, bool enable)
@@@ -615,7 -615,7 +615,7 @@@ send
  static int iwl_mvm_tzone_get_temp(struct thermal_zone_device *device,
                                  int *temperature)
  {
 -      struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata;
 +      struct iwl_mvm *mvm = thermal_zone_device_priv(device);
        int ret;
        int temp;
  
@@@ -641,7 -641,7 +641,7 @@@ out
  static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
                                       int trip, int temp)
  {
 -      struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata;
 +      struct iwl_mvm *mvm = thermal_zone_device_priv(device);
        struct iwl_mvm_thermal_device *tzone;
        int ret;
  
@@@ -337,7 -337,7 +337,7 @@@ void cxgbi_hbas_remove(struct cxgbi_dev
  EXPORT_SYMBOL_GPL(cxgbi_hbas_remove);
  
  int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
 -              unsigned int max_conns, struct scsi_host_template *sht,
 +              unsigned int max_conns, const struct scsi_host_template *sht,
                struct scsi_transport_template *stt)
  {
        struct cxgbi_hba *chba;
@@@ -2314,9 -2314,9 +2314,9 @@@ static int cxgbi_sock_tx_queue_up(struc
                frags++;
  
        if (frags >= SKB_WR_LIST_SIZE) {
-               pr_err("csk 0x%p, frags %u, %u,%u >%lu.\n",
+               pr_err("csk 0x%p, frags %u, %u,%u >%u.\n",
                       csk, skb_shinfo(skb)->nr_frags, skb->len,
-                      skb->data_len, SKB_WR_LIST_SIZE);
+                      skb->data_len, (unsigned int)SKB_WR_LIST_SIZE);
                return -EINVAL;
        }
  
diff --combined fs/dlm/lowcomms.c
@@@ -601,7 -601,7 +601,7 @@@ static void lowcomms_error_report(struc
                                   "sk_err=%d/%d\n", dlm_our_nodeid(),
                                   con->nodeid, &inet->inet_daddr,
                                   ntohs(inet->inet_dport), sk->sk_err,
-                                  sk->sk_err_soft);
+                                  READ_ONCE(sk->sk_err_soft));
                break;
  #if IS_ENABLED(CONFIG_IPV6)
        case AF_INET6:
                                   "dport %d, sk_err=%d/%d\n", dlm_our_nodeid(),
                                   con->nodeid, &sk->sk_v6_daddr,
                                   ntohs(inet->inet_dport), sk->sk_err,
-                                  sk->sk_err_soft);
+                                  READ_ONCE(sk->sk_err_soft));
                break;
  #endif
        default:
                printk_ratelimited(KERN_ERR "dlm: node %d: socket error "
                                   "invalid socket family %d set, "
                                   "sk_err=%d/%d\n", dlm_our_nodeid(),
-                                  sk->sk_family, sk->sk_err, sk->sk_err_soft);
+                                  sk->sk_family, sk->sk_err,
+                                  READ_ONCE(sk->sk_err_soft));
                break;
        }
  
@@@ -1717,8 -1718,8 +1718,8 @@@ static void work_stop(void
  
  static int work_start(void)
  {
 -      io_workqueue = alloc_workqueue("dlm_io", WQ_HIGHPRI | WQ_MEM_RECLAIM,
 -                                     0);
 +      io_workqueue = alloc_workqueue("dlm_io", WQ_HIGHPRI | WQ_MEM_RECLAIM |
 +                                     WQ_UNBOUND, 0);
        if (!io_workqueue) {
                log_print("can't start dlm_io");
                return -ENOMEM;
@@@ -1814,7 -1815,7 +1815,7 @@@ static int dlm_listen_for_all(void
        sock->sk->sk_data_ready = lowcomms_listen_data_ready;
        release_sock(sock->sk);
  
 -      result = sock->ops->listen(sock, 5);
 +      result = sock->ops->listen(sock, 128);
        if (result < 0) {
                dlm_close_sock(&listen_con.sock);
                return result;
diff --combined include/linux/module.h
@@@ -353,9 -353,9 +353,9 @@@ struct mod_kallsyms 
  
  #ifdef CONFIG_LIVEPATCH
  /**
 - * struct klp_modinfo - Elf information preserved from the livepatch module
 + * struct klp_modinfo - ELF information preserved from the livepatch module
   *
 - * @hdr: Elf header
 + * @hdr: ELF header
   * @sechdrs: Section header table
   * @secstrings: String table for the section headers
   * @symndx: The symbol table section index
@@@ -523,7 -523,7 +523,7 @@@ struct module 
        bool klp; /* Is this a livepatch module? */
        bool klp_alive;
  
 -      /* Elf information */
 +      /* ELF information */
        struct klp_modinfo *klp_info;
  #endif
  
@@@ -608,14 -608,6 +608,6 @@@ static inline bool within_module(unsign
  /* Search for module by name: must be in a RCU-sched critical section. */
  struct module *find_module(const char *name);
  
- /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
-    symnum out of range. */
- int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
-                       char *name, char *module_name, int *exported);
- /* Look for this name: can be of form module:name. */
- unsigned long module_kallsyms_lookup_name(const char *name);
  extern void __noreturn __module_put_and_kthread_exit(struct module *mod,
                        long code);
  #define module_put_and_kthread_exit(code) __module_put_and_kthread_exit(THIS_MODULE, code)
@@@ -662,17 -654,6 +654,6 @@@ static inline void __module_get(struct 
  /* Dereference module function descriptor */
  void *dereference_module_function_descriptor(struct module *mod, void *ptr);
  
- /* For kallsyms to ask for address resolution.  namebuf should be at
-  * least KSYM_NAME_LEN long: a pointer to namebuf is returned if
-  * found, otherwise NULL. */
- const char *module_address_lookup(unsigned long addr,
-                           unsigned long *symbolsize,
-                           unsigned long *offset,
-                           char **modname, const unsigned char **modbuildid,
-                           char *namebuf);
- int lookup_module_symbol_name(unsigned long addr, char *symname);
- int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name);
  int register_module_notifier(struct notifier_block *nb);
  int unregister_module_notifier(struct notifier_block *nb);
  
@@@ -763,39 -744,6 +744,6 @@@ static inline void module_put(struct mo
  
  #define module_name(mod) "kernel"
  
- /* For kallsyms to ask for address resolution.  NULL means not found. */
- static inline const char *module_address_lookup(unsigned long addr,
-                                         unsigned long *symbolsize,
-                                         unsigned long *offset,
-                                         char **modname,
-                                         const unsigned char **modbuildid,
-                                         char *namebuf)
- {
-       return NULL;
- }
- static inline int lookup_module_symbol_name(unsigned long addr, char *symname)
- {
-       return -ERANGE;
- }
- static inline int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name)
- {
-       return -ERANGE;
- }
- static inline int module_get_kallsym(unsigned int symnum, unsigned long *value,
-                                       char *type, char *name,
-                                       char *module_name, int *exported)
- {
-       return -ERANGE;
- }
- static inline unsigned long module_kallsyms_lookup_name(const char *name)
- {
-       return 0;
- }
  static inline int register_module_notifier(struct notifier_block *nb)
  {
        /* no events will happen anyway, so this can always succeed */
@@@ -891,7 -839,36 +839,36 @@@ int module_kallsyms_on_each_symbol(cons
                                   int (*fn)(void *, const char *,
                                             struct module *, unsigned long),
                                   void *data);
- #else
+ /* For kallsyms to ask for address resolution.  namebuf should be at
+  * least KSYM_NAME_LEN long: a pointer to namebuf is returned if
+  * found, otherwise NULL.
+  */
+ const char *module_address_lookup(unsigned long addr,
+                                 unsigned long *symbolsize,
+                                 unsigned long *offset,
+                                 char **modname, const unsigned char **modbuildid,
+                                 char *namebuf);
+ int lookup_module_symbol_name(unsigned long addr, char *symname);
+ int lookup_module_symbol_attrs(unsigned long addr,
+                              unsigned long *size,
+                              unsigned long *offset,
+                              char *modname,
+                              char *name);
+ /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
+  * symnum out of range.
+  */
+ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
+                      char *name, char *module_name, int *exported);
+ /* Look for this name: can be of form module:name. */
+ unsigned long module_kallsyms_lookup_name(const char *name);
+ unsigned long find_kallsyms_symbol_value(struct module *mod, const char *name);
+ #else /* CONFIG_MODULES && CONFIG_KALLSYMS */
  static inline int module_kallsyms_on_each_symbol(const char *modname,
                                                 int (*fn)(void *, const char *,
                                                 struct module *, unsigned long),
  {
        return -EOPNOTSUPP;
  }
+ /* For kallsyms to ask for address resolution.  NULL means not found. */
+ static inline const char *module_address_lookup(unsigned long addr,
+                                               unsigned long *symbolsize,
+                                               unsigned long *offset,
+                                               char **modname,
+                                               const unsigned char **modbuildid,
+                                               char *namebuf)
+ {
+       return NULL;
+ }
+ static inline int lookup_module_symbol_name(unsigned long addr, char *symname)
+ {
+       return -ERANGE;
+ }
+ static inline int lookup_module_symbol_attrs(unsigned long addr,
+                                            unsigned long *size,
+                                            unsigned long *offset,
+                                            char *modname,
+                                            char *name)
+ {
+       return -ERANGE;
+ }
+ static inline int module_get_kallsym(unsigned int symnum, unsigned long *value,
+                                    char *type, char *name,
+                                    char *module_name, int *exported)
+ {
+       return -ERANGE;
+ }
+ static inline unsigned long module_kallsyms_lookup_name(const char *name)
+ {
+       return 0;
+ }
+ static inline unsigned long find_kallsyms_symbol_value(struct module *mod,
+                                                      const char *name)
+ {
+       return 0;
+ }
  #endif  /* CONFIG_MODULES && CONFIG_KALLSYMS */
  
  #endif /* _LINUX_MODULE_H */
diff --combined include/linux/sched.h
@@@ -1318,11 -1318,6 +1318,6 @@@ struct task_struct 
  
        struct tlbflush_unmap_batch     tlb_ubc;
  
-       union {
-               refcount_t              rcu_users;
-               struct rcu_head         rcu;
-       };
        /* Cache last used pipe for splice(): */
        struct pipe_inode_info          *splice_pipe;
  
        unsigned long                   saved_state_change;
  # endif
  #endif
+       struct rcu_head                 rcu;
+       refcount_t                      rcu_users;
        int                             pagefault_disabled;
  #ifdef CONFIG_MMU
        struct task_struct              *oom_reaper_list;
@@@ -1729,7 -1726,7 +1726,7 @@@ extern struct pid *cad_pid
  #define PF_MEMALLOC           0x00000800      /* Allocating memory */
  #define PF_NPROC_EXCEEDED     0x00001000      /* set_user() noticed that RLIMIT_NPROC was exceeded */
  #define PF_USED_MATH          0x00002000      /* If unset the fpu must be initialized before use */
 -#define PF__HOLE__00004000    0x00004000
 +#define PF_USER_WORKER                0x00004000      /* Kernel thread cloned from userspace thread */
  #define PF_NOFREEZE           0x00008000      /* This thread should not be frozen */
  #define PF__HOLE__00010000    0x00010000
  #define PF_KSWAPD             0x00020000      /* I am kswapd */
diff --combined io_uring/rsrc.c
@@@ -23,16 -23,25 +23,16 @@@ struct io_rsrc_update 
        u32                             offset;
  };
  
 +static void io_rsrc_buf_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
 +static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
  static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
                                  struct io_mapped_ubuf **pimu,
                                  struct page **last_hpage);
  
 -#define IO_RSRC_REF_BATCH     100
 -
  /* only define max */
  #define IORING_MAX_FIXED_FILES        (1U << 20)
  #define IORING_MAX_REG_BUFFERS        (1U << 14)
  
 -void io_rsrc_refs_drop(struct io_ring_ctx *ctx)
 -      __must_hold(&ctx->uring_lock)
 -{
 -      if (ctx->rsrc_cached_refs) {
 -              io_rsrc_put_node(ctx->rsrc_node, ctx->rsrc_cached_refs);
 -              ctx->rsrc_cached_refs = 0;
 -      }
 -}
 -
  int __io_account_mem(struct user_struct *user, unsigned long nr_pages)
  {
        unsigned long page_limit, cur_pages, new_pages;
@@@ -142,129 -151,216 +142,129 @@@ static void io_buffer_unmap(struct io_r
        *slot = NULL;
  }
  
 -void io_rsrc_refs_refill(struct io_ring_ctx *ctx)
 -      __must_hold(&ctx->uring_lock)
 -{
 -      ctx->rsrc_cached_refs += IO_RSRC_REF_BATCH;
 -      percpu_ref_get_many(&ctx->rsrc_node->refs, IO_RSRC_REF_BATCH);
 -}
 -
 -static void __io_rsrc_put_work(struct io_rsrc_node *ref_node)
 -{
 -      struct io_rsrc_data *rsrc_data = ref_node->rsrc_data;
 -      struct io_ring_ctx *ctx = rsrc_data->ctx;
 -      struct io_rsrc_put *prsrc, *tmp;
 -
 -      list_for_each_entry_safe(prsrc, tmp, &ref_node->rsrc_list, list) {
 -              list_del(&prsrc->list);
 -
 -              if (prsrc->tag) {
 -                      if (ctx->flags & IORING_SETUP_IOPOLL) {
 -                              mutex_lock(&ctx->uring_lock);
 -                              io_post_aux_cqe(ctx, prsrc->tag, 0, 0);
 -                              mutex_unlock(&ctx->uring_lock);
 -                      } else {
 -                              io_post_aux_cqe(ctx, prsrc->tag, 0, 0);
 -                      }
 -              }
 -
 -              rsrc_data->do_put(ctx, prsrc);
 -              kfree(prsrc);
 -      }
 -
 -      io_rsrc_node_destroy(ref_node);
 -      if (atomic_dec_and_test(&rsrc_data->refs))
 -              complete(&rsrc_data->done);
 -}
 -
 -void io_rsrc_put_work(struct work_struct *work)
 +static void io_rsrc_put_work(struct io_rsrc_node *node)
  {
 -      struct io_ring_ctx *ctx;
 -      struct llist_node *node;
 -
 -      ctx = container_of(work, struct io_ring_ctx, rsrc_put_work.work);
 -      node = llist_del_all(&ctx->rsrc_put_llist);
 +      struct io_rsrc_put *prsrc = &node->item;
  
 -      while (node) {
 -              struct io_rsrc_node *ref_node;
 -              struct llist_node *next = node->next;
 +      if (prsrc->tag)
 +              io_post_aux_cqe(node->ctx, prsrc->tag, 0, 0);
  
 -              ref_node = llist_entry(node, struct io_rsrc_node, llist);
 -              __io_rsrc_put_work(ref_node);
 -              node = next;
 +      switch (node->type) {
 +      case IORING_RSRC_FILE:
 +              io_rsrc_file_put(node->ctx, prsrc);
 +              break;
 +      case IORING_RSRC_BUFFER:
 +              io_rsrc_buf_put(node->ctx, prsrc);
 +              break;
 +      default:
 +              WARN_ON_ONCE(1);
 +              break;
        }
  }
  
 -void io_rsrc_put_tw(struct callback_head *cb)
 +void io_rsrc_node_destroy(struct io_ring_ctx *ctx, struct io_rsrc_node *node)
  {
 -      struct io_ring_ctx *ctx = container_of(cb, struct io_ring_ctx,
 -                                             rsrc_put_tw);
 -
 -      io_rsrc_put_work(&ctx->rsrc_put_work.work);
 +      if (!io_alloc_cache_put(&ctx->rsrc_node_cache, &node->cache))
 +              kfree(node);
  }
  
 -void io_wait_rsrc_data(struct io_rsrc_data *data)
 +void io_rsrc_node_ref_zero(struct io_rsrc_node *node)
 +      __must_hold(&node->ctx->uring_lock)
  {
 -      if (data && !atomic_dec_and_test(&data->refs))
 -              wait_for_completion(&data->done);
 -}
 -
 -void io_rsrc_node_destroy(struct io_rsrc_node *ref_node)
 -{
 -      percpu_ref_exit(&ref_node->refs);
 -      kfree(ref_node);
 -}
 -
 -static __cold void io_rsrc_node_ref_zero(struct percpu_ref *ref)
 -{
 -      struct io_rsrc_node *node = container_of(ref, struct io_rsrc_node, refs);
 -      struct io_ring_ctx *ctx = node->rsrc_data->ctx;
 -      unsigned long flags;
 -      bool first_add = false;
 -      unsigned long delay = HZ;
 -
 -      spin_lock_irqsave(&ctx->rsrc_ref_lock, flags);
 -      node->done = true;
 -
 -      /* if we are mid-quiesce then do not delay */
 -      if (node->rsrc_data->quiesce)
 -              delay = 0;
 +      struct io_ring_ctx *ctx = node->ctx;
  
        while (!list_empty(&ctx->rsrc_ref_list)) {
                node = list_first_entry(&ctx->rsrc_ref_list,
                                            struct io_rsrc_node, node);
                /* recycle ref nodes in order */
 -              if (!node->done)
 +              if (node->refs)
                        break;
                list_del(&node->node);
 -              first_add |= llist_add(&node->llist, &ctx->rsrc_put_llist);
 -      }
 -      spin_unlock_irqrestore(&ctx->rsrc_ref_lock, flags);
  
 -      if (!first_add)
 -              return;
 -
 -      if (ctx->submitter_task) {
 -              if (!task_work_add(ctx->submitter_task, &ctx->rsrc_put_tw,
 -                                 ctx->notify_method))
 -                      return;
 +              if (likely(!node->empty))
 +                      io_rsrc_put_work(node);
 +              io_rsrc_node_destroy(ctx, node);
        }
 -      mod_delayed_work(system_wq, &ctx->rsrc_put_work, delay);
 +      if (list_empty(&ctx->rsrc_ref_list) && unlikely(ctx->rsrc_quiesce))
 +              wake_up_all(&ctx->rsrc_quiesce_wq);
  }
  
 -static struct io_rsrc_node *io_rsrc_node_alloc(void)
 +struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx)
  {
        struct io_rsrc_node *ref_node;
 +      struct io_cache_entry *entry;
  
 -      ref_node = kzalloc(sizeof(*ref_node), GFP_KERNEL);
 -      if (!ref_node)
 -              return NULL;
 -
 -      if (percpu_ref_init(&ref_node->refs, io_rsrc_node_ref_zero,
 -                          0, GFP_KERNEL)) {
 -              kfree(ref_node);
 -              return NULL;
 -      }
 -      INIT_LIST_HEAD(&ref_node->node);
 -      INIT_LIST_HEAD(&ref_node->rsrc_list);
 -      ref_node->done = false;
 -      return ref_node;
 -}
 -
 -void io_rsrc_node_switch(struct io_ring_ctx *ctx,
 -                       struct io_rsrc_data *data_to_kill)
 -      __must_hold(&ctx->uring_lock)
 -{
 -      WARN_ON_ONCE(!ctx->rsrc_backup_node);
 -      WARN_ON_ONCE(data_to_kill && !ctx->rsrc_node);
 -
 -      io_rsrc_refs_drop(ctx);
 -
 -      if (data_to_kill) {
 -              struct io_rsrc_node *rsrc_node = ctx->rsrc_node;
 -
 -              rsrc_node->rsrc_data = data_to_kill;
 -              spin_lock_irq(&ctx->rsrc_ref_lock);
 -              list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
 -              spin_unlock_irq(&ctx->rsrc_ref_lock);
 -
 -              atomic_inc(&data_to_kill->refs);
 -              percpu_ref_kill(&rsrc_node->refs);
 -              ctx->rsrc_node = NULL;
 -      }
 -
 -      if (!ctx->rsrc_node) {
 -              ctx->rsrc_node = ctx->rsrc_backup_node;
 -              ctx->rsrc_backup_node = NULL;
 +      entry = io_alloc_cache_get(&ctx->rsrc_node_cache);
 +      if (entry) {
 +              ref_node = container_of(entry, struct io_rsrc_node, cache);
 +      } else {
 +              ref_node = kzalloc(sizeof(*ref_node), GFP_KERNEL);
 +              if (!ref_node)
 +                      return NULL;
        }
 -}
  
 -int io_rsrc_node_switch_start(struct io_ring_ctx *ctx)
 -{
 -      if (ctx->rsrc_backup_node)
 -              return 0;
 -      ctx->rsrc_backup_node = io_rsrc_node_alloc();
 -      return ctx->rsrc_backup_node ? 0 : -ENOMEM;
 +      ref_node->ctx = ctx;
 +      ref_node->empty = 0;
 +      ref_node->refs = 1;
 +      return ref_node;
  }
  
  __cold static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
                                      struct io_ring_ctx *ctx)
  {
 +      struct io_rsrc_node *backup;
 +      DEFINE_WAIT(we);
        int ret;
  
 -      /* As we may drop ->uring_lock, other task may have started quiesce */
 +      /* As We may drop ->uring_lock, other task may have started quiesce */
        if (data->quiesce)
                return -ENXIO;
 -      ret = io_rsrc_node_switch_start(ctx);
 -      if (ret)
 -              return ret;
 -      io_rsrc_node_switch(ctx, data);
  
 -      /* kill initial ref, already quiesced if zero */
 -      if (atomic_dec_and_test(&data->refs))
 +      backup = io_rsrc_node_alloc(ctx);
 +      if (!backup)
 +              return -ENOMEM;
 +      ctx->rsrc_node->empty = true;
 +      ctx->rsrc_node->type = -1;
 +      list_add_tail(&ctx->rsrc_node->node, &ctx->rsrc_ref_list);
 +      io_put_rsrc_node(ctx, ctx->rsrc_node);
 +      ctx->rsrc_node = backup;
 +
 +      if (list_empty(&ctx->rsrc_ref_list))
                return 0;
  
 +      if (ctx->flags & IORING_SETUP_DEFER_TASKRUN) {
 +              atomic_set(&ctx->cq_wait_nr, 1);
 +              smp_mb();
 +      }
 +
 +      ctx->rsrc_quiesce++;
        data->quiesce = true;
 -      mutex_unlock(&ctx->uring_lock);
        do {
 +              prepare_to_wait(&ctx->rsrc_quiesce_wq, &we, TASK_INTERRUPTIBLE);
 +              mutex_unlock(&ctx->uring_lock);
 +
                ret = io_run_task_work_sig(ctx);
                if (ret < 0) {
 -                      atomic_inc(&data->refs);
 -                      /* wait for all works potentially completing data->done */
 -                      flush_delayed_work(&ctx->rsrc_put_work);
 -                      reinit_completion(&data->done);
                        mutex_lock(&ctx->uring_lock);
 +                      if (list_empty(&ctx->rsrc_ref_list))
 +                              ret = 0;
                        break;
                }
  
 -              flush_delayed_work(&ctx->rsrc_put_work);
 -              ret = wait_for_completion_interruptible(&data->done);
 -              if (!ret) {
 -                      mutex_lock(&ctx->uring_lock);
 -                      if (atomic_read(&data->refs) <= 0)
 -                              break;
 -                      /*
 -                       * it has been revived by another thread while
 -                       * we were unlocked
 -                       */
 -                      mutex_unlock(&ctx->uring_lock);
 -              }
 -      } while (1);
 +              schedule();
 +              __set_current_state(TASK_RUNNING);
 +              mutex_lock(&ctx->uring_lock);
 +              ret = 0;
 +      } while (!list_empty(&ctx->rsrc_ref_list));
 +
 +      finish_wait(&ctx->rsrc_quiesce_wq, &we);
        data->quiesce = false;
 +      ctx->rsrc_quiesce--;
  
 +      if (ctx->flags & IORING_SETUP_DEFER_TASKRUN) {
 +              atomic_set(&ctx->cq_wait_nr, 0);
 +              smp_mb();
 +      }
        return ret;
  }
  
@@@ -309,8 -405,8 +309,8 @@@ static __cold void **io_alloc_page_tabl
        return table;
  }
  
 -__cold static int io_rsrc_data_alloc(struct io_ring_ctx *ctx,
 -                                   rsrc_put_fn *do_put, u64 __user *utags,
 +__cold static int io_rsrc_data_alloc(struct io_ring_ctx *ctx, int type,
 +                                   u64 __user *utags,
                                     unsigned nr, struct io_rsrc_data **pdata)
  {
        struct io_rsrc_data *data;
  
        data->nr = nr;
        data->ctx = ctx;
 -      data->do_put = do_put;
 +      data->rsrc_type = type;
        if (utags) {
                ret = -EFAULT;
                for (i = 0; i < nr; i++) {
                                goto fail;
                }
        }
 -
 -      atomic_set(&data->refs, 1);
 -      init_completion(&data->done);
        *pdata = data;
        return 0;
  fail:
@@@ -357,6 -456,7 +357,6 @@@ static int __io_sqe_files_update(struc
        struct file *file;
        int fd, i, err = 0;
        unsigned int done;
 -      bool needs_switch = false;
  
        if (!ctx->file_data)
                return -ENXIO;
  
                if (file_slot->file_ptr) {
                        file = (struct file *)(file_slot->file_ptr & FFS_MASK);
 -                      err = io_queue_rsrc_removal(data, i, ctx->rsrc_node, file);
 +                      err = io_queue_rsrc_removal(data, i, file);
                        if (err)
                                break;
                        file_slot->file_ptr = 0;
                        io_file_bitmap_clear(&ctx->file_table, i);
 -                      needs_switch = true;
                }
                if (fd != -1) {
                        file = fget(fd);
                        io_file_bitmap_set(&ctx->file_table, i);
                }
        }
 -
 -      if (needs_switch)
 -              io_rsrc_node_switch(ctx, data);
        return done ? done : err;
  }
  
@@@ -428,6 -532,7 +428,6 @@@ static int __io_sqe_buffers_update(stru
        u64 __user *tags = u64_to_user_ptr(up->tags);
        struct iovec iov, __user *iovs = u64_to_user_ptr(up->data);
        struct page *last_hpage = NULL;
 -      bool needs_switch = false;
        __u32 done;
        int i, err;
  
  
        for (done = 0; done < nr_args; done++) {
                struct io_mapped_ubuf *imu;
 -              int offset = up->offset + done;
                u64 tag = 0;
  
                err = io_copy_iov(ctx, &iov, iovs, done);
                if (err)
                        break;
  
 -              i = array_index_nospec(offset, ctx->nr_user_bufs);
 +              i = array_index_nospec(up->offset + done, ctx->nr_user_bufs);
                if (ctx->user_bufs[i] != ctx->dummy_ubuf) {
                        err = io_queue_rsrc_removal(ctx->buf_data, i,
 -                                                  ctx->rsrc_node, ctx->user_bufs[i]);
 +                                                  ctx->user_bufs[i]);
                        if (unlikely(err)) {
                                io_buffer_unmap(ctx, &imu);
                                break;
                        }
                        ctx->user_bufs[i] = ctx->dummy_ubuf;
 -                      needs_switch = true;
                }
  
                ctx->user_bufs[i] = imu;
 -              *io_get_tag_slot(ctx->buf_data, offset) = tag;
 +              *io_get_tag_slot(ctx->buf_data, i) = tag;
        }
 -
 -      if (needs_switch)
 -              io_rsrc_node_switch(ctx, ctx->buf_data);
        return done ? done : err;
  }
  
@@@ -480,11 -590,13 +480,11 @@@ static int __io_register_rsrc_update(st
                                     unsigned nr_args)
  {
        __u32 tmp;
 -      int err;
 +
 +      lockdep_assert_held(&ctx->uring_lock);
  
        if (check_add_overflow(up->offset, nr_args, &tmp))
                return -EOVERFLOW;
 -      err = io_rsrc_node_switch_start(ctx);
 -      if (err)
 -              return err;
  
        switch (type) {
        case IORING_RSRC_FILE:
@@@ -641,24 -753,20 +641,24 @@@ int io_files_update(struct io_kiocb *re
        return IOU_OK;
  }
  
 -int io_queue_rsrc_removal(struct io_rsrc_data *data, unsigned idx,
 -                        struct io_rsrc_node *node, void *rsrc)
 +int io_queue_rsrc_removal(struct io_rsrc_data *data, unsigned idx, void *rsrc)
  {
 +      struct io_ring_ctx *ctx = data->ctx;
 +      struct io_rsrc_node *node = ctx->rsrc_node;
        u64 *tag_slot = io_get_tag_slot(data, idx);
 -      struct io_rsrc_put *prsrc;
  
 -      prsrc = kzalloc(sizeof(*prsrc), GFP_KERNEL);
 -      if (!prsrc)
 +      ctx->rsrc_node = io_rsrc_node_alloc(ctx);
 +      if (unlikely(!ctx->rsrc_node)) {
 +              ctx->rsrc_node = node;
                return -ENOMEM;
 +      }
  
 -      prsrc->tag = *tag_slot;
 +      node->item.rsrc = rsrc;
 +      node->type = data->rsrc_type;
 +      node->item.tag = *tag_slot;
        *tag_slot = 0;
 -      prsrc->rsrc = rsrc;
 -      list_add(&prsrc->list, &node->rsrc_list);
 +      list_add_tail(&node->node, &ctx->rsrc_ref_list);
 +      io_put_rsrc_node(ctx, node);
        return 0;
  }
  
@@@ -760,8 -868,7 +760,7 @@@ int __io_scm_file_account(struct io_rin
  
                UNIXCB(skb).fp = fpl;
                skb->sk = sk;
-               skb->scm_io_uring = 1;
-               skb->destructor = unix_destruct_scm;
+               skb->destructor = io_uring_destruct_scm;
                refcount_add(skb->truesize, &sk->sk_wmem_alloc);
        }
  
        return 0;
  }
  
 -static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
 +static __cold void io_rsrc_file_scm_put(struct io_ring_ctx *ctx, struct file *file)
  {
 -      struct file *file = prsrc->file;
  #if defined(CONFIG_UNIX)
        struct sock *sock = ctx->ring_sock->sk;
        struct sk_buff_head list, *head = &sock->sk_receive_queue;
        struct sk_buff *skb;
        int i;
  
 -      if (!io_file_need_scm(file)) {
 -              fput(file);
 -              return;
 -      }
 -
        __skb_queue_head_init(&list);
  
        /*
                        __skb_queue_tail(head, skb);
                spin_unlock_irq(&head->lock);
        }
 -#else
 -      fput(file);
  #endif
  }
  
 +static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
 +{
 +      struct file *file = prsrc->file;
 +
 +      if (likely(!io_file_need_scm(file)))
 +              fput(file);
 +      else
 +              io_rsrc_file_scm_put(ctx, file);
 +}
 +
  int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
                          unsigned nr_args, u64 __user *tags)
  {
                return -EMFILE;
        if (nr_args > rlimit(RLIMIT_NOFILE))
                return -EMFILE;
 -      ret = io_rsrc_node_switch_start(ctx);
 -      if (ret)
 -              return ret;
 -      ret = io_rsrc_data_alloc(ctx, io_rsrc_file_put, tags, nr_args,
 +      ret = io_rsrc_data_alloc(ctx, IORING_RSRC_FILE, tags, nr_args,
                                 &ctx->file_data);
        if (ret)
                return ret;
  
        /* default it to the whole table */
        io_file_table_set_alloc_range(ctx, 0, ctx->nr_user_files);
 -      io_rsrc_node_switch(ctx, NULL);
        return 0;
  fail:
        __io_sqe_files_unregister(ctx);
@@@ -1053,14 -1162,17 +1052,14 @@@ struct page **io_pin_pages(unsigned lon
        pret = pin_user_pages(ubuf, nr_pages, FOLL_WRITE | FOLL_LONGTERM,
                              pages, vmas);
        if (pret == nr_pages) {
 -              struct file *file = vmas[0]->vm_file;
 -
                /* don't support file backed memory */
                for (i = 0; i < nr_pages; i++) {
 -                      if (vmas[i]->vm_file != file) {
 -                              ret = -EINVAL;
 -                              break;
 -                      }
 -                      if (!file)
 +                      struct vm_area_struct *vma = vmas[i];
 +
 +                      if (vma_is_shmem(vma))
                                continue;
 -                      if (!vma_is_shmem(vmas[i]) && !is_file_hugepages(file)) {
 +                      if (vma->vm_file &&
 +                          !is_file_hugepages(vma->vm_file)) {
                                ret = -EOPNOTSUPP;
                                break;
                        }
@@@ -1192,7 -1304,10 +1191,7 @@@ int io_sqe_buffers_register(struct io_r
                return -EBUSY;
        if (!nr_args || nr_args > IORING_MAX_REG_BUFFERS)
                return -EINVAL;
 -      ret = io_rsrc_node_switch_start(ctx);
 -      if (ret)
 -              return ret;
 -      ret = io_rsrc_data_alloc(ctx, io_rsrc_buf_put, tags, nr_args, &data);
 +      ret = io_rsrc_data_alloc(ctx, IORING_RSRC_BUFFER, tags, nr_args, &data);
        if (ret)
                return ret;
        ret = io_buffers_map_alloc(ctx, nr_args);
        ctx->buf_data = data;
        if (ret)
                __io_sqe_buffers_unregister(ctx);
 -      else
 -              io_rsrc_node_switch(ctx, NULL);
        return ret;
  }
  
@@@ -57,7 -57,6 +57,6 @@@ static struct bpf_local_storage_data *i
  void bpf_inode_storage_free(struct inode *inode)
  {
        struct bpf_local_storage *local_storage;
-       bool free_inode_storage = false;
        struct bpf_storage_blob *bsb;
  
        bsb = bpf_inode(inode);
                return;
        }
  
-       raw_spin_lock_bh(&local_storage->lock);
-       free_inode_storage = bpf_local_storage_unlink_nolock(local_storage);
-       raw_spin_unlock_bh(&local_storage->lock);
+       bpf_local_storage_destroy(local_storage);
        rcu_read_unlock();
-       if (free_inode_storage)
-               kfree_rcu(local_storage, rcu);
  }
  
  static void *bpf_fd_inode_storage_lookup_elem(struct bpf_map *map, void *key)
  {
        struct bpf_local_storage_data *sdata;
 -      struct file *f;
 -      int fd;
 +      struct fd f = fdget_raw(*(int *)key);
  
 -      fd = *(int *)key;
 -      f = fget_raw(fd);
 -      if (!f)
 +      if (!f.file)
                return ERR_PTR(-EBADF);
  
 -      sdata = inode_storage_lookup(f->f_inode, map, true);
 -      fput(f);
 +      sdata = inode_storage_lookup(file_inode(f.file), map, true);
 +      fdput(f);
        return sdata ? sdata->data : NULL;
  }
  
- static int bpf_fd_inode_storage_update_elem(struct bpf_map *map, void *key,
-                                        void *value, u64 map_flags)
+ static long bpf_fd_inode_storage_update_elem(struct bpf_map *map, void *key,
+                                            void *value, u64 map_flags)
  {
        struct bpf_local_storage_data *sdata;
 -      struct file *f;
 -      int fd;
 +      struct fd f = fdget_raw(*(int *)key);
  
 -      fd = *(int *)key;
 -      f = fget_raw(fd);
 -      if (!f)
 +      if (!f.file)
                return -EBADF;
 -      if (!inode_storage_ptr(f->f_inode)) {
 -              fput(f);
 +      if (!inode_storage_ptr(file_inode(f.file))) {
 +              fdput(f);
                return -EBADF;
        }
  
 -      sdata = bpf_local_storage_update(f->f_inode,
 +      sdata = bpf_local_storage_update(file_inode(f.file),
                                         (struct bpf_local_storage_map *)map,
                                         value, map_flags, GFP_ATOMIC);
 -      fput(f);
 +      fdput(f);
        return PTR_ERR_OR_ZERO(sdata);
  }
  
@@@ -122,21 -122,23 +116,21 @@@ static int inode_storage_delete(struct 
        if (!sdata)
                return -ENOENT;
  
-       bpf_selem_unlink(SELEM(sdata), true);
+       bpf_selem_unlink(SELEM(sdata), false);
  
        return 0;
  }
  
- static int bpf_fd_inode_storage_delete_elem(struct bpf_map *map, void *key)
+ static long bpf_fd_inode_storage_delete_elem(struct bpf_map *map, void *key)
  {
 -      struct file *f;
 -      int fd, err;
 +      struct fd f = fdget_raw(*(int *)key);
 +      int err;
  
 -      fd = *(int *)key;
 -      f = fget_raw(fd);
 -      if (!f)
 +      if (!f.file)
                return -EBADF;
  
 -      err = inode_storage_delete(f->f_inode, map);
 -      fput(f);
 +      err = inode_storage_delete(file_inode(f.file), map);
 +      fdput(f);
        return err;
  }
  
@@@ -197,7 -199,7 +191,7 @@@ static int notsupp_get_next_key(struct 
  
  static struct bpf_map *inode_storage_map_alloc(union bpf_attr *attr)
  {
-       return bpf_local_storage_map_alloc(attr, &inode_cache);
+       return bpf_local_storage_map_alloc(attr, &inode_cache, false);
  }
  
  static void inode_storage_map_free(struct bpf_map *map)
@@@ -215,6 -217,7 +209,7 @@@ const struct bpf_map_ops inode_storage_
        .map_update_elem = bpf_fd_inode_storage_update_elem,
        .map_delete_elem = bpf_fd_inode_storage_delete_elem,
        .map_check_btf = bpf_local_storage_map_check_btf,
+       .map_mem_usage = bpf_local_storage_map_mem_usage,
        .map_btf_id = &bpf_local_storage_map_btf_id[0],
        .map_owner_storage_ptr = inode_storage_ptr,
  };
@@@ -226,7 -229,7 +221,7 @@@ const struct bpf_func_proto bpf_inode_s
        .gpl_only       = false,
        .ret_type       = RET_PTR_TO_MAP_VALUE_OR_NULL,
        .arg1_type      = ARG_CONST_MAP_PTR,
-       .arg2_type      = ARG_PTR_TO_BTF_ID,
+       .arg2_type      = ARG_PTR_TO_BTF_ID_OR_NULL,
        .arg2_btf_id    = &bpf_inode_storage_btf_ids[0],
        .arg3_type      = ARG_PTR_TO_MAP_VALUE_OR_NULL,
        .arg4_type      = ARG_ANYTHING,
@@@ -237,6 -240,6 +232,6 @@@ const struct bpf_func_proto bpf_inode_s
        .gpl_only       = false,
        .ret_type       = RET_INTEGER,
        .arg1_type      = ARG_CONST_MAP_PTR,
-       .arg2_type      = ARG_PTR_TO_BTF_ID,
+       .arg2_type      = ARG_PTR_TO_BTF_ID_OR_NULL,
        .arg2_btf_id    = &bpf_inode_storage_btf_ids[0],
  };
diff --combined kernel/bpf/trampoline.c
@@@ -9,7 -9,6 +9,6 @@@
  #include <linux/btf.h>
  #include <linux/rcupdate_trace.h>
  #include <linux/rcupdate_wait.h>
- #include <linux/module.h>
  #include <linux/static_call.h>
  #include <linux/bpf_verifier.h>
  #include <linux/bpf_lsm.h>
@@@ -45,8 -44,8 +44,8 @@@ static int bpf_tramp_ftrace_ops_func(st
                lockdep_assert_held_once(&tr->mutex);
  
                /* Instead of updating the trampoline here, we propagate
 -               * -EAGAIN to register_ftrace_direct_multi(). Then we can
 -               * retry register_ftrace_direct_multi() after updating the
 +               * -EAGAIN to register_ftrace_direct(). Then we can
 +               * retry register_ftrace_direct() after updating the
                 * trampoline.
                 */
                if ((tr->flags & BPF_TRAMP_F_CALL_ORIG) &&
@@@ -172,38 -171,16 +171,16 @@@ out
        return tr;
  }
  
- static int bpf_trampoline_module_get(struct bpf_trampoline *tr)
- {
-       struct module *mod;
-       int err = 0;
-       preempt_disable();
-       mod = __module_text_address((unsigned long) tr->func.addr);
-       if (mod && !try_module_get(mod))
-               err = -ENOENT;
-       preempt_enable();
-       tr->mod = mod;
-       return err;
- }
- static void bpf_trampoline_module_put(struct bpf_trampoline *tr)
- {
-       module_put(tr->mod);
-       tr->mod = NULL;
- }
  static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
  {
        void *ip = tr->func.addr;
        int ret;
  
        if (tr->func.ftrace_managed)
 -              ret = unregister_ftrace_direct_multi(tr->fops, (long)old_addr);
 +              ret = unregister_ftrace_direct(tr->fops, (long)old_addr, false);
        else
                ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, old_addr, NULL);
  
-       if (!ret)
-               bpf_trampoline_module_put(tr);
        return ret;
  }
  
@@@ -215,9 -192,9 +192,9 @@@ static int modify_fentry(struct bpf_tra
  
        if (tr->func.ftrace_managed) {
                if (lock_direct_mutex)
 -                      ret = modify_ftrace_direct_multi(tr->fops, (long)new_addr);
 +                      ret = modify_ftrace_direct(tr->fops, (long)new_addr);
                else
 -                      ret = modify_ftrace_direct_multi_nolock(tr->fops, (long)new_addr);
 +                      ret = modify_ftrace_direct_nolock(tr->fops, (long)new_addr);
        } else {
                ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, old_addr, new_addr);
        }
@@@ -238,18 -215,13 +215,13 @@@ static int register_fentry(struct bpf_t
                tr->func.ftrace_managed = true;
        }
  
-       if (bpf_trampoline_module_get(tr))
-               return -ENOENT;
        if (tr->func.ftrace_managed) {
                ftrace_set_filter_ip(tr->fops, (unsigned long)ip, 0, 1);
 -              ret = register_ftrace_direct_multi(tr->fops, (long)new_addr);
 +              ret = register_ftrace_direct(tr->fops, (long)new_addr);
        } else {
                ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, NULL, new_addr);
        }
  
-       if (ret)
-               bpf_trampoline_module_put(tr);
        return ret;
  }
  
diff --combined kernel/cgroup/cgroup.c
@@@ -1465,8 -1465,18 +1465,18 @@@ static struct cgroup *current_cgns_cgro
  {
        struct css_set *cset;
  
-       cset = current->nsproxy->cgroup_ns->root_cset;
-       return __cset_cgroup_from_root(cset, &cgrp_dfl_root);
+       if (current->nsproxy) {
+               cset = current->nsproxy->cgroup_ns->root_cset;
+               return __cset_cgroup_from_root(cset, &cgrp_dfl_root);
+       } else {
+               /*
+                * NOTE: This function may be called from bpf_cgroup_from_id()
+                * on a task which has already passed exit_task_namespaces() and
+                * nsproxy == NULL. Fall back to cgrp_dfl_root which will make all
+                * cgroups visible for lookups.
+                */
+               return &cgrp_dfl_root.cgrp;
+       }
  }
  
  /* look up cgroup associated with given css_set on the specified hierarchy */
@@@ -6856,12 -6866,14 +6866,12 @@@ EXPORT_SYMBOL_GPL(cgroup_get_from_path)
  struct cgroup *cgroup_v1v2_get_from_fd(int fd)
  {
        struct cgroup *cgrp;
 -      struct file *f;
 -
 -      f = fget_raw(fd);
 -      if (!f)
 +      struct fd f = fdget_raw(fd);
 +      if (!f.file)
                return ERR_PTR(-EBADF);
  
 -      cgrp = cgroup_v1v2_get_from_file(f);
 -      fput(f);
 +      cgrp = cgroup_v1v2_get_from_file(f.file);
 +      fdput(f);
        return cgrp;
  }