]> Git Repo - linux.git/commitdiff
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
authorLinus Torvalds <[email protected]>
Thu, 23 May 2024 19:04:36 +0000 (12:04 -0700)
committerLinus Torvalds <[email protected]>
Thu, 23 May 2024 19:04:36 +0000 (12:04 -0700)
Pull virtio updates from Michael Tsirkin:
 "Several new features here:

   - virtio-net is finally supported in vduse

   - virtio (balloon and mem) interaction with suspend is improved

   - vhost-scsi now handles signals better/faster

  And fixes, cleanups all over the place"

* tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: (48 commits)
  virtio-pci: Check if is_avq is NULL
  virtio: delete vq in vp_find_vqs_msix() when request_irq() fails
  MAINTAINERS: add Eugenio Pérez as reviewer
  vhost-vdpa: Remove usage of the deprecated ida_simple_xx() API
  vp_vdpa: don't allocate unused msix vectors
  sound: virtio: drop owner assignment
  fuse: virtio: drop owner assignment
  scsi: virtio: drop owner assignment
  rpmsg: virtio: drop owner assignment
  nvdimm: virtio_pmem: drop owner assignment
  wifi: mac80211_hwsim: drop owner assignment
  vsock/virtio: drop owner assignment
  net: 9p: virtio: drop owner assignment
  net: virtio: drop owner assignment
  net: caif: virtio: drop owner assignment
  misc: nsm: drop owner assignment
  iommu: virtio: drop owner assignment
  drm/virtio: drop owner assignment
  gpio: virtio: drop owner assignment
  firmware: arm_scmi: virtio: drop owner assignment
  ...

1  2 
MAINTAINERS
drivers/block/virtio_blk.c
drivers/bluetooth/virtio_bt.c
drivers/iommu/virtio-iommu.c
drivers/net/virtio_net.c
drivers/net/wireless/virtual/mac80211_hwsim.c
drivers/virtio/virtio_mem.c
fs/coredump.c
fs/fuse/virtio_fs.c
kernel/exit.c
kernel/signal.c

diff --combined MAINTAINERS
index 7af431daf77bc34a25fedbf44f5478aee5fba4df,f2f6cfbaa11a6c9ddb0eef32980f7d343fe6d6c2..27367ad339ea76816100915a149371f39da6c4cb
@@@ -210,44 -210,44 +210,44 @@@ S:      Maintaine
  F:    drivers/hwmon/abituguru3.c
  
  ACCES 104-DIO-48E GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-104-dio-48e.c
  
  ACCES 104-IDI-48 GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-104-idi-48.c
  
  ACCES 104-IDIO-16 GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-104-idio-16.c
  
  ACCES 104-QUAD-8 DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/counter/104-quad-8.c
  
  ACCES IDIO-16 GPIO LIBRARY
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-idio-16.c
  F:    drivers/gpio/gpio-idio-16.h
  
  ACCES PCI-IDIO-16 GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-pci-idio-16.c
  
  ACCES PCIe-IDIO-24 GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-pcie-idio-24.c
@@@ -258,12 -258,6 +258,12 @@@ L:       [email protected]
  S:    Maintained
  F:    drivers/net/ethernet/alteon/acenic*
  
 +ACER ASPIRE 1 EMBEDDED CONTROLLER DRIVER
 +M:    Nikita Travkin <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/platform/acer,aspire1-ec.yaml
 +F:    drivers/platform/arm64/acer-aspire1-ec.c
 +
  ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER
  M:    Peter Kaestle <[email protected]>
  L:    [email protected]
@@@ -360,12 -354,6 +360,12 @@@ B:       https://bugzilla.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
  F:    drivers/acpi/pmic/
  
 +ACPI QUICKSTART DRIVER
 +M:    Armin Wolf <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/platform/x86/quickstart.c
 +
  ACPI SERIAL MULTI INSTANTIATE DRIVER
  M:    Hans de Goede <[email protected]>
  L:    [email protected]
@@@ -453,16 -441,6 +453,16 @@@ W:       http://wiki.analog.com/AD787
  W:    https://ez.analog.com/linux-software-drivers
  F:    drivers/input/touchscreen/ad7879.c
  
 +AD7944 ADC DRIVER (AD7944/AD7985/AD7986)
 +M:    Michael Hennerich <[email protected]>
 +M:    Nuno Sá <[email protected]>
 +R:    David Lechner <[email protected]>
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/iio/adc/adi,ad7944.yaml
 +F:    Documentation/iio/ad7944.rst
 +F:    drivers/iio/adc/ad7944.c
 +
  ADAFRUIT MINI I2C GAMEPAD
  M:    Anshul Dalal <[email protected]>
  L:    [email protected]
@@@ -501,13 -479,6 +501,13 @@@ L:       [email protected]
  S:    Orphan
  F:    drivers/net/wireless/admtek/adm8211.*
  
 +ADP1050 HARDWARE MONITOR DRIVER
 +M:    Radu Sabau <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/hwmon/pmbus/adi,adp1050.yaml
 +
  ADP1653 FLASH CONTROLLER DRIVER
  M:    Sakari Ailus <[email protected]>
  L:    [email protected]
@@@ -582,7 -553,7 +582,7 @@@ F: Documentation/devicetree/bindings/ii
  F:    drivers/input/misc/adxl34x.c
  
  ADXL355 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
 -M:    Puranjay Mohan <puranjay[email protected]>
 +M:    Puranjay Mohan <puranjay@kernel.org>
  L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/iio/accel/adi,adxl355.yaml
@@@ -682,15 -653,6 +682,15 @@@ S:       Supporte
  F:    fs/aio.c
  F:    include/linux/*aio*.h
  
 +AIROHA SPI SNFI DRIVER
 +M:    Lorenzo Bianconi <[email protected]>
 +M:    Ray Liu <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/spi/airoha,en7581-snand.yaml
 +F:    drivers/spi/spi-airoha-snfi.c
 +
  AIRSPY MEDIA DRIVER
  L:    [email protected]
  S:    Orphan
@@@ -1031,7 -993,7 +1031,7 @@@ F:       drivers/video/fbdev/geode
  
  AMD HSMP DRIVER
  M:    Naveen Krishna Chatradhi <[email protected]>
 -R:    Carlos Bilbao <carlos.bilbao@amd.com>
 +R:    Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/arch/x86/amd_hsmp.rst
@@@ -1100,9 -1062,6 +1100,9 @@@ F:      drivers/gpu/drm/amd/pm
  
  AMD PSTATE DRIVER
  M:    Huang Rui <[email protected]>
 +M:    Gautham R. Shenoy <[email protected]>
 +M:    Mario Limonciello <[email protected]>
 +R:    Perry Yuan <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    Documentation/admin-guide/pm/amd-pstate.rst
@@@ -1265,15 -1224,6 +1265,15 @@@ W:    https://ez.analog.com/linux-software
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml
  F:    drivers/iio/adc/ad7780.c
  
 +ANALOG DEVICES INC AD9739a DRIVER
 +M:    Nuno Sa <[email protected]>
 +M:    Dragos Bogdan <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/iio/dac/adi,ad9739a.yaml
 +F:    drivers/iio/dac/ad9739a.c
 +
  ANALOG DEVICES INC ADA4250 DRIVER
  M:    Antoniu Miclaus <[email protected]>
  L:    [email protected]
@@@ -1439,14 -1389,6 +1439,14 @@@ F:    sound/soc/codecs/adav
  F:    sound/soc/codecs/sigmadsp.*
  F:    sound/soc/codecs/ssm*
  
 +ANALOG DEVICES INC AXI DAC DRIVER
 +M:    Nuno Sa <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/iio/dac/adi,axi-dac.yaml
 +F:    drivers/iio/dac/adi-axi-dac.c
 +
  ANALOG DEVICES INC DMA DRIVERS
  M:    Lars-Peter Clausen <[email protected]>
  S:    Supported
@@@ -1511,7 -1453,7 +1511,7 @@@ S:      Maintaine
  F:    sound/aoa/
  
  APEX EMBEDDED SYSTEMS STX104 IIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/iio/addac/stx104.c
@@@ -1729,7 -1671,7 +1729,7 @@@ F:      drivers/soc/versatile
  ARM KOMEDA DRM-KMS DRIVER
  M:    Liviu Dudau <[email protected]>
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/arm,komeda.yaml
  F:    Documentation/gpu/komeda-kms.rst
  F:    drivers/gpu/drm/arm/display/include/
@@@ -1741,26 -1683,15 +1741,26 @@@ M:   Rob Herring <[email protected]
  R:    Steven Price <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/gpu/panfrost.rst
  F:    drivers/gpu/drm/panfrost/
  F:    include/uapi/drm/panfrost_drm.h
  
 +ARM MALI PANTHOR DRM DRIVER
 +M:    Boris Brezillon <[email protected]>
 +M:    Steven Price <[email protected]>
 +M:    Liviu Dudau <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
 +F:    Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml
 +F:    drivers/gpu/drm/panthor/
 +F:    include/uapi/drm/panthor_drm.h
 +
  ARM MALI-DP DRM DRIVER
  M:    Liviu Dudau <[email protected]>
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/arm,malidp.yaml
  F:    Documentation/gpu/afbc.rst
  F:    drivers/gpu/drm/arm/
@@@ -2389,7 -2320,7 +2389,7 @@@ M:      Vladimir Zapolskiy <[email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  T:    git git://github.com/vzapolskiy/linux-lpc32xx.git
 -F:    Documentation/devicetree/bindings/i2c/i2c-pnx.txt
 +F:    Documentation/devicetree/bindings/i2c/nxp,pnx-i2c.yaml
  F:    arch/arm/boot/dts/nxp/lpc/lpc32*
  F:    arch/arm/mach-lpc32xx/
  F:    drivers/i2c/busses/i2c-pnx.c
@@@ -2654,8 -2585,12 +2654,8 @@@ F:     arch/arm64/boot/dts/qcom/sc7180
  F:    arch/arm64/boot/dts/qcom/sc7280*
  F:    arch/arm64/boot/dts/qcom/sdm845-cheza*
  
 -ARM/QUALCOMM SUPPORT
 -M:    Bjorn Andersson <[email protected]>
 -M:    Konrad Dybcio <[email protected]>
 +ARM/QUALCOMM MAILING LIST
  L:    [email protected]
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
  F:    Documentation/devicetree/bindings/*/qcom*
  F:    Documentation/devicetree/bindings/soc/qcom/
  F:    arch/arm/boot/dts/qcom/
@@@ -2692,33 -2627,6 +2692,33 @@@ F:    include/dt-bindings/*/qcom
  F:    include/linux/*/qcom*
  F:    include/linux/soc/qcom/
  
 +ARM/QUALCOMM SUPPORT
 +M:    Bjorn Andersson <[email protected]>
 +M:    Konrad Dybcio <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
 +F:    Documentation/devicetree/bindings/arm/qcom-soc.yaml
 +F:    Documentation/devicetree/bindings/arm/qcom.yaml
 +F:    Documentation/devicetree/bindings/bus/qcom*
 +F:    Documentation/devicetree/bindings/cache/qcom,llcc.yaml
 +F:    Documentation/devicetree/bindings/firmware/qcom,scm.yaml
 +F:    Documentation/devicetree/bindings/reserved-memory/qcom
 +F:    Documentation/devicetree/bindings/soc/qcom/
 +F:    arch/arm/boot/dts/qcom/
 +F:    arch/arm/configs/qcom_defconfig
 +F:    arch/arm/mach-qcom/
 +F:    arch/arm64/boot/dts/qcom/
 +F:    drivers/bus/qcom*
 +F:    drivers/firmware/qcom/
 +F:    drivers/soc/qcom/
 +F:    include/dt-bindings/arm/qcom,ids.h
 +F:    include/dt-bindings/firmware/qcom,scm.h
 +F:    include/dt-bindings/soc/qcom*
 +F:    include/linux/firmware/qcom
 +F:    include/linux/soc/qcom/
 +F:    include/soc/qcom/
 +
  ARM/RDA MICRO ARCHITECTURE
  M:    Manivannan Sadhasivam <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -3109,11 -3017,13 +3109,11 @@@ S:   Orpha
  F:    Documentation/devicetree/bindings/i2c/i2c-wmt.txt
  F:    arch/arm/mach-vt8500/
  F:    drivers/clocksource/timer-vt8500.c
 -F:    drivers/i2c/busses/i2c-wmt.c
 +F:    drivers/i2c/busses/i2c-viai2c-wmt.c
  F:    drivers/mmc/host/wmt-sdmmc.c
  F:    drivers/pwm/pwm-vt8500.c
  F:    drivers/rtc/rtc-vt8500.c
  F:    drivers/tty/serial/vt8500_serial.c
 -F:    drivers/usb/host/ehci-platform.c
 -F:    drivers/usb/host/uhci-platform.c
  F:    drivers/video/fbdev/vt8500lcdfb.*
  F:    drivers/video/fbdev/wm8505fb*
  F:    drivers/video/fbdev/wmt_ge_rops.*
@@@ -3140,23 -3050,6 +3140,23 @@@ F:    drivers/mmc/host/sdhci-of-arasan.
  N:    zynq
  N:    xilinx
  
 +ARM64 FIT SUPPORT
 +M:    Simon Glass <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm64/boot/Makefile
 +F:    scripts/make_fit.py
 +
 +ARM64 PLATFORM DRIVERS
 +M:    Hans de Goede <[email protected]>
 +M:    Ilpo Järvinen <[email protected]>
 +R:    Bryan O'Donoghue <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +Q:    https://patchwork.kernel.org/project/platform-driver-x86/list/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
 +F:    drivers/platform/arm64/
 +
  ARM64 PORT (AARCH64 ARCHITECTURE)
  M:    Catalin Marinas <[email protected]>
  M:    Will Deacon <[email protected]>
@@@ -3718,11 -3611,6 +3718,11 @@@ F:    Documentation/filesystems/bfs.rs
  F:    fs/bfs/
  F:    include/uapi/linux/bfs_fs.h
  
 +BINMAN
 +M:    Simon Glass <[email protected]>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/mtd/partitions/binman*
 +
  BITMAP API
  M:    Yury Norov <[email protected]>
  R:    Rasmus Villemoes <[email protected]>
@@@ -3750,20 -3638,6 +3750,20 @@@ F:    tools/include/vdso/bits.
  F:    tools/lib/bitmap.c
  F:    tools/lib/find_bit.c
  
 +BITOPS API
 +M:    Yury Norov <[email protected]>
 +R:    Rasmus Villemoes <[email protected]>
 +S:    Maintained
 +F:    arch/*/include/asm/bitops.h
 +F:    arch/*/include/asm/bitops_32.h
 +F:    arch/*/include/asm/bitops_64.h
 +F:    arch/*/lib/bitops.c
 +F:    include/asm-generic/bitops
 +F:    include/asm-generic/bitops.h
 +F:    include/linux/bitops.h
 +F:    lib/test_bitops.c
 +F:    tools/*/bitops*
 +
  BLINKM RGB LED DRIVER
  M:    Jan-Simon Moeller <[email protected]>
  S:    Maintained
@@@ -3838,15 -3712,9 +3838,15 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml
  F:    drivers/iio/imu/bmi323/
  
 +BPF JIT for ARC
 +M:    Shahab Vahedi <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    arch/arc/net/
 +
  BPF JIT for ARM
  M:    Russell King <[email protected]>
 -M:    Puranjay Mohan <puranjay[email protected]>
 +M:    Puranjay Mohan <puranjay@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    arch/arm/net/
  BPF JIT for ARM64
  M:    Daniel Borkmann <[email protected]>
  M:    Alexei Starovoitov <[email protected]>
 -M:    Zi Shen Lim <[email protected]>
 +M:    Puranjay Mohan <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    arch/arm64/net/
@@@ -3896,8 -3764,6 +3896,8 @@@ X:      arch/riscv/net/bpf_jit_comp64.
  
  BPF JIT for RISC-V (64-bit)
  M:    Björn Töpel <[email protected]>
 +R:    Pu Lehui <[email protected]>
 +R:    Puranjay Mohan <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    arch/riscv/net/
@@@ -3956,14 -3822,6 +3956,14 @@@ F:    kernel/bpf/tnum.
  F:    kernel/bpf/trampoline.c
  F:    kernel/bpf/verifier.c
  
 +BPF [CRYPTO]
 +M:    Vadim Fedorenko <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    crypto/bpf_crypto_skcipher.c
 +F:    include/linux/bpf_crypto.h
 +F:    kernel/bpf/crypto.c
 +
  BPF [DOCUMENTATION] (Related to Standardization)
  R:    David Vernet <[email protected]>
  L:    [email protected]
@@@ -4176,13 -4034,6 +4176,13 @@@ N:    bcm113
  N:    bcm216*
  N:    kona
  
 +BROADCOM BCM2835 CAMERA DRIVERS
 +M:    Raspberry Pi Kernel Maintenance <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/brcm,bcm2835-unicam.yaml
 +F:    drivers/media/platform/broadcom/bcm2835-unicam*
 +
  BROADCOM BCM47XX MIPS ARCHITECTURE
  M:    Hauke Mehrtens <[email protected]>
  M:    Rafał Miłecki <[email protected]>
@@@ -4340,6 -4191,7 +4340,6 @@@ S:      Supporte
  F:    drivers/scsi/bnx2i/
  
  BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
 -M:    Ariel Elior <[email protected]>
  M:    Sudarsana Kalluru <[email protected]>
  M:    Manish Chopra <[email protected]>
  L:    [email protected]
@@@ -5352,6 -5204,7 +5352,6 @@@ F:      lib/closure.
  
  CMPC ACPI DRIVER
  M:    Thadeu Lima de Souza Cascardo <[email protected]>
 -M:    Daniel Oliveira Nascimento <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    drivers/platform/x86/classmate-laptop.c
@@@ -5399,14 -5252,6 +5399,14 @@@ S:    Supporte
  F:    Documentation/process/code-of-conduct-interpretation.rst
  F:    Documentation/process/code-of-conduct.rst
  
 +CODE TAGGING
 +M:    Suren Baghdasaryan <[email protected]>
 +M:    Kent Overstreet <[email protected]>
 +S:    Maintained
 +F:    include/asm-generic/codetag.lds.h
 +F:    include/linux/codetag.h
 +F:    lib/codetag.c
 +
  COMEDI DRIVERS
  M:    Ian Abbott <[email protected]>
  M:    H Hartley Sweeten <[email protected]>
@@@ -5487,7 -5332,7 +5487,7 @@@ M:      Dan Williams <[email protected]
  L:    [email protected]
  S:    Maintained
  F:    drivers/cxl/
 -F:    include/linux/cxl-einj.h
 +F:    include/linux/einj-cxl.h
  F:    include/linux/cxl-event.h
  F:    include/uapi/linux/cxl_mem.h
  F:    tools/testing/cxl/
@@@ -5507,7 -5352,7 +5507,7 @@@ F:      drivers/usb/atm/cxacru.
  
  CONFIDENTIAL COMPUTING THREAT MODEL FOR X86 VIRTUALIZATION (SNP/TDX)
  M:    Elena Reshetova <[email protected]>
 -M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +M:    Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
  S:    Maintained
  F:    Documentation/security/snp-tdx-threat-model.rst
  
@@@ -5612,7 -5457,7 +5612,7 @@@ F:      Documentation/hwmon/corsair-psu.rs
  F:    drivers/hwmon/corsair-psu.c
  
  COUNTER SUBSYSTEM
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter.git
@@@ -5731,7 -5576,6 +5731,7 @@@ M:      Ulf Hansson <[email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git
  F:    drivers/cpuidle/cpuidle-psci-domain.c
  F:    drivers/cpuidle/cpuidle-psci.h
  
@@@ -5739,7 -5583,6 +5739,7 @@@ CPUIDLE DRIVER - DT IDLE PM DOMAI
  M:    Ulf Hansson <[email protected]>
  L:    [email protected]
  S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git
  F:    drivers/cpuidle/dt_idle_genpd.c
  F:    drivers/cpuidle/dt_idle_genpd.h
  
@@@ -5865,7 -5708,7 +5865,7 @@@ Q:      http://patchwork.linuxtv.org/project
  F:    drivers/media/dvb-frontends/cxd2820r*
  
  CXGB3 ETHERNET DRIVER (CXGB3)
 -M:    Raju Rangoju <rajur@chelsio.com>
 +M:    Potnuri Bharat Teja <bharat@chelsio.com>
  L:    [email protected]
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5886,7 -5729,7 +5886,7 @@@ W:      http://www.chelsio.co
  F:    drivers/crypto/chelsio
  
  CXGB4 ETHERNET DRIVER (CXGB4)
 -M:    Raju Rangoju <rajur@chelsio.com>
 +M:    Potnuri Bharat Teja <bharat@chelsio.com>
  L:    [email protected]
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5915,7 -5758,7 +5915,7 @@@ F:      drivers/infiniband/hw/cxgb4
  F:    include/uapi/rdma/cxgb4-abi.h
  
  CXGB4VF ETHERNET DRIVER (CXGB4VF)
 -M:    Raju Rangoju <rajur@chelsio.com>
 +M:    Potnuri Bharat Teja <bharat@chelsio.com>
  L:    [email protected]
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5935,9 -5778,10 +5935,9 @@@ F:     include/uapi/misc/cxl.
  
  CXLFLASH (IBM Coherent Accelerator Processor Interface CAPI Flash) SCSI DRIVER
  M:    Manoj N. Kumar <[email protected]>
 -M:    Matthew R. Ochs <[email protected]>
  M:    Uma Krishnan <[email protected]>
  L:    [email protected]
 -S:    Supported
 +S:    Obsolete
  F:    Documentation/arch/powerpc/cxlflash.rst
  F:    drivers/scsi/cxlflash/
  F:    include/uapi/scsi/cxlflash_ioctl.h
@@@ -6220,6 -6064,7 +6220,6 @@@ F:      drivers/mtd/nand/raw/denali
  
  DESIGNWARE EDMA CORE IP DRIVER
  M:    Manivannan Sadhasivam <[email protected]>
 -R:    Gustavo Pimentel <[email protected]>
  R:    Serge Semin <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -6398,7 -6243,7 +6398,7 @@@ F:      include/sound/da[79]*.
  F:    sound/soc/codecs/da[79]*.[ch]
  
  DIAMOND SYSTEMS GPIO-MM GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-gpio-mm.c
@@@ -6465,7 -6310,7 +6465,7 @@@ L:      [email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/driver-api/dma-buf.rst
  F:    Documentation/userspace-api/dma-buf-alloc-exchange.rst
  F:    drivers/dma-buf/
@@@ -6519,7 -6364,7 +6519,7 @@@ L:      [email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/dma-buf/dma-heap.c
  F:    drivers/dma-buf/heaps/*
  F:    include/linux/dma-heap.h
@@@ -6556,7 -6401,6 +6556,7 @@@ S:      Maintaine
  P:    Documentation/doc-guide/maintainer-profile.rst
  T:    git git://git.lwn.net/linux.git docs-next
  F:    Documentation/
 +F:    scripts/check-variable-fonts.sh
  F:    scripts/documentation-file-ref-check
  F:    scripts/kernel-doc
  F:    scripts/sphinx-pre-install
@@@ -6729,7 -6573,7 +6729,7 @@@ M:      Jacek Lawrynowicz <jacek.lawrynowicz
  M:    Stanislaw Gruszka <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/accel/ivpu/
  F:    include/uapi/drm/ivpu_accel.h
  
@@@ -6749,18 -6593,18 +6749,18 @@@ M:   Chen-Yu Tsai <[email protected]
  R:    Jernej Skrabec <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/sun4i/sun8i*
  
  DRM DRIVER FOR ARM PL111 CLCD
  S:    Orphan
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/pl111/
  
  DRM DRIVER FOR ARM VERSATILE TFT PANELS
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/arm,versatile-tft-panel.yaml
  F:    drivers/gpu/drm/panel/panel-arm-versatile.c
  
@@@ -6768,7 -6612,7 +6768,7 @@@ DRM DRIVER FOR ASPEED BMC GF
  M:    Joel Stanley <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/gpu/aspeed-gfx.txt
  F:    drivers/gpu/drm/aspeed/
  
@@@ -6778,14 -6622,14 +6778,14 @@@ R:   Thomas Zimmermann <tzimmermann@suse.
  R:    Jocelyn Falempe <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/ast/
  
  DRM DRIVER FOR BOCHS VIRTUAL GPU
  M:    Gerd Hoffmann <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/tiny/bochs.c
  
  DRM DRIVER FOR BOE HIMAX8279D PANELS
@@@ -6803,14 -6647,14 +6803,14 @@@ F:   drivers/gpu/drm/bridge/chipone-icn62
  DRM DRIVER FOR EBBG FT8719 PANEL
  M:    Joel Selvaraj <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/ebbg,ft8719.yaml
  F:    drivers/gpu/drm/panel/panel-ebbg-ft8719.c
  
  DRM DRIVER FOR FARADAY TVE200 TV ENCODER
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/tve200/
  
  DRM DRIVER FOR FEIXIN K101 IM2BA02 MIPI-DSI LCD PANELS
@@@ -6830,7 -6674,7 +6830,7 @@@ M:      Thomas Zimmermann <tzimmermann@suse.
  M:    Javier Martinez Canillas <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/drm_aperture.c
  F:    drivers/gpu/drm/tiny/ofdrm.c
  F:    drivers/gpu/drm/tiny/simpledrm.c
@@@ -6849,27 -6693,27 +6849,27 @@@ DRM DRIVER FOR GENERIC USB DISPLA
  M:    Noralf Trønnes <[email protected]>
  S:    Maintained
  W:    https://github.com/notro/gud/wiki
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/gud/
  F:    include/drm/gud.h
  
  DRM DRIVER FOR GRAIN MEDIA GM12U320 PROJECTORS
  M:    Hans de Goede <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/tiny/gm12u320.c
  
  DRM DRIVER FOR HIMAX HX8394 MIPI-DSI LCD panels
  M:    Ondrej Jirman <[email protected]>
  M:    Javier Martinez Canillas <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml
  F:    drivers/gpu/drm/panel/panel-himax-hx8394.c
  
  DRM DRIVER FOR HX8357D PANELS
  S:    Orphan
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/himax,hx8357d.txt
  F:    drivers/gpu/drm/tiny/hx8357d.c
  
@@@ -6878,20 -6722,20 +6878,20 @@@ M:   Deepak Rawat <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/hyperv
  
  DRM DRIVER FOR ILITEK ILI9225 PANELS
  M:    David Lechner <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/ilitek,ili9225.txt
  F:    drivers/gpu/drm/tiny/ili9225.c
  
  DRM DRIVER FOR ILITEK ILI9486 PANELS
  M:    Kamlesh Gurudasani <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
  F:    drivers/gpu/drm/tiny/ili9486.c
  
@@@ -6907,25 -6751,17 +6907,25 @@@ S:   Maintaine
  F:    Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
  F:    drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
  
 +DRM DRIVER FOR LG SW43408 PANELS
 +M:    Sumit Semwal <[email protected]>
 +M:    Caleb Connolly <[email protected]>
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/display/panel/lg,sw43408.yaml
 +F:    drivers/gpu/drm/panel/panel-lg-sw43408.c
 +
  DRM DRIVER FOR LOGICVC DISPLAY CONTROLLER
  M:    Paul Kocialkowski <[email protected]>
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/logicvc/
  
  DRM DRIVER FOR LVDS PANELS
  M:    Laurent Pinchart <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/lvds.yaml
  F:    Documentation/devicetree/bindings/display/panel/panel-lvds.yaml
  F:    drivers/gpu/drm/panel/panel-lvds.c
@@@ -6943,13 -6779,13 +6943,13 @@@ R:   Thomas Zimmermann <tzimmermann@suse.
  R:    Jocelyn Falempe <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/mgag200/
  
  DRM DRIVER FOR MI0283QT
  M:    Noralf Trønnes <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/multi-inno,mi0283qt.txt
  F:    drivers/gpu/drm/tiny/mi0283qt.c
  
@@@ -6957,29 -6793,11 +6957,29 @@@ DRM DRIVER FOR MIPI DBI compatible pane
  M:    Noralf Trønnes <[email protected]>
  S:    Maintained
  W:    https://github.com/notro/panel-mipi-dbi/wiki
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/panel-mipi-dbi-spi.yaml
  F:    drivers/gpu/drm/tiny/panel-mipi-dbi.c
  
 -DRM DRIVER FOR MSM ADRENO GPU
 +DRM DRIVER for Qualcomm Adreno GPUs
 +M:    Rob Clark <[email protected]>
 +R:    Sean Paul <[email protected]>
 +R:    Konrad Dybcio <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +L:    [email protected]
 +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/gpu.yaml
 +F:    drivers/gpu/drm/msm/adreno/
 +F:    drivers/gpu/drm/msm/msm_gpu.*
 +F:    drivers/gpu/drm/msm/msm_gpu_devfreq.*
 +F:    drivers/gpu/drm/msm/msm_ringbuffer.*
 +F:    drivers/gpu/drm/msm/registers/adreno/
 +F:    include/uapi/drm/msm_drm.h
 +
 +DRM DRIVER for Qualcomm display hardware
  M:    Rob Clark <[email protected]>
  M:    Abhinav Kumar <[email protected]>
  M:    Dmitry Baryshkov <[email protected]>
@@@ -6999,28 -6817,28 +6999,28 @@@ F:   include/uapi/drm/msm_drm.
  DRM DRIVER FOR NOVATEK NT35510 PANELS
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/novatek,nt35510.yaml
  F:    drivers/gpu/drm/panel/panel-novatek-nt35510.c
  
  DRM DRIVER FOR NOVATEK NT35560 PANELS
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  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 <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  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 <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/novatek,nt36672a.yaml
  F:    drivers/gpu/drm/panel/panel-novatek-nt36672a.c
  
@@@ -7054,7 -6872,7 +7054,7 @@@ F:      drivers/gpu/drm/bridge/parade-ps8640
  DRM DRIVER FOR PERVASIVE DISPLAYS REPAPER PANELS
  M:    Noralf Trønnes <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/repaper.txt
  F:    drivers/gpu/drm/tiny/repaper.c
  
@@@ -7064,7 -6882,7 +7064,7 @@@ M:      Gerd Hoffmann <[email protected]
  L:    [email protected]
  S:    Obsolete
  W:    https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/tiny/cirrus.c
  
  DRM DRIVER FOR QXL VIRTUAL GPU
@@@ -7073,7 -6891,7 +7073,7 @@@ M:      Gerd Hoffmann <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/qxl/
  F:    include/uapi/drm/qxl_drm.h
  
@@@ -7086,7 -6904,7 +7086,7 @@@ F:      drivers/gpu/drm/panel/panel-raydium-
  DRM DRIVER FOR SAMSUNG DB7430 PANELS
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml
  F:    drivers/gpu/drm/panel/panel-samsung-db7430.c
  
@@@ -7095,7 -6913,7 +7095,7 @@@ M:      Inki Dae <[email protected]
  M:    Jagan Teki <[email protected]>
  M:    Marek Szyprowski <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  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
@@@ -7115,7 -6933,7 +7115,7 @@@ F:      drivers/gpu/drm/panel/panel-samsung-
  DRM DRIVER FOR SITRONIX ST7586 PANELS
  M:    David Lechner <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/sitronix,st7586.txt
  F:    drivers/gpu/drm/tiny/st7586.c
  
@@@ -7136,14 -6954,14 +7136,14 @@@ F:   drivers/gpu/drm/panel/panel-sitronix
  DRM DRIVER FOR SITRONIX ST7735R PANELS
  M:    David Lechner <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/sitronix,st7735r.yaml
  F:    drivers/gpu/drm/tiny/st7735r.c
  
  DRM DRIVER FOR SOLOMON SSD130X OLED DISPLAYS
  M:    Javier Martinez Canillas <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/solomon,ssd-common.yaml
  F:    Documentation/devicetree/bindings/display/solomon,ssd13*.yaml
  F:    drivers/gpu/drm/solomon/ssd130x*
  DRM DRIVER FOR ST-ERICSSON MCDE
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/ste,mcde.yaml
  F:    drivers/gpu/drm/mcde/
  
@@@ -7175,7 -6993,7 +7175,7 @@@ F:      drivers/gpu/drm/bridge/ti-sn65dsi86.
  DRM DRIVER FOR TPO TPG110 PANELS
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/tpo,tpg110.yaml
  F:    drivers/gpu/drm/panel/panel-tpo-tpg110.c
  
@@@ -7185,7 -7003,7 +7185,7 @@@ R:      Sean Paul <[email protected]
  R:    Thomas Zimmermann <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/udl/
  
  DRM DRIVER FOR VIRTUAL KERNEL MODESETTING (VKMS)
@@@ -7196,7 -7014,7 +7196,7 @@@ R:      Haneen Mohammed <hamohammed.sa@gmail
  R:    Daniel Vetter <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/gpu/vkms.rst
  F:    drivers/gpu/drm/vkms/
  
@@@ -7204,7 -7022,7 +7204,7 @@@ DRM DRIVER FOR VIRTUALBOX VIRTUAL GP
  M:    Hans de Goede <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/vboxvideo/
  
  DRM DRIVER FOR VMWARE VIRTUAL GPU
@@@ -7212,14 -7030,14 +7212,14 @@@ M:   Zack Rusin <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/vmwgfx/
  F:    include/uapi/drm/vmwgfx_drm.h
  
  DRM DRIVER FOR WIDECHIPS WS2401 PANELS
  M:    Linus Walleij <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/samsung,lms380kf01.yaml
  F:    drivers/gpu/drm/panel/panel-widechips-ws2401.c
  
@@@ -7244,8 -7062,8 +7244,8 @@@ M:      Maarten Lankhorst <maarten.lankhorst
  M:    Maxime Ripard <[email protected]>
  M:    Thomas Zimmermann <[email protected]>
  S:    Maintained
 -W:    https://01.org/linuxgraphics/gfx-docs/maintainer-tools/drm-misc.html
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +W:    https://drm.pages.freedesktop.org/maintainer-tools/drm-misc.html
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/
  F:    Documentation/devicetree/bindings/gpu/
  F:    Documentation/gpu/
@@@ -7272,7 -7090,7 +7272,7 @@@ M:      Maxime Ripard <[email protected]
  M:    Chen-Yu Tsai <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/allwinner*
  F:    drivers/gpu/drm/sun4i/
  
@@@ -7282,7 -7100,7 +7282,7 @@@ L:      [email protected]
  L:    [email protected]
  S:    Supported
  W:    http://linux-meson.com/
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/amlogic,meson-dw-hdmi.yaml
  F:    Documentation/devicetree/bindings/display/amlogic,meson-vpu.yaml
  F:    Documentation/gpu/meson.rst
@@@ -7294,7 -7112,7 +7294,7 @@@ M:      Sam Ravnborg <[email protected]
  M:    Boris Brezillon <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/atmel/
  F:    drivers/gpu/drm/atmel-hlcdc/
  
@@@ -7306,7 -7124,7 +7306,7 @@@ R:      Laurent Pinchart <Laurent.pinchart@i
  R:    Jonas Karlman <[email protected]>
  R:    Jernej Skrabec <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/bridge/
  F:    drivers/gpu/drm/bridge/
  F:    drivers/gpu/drm/drm_bridge.c
@@@ -7331,7 -7149,7 +7331,7 @@@ M:      Stefan Agner <[email protected]
  M:    Alison Wang <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/fsl,dcu.txt
  F:    Documentation/devicetree/bindings/display/fsl,tcon.txt
  F:    drivers/gpu/drm/fsl-dcu/
@@@ -7340,7 -7158,7 +7340,7 @@@ DRM DRIVERS FOR FREESCALE IMX 5/
  M:    Philipp Zabel <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  T:    git git://git.pengutronix.de/git/pza/linux
  F:    Documentation/devicetree/bindings/display/imx/
  F:    drivers/gpu/drm/imx/ipuv3/
@@@ -7360,7 -7178,7 +7360,7 @@@ DRM DRIVERS FOR GMA500 (Poulsbo, Moores
  M:    Patrik Jakobsson <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/gma500/
  
  DRM DRIVERS FOR HISILICON
@@@ -7372,7 -7190,7 +7372,7 @@@ R:      Yongqin Liu <[email protected]
  R:    John Stultz <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/hisilicon/
  F:    drivers/gpu/drm/hisilicon/
  
@@@ -7381,7 -7199,7 +7381,7 @@@ M:      Qiang Yu <[email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/lima/
  F:    include/uapi/drm/lima_drm.h
  
@@@ -7389,7 -7207,7 +7389,7 @@@ DRM DRIVERS FOR LOONGSO
  M:    Sui Jingfeng <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/loongson/
  
  DRM DRIVERS FOR MEDIATEK
@@@ -7437,7 -7255,7 +7437,7 @@@ M:      Biju Das <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
  F:    drivers/gpu/drm/renesas/rz-du/
  
@@@ -7447,7 -7265,7 +7447,7 @@@ M:      Geert Uytterhoeven <geert+renesas@gl
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/renesas,shmobile-lcdc.yaml
  F:    drivers/gpu/drm/renesas/shmobile/
  F:    include/linux/platform_data/shmob_drm.h
@@@ -7458,7 -7276,7 +7458,7 @@@ M:      Heiko Stübner <[email protected]
  M:    Andy Yan <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/rockchip/
  F:    drivers/gpu/drm/ci/xfails/rockchip*
  F:    drivers/gpu/drm/rockchip/
@@@ -7467,7 -7285,7 +7467,7 @@@ DRM DRIVERS FOR ST
  M:    Alain Volmat <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/st,stih4xx.txt
  F:    drivers/gpu/drm/sti
  
@@@ -7477,7 -7295,7 +7477,7 @@@ M:      Raphael Gallais-Pou <raphael.gallais
  M:    Philippe Cornu <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml
  F:    drivers/gpu/drm/stm
  
@@@ -7486,7 -7304,7 +7486,7 @@@ M:      Jyri Sarha <[email protected]
  M:    Tomi Valkeinen <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml
  F:    Documentation/devicetree/bindings/display/ti/ti,j721e-dss.yaml
  F:    Documentation/devicetree/bindings/display/ti/ti,k2g-dss.yaml
@@@ -7497,7 -7315,7 +7497,7 @@@ M:      Jyri Sarha <[email protected]
  M:    Tomi Valkeinen <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/tilcdc/
  F:    drivers/gpu/drm/tilcdc/
  
@@@ -7505,7 -7323,7 +7505,7 @@@ DRM DRIVERS FOR TI OMA
  M:    Tomi Valkeinen <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/ti/
  F:    drivers/gpu/drm/omapdrm/
  
@@@ -7513,7 -7331,7 +7513,7 @@@ DRM DRIVERS FOR V3
  M:    Melissa Wen <[email protected]>
  M:    Maíra Canal <[email protected]>
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
  F:    drivers/gpu/drm/v3d/
  F:    include/uapi/drm/v3d_drm.h
@@@ -7522,7 -7340,7 +7522,7 @@@ DRM DRIVERS FOR VC
  M:    Maxime Ripard <[email protected]>
  S:    Supported
  T:    git git://github.com/anholt/linux
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/brcm,bcm2835-*.yaml
  F:    drivers/gpu/drm/vc4/
  F:    include/uapi/drm/vc4_drm.h
@@@ -7543,16 -7361,15 +7543,16 @@@ M:   Oleksandr Andrushchenko <oleksandr_a
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/gpu/xen-front.rst
  F:    drivers/gpu/drm/xen/
  
  DRM DRIVERS FOR XILINX
  M:    Laurent Pinchart <[email protected]>
 +M:    Tomi Valkeinen <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/xlnx/
  F:    drivers/gpu/drm/xlnx/
  
@@@ -7561,7 -7378,7 +7561,7 @@@ M:      Luben Tuikov <[email protected]
  M:    Matthew Brost <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/scheduler/
  F:    include/drm/gpu_scheduler.h
  
@@@ -7571,7 -7388,7 +7571,7 @@@ R:      Jessica Zhang <quic_jesszhan@quicinc
  R:    Sam Ravnborg <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/panel/
  F:    drivers/gpu/drm/drm_panel.c
  F:    drivers/gpu/drm/panel/
@@@ -7581,7 -7398,7 +7581,7 @@@ DRM PRIVACY-SCREEN CLAS
  M:    Hans de Goede <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/drm_privacy_screen*
  F:    include/drm/drm_privacy_screen*
  
@@@ -7590,7 -7407,7 +7590,7 @@@ M:      Christian Koenig <christian.koenig@a
  M:    Huang Rui <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/ttm/
  F:    include/drm/ttm/
  
@@@ -7598,7 -7415,7 +7598,7 @@@ DRM AUTOMATED TESTIN
  M:    Helen Koike <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/gpu/automated_testing.rst
  F:    drivers/gpu/drm/ci/
  
@@@ -8621,6 -8438,8 +8621,6 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    include/linux/fortify-string.h
  F:    lib/fortify_kunit.c
  F:    lib/memcpy_kunit.c
 -F:    lib/strcat_kunit.c
 -F:    lib/strscpy_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
  K:    \b__NO_FORTIFY\b
@@@ -8661,7 -8480,7 +8661,7 @@@ F:      arch/x86/math-emu
  FRAMEBUFFER CORE
  M:    Daniel Vetter <[email protected]>
  S:    Odd Fixes
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/video/fbdev/core/
  
  FRAMEBUFFER LAYER
@@@ -8688,7 -8507,7 +8688,7 @@@ F:      Documentation/devicetree/bindings/cr
  F:    drivers/crypto/caam/
  
  FREESCALE COLDFIRE M5441X MMC DRIVER
 -M:    Angelo Dureghello <angelo.dureghello@timesys.com>
 +M:    Angelo Dureghello <adureghello@baylibre.com>
  L:    [email protected]
  S:    Maintained
  F:    drivers/mmc/host/sdhci-esdhc-mcf.c
@@@ -9351,7 -9170,6 +9351,7 @@@ S:      Maintaine
  F:    Documentation/devicetree/bindings/clock/google,gs101-clock.yaml
  F:    arch/arm64/boot/dts/exynos/google/
  F:    drivers/clk/samsung/clk-gs101.c
 +F:    drivers/phy/samsung/phy-gs101-ufs.c
  F:    include/dt-bindings/clock/google,gs101.h
  K:    [gG]oogle.?[tT]ensor
  
@@@ -9970,7 -9788,7 +9970,7 @@@ M:      Yicong Yang <[email protected]
  M:    Jonathan Cameron <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/ABI/testing/sysfs-devices-hisi_ptt
 +F:    Documentation/ABI/testing/sysfs-bus-event_source-devices-hisi_ptt
  F:    Documentation/trace/hisi-ptt.rst
  F:    drivers/hwtracing/ptt/
  F:    tools/perf/arch/arm64/util/hisi-ptt.c
  F:    Documentation/i2c/busses/i2c-ismt.rst
  F:    drivers/i2c/busses/i2c-ismt.c
  
 +I2C/SMBUS ZHAOXIN DRIVER
 +M:    Hans Hu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +W:    https://www.zhaoxin.com
 +F:    drivers/i2c/busses/i2c-viai2c-common.c
 +F:    drivers/i2c/busses/i2c-viai2c-zhaoxin.c
 +
  I2C/SMBUS STUB DRIVER
  M:    Jean Delvare <[email protected]>
  L:    [email protected]
@@@ -10654,8 -10464,10 +10654,10 @@@ F: include/net/nl802154.
  F:    net/ieee802154/
  F:    net/mac802154/
  
- IFCVF VIRTIO DATA PATH ACCELERATOR
- R:    Zhu Lingshan <[email protected]>
+ Intel VIRTIO DATA PATH ACCELERATOR
+ M:    Zhu Lingshan <[email protected]>
+ L:    [email protected]
+ S:    Supported
  F:    drivers/vdpa/ifcvf/
  
  IFE PROTOCOL
@@@ -10731,7 -10543,6 +10733,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/ABI/testing/configfs-iio*
  F:    Documentation/ABI/testing/sysfs-bus-iio*
  F:    Documentation/devicetree/bindings/iio/
 +F:    Documentation/iio/
  F:    drivers/iio/
  F:    drivers/staging/iio/
  F:    include/dt-bindings/iio/
@@@ -10773,7 -10584,7 +10775,7 @@@ IMGTEC POWERVR DRM DRIVE
  M:    Frank Binns <[email protected]>
  M:    Matt Coster <[email protected]>
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/gpu/img,powervr-rogue.yaml
  F:    Documentation/devicetree/bindings/gpu/img,powervr-sgx.yaml
  F:    Documentation/gpu/imagination/
@@@ -10793,7 -10604,7 +10795,7 @@@ S:   Orpha
  F:    drivers/video/fbdev/imsttfb.c
  
  INDEX OF FURTHER KERNEL DOCUMENTATION
 -M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +M:    Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
  S:    Maintained
  F:    Documentation/process/kernel-docs.rst
  
@@@ -10939,14 -10750,14 +10941,14 @@@ S:        Maintaine
  F:    drivers/video/fbdev/i810/
  
  INTEL 8254 COUNTER DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/counter/i8254.c
  F:    include/linux/i8254.h
  
  INTEL 8255 GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-i8255.c
  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-graniterapids.c
  F:    drivers/gpio/gpio-ich.c
  F:    drivers/gpio/gpio-merrifield.c
  F:    drivers/gpio/gpio-ml-ioh.c
@@@ -11130,7 -10940,7 +11132,7 @@@ F:   drivers/idle/intel_idle.
  
  INTEL IDXD DRIVER
  M:    Fenghua Yu <[email protected]>
 -M:    Dave Jiang <[email protected]>
 +R:    Dave Jiang <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    drivers/dma/idxd/*
@@@ -11182,16 -10992,6 +11184,16 @@@ F: Documentation/admin-guide/media/ipu3
  F:    Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst
  F:    drivers/staging/media/ipu3/
  
 +INTEL IPU6 INPUT SYSTEM DRIVER
 +M:    Sakari Ailus <[email protected]>
 +M:    Bingbu Cao <[email protected]>
 +R:    Tianshu Qiu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/admin-guide/media/ipu6-isys.rst
 +F:    drivers/media/pci/intel/ipu6/
 +
  INTEL ISHTP ECLITE DRIVER
  M:    Sumesh K Naduvalath <[email protected]>
  L:    [email protected]
@@@ -11565,7 -11365,7 +11567,7 @@@ IOSYS-MAP HELPER
  M:    Thomas Zimmermann <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    include/linux/iosys-map.h
  
  IO_URING
@@@ -11633,7 -11433,6 +11635,7 @@@ S:   Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    Documentation/core-api/irq/irq-domain.rst
  F:    include/linux/irqdomain.h
 +F:    include/linux/irqdomain_defs.h
  F:    kernel/irq/irqdomain.c
  F:    kernel/irq/msi.c
  
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    include/linux/group_cpus.h
 +F:    include/linux/irq.h
 +F:    include/linux/irqhandler.h
 +F:    include/linux/irqnr.h
 +F:    include/linux/irqreturn.h
  F:    kernel/irq/
  F:    lib/group_cpus.c
  
@@@ -11657,10 -11452,9 +11659,10 @@@ S: Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    Documentation/devicetree/bindings/interrupt-controller/
  F:    drivers/irqchip/
 +F:    include/linux/irqchip.h
  
  ISA
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  S:    Maintained
  F:    Documentation/driver-api/isa.rst
  F:    drivers/base/isa.c
@@@ -11764,7 -11558,7 +11766,7 @@@ ITE IT66121 HDMI BRIDGE DRIVE
  M:    Phong LE <[email protected]>
  M:    Neil Armstrong <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/bridge/ite,it66121.yaml
  F:    drivers/gpu/drm/bridge/ite-it66121.c
  
@@@ -12221,15 -12015,6 +12223,15 @@@ S: Maintaine
  F:    include/keys/trusted_caam.h
  F:    security/keys/trusted-keys/trusted_caam.c
  
 +KEYS-TRUSTED-DCP
 +M:    David Gstir <[email protected]>
 +R:    sigma star Kernel Team <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Supported
 +F:    include/keys/trusted_dcp.h
 +F:    security/keys/trusted-keys/trusted_dcp.c
 +
  KEYS-TRUSTED-TEE
  M:    Sumit Garg <[email protected]>
  L:    [email protected]
@@@ -12257,7 -12042,6 +12259,7 @@@ M:   Mimi Zohar <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 +W:    https://kernsec.org/wiki/index.php/Linux_Kernel_Integrity
  F:    security/integrity/platform_certs
  
  KFENCE
@@@ -12430,14 -12214,12 +12432,14 @@@ F:        net/l3mde
  
  LANDLOCK SECURITY MODULE
  M:    Mickaël Salaün <[email protected]>
 +R:    Günther Noack <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://landlock.io
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/mic/linux.git
  F:    Documentation/security/landlock.rst
  F:    Documentation/userspace-api/landlock.rst
 +F:    fs/ioctl.c
  F:    include/uapi/linux/landlock.h
  F:    samples/landlock/
  F:    security/landlock/
@@@ -12606,26 -12388,6 +12608,26 @@@ F: drivers/ata
  F:    include/linux/ata.h
  F:    include/linux/libata.h
  
 +LIBETH COMMON ETHERNET LIBRARY
 +M:    Alexander Lobakin <[email protected]>
 +L:    [email protected]
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Supported
 +T:    git https://github.com/alobakin/linux.git
 +F:    drivers/net/ethernet/intel/libeth/
 +F:    include/net/libeth/
 +K:    libeth
 +
 +LIBIE COMMON INTEL ETHERNET LIBRARY
 +M:    Alexander Lobakin <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
 +S:    Supported
 +T:    git https://github.com/alobakin/linux.git
 +F:    drivers/net/ethernet/intel/libie/
 +F:    include/linux/net/intel/libie/
 +K:    libie
 +
  LIBNVDIMM BTT: BLOCK TRANSLATION TABLE
  M:    Vishal Verma <[email protected]>
  M:    Dan Williams <[email protected]>
@@@ -12710,6 -12472,7 +12712,6 @@@ LINUX FOR POWERPC (32-BIT AND 64-BIT
  M:    Michael Ellerman <[email protected]>
  R:    Nicholas Piggin <[email protected]>
  R:    Christophe Leroy <[email protected]>
 -R:    Aneesh Kumar K.V <[email protected]>
  R:    Naveen N. Rao <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -12735,8 -12498,6 +12737,8 @@@ F:   drivers/rtc/rtc-opal.
  F:    drivers/scsi/ibmvscsi/
  F:    drivers/tty/hvc/hvc_opal.c
  F:    drivers/watchdog/wdrtas.c
 +F:    include/linux/papr_scm.h
 +F:    include/uapi/linux/papr_pdsm.h
  F:    tools/testing/selftests/powerpc
  N:    /pmac
  N:    powermac
@@@ -13235,15 -12996,6 +13237,15 @@@ F: Documentation/devicetree/bindings/ma
  F:    drivers/mailbox/arm_mhuv2.c
  F:    include/linux/mailbox/arm_mhuv2_message.h
  
 +MAILBOX ARM MHUv3
 +M:    Sudeep Holla <[email protected]>
 +M:    Cristian Marussi <[email protected]>
 +L:    [email protected]
 +L:    [email protected] (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mailbox/arm,mhuv3.yaml
 +F:    drivers/mailbox/arm_mhuv3.c
 +
  MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
  M:    Alejandro Colomar <[email protected]>
  L:    [email protected]
@@@ -13714,7 -13466,7 +13716,7 @@@ F:   drivers/net/mdio/mdio-regmap.
  F:    include/linux/mdio/mdio-regmap.h
  
  MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/iio/dac/cio-dac.c
@@@ -13978,7 -13730,6 +13980,7 @@@ M:   Sean Wang <[email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.yaml
  F:    Documentation/devicetree/bindings/net/mediatek-bluetooth.txt
  F:    drivers/bluetooth/btmtkuart.c
  
  S:    Maintained
  F:    drivers/net/phy/mediatek-ge-soc.c
  F:    drivers/net/phy/mediatek-ge.c
 +F:    drivers/phy/mediatek/phy-mtk-xfi-tphy.c
  
  MEDIATEK I2C CONTROLLER DRIVER
  M:    Qii Wang <[email protected]>
@@@ -14401,16 -14151,6 +14403,16 @@@ F: mm/memblock.
  F:    mm/mm_init.c
  F:    tools/testing/memblock/
  
 +MEMORY ALLOCATION PROFILING
 +M:    Suren Baghdasaryan <[email protected]>
 +M:    Kent Overstreet <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/mm/allocation-profiling.rst
 +F:    include/linux/alloc_tag.h
 +F:    include/linux/pgalloc_tag.h
 +F:    lib/alloc_tag.c
 +
  MEMORY CONTROLLER DRIVERS
  M:    Krzysztof Kozlowski <[email protected]>
  L:    [email protected]
@@@ -14823,14 -14563,6 +14825,14 @@@ S: Supporte
  F:    Documentation/devicetree/bindings/pwm/atmel,at91sam-pwm.yaml
  F:    drivers/pwm/pwm-atmel.c
  
 +MICROCHIP SAM9x7-COMPATIBLE LVDS CONTROLLER
 +M:    Manikandan Muralidharan <[email protected]>
 +M:    Dharma Balasubiramani <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    Documentation/devicetree/bindings/display/bridge/microchip,sam9x75-lvds.yaml
 +F:    drivers/gpu/drm/bridge/microchip-lvds.c
 +
  MICROCHIP SAMA5D2-COMPATIBLE ADC DRIVER
  M:    Eugen Hristev <[email protected]>
  L:    [email protected]
@@@ -15163,7 -14895,7 +15165,7 @@@ F:   drivers/phy/marvell/phy-pxa-usb.
  
  MMU GATHER AND TLB INVALIDATION
  M:    Will Deacon <[email protected]>
 -M:    "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
 +M:    "Aneesh Kumar K.V" <aneesh.kumar@kernel.org>
  M:    Andrew Morton <[email protected]>
  M:    Nick Piggin <[email protected]>
  M:    Peter Zijlstra <[email protected]>
  S:    Orphan
  F:    drivers/platform/x86/msi-wmi.c
  
 +MSI WMI PLATFORM FEATURES
 +M:    Armin Wolf <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/ABI/testing/debugfs-msi-wmi-platform
 +F:    Documentation/wmi/devices/msi-wmi-platform.rst
 +F:    drivers/platform/x86/msi-wmi-platform.c
 +
  MSI001 MEDIA DRIVER
  L:    [email protected]
  S:    Orphan
@@@ -15426,7 -15150,7 +15428,7 @@@ M:   Marek Vasut <[email protected]
  M:    Stefan Agner <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/fsl,lcdif.yaml
  F:    drivers/gpu/drm/mxsfb/
  
@@@ -15438,8 -15162,9 +15440,8 @@@ F:   drivers/scsi/myrb.
  F:    drivers/scsi/myrs.*
  
  MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
 -M:    Chris Lee <[email protected]>
  L:    [email protected]
 -S:    Supported
 +S:    Orphan
  W:    https://www.cspi.com/ethernet-products/support/downloads/
  F:    drivers/net/ethernet/myricom/myri10ge/
  
@@@ -15535,7 -15260,6 +15537,7 @@@ F:   net/*/netfilter.
  F:    net/*/netfilter/
  F:    net/bridge/br_netfilter*.c
  F:    net/netfilter/
 +F:    tools/testing/selftests/net/netfilter/
  
  NETROM NETWORK LAYER
  M:    Ralf Baechle <[email protected]>
@@@ -16147,7 -15871,7 +16149,7 @@@ M:   Laurentiu Palcu <laurentiu.palcu@oss
  R:    Lucas Stach <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/devicetree/bindings/display/imx/nxp,imx8mq-dcss.yaml
  F:    drivers/gpu/drm/imx/dcss/
  
@@@ -16669,7 -16393,7 +16671,7 @@@ M:   Sakari Ailus <[email protected]
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/ov8856.yaml
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov8856.yaml
  F:    drivers/media/i2c/ov8856.c
  
  OMNIVISION OV8858 SENSOR DRIVER
@@@ -16717,8 -16441,8 +16719,8 @@@ ONBOARD USB HUB DRIVE
  M:    Matthias Kaehlcke <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/ABI/testing/sysfs-bus-platform-onboard-usb-hub
 -F:    drivers/usb/misc/onboard_usb_hub.c
 +F:    Documentation/ABI/testing/sysfs-bus-platform-onboard-usb-dev
 +F:    drivers/usb/misc/onboard_usb_dev.c
  
  ONENAND FLASH DRIVER
  M:    Kyungmin Park <[email protected]>
@@@ -17567,7 -17291,6 +17569,7 @@@ R:   Alexander Shishkin <alexander.shishk
  R:    Jiri Olsa <[email protected]>
  R:    Ian Rogers <[email protected]>
  R:    Adrian Hunter <[email protected]>
 +R:    "Liang, Kan" <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Supported
@@@ -17761,6 -17484,7 +17763,6 @@@ C:   irc://irc.libera.chat/linux-exyno
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git
  F:    Documentation/devicetree/bindings/pinctrl/samsung,pinctrl*yaml
  F:    drivers/pinctrl/samsung/
 -F:    include/dt-bindings/pinctrl/samsung.h
  
  PIN CONTROLLER - SINGLE
  M:    Tony Lindgren <[email protected]>
@@@ -18044,14 -17768,6 +18046,14 @@@ F: include/net/psample.
  F:    include/uapi/linux/psample.h
  F:    net/psample
  
 +PSE NETWORK DRIVER
 +M:    Oleksij Rempel <[email protected]>
 +M:    Kory Maincent <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/pse-pd/
 +F:    drivers/net/pse-pd/
 +
  PSTORE FILESYSTEM
  M:    Kees Cook <[email protected]>
  R:    Tony Luck <[email protected]>
@@@ -18276,6 -17992,7 +18278,6 @@@ S:   Supporte
  F:    drivers/scsi/qedi/
  
  QLOGIC QL4xxx ETHERNET DRIVER
 -M:    Ariel Elior <[email protected]>
  M:    Manish Chopra <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -18285,6 -18002,7 +18287,6 @@@ F:   include/linux/qed
  
  QLOGIC QL4xxx RDMA DRIVER
  M:    Michal Kalderon <[email protected]>
 -M:    Ariel Elior <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    drivers/infiniband/hw/qedr/
@@@ -18450,7 -18168,7 +18452,7 @@@ R:   Pranjal Ramajor Asha Kanojiya <quic_
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/accel/qaic/
  F:    drivers/accel/qaic/
  F:    include/uapi/drm/qaic_accel.h
@@@ -18745,7 -18463,6 +18747,7 @@@ M:   "Theodore Ts'o" <[email protected]
  M:    Jason A. Donenfeld <[email protected]>
  S:    Maintained
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git
 +F:    Documentation/devicetree/bindings/rng/microsoft,vmgenid.yaml
  F:    drivers/char/random.c
  F:    drivers/virt/vmgenid.c
  
@@@ -18863,7 -18580,7 +18865,7 @@@ F:   tools/testing/selftests/resctrl
  READ-COPY UPDATE (RCU)
  M:    "Paul E. McKenney" <[email protected]>
  M:    Frederic Weisbecker <[email protected]> (kernel/rcu/tree_nocb.h)
 -M:    Neeraj Upadhyay <[email protected]> (kernel/rcu/tasks.h)
 +M:    Neeraj Upadhyay <[email protected]> (kernel/rcu/tasks.h)
  M:    Joel Fernandes <[email protected]>
  M:    Josh Triplett <[email protected]>
  M:    Boqun Feng <[email protected]>
@@@ -19116,12 -18833,6 +19118,12 @@@ F: include/dt-bindings/net/pcs-rzn1-mii
  F:    include/linux/pcs-rzn1-miic.h
  F:    net/dsa/tag_rzn1_a5psw.c
  
 +RENESAS RZ/N1 DWMAC GLUE LAYER
 +M:    Romain Gantois <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/renesas,rzn1-gmac.yaml
 +F:    drivers/net/ethernet/stmicro/stmmac/dwmac-rzn1.c
 +
  RENESAS RZ/N1 RTC CONTROLLER DRIVER
  M:    Miquel Raynal <[email protected]>
  L:    [email protected]
@@@ -19235,20 -18946,6 +19237,20 @@@ S: Maintaine
  F:    drivers/mtd/nand/raw/r852.c
  F:    drivers/mtd/nand/raw/r852.h
  
 +RISC-V AIA DRIVERS
 +M:    Anup Patel <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/interrupt-controller/riscv,aplic.yaml
 +F:    Documentation/devicetree/bindings/interrupt-controller/riscv,imsics.yaml
 +F:    drivers/irqchip/irq-riscv-aplic-*.c
 +F:    drivers/irqchip/irq-riscv-aplic-*.h
 +F:    drivers/irqchip/irq-riscv-imsic-*.c
 +F:    drivers/irqchip/irq-riscv-imsic-*.h
 +F:    drivers/irqchip/irq-riscv-intc.c
 +F:    include/linux/irqchip/riscv-aplic.h
 +F:    include/linux/irqchip/riscv-imsic.h
 +
  RISC-V ARCHITECTURE
  M:    Paul Walmsley <[email protected]>
  M:    Palmer Dabbelt <[email protected]>
@@@ -19373,13 -19070,6 +19375,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/media/rockchip-rga.yaml
  F:    drivers/media/platform/rockchip/rga/
  
 +ROCKCHIP RK3308 INTERNAL AUDIO CODEC
 +M:    Luca Ceresoli <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/rockchip,rk3308-codec.yaml
 +F:    sound/soc/codecs/rk3308_codec.c
 +F:    sound/soc/codecs/rk3308_codec.h
 +
  ROCKCHIP VIDEO DECODER DRIVER
  M:    Ezequiel Garcia <[email protected]>
  L:    [email protected]
@@@ -20154,10 -19844,6 +20156,10 @@@ Q: https://patchwork.kernel.org/project
  B:    mailto:[email protected]
  P:    https://github.com/LinuxSecurityModule/kernel/blob/main/README.md
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git
 +F:    include/linux/lsm_audit.h
 +F:    include/linux/lsm_hook_defs.h
 +F:    include/linux/lsm_hooks.h
 +F:    include/linux/security.h
  F:    include/uapi/linux/lsm.h
  F:    security/
  F:    tools/testing/selftests/lsm/
@@@ -20964,12 -20650,6 +20966,12 @@@ F: include/trace/events/sof*.
  F:    include/uapi/sound/asoc.h
  F:    sound/soc/
  
 +SOUND - SOC LAYER / dapm-graph
 +M:    Luca Ceresoli <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    tools/sound/dapm-graph
 +
  SOUND - SOUND OPEN FIRMWARE (SOF) DRIVERS
  M:    Pierre-Louis Bossart <[email protected]>
  M:    Liam Girdwood <[email protected]>
@@@ -21004,7 -20684,7 +21006,7 @@@ Q:   http://patchwork.linuxtv.org/project
  F:    drivers/media/dvb-frontends/sp2*
  
  SPANISH DOCUMENTATION
 -M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +M:    Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
  R:    Avadhut Naik <[email protected]>
  S:    Maintained
  F:    Documentation/translations/sp_SP/
@@@ -21156,13 -20836,6 +21158,13 @@@ T: git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.yaml
  F:    drivers/media/i2c/st-mipid02.c
  
 +ST STM32 FIREWALL
 +M:    Gatien Chevallier <[email protected]>
 +S:    Maintained
 +F:    drivers/bus/stm32_etzpc.c
 +F:    drivers/bus/stm32_firewall.c
 +F:    drivers/bus/stm32_rifsc.c
 +
  ST STM32 I2C/SMBUS DRIVER
  M:    Pierre-Yves MORDRET <[email protected]>
  M:    Alain Volmat <[email protected]>
@@@ -21269,7 -20942,7 +21271,7 @@@ S:   Maintaine
  F:    drivers/staging/sm750fb/
  
  STAGING - VIA VT665X DRIVERS
 -M:    Forest Bond <[email protected]>
 +M:    Philipp Hortmann <[email protected]>
  S:    Odd Fixes
  F:    drivers/staging/vt665?/
  
@@@ -21646,7 -21319,7 +21648,7 @@@ R:   Gustavo Padovan <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/driver-api/sync_file.rst
  F:    drivers/dma-buf/dma-fence*
  F:    drivers/dma-buf/sw_sync.c
@@@ -21805,7 -21478,6 +21807,7 @@@ F:   drivers/cpufreq/sc[mp]i-cpufreq.
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
  F:    drivers/hwmon/scmi-hwmon.c
 +F:    drivers/pinctrl/pinctrl-scmi.c
  F:    drivers/pmdomain/arm/
  F:    drivers/powercap/arm_scmi_powercap.c
  F:    drivers/regulator/scmi-regulator.c
@@@ -21992,7 -21664,6 +21994,7 @@@ TEAM DRIVE
  M:    Jiri Pirko <[email protected]>
  L:    [email protected]
  S:    Supported
 +F:    Documentation/netlink/specs/team.yaml
  F:    drivers/net/team/
  F:    include/linux/if_team.h
  F:    include/uapi/linux/if_team.h
@@@ -22038,7 -21709,6 +22040,7 @@@ F:   Documentation/driver-api/tee.rs
  F:    Documentation/tee/
  F:    Documentation/userspace-api/tee.rst
  F:    drivers/tee/
 +F:    include/linux/tee_core.h
  F:    include/linux/tee_drv.h
  F:    include/uapi/linux/tee.h
  
@@@ -22057,11 -21727,6 +22059,11 @@@ M: Prashant Gaikwad <[email protected]
  S:    Supported
  F:    drivers/clk/tegra/
  
 +TEGRA CRYPTO DRIVERS
 +M:    Akhil R <[email protected]>
 +S:    Supported
 +F:    drivers/crypto/tegra/*
 +
  TEGRA DMA DRIVERS
  M:    Laxman Dewangan <[email protected]>
  M:    Jon Hunter <[email protected]>
@@@ -22178,7 -21843,7 +22180,7 @@@ F:   Documentation/devicetree/bindings/so
  F:    Documentation/devicetree/bindings/sound/tas2562.yaml
  F:    Documentation/devicetree/bindings/sound/tas2770.yaml
  F:    Documentation/devicetree/bindings/sound/tas27xx.yaml
 -F:    Documentation/devicetree/bindings/sound/ti,pcm1681.txt
 +F:    Documentation/devicetree/bindings/sound/ti,pcm1681.yaml
  F:    Documentation/devicetree/bindings/sound/ti,pcm3168a.yaml
  F:    Documentation/devicetree/bindings/sound/ti,tlv320*.yaml
  F:    Documentation/devicetree/bindings/sound/tlv320adcx140.yaml
@@@ -22255,7 -21920,7 +22257,7 @@@ F:   include/linux/soc/ti/ti_sci_inta_msi
  F:    include/linux/soc/ti/ti_sci_protocol.h
  
  TEXAS INSTRUMENTS' TMP117 TEMPERATURE SENSOR DRIVER
 -M:    Puranjay Mohan <puranjay[email protected]>
 +M:    Puranjay Mohan <puranjay@kernel.org>
  L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/iio/temperature/ti,tmp117.yaml
@@@ -22471,6 -22136,7 +22473,6 @@@ F:   drivers/counter/ti-eqep.
  
  TI ETHERNET SWITCH DRIVER (CPSW)
  R:    Siddharth Vadapalli <[email protected]>
 -R:    Ravi Gunasekaran <[email protected]>
  R:    Roger Quadros <[email protected]>
  L:    [email protected]
  L:    [email protected]
@@@ -22747,7 -22413,7 +22749,7 @@@ M:   Jarkko Sakkinen <[email protected]
  R:    Jason Gunthorpe <[email protected]>
  L:    [email protected]
  S:    Maintained
 -W:    https://kernsec.org/wiki/index.php/Linux_Kernel_Integrity
 +W:    https://gitlab.com/jarkkojs/linux-tpmdd-test
  Q:    https://patchwork.kernel.org/project/linux-integrity/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
  F:    Documentation/devicetree/bindings/tpm/
@@@ -22836,15 -22502,6 +22838,15 @@@ F: Documentation/ABI/testing/configfs-t
  F:    drivers/virt/coco/tsm.c
  F:    include/linux/tsm.h
  
 +TRUSTED SERVICES TEE DRIVER
 +M:    Balint Dobszay <[email protected]>
 +M:    Sudeep Holla <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/tee/ts-tee.rst
 +F:    drivers/tee/tstee/
 +
  TTY LAYER AND SERIAL DRIVERS
  M:    Greg Kroah-Hartman <[email protected]>
  M:    Jiri Slaby <[email protected]>
@@@ -22986,7 -22643,6 +22988,7 @@@ F:   include/linux/ubsan.
  F:    lib/Kconfig.ubsan
  F:    lib/test_ubsan.c
  F:    lib/ubsan.c
 +F:    lib/ubsan.h
  F:    scripts/Makefile.ubsan
  K:    \bARCH_HAS_UBSAN\b
  
@@@ -23447,7 -23103,7 +23449,7 @@@ USERSPACE DMA BUFFER DRIVE
  M:    Gerd Hoffmann <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/dma-buf/udmabuf.c
  F:    include/uapi/linux/udmabuf.h
  
@@@ -23563,8 -23219,9 +23565,8 @@@ F:   include/linux/vfio_pci_core.
  F:    include/uapi/linux/vfio.h
  
  VFIO FSL-MC DRIVER
 -M:    Diana Craciun <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  F:    drivers/vfio/fsl-mc/
  
  VFIO HISILICON PCI DRIVER
  S:    Maintained
  F:    drivers/vfio/platform/
  
 +VFIO QAT PCI DRIVER
 +M:    Xin Zeng <[email protected]>
 +M:    Giovanni Cabiddu <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/vfio/pci/qat/
 +
  VFIO VIRTIO PCI DRIVER
  M:    Yishai Hadas <[email protected]>
  L:    [email protected]
@@@ -23636,7 -23285,7 +23638,7 @@@ F:   drivers/vfio/pci/virti
  VGA_SWITCHEROO
  R:    Lukas Wunner <[email protected]>
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    Documentation/gpu/vga-switcheroo.rst
  F:    drivers/gpu/vga/vga_switcheroo.c
  F:    include/linux/vga_switcheroo.h
@@@ -23746,6 -23395,7 +23748,7 @@@ M:   "Michael S. Tsirkin" <[email protected]
  M:    Jason Wang <[email protected]>
  R:    Paolo Bonzini <[email protected]>
  R:    Stefan Hajnoczi <[email protected]>
+ R:    Eugenio Pérez <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/block/virtio_blk.c
@@@ -23764,6 -23414,7 +23767,7 @@@ VIRTIO CORE AND NET DRIVER
  M:    "Michael S. Tsirkin" <[email protected]>
  M:    Jason Wang <[email protected]>
  R:    Xuan Zhuo <[email protected]>
+ R:    Eugenio Pérez <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-vdpa
@@@ -23780,7 -23431,6 +23784,7 @@@ F:   include/linux/virtio*.
  F:    include/linux/vringh.h
  F:    include/uapi/linux/virtio_*.h
  F:    tools/virtio/
 +F:    tools/testing/selftests/drivers/net/virtio_net/
  
  VIRTIO CRYPTO DRIVER
  M:    Gonglei <[email protected]>
@@@ -23805,6 -23455,7 +23809,7 @@@ VIRTIO FILE SYSTE
  M:    Vivek Goyal <[email protected]>
  M:    Stefan Hajnoczi <[email protected]>
  M:    Miklos Szeredi <[email protected]>
+ R:    Eugenio Pérez <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Supported
@@@ -23830,7 -23481,7 +23835,7 @@@ R:   Chia-I Wu <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 +T:    git https://gitlab.freedesktop.org/drm/misc/kernel.git
  F:    drivers/gpu/drm/ci/xfails/virtio*
  F:    drivers/gpu/drm/virtio/
  F:    include/uapi/linux/virtio_gpu.h
  VIRTIO HOST (VHOST)
  M:    "Michael S. Tsirkin" <[email protected]>
  M:    Jason Wang <[email protected]>
+ R:    Eugenio Pérez <[email protected]>
  L:    [email protected]
  L:    [email protected]
  L:    [email protected]
@@@ -24230,7 -23882,7 +24236,7 @@@ S:   Orpha
  F:    drivers/watchdog/ebc-c384_wdt.c
  
  WINSYSTEMS WS16C48 GPIO DRIVER
 -M:    William Breathitt Gray <william.gray@linaro.org>
 +M:    William Breathitt Gray <wbg@kernel.org>
  L:    [email protected]
  S:    Maintained
  F:    drivers/gpio/gpio-ws16c48.c
@@@ -24813,14 -24465,6 +24819,14 @@@ T: git git://git.kernel.org/pub/scm/lin
  F:    Documentation/admin-guide/LSM/Yama.rst
  F:    security/yama/
  
 +YAML NETLINK (YNL)
 +M:    Donald Hunter <[email protected]>
 +M:    Jakub Kicinski <[email protected]>
 +F:    Documentation/netlink/
 +F:    Documentation/userspace-api/netlink/intro-specs.rst
 +F:    Documentation/userspace-api/netlink/specs.rst
 +F:    tools/net/ynl/
 +
  YEALINK PHONE DRIVER
  M:    Henk Vergonet <[email protected]>
  L:    [email protected]
index c1af0a7d56c80ad772980ff9e419da15caa160b2,46bdbad1ab48b5d910eccb52537e8ef3c301cb18..2351f411fa4680f47dd7e5d87bc9b771a71c8582
@@@ -1543,7 -1543,7 +1543,7 @@@ static int virtblk_probe(struct virtio_
         */
        if (IS_ENABLED(CONFIG_BLK_DEV_ZONED) && lim.zoned) {
                blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, vblk->disk->queue);
 -              err = blk_revalidate_disk_zones(vblk->disk, NULL);
 +              err = blk_revalidate_disk_zones(vblk->disk);
                if (err)
                        goto out_cleanup_disk;
        }
@@@ -1658,7 -1658,6 +1658,6 @@@ static struct virtio_driver virtio_blk 
        .feature_table_legacy           = features_legacy,
        .feature_table_size_legacy      = ARRAY_SIZE(features_legacy),
        .driver.name                    = KBUILD_MODNAME,
-       .driver.owner                   = THIS_MODULE,
        .id_table                       = id_table,
        .probe                          = virtblk_probe,
        .remove                         = virtblk_remove,
index 18208e152a3675b6366016aedc16c50154bd7775,463b49ca2492eca9a23d437cd43f37ee9e528573..40bd83825c29ad1ce787765b96f0096eb7930841
@@@ -274,6 -274,7 +274,6 @@@ static int virtbt_probe(struct virtio_d
  
        switch (type) {
        case VIRTIO_BT_CONFIG_TYPE_PRIMARY:
 -      case VIRTIO_BT_CONFIG_TYPE_AMP:
                break;
        default:
                return -EINVAL;
        vbt->hdev = hdev;
  
        hdev->bus = HCI_VIRTIO;
 -      hdev->dev_type = type;
        hci_set_drvdata(hdev, vbt);
  
        hdev->open  = virtbt_open;
@@@ -415,7 -417,6 +415,6 @@@ static const unsigned int virtbt_featur
  
  static struct virtio_driver virtbt_driver = {
        .driver.name         = KBUILD_MODNAME,
-       .driver.owner        = THIS_MODULE,
        .feature_table       = virtbt_features,
        .feature_table_size  = ARRAY_SIZE(virtbt_features),
        .id_table            = virtbt_table,
index 8e776f6c6e35bcb756a6081f18fbb7a2e378d6a8,9ed8958a42bf19de66cdbfc4008f69e8b809d51e..36d680826b5733ad6c322e493562b951d2f81509
@@@ -1025,6 -1025,15 +1025,6 @@@ err_free_dev
        return ERR_PTR(ret);
  }
  
 -static void viommu_probe_finalize(struct device *dev)
 -{
 -#ifndef CONFIG_ARCH_HAS_SETUP_DMA_OPS
 -      /* First clear the DMA ops in case we're switching from a DMA domain */
 -      set_dma_ops(dev, NULL);
 -      iommu_setup_dma_ops(dev, 0, U64_MAX);
 -#endif
 -}
 -
  static void viommu_release_device(struct device *dev)
  {
        struct viommu_endpoint *vdev = dev_iommu_priv_get(dev);
@@@ -1064,6 -1073,7 +1064,6 @@@ static struct iommu_ops viommu_ops = 
        .capable                = viommu_capable,
        .domain_alloc           = viommu_domain_alloc,
        .probe_device           = viommu_probe_device,
 -      .probe_finalize         = viommu_probe_finalize,
        .release_device         = viommu_release_device,
        .device_group           = viommu_device_group,
        .get_resv_regions       = viommu_get_resv_regions,
@@@ -1251,7 -1261,6 +1251,6 @@@ MODULE_DEVICE_TABLE(virtio, id_table)
  
  static struct virtio_driver virtio_iommu_drv = {
        .driver.name            = KBUILD_MODNAME,
-       .driver.owner           = THIS_MODULE,
        .id_table               = id_table,
        .feature_table          = features,
        .feature_table_size     = ARRAY_SIZE(features),
diff --combined drivers/net/virtio_net.c
index 4e1a0fc0d5558c3739f9dcff7e730da4803a970f,283b34d502962fb6a5321bc2c14d82e5689d0bb5..4a802c0ea2cbc381ecc8a48c7ca28bc75c4808f8
@@@ -24,7 -24,6 +24,7 @@@
  #include <net/xdp.h>
  #include <net/net_failover.h>
  #include <net/netdev_rx_queue.h>
 +#include <net/netdev_queues.h>
  
  static int napi_weight = NAPI_POLL_WEIGHT;
  module_param(napi_weight, int, 0444);
@@@ -79,7 -78,6 +79,7 @@@ static const unsigned long guest_offloa
  struct virtnet_stat_desc {
        char desc[ETH_GSTRING_LEN];
        size_t offset;
 +      size_t qstat_offset;
  };
  
  struct virtnet_sq_free_stats {
@@@ -95,8 -93,6 +95,8 @@@ struct virtnet_sq_stats 
        u64_stats_t xdp_tx_drops;
        u64_stats_t kicks;
        u64_stats_t tx_timeouts;
 +      u64_stats_t stop;
 +      u64_stats_t wake;
  };
  
  struct virtnet_rq_stats {
        u64_stats_t kicks;
  };
  
 -#define VIRTNET_SQ_STAT(m)    offsetof(struct virtnet_sq_stats, m)
 -#define VIRTNET_RQ_STAT(m)    offsetof(struct virtnet_rq_stats, m)
 +#define VIRTNET_SQ_STAT(name, m) {name, offsetof(struct virtnet_sq_stats, m), -1}
 +#define VIRTNET_RQ_STAT(name, m) {name, offsetof(struct virtnet_rq_stats, m), -1}
 +
 +#define VIRTNET_SQ_STAT_QSTAT(name, m)                                \
 +      {                                                       \
 +              name,                                           \
 +              offsetof(struct virtnet_sq_stats, m),           \
 +              offsetof(struct netdev_queue_stats_tx, m),      \
 +      }
 +
 +#define VIRTNET_RQ_STAT_QSTAT(name, m)                                \
 +      {                                                       \
 +              name,                                           \
 +              offsetof(struct virtnet_rq_stats, m),           \
 +              offsetof(struct netdev_queue_stats_rx, m),      \
 +      }
  
  static const struct virtnet_stat_desc virtnet_sq_stats_desc[] = {
 -      { "packets",            VIRTNET_SQ_STAT(packets) },
 -      { "bytes",              VIRTNET_SQ_STAT(bytes) },
 -      { "xdp_tx",             VIRTNET_SQ_STAT(xdp_tx) },
 -      { "xdp_tx_drops",       VIRTNET_SQ_STAT(xdp_tx_drops) },
 -      { "kicks",              VIRTNET_SQ_STAT(kicks) },
 -      { "tx_timeouts",        VIRTNET_SQ_STAT(tx_timeouts) },
 +      VIRTNET_SQ_STAT("xdp_tx",       xdp_tx),
 +      VIRTNET_SQ_STAT("xdp_tx_drops", xdp_tx_drops),
 +      VIRTNET_SQ_STAT("kicks",        kicks),
 +      VIRTNET_SQ_STAT("tx_timeouts",  tx_timeouts),
  };
  
  static const struct virtnet_stat_desc virtnet_rq_stats_desc[] = {
 -      { "packets",            VIRTNET_RQ_STAT(packets) },
 -      { "bytes",              VIRTNET_RQ_STAT(bytes) },
 -      { "drops",              VIRTNET_RQ_STAT(drops) },
 -      { "xdp_packets",        VIRTNET_RQ_STAT(xdp_packets) },
 -      { "xdp_tx",             VIRTNET_RQ_STAT(xdp_tx) },
 -      { "xdp_redirects",      VIRTNET_RQ_STAT(xdp_redirects) },
 -      { "xdp_drops",          VIRTNET_RQ_STAT(xdp_drops) },
 -      { "kicks",              VIRTNET_RQ_STAT(kicks) },
 +      VIRTNET_RQ_STAT("drops",         drops),
 +      VIRTNET_RQ_STAT("xdp_packets",   xdp_packets),
 +      VIRTNET_RQ_STAT("xdp_tx",        xdp_tx),
 +      VIRTNET_RQ_STAT("xdp_redirects", xdp_redirects),
 +      VIRTNET_RQ_STAT("xdp_drops",     xdp_drops),
 +      VIRTNET_RQ_STAT("kicks",         kicks),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_sq_stats_desc_qstat[] = {
 +      VIRTNET_SQ_STAT_QSTAT("packets", packets),
 +      VIRTNET_SQ_STAT_QSTAT("bytes",   bytes),
 +      VIRTNET_SQ_STAT_QSTAT("stop",    stop),
 +      VIRTNET_SQ_STAT_QSTAT("wake",    wake),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_rq_stats_desc_qstat[] = {
 +      VIRTNET_RQ_STAT_QSTAT("packets", packets),
 +      VIRTNET_RQ_STAT_QSTAT("bytes",   bytes),
 +};
 +
 +#define VIRTNET_STATS_DESC_CQ(name) \
 +      {#name, offsetof(struct virtio_net_stats_cvq, name), -1}
 +
 +#define VIRTNET_STATS_DESC_RX(class, name) \
 +      {#name, offsetof(struct virtio_net_stats_rx_ ## class, rx_ ## name), -1}
 +
 +#define VIRTNET_STATS_DESC_TX(class, name) \
 +      {#name, offsetof(struct virtio_net_stats_tx_ ## class, tx_ ## name), -1}
 +
 +
 +static const struct virtnet_stat_desc virtnet_stats_cvq_desc[] = {
 +      VIRTNET_STATS_DESC_CQ(command_num),
 +      VIRTNET_STATS_DESC_CQ(ok_num),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_basic_desc[] = {
 +      VIRTNET_STATS_DESC_RX(basic, packets),
 +      VIRTNET_STATS_DESC_RX(basic, bytes),
 +
 +      VIRTNET_STATS_DESC_RX(basic, notifications),
 +      VIRTNET_STATS_DESC_RX(basic, interrupts),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_tx_basic_desc[] = {
 +      VIRTNET_STATS_DESC_TX(basic, packets),
 +      VIRTNET_STATS_DESC_TX(basic, bytes),
 +
 +      VIRTNET_STATS_DESC_TX(basic, notifications),
 +      VIRTNET_STATS_DESC_TX(basic, interrupts),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_csum_desc[] = {
 +      VIRTNET_STATS_DESC_RX(csum, needs_csum),
  };
  
 -#define VIRTNET_SQ_STATS_LEN  ARRAY_SIZE(virtnet_sq_stats_desc)
 -#define VIRTNET_RQ_STATS_LEN  ARRAY_SIZE(virtnet_rq_stats_desc)
 +static const struct virtnet_stat_desc virtnet_stats_tx_gso_desc[] = {
 +      VIRTNET_STATS_DESC_TX(gso, gso_packets_noseg),
 +      VIRTNET_STATS_DESC_TX(gso, gso_bytes_noseg),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_speed_desc[] = {
 +      VIRTNET_STATS_DESC_RX(speed, ratelimit_bytes),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_tx_speed_desc[] = {
 +      VIRTNET_STATS_DESC_TX(speed, ratelimit_bytes),
 +};
 +
 +#define VIRTNET_STATS_DESC_RX_QSTAT(class, name, qstat_field)                 \
 +      {                                                                       \
 +              #name,                                                          \
 +              offsetof(struct virtio_net_stats_rx_ ## class, rx_ ## name),    \
 +              offsetof(struct netdev_queue_stats_rx, qstat_field),            \
 +      }
 +
 +#define VIRTNET_STATS_DESC_TX_QSTAT(class, name, qstat_field)                 \
 +      {                                                                       \
 +              #name,                                                          \
 +              offsetof(struct virtio_net_stats_tx_ ## class, tx_ ## name),    \
 +              offsetof(struct netdev_queue_stats_tx, qstat_field),            \
 +      }
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_basic_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_RX_QSTAT(basic, drops,         hw_drops),
 +      VIRTNET_STATS_DESC_RX_QSTAT(basic, drop_overruns, hw_drop_overruns),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_tx_basic_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_TX_QSTAT(basic, drops,          hw_drops),
 +      VIRTNET_STATS_DESC_TX_QSTAT(basic, drop_malformed, hw_drop_errors),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_csum_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_RX_QSTAT(csum, csum_valid, csum_unnecessary),
 +      VIRTNET_STATS_DESC_RX_QSTAT(csum, csum_none,  csum_none),
 +      VIRTNET_STATS_DESC_RX_QSTAT(csum, csum_bad,   csum_bad),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_tx_csum_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_TX_QSTAT(csum, csum_none,  csum_none),
 +      VIRTNET_STATS_DESC_TX_QSTAT(csum, needs_csum, needs_csum),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_gso_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_RX_QSTAT(gso, gso_packets,           hw_gro_packets),
 +      VIRTNET_STATS_DESC_RX_QSTAT(gso, gso_bytes,             hw_gro_bytes),
 +      VIRTNET_STATS_DESC_RX_QSTAT(gso, gso_packets_coalesced, hw_gro_wire_packets),
 +      VIRTNET_STATS_DESC_RX_QSTAT(gso, gso_bytes_coalesced,   hw_gro_wire_bytes),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_tx_gso_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_TX_QSTAT(gso, gso_packets,        hw_gso_packets),
 +      VIRTNET_STATS_DESC_TX_QSTAT(gso, gso_bytes,          hw_gso_bytes),
 +      VIRTNET_STATS_DESC_TX_QSTAT(gso, gso_segments,       hw_gso_wire_packets),
 +      VIRTNET_STATS_DESC_TX_QSTAT(gso, gso_segments_bytes, hw_gso_wire_bytes),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_rx_speed_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_RX_QSTAT(speed, ratelimit_packets, hw_drop_ratelimits),
 +};
 +
 +static const struct virtnet_stat_desc virtnet_stats_tx_speed_desc_qstat[] = {
 +      VIRTNET_STATS_DESC_TX_QSTAT(speed, ratelimit_packets, hw_drop_ratelimits),
 +};
 +
 +#define VIRTNET_Q_TYPE_RX 0
 +#define VIRTNET_Q_TYPE_TX 1
 +#define VIRTNET_Q_TYPE_CQ 2
  
  struct virtnet_interrupt_coalesce {
        u32 max_packets;
@@@ -316,9 -184,6 +316,9 @@@ struct receive_queue 
        /* Is dynamic interrupt moderation enabled? */
        bool dim_enabled;
  
 +      /* Used to protect dim_enabled and inter_coal */
 +      struct mutex dim_lock;
 +
        /* Dynamic Interrupt Moderation */
        struct dim dim;
  
  
        /* Record the last dma info to free after new pages is allocated. */
        struct virtnet_rq_dma *last_dma;
 -
 -      /* Do dma by self */
 -      bool do_dma;
  };
  
  /* This structure can contain rss message with maximum settings for indirection table and keysize
@@@ -372,6 -240,15 +372,6 @@@ struct virtio_net_ctrl_rss 
  struct control_buf {
        struct virtio_net_ctrl_hdr hdr;
        virtio_net_ctrl_ack status;
 -      struct virtio_net_ctrl_mq mq;
 -      u8 promisc;
 -      u8 allmulti;
 -      __virtio16 vid;
 -      __virtio64 offloads;
 -      struct virtio_net_ctrl_rss rss;
 -      struct virtio_net_ctrl_coal_tx coal_tx;
 -      struct virtio_net_ctrl_coal_rx coal_rx;
 -      struct virtio_net_ctrl_coal_vq coal_vq;
  };
  
  struct virtnet_info {
        u16 rss_indir_table_size;
        u32 rss_hash_types_supported;
        u32 rss_hash_types_saved;
 +      struct virtio_net_ctrl_rss rss;
  
        /* Has control virtqueue */
        bool has_cvq;
  
 +      /* Lock to protect the control VQ */
 +      struct mutex cvq_lock;
 +
        /* Host can handle any s/g split between our header and packet data */
        bool any_header_sg;
  
  
        /* failover when STANDBY feature enabled */
        struct failover *failover;
 +
 +      u64 device_stats_cap;
  };
  
  struct padded_vnet_hdr {
@@@ -554,17 -425,6 +554,17 @@@ static int rxq2vq(int rxq
        return rxq * 2;
  }
  
 +static int vq_type(struct virtnet_info *vi, int qid)
 +{
 +      if (qid == vi->max_queue_pairs * 2)
 +              return VIRTNET_Q_TYPE_CQ;
 +
 +      if (qid % 2)
 +              return VIRTNET_Q_TYPE_TX;
 +
 +      return VIRTNET_Q_TYPE_RX;
 +}
 +
  static inline struct virtio_net_common_hdr *
  skb_vnet_common_hdr(struct sk_buff *skb)
  {
@@@ -743,6 -603,7 +743,6 @@@ static struct sk_buff *page_to_skb(stru
  
        shinfo_size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
  
 -      /* copy small packet so we can reuse these pages */
        if (!NET_IP_ALIGN && len > GOOD_COPY_LEN && tailroom >= shinfo_size) {
                skb = virtnet_build_skb(buf, truesize, p - buf, len);
                if (unlikely(!skb))
@@@ -846,7 -707,7 +846,7 @@@ static void *virtnet_rq_get_buf(struct 
        void *buf;
  
        buf = virtqueue_get_buf_ctx(rq->vq, len, ctx);
 -      if (buf && rq->do_dma)
 +      if (buf)
                virtnet_rq_unmap(rq, buf, *len);
  
        return buf;
@@@ -859,6 -720,11 +859,6 @@@ static void virtnet_rq_init_one_sg(stru
        u32 offset;
        void *head;
  
 -      if (!rq->do_dma) {
 -              sg_init_one(rq->sg, buf, len);
 -              return;
 -      }
 -
        head = page_address(rq->alloc_frag.page);
  
        offset = buf - head;
@@@ -884,42 -750,44 +884,42 @@@ static void *virtnet_rq_alloc(struct re
  
        head = page_address(alloc_frag->page);
  
 -      if (rq->do_dma) {
 -              dma = head;
 -
 -              /* new pages */
 -              if (!alloc_frag->offset) {
 -                      if (rq->last_dma) {
 -                              /* Now, the new page is allocated, the last dma
 -                               * will not be used. So the dma can be unmapped
 -                               * if the ref is 0.
 -                               */
 -                              virtnet_rq_unmap(rq, rq->last_dma, 0);
 -                              rq->last_dma = NULL;
 -                      }
 +      dma = head;
  
 -                      dma->len = alloc_frag->size - sizeof(*dma);
 +      /* new pages */
 +      if (!alloc_frag->offset) {
 +              if (rq->last_dma) {
 +                      /* Now, the new page is allocated, the last dma
 +                       * will not be used. So the dma can be unmapped
 +                       * if the ref is 0.
 +                       */
 +                      virtnet_rq_unmap(rq, rq->last_dma, 0);
 +                      rq->last_dma = NULL;
 +              }
  
 -                      addr = virtqueue_dma_map_single_attrs(rq->vq, dma + 1,
 -                                                            dma->len, DMA_FROM_DEVICE, 0);
 -                      if (virtqueue_dma_mapping_error(rq->vq, addr))
 -                              return NULL;
 +              dma->len = alloc_frag->size - sizeof(*dma);
  
 -                      dma->addr = addr;
 -                      dma->need_sync = virtqueue_dma_need_sync(rq->vq, addr);
 +              addr = virtqueue_dma_map_single_attrs(rq->vq, dma + 1,
 +                                                    dma->len, DMA_FROM_DEVICE, 0);
 +              if (virtqueue_dma_mapping_error(rq->vq, addr))
 +                      return NULL;
  
 -                      /* Add a reference to dma to prevent the entire dma from
 -                       * being released during error handling. This reference
 -                       * will be freed after the pages are no longer used.
 -                       */
 -                      get_page(alloc_frag->page);
 -                      dma->ref = 1;
 -                      alloc_frag->offset = sizeof(*dma);
 +              dma->addr = addr;
 +              dma->need_sync = virtqueue_dma_need_sync(rq->vq, addr);
  
 -                      rq->last_dma = dma;
 -              }
 +              /* Add a reference to dma to prevent the entire dma from
 +               * being released during error handling. This reference
 +               * will be freed after the pages are no longer used.
 +               */
 +              get_page(alloc_frag->page);
 +              dma->ref = 1;
 +              alloc_frag->offset = sizeof(*dma);
  
 -              ++dma->ref;
 +              rq->last_dma = dma;
        }
  
 +      ++dma->ref;
 +
        buf = head + alloc_frag->offset;
  
        get_page(alloc_frag->page);
@@@ -936,9 -804,12 +936,9 @@@ static void virtnet_rq_set_premapped(st
        if (!vi->mergeable_rx_bufs && vi->big_packets)
                return;
  
 -      for (i = 0; i < vi->max_queue_pairs; i++) {
 -              if (virtqueue_set_dma_premapped(vi->rq[i].vq))
 -                      continue;
 -
 -              vi->rq[i].do_dma = true;
 -      }
 +      for (i = 0; i < vi->max_queue_pairs; i++)
 +              /* error should never happen */
 +              BUG_ON(virtqueue_set_dma_premapped(vi->rq[i].vq));
  }
  
  static void virtnet_rq_unmap_free_buf(struct virtqueue *vq, void *buf)
  
        rq = &vi->rq[i];
  
 -      if (rq->do_dma)
 +      if (!vi->big_packets || vi->mergeable_rx_bufs)
                virtnet_rq_unmap(rq, buf, 0);
  
        virtnet_rq_free_buf(vi, rq, buf);
@@@ -1004,9 -875,6 +1004,9 @@@ static void check_sq_full_and_disable(s
         */
        if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {
                netif_stop_subqueue(dev, qnum);
 +              u64_stats_update_begin(&sq->stats.syncp);
 +              u64_stats_inc(&sq->stats.stop);
 +              u64_stats_update_end(&sq->stats.syncp);
                if (use_napi) {
                        if (unlikely(!virtqueue_enable_cb_delayed(sq->vq)))
                                virtqueue_napi_schedule(&sq->napi, sq->vq);
                        free_old_xmit(sq, false);
                        if (sq->vq->num_free >= 2+MAX_SKB_FRAGS) {
                                netif_start_subqueue(dev, qnum);
 +                              u64_stats_update_begin(&sq->stats.syncp);
 +                              u64_stats_inc(&sq->stats.wake);
 +                              u64_stats_update_end(&sq->stats.syncp);
                                virtqueue_disable_cb(sq->vq);
                        }
                }
@@@ -2016,7 -1881,8 +2016,7 @@@ static int add_recvbuf_small(struct vir
  
        err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp);
        if (err < 0) {
 -              if (rq->do_dma)
 -                      virtnet_rq_unmap(rq, buf, 0);
 +              virtnet_rq_unmap(rq, buf, 0);
                put_page(virt_to_head_page(buf));
        }
  
@@@ -2130,7 -1996,8 +2130,7 @@@ static int add_recvbuf_mergeable(struc
        ctx = mergeable_len_to_ctx(len + room, headroom);
        err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp);
        if (err < 0) {
 -              if (rq->do_dma)
 -                      virtnet_rq_unmap(rq, buf, 0);
 +              virtnet_rq_unmap(rq, buf, 0);
                put_page(virt_to_head_page(buf));
        }
  
@@@ -2261,7 -2128,7 +2261,7 @@@ static int virtnet_receive(struct recei
                }
        } else {
                while (packets < budget &&
 -                     (buf = virtnet_rq_get_buf(rq, &len, NULL)) != NULL) {
 +                     (buf = virtqueue_get_buf(rq->vq, &len)) != NULL) {
                        receive_buf(vi, rq, buf, len, NULL, xdp_xmit, &stats);
                        packets++;
                }
  
        u64_stats_set(&stats.packets, packets);
        u64_stats_update_begin(&rq->stats.syncp);
 -      for (i = 0; i < VIRTNET_RQ_STATS_LEN; i++) {
 +      for (i = 0; i < ARRAY_SIZE(virtnet_rq_stats_desc); i++) {
                size_t offset = virtnet_rq_stats_desc[i].offset;
                u64_stats_t *item, *src;
  
                src = (u64_stats_t *)((u8 *)&stats + offset);
                u64_stats_add(item, u64_stats_read(src));
        }
 +
 +      u64_stats_add(&rq->stats.packets, u64_stats_read(&stats.packets));
 +      u64_stats_add(&rq->stats.bytes, u64_stats_read(&stats.bytes));
 +
        u64_stats_update_end(&rq->stats.syncp);
  
        return packets;
@@@ -2316,14 -2179,8 +2316,14 @@@ static void virtnet_poll_cleantx(struc
                        free_old_xmit(sq, true);
                } while (unlikely(!virtqueue_enable_cb_delayed(sq->vq)));
  
 -              if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
 +              if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS) {
 +                      if (netif_tx_queue_stopped(txq)) {
 +                              u64_stats_update_begin(&sq->stats.syncp);
 +                              u64_stats_inc(&sq->stats.wake);
 +                              u64_stats_update_end(&sq->stats.syncp);
 +                      }
                        netif_tx_wake_queue(txq);
 +              }
  
                __netif_tx_unlock(txq);
        }
@@@ -2368,10 -2225,6 +2368,10 @@@ static int virtnet_poll(struct napi_str
        /* Out of packets? */
        if (received < budget) {
                napi_complete = virtqueue_napi_complete(napi, rq->vq, received);
 +              /* Intentionally not taking dim_lock here. This may result in a
 +               * spurious net_dim call. But if that happens virtnet_rx_dim_work
 +               * will not act on the scheduled work.
 +               */
                if (napi_complete && rq->dim_enabled)
                        virtnet_rx_dim_update(vi, rq);
        }
@@@ -2473,14 -2326,8 +2473,14 @@@ static int virtnet_poll_tx(struct napi_
        virtqueue_disable_cb(sq->vq);
        free_old_xmit(sq, true);
  
 -      if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
 +      if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS) {
 +              if (netif_tx_queue_stopped(txq)) {
 +                      u64_stats_update_begin(&sq->stats.syncp);
 +                      u64_stats_inc(&sq->stats.wake);
 +                      u64_stats_update_end(&sq->stats.syncp);
 +              }
                netif_tx_wake_queue(txq);
 +      }
  
        opaque = virtqueue_enable_cb_prepare(sq->vq);
  
@@@ -2680,18 -2527,16 +2680,18 @@@ static int virtnet_tx_resize(struct vir
   * supported by the hypervisor, as indicated by feature bits, should
   * never fail unless improperly formatted.
   */
 -static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
 -                               struct scatterlist *out)
 +static bool virtnet_send_command_reply(struct virtnet_info *vi, u8 class, u8 cmd,
 +                                     struct scatterlist *out,
 +                                     struct scatterlist *in)
  {
 -      struct scatterlist *sgs[4], hdr, stat;
 -      unsigned out_num = 0, tmp;
 +      struct scatterlist *sgs[5], hdr, stat;
 +      u32 out_num = 0, tmp, in_num = 0;
        int ret;
  
        /* Caller should know better */
        BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ));
  
 +      mutex_lock(&vi->cvq_lock);
        vi->ctrl->status = ~0;
        vi->ctrl->hdr.class = class;
        vi->ctrl->hdr.cmd = cmd;
  
        /* Add return status. */
        sg_init_one(&stat, &vi->ctrl->status, sizeof(vi->ctrl->status));
 -      sgs[out_num] = &stat;
 +      sgs[out_num + in_num++] = &stat;
  
 -      BUG_ON(out_num + 1 > ARRAY_SIZE(sgs));
 -      ret = virtqueue_add_sgs(vi->cvq, sgs, out_num, 1, vi, GFP_ATOMIC);
 +      if (in)
 +              sgs[out_num + in_num++] = in;
 +
 +      BUG_ON(out_num + in_num > ARRAY_SIZE(sgs));
 +      ret = virtqueue_add_sgs(vi->cvq, sgs, out_num, in_num, vi, GFP_ATOMIC);
        if (ret < 0) {
                dev_warn(&vi->vdev->dev,
                         "Failed to add sgs for command vq: %d\n.", ret);
 +              mutex_unlock(&vi->cvq_lock);
                return false;
        }
  
        if (unlikely(!virtqueue_kick(vi->cvq)))
 -              return vi->ctrl->status == VIRTIO_NET_OK;
 +              goto unlock;
  
        /* Spin for a response, the kick causes an ioport write, trapping
         * into the hypervisor, so the request should be handled immediately.
                cpu_relax();
        }
  
 +unlock:
 +      mutex_unlock(&vi->cvq_lock);
        return vi->ctrl->status == VIRTIO_NET_OK;
  }
  
 +static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
 +                               struct scatterlist *out)
 +{
 +      return virtnet_send_command_reply(vi, class, cmd, out, NULL);
 +}
 +
  static int virtnet_set_mac_address(struct net_device *dev, void *p)
  {
        struct virtnet_info *vi = netdev_priv(dev);
@@@ -2830,26 -2663,23 +2830,26 @@@ static void virtnet_stats(struct net_de
  
  static void virtnet_ack_link_announce(struct virtnet_info *vi)
  {
 -      rtnl_lock();
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_ANNOUNCE,
                                  VIRTIO_NET_CTRL_ANNOUNCE_ACK, NULL))
                dev_warn(&vi->dev->dev, "Failed to ack link announce.\n");
 -      rtnl_unlock();
  }
  
 -static int _virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
 +static int virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
  {
 +      struct virtio_net_ctrl_mq *mq __free(kfree) = NULL;
        struct scatterlist sg;
        struct net_device *dev = vi->dev;
  
        if (!vi->has_cvq || !virtio_has_feature(vi->vdev, VIRTIO_NET_F_MQ))
                return 0;
  
 -      vi->ctrl->mq.virtqueue_pairs = cpu_to_virtio16(vi->vdev, queue_pairs);
 -      sg_init_one(&sg, &vi->ctrl->mq, sizeof(vi->ctrl->mq));
 +      mq = kzalloc(sizeof(*mq), GFP_KERNEL);
 +      if (!mq)
 +              return -ENOMEM;
 +
 +      mq->virtqueue_pairs = cpu_to_virtio16(vi->vdev, queue_pairs);
 +      sg_init_one(&sg, mq, sizeof(*mq));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MQ,
                                  VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET, &sg)) {
        return 0;
  }
  
 -static int virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
 -{
 -      int err;
 -
 -      rtnl_lock();
 -      err = _virtnet_set_queues(vi, queue_pairs);
 -      rtnl_unlock();
 -      return err;
 -}
 -
  static int virtnet_close(struct net_device *dev)
  {
        struct virtnet_info *vi = netdev_priv(dev);
@@@ -2888,7 -2728,6 +2888,7 @@@ static void virtnet_rx_mode_work(struc
  {
        struct virtnet_info *vi =
                container_of(work, struct virtnet_info, rx_mode_work);
 +      u8 *promisc_allmulti  __free(kfree) = NULL;
        struct net_device *dev = vi->dev;
        struct scatterlist sg[2];
        struct virtio_net_ctrl_mac *mac_data;
        if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX))
                return;
  
 -      rtnl_lock();
 +      promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_KERNEL);
 +      if (!promisc_allmulti) {
 +              dev_warn(&dev->dev, "Failed to set RX mode, no memory.\n");
 +              return;
 +      }
  
 -      vi->ctrl->promisc = ((dev->flags & IFF_PROMISC) != 0);
 -      vi->ctrl->allmulti = ((dev->flags & IFF_ALLMULTI) != 0);
 +      rtnl_lock();
  
 -      sg_init_one(sg, &vi->ctrl->promisc, sizeof(vi->ctrl->promisc));
 +      *promisc_allmulti = !!(dev->flags & IFF_PROMISC);
 +      sg_init_one(sg, promisc_allmulti, sizeof(*promisc_allmulti));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX,
                                  VIRTIO_NET_CTRL_RX_PROMISC, sg))
                dev_warn(&dev->dev, "Failed to %sable promisc mode.\n",
 -                       vi->ctrl->promisc ? "en" : "dis");
 +                       *promisc_allmulti ? "en" : "dis");
  
 -      sg_init_one(sg, &vi->ctrl->allmulti, sizeof(vi->ctrl->allmulti));
 +      *promisc_allmulti = !!(dev->flags & IFF_ALLMULTI);
 +      sg_init_one(sg, promisc_allmulti, sizeof(*promisc_allmulti));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_RX,
                                  VIRTIO_NET_CTRL_RX_ALLMULTI, sg))
                dev_warn(&dev->dev, "Failed to %sable allmulti mode.\n",
 -                       vi->ctrl->allmulti ? "en" : "dis");
 +                       *promisc_allmulti ? "en" : "dis");
  
        netif_addr_lock_bh(dev);
  
@@@ -2985,15 -2819,10 +2985,15 @@@ static int virtnet_vlan_rx_add_vid(stru
                                   __be16 proto, u16 vid)
  {
        struct virtnet_info *vi = netdev_priv(dev);
 +      __virtio16 *_vid __free(kfree) = NULL;
        struct scatterlist sg;
  
 -      vi->ctrl->vid = cpu_to_virtio16(vi->vdev, vid);
 -      sg_init_one(&sg, &vi->ctrl->vid, sizeof(vi->ctrl->vid));
 +      _vid = kzalloc(sizeof(*_vid), GFP_KERNEL);
 +      if (!_vid)
 +              return -ENOMEM;
 +
 +      *_vid = cpu_to_virtio16(vi->vdev, vid);
 +      sg_init_one(&sg, _vid, sizeof(*_vid));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN,
                                  VIRTIO_NET_CTRL_VLAN_ADD, &sg))
@@@ -3005,15 -2834,10 +3005,15 @@@ static int virtnet_vlan_rx_kill_vid(str
                                    __be16 proto, u16 vid)
  {
        struct virtnet_info *vi = netdev_priv(dev);
 +      __virtio16 *_vid __free(kfree) = NULL;
        struct scatterlist sg;
  
 -      vi->ctrl->vid = cpu_to_virtio16(vi->vdev, vid);
 -      sg_init_one(&sg, &vi->ctrl->vid, sizeof(vi->ctrl->vid));
 +      _vid = kzalloc(sizeof(*_vid), GFP_KERNEL);
 +      if (!_vid)
 +              return -ENOMEM;
 +
 +      *_vid = cpu_to_virtio16(vi->vdev, vid);
 +      sg_init_one(&sg, _vid, sizeof(*_vid));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN,
                                  VIRTIO_NET_CTRL_VLAN_DEL, &sg))
@@@ -3126,17 -2950,12 +3126,17 @@@ static void virtnet_cpu_notif_remove(st
  static int virtnet_send_ctrl_coal_vq_cmd(struct virtnet_info *vi,
                                         u16 vqn, u32 max_usecs, u32 max_packets)
  {
 +      struct virtio_net_ctrl_coal_vq *coal_vq __free(kfree) = NULL;
        struct scatterlist sgs;
  
 -      vi->ctrl->coal_vq.vqn = cpu_to_le16(vqn);
 -      vi->ctrl->coal_vq.coal.max_usecs = cpu_to_le32(max_usecs);
 -      vi->ctrl->coal_vq.coal.max_packets = cpu_to_le32(max_packets);
 -      sg_init_one(&sgs, &vi->ctrl->coal_vq, sizeof(vi->ctrl->coal_vq));
 +      coal_vq = kzalloc(sizeof(*coal_vq), GFP_KERNEL);
 +      if (!coal_vq)
 +              return -ENOMEM;
 +
 +      coal_vq->vqn = cpu_to_le16(vqn);
 +      coal_vq->coal.max_usecs = cpu_to_le32(max_usecs);
 +      coal_vq->coal.max_packets = cpu_to_le32(max_packets);
 +      sg_init_one(&sgs, coal_vq, sizeof(*coal_vq));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_NOTF_COAL,
                                  VIRTIO_NET_CTRL_NOTF_COAL_VQ_SET,
@@@ -3247,11 -3066,9 +3247,11 @@@ static int virtnet_set_ringparam(struc
                                return err;
  
                        /* The reason is same as the transmit virtqueue reset */
 +                      mutex_lock(&vi->rq[i].dim_lock);
                        err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, i,
                                                               vi->intr_coal_rx.max_usecs,
                                                               vi->intr_coal_rx.max_packets);
 +                      mutex_unlock(&vi->rq[i].dim_lock);
                        if (err)
                                return err;
                }
@@@ -3270,29 -3087,25 +3270,29 @@@ static bool virtnet_commit_rss_command(
        sg_init_table(sgs, 4);
  
        sg_buf_size = offsetof(struct virtio_net_ctrl_rss, indirection_table);
 -      sg_set_buf(&sgs[0], &vi->ctrl->rss, sg_buf_size);
 +      sg_set_buf(&sgs[0], &vi->rss, sg_buf_size);
  
 -      sg_buf_size = sizeof(uint16_t) * (vi->ctrl->rss.indirection_table_mask + 1);
 -      sg_set_buf(&sgs[1], vi->ctrl->rss.indirection_table, sg_buf_size);
 +      sg_buf_size = sizeof(uint16_t) * (vi->rss.indirection_table_mask + 1);
 +      sg_set_buf(&sgs[1], vi->rss.indirection_table, sg_buf_size);
  
        sg_buf_size = offsetof(struct virtio_net_ctrl_rss, key)
                        - offsetof(struct virtio_net_ctrl_rss, max_tx_vq);
 -      sg_set_buf(&sgs[2], &vi->ctrl->rss.max_tx_vq, sg_buf_size);
 +      sg_set_buf(&sgs[2], &vi->rss.max_tx_vq, sg_buf_size);
  
        sg_buf_size = vi->rss_key_size;
 -      sg_set_buf(&sgs[3], vi->ctrl->rss.key, sg_buf_size);
 +      sg_set_buf(&sgs[3], vi->rss.key, sg_buf_size);
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MQ,
                                  vi->has_rss ? VIRTIO_NET_CTRL_MQ_RSS_CONFIG
 -                                : VIRTIO_NET_CTRL_MQ_HASH_CONFIG, sgs)) {
 -              dev_warn(&dev->dev, "VIRTIONET issue with committing RSS sgs\n");
 -              return false;
 -      }
 +                                : VIRTIO_NET_CTRL_MQ_HASH_CONFIG, sgs))
 +              goto err;
 +
        return true;
 +
 +err:
 +      dev_warn(&dev->dev, "VIRTIONET issue with committing RSS sgs\n");
 +      return false;
 +
  }
  
  static void virtnet_init_default_rss(struct virtnet_info *vi)
        u32 indir_val = 0;
        int i = 0;
  
 -      vi->ctrl->rss.hash_types = vi->rss_hash_types_supported;
 +      vi->rss.hash_types = vi->rss_hash_types_supported;
        vi->rss_hash_types_saved = vi->rss_hash_types_supported;
 -      vi->ctrl->rss.indirection_table_mask = vi->rss_indir_table_size
 +      vi->rss.indirection_table_mask = vi->rss_indir_table_size
                                                ? vi->rss_indir_table_size - 1 : 0;
 -      vi->ctrl->rss.unclassified_queue = 0;
 +      vi->rss.unclassified_queue = 0;
  
        for (; i < vi->rss_indir_table_size; ++i) {
                indir_val = ethtool_rxfh_indir_default(i, vi->curr_queue_pairs);
 -              vi->ctrl->rss.indirection_table[i] = indir_val;
 +              vi->rss.indirection_table[i] = indir_val;
        }
  
 -      vi->ctrl->rss.max_tx_vq = vi->has_rss ? vi->curr_queue_pairs : 0;
 -      vi->ctrl->rss.hash_key_length = vi->rss_key_size;
 +      vi->rss.max_tx_vq = vi->has_rss ? vi->curr_queue_pairs : 0;
 +      vi->rss.hash_key_length = vi->rss_key_size;
  
 -      netdev_rss_key_fill(vi->ctrl->rss.key, vi->rss_key_size);
 +      netdev_rss_key_fill(vi->rss.key, vi->rss_key_size);
  }
  
  static void virtnet_get_hashflow(const struct virtnet_info *vi, struct ethtool_rxnfc *info)
@@@ -3425,7 -3238,7 +3425,7 @@@ static bool virtnet_set_hashflow(struc
  
        if (new_hashtypes != vi->rss_hash_types_saved) {
                vi->rss_hash_types_saved = new_hashtypes;
 -              vi->ctrl->rss.hash_types = vi->rss_hash_types_saved;
 +              vi->rss.hash_types = vi->rss_hash_types_saved;
                if (vi->dev->features & NETIF_F_RXHASH)
                        return virtnet_commit_rss_command(vi);
        }
@@@ -3470,7 -3283,7 +3470,7 @@@ static int virtnet_set_channels(struct 
                return -EINVAL;
  
        cpus_read_lock();
 -      err = _virtnet_set_queues(vi, queue_pairs);
 +      err = virtnet_set_queues(vi, queue_pairs);
        if (err) {
                cpus_read_unlock();
                goto err;
        return err;
  }
  
 +static void virtnet_stats_sprintf(u8 **p, const char *fmt, const char *noq_fmt,
 +                                int num, int qid, const struct virtnet_stat_desc *desc)
 +{
 +      int i;
 +
 +      if (qid < 0) {
 +              for (i = 0; i < num; ++i)
 +                      ethtool_sprintf(p, noq_fmt, desc[i].desc);
 +      } else {
 +              for (i = 0; i < num; ++i)
 +                      ethtool_sprintf(p, fmt, qid, desc[i].desc);
 +      }
 +}
 +
 +/* qid == -1: for rx/tx queue total field */
 +static void virtnet_get_stats_string(struct virtnet_info *vi, int type, int qid, u8 **data)
 +{
 +      const struct virtnet_stat_desc *desc;
 +      const char *fmt, *noq_fmt;
 +      u8 *p = *data;
 +      u32 num;
 +
 +      if (type == VIRTNET_Q_TYPE_CQ && qid >= 0) {
 +              noq_fmt = "cq_hw_%s";
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_CVQ) {
 +                      desc = &virtnet_stats_cvq_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_cvq_desc);
 +
 +                      virtnet_stats_sprintf(&p, NULL, noq_fmt, num, -1, desc);
 +              }
 +      }
 +
 +      if (type == VIRTNET_Q_TYPE_RX) {
 +              fmt = "rx%u_%s";
 +              noq_fmt = "rx_%s";
 +
 +              desc = &virtnet_rq_stats_desc[0];
 +              num = ARRAY_SIZE(virtnet_rq_stats_desc);
 +
 +              virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +
 +              fmt = "rx%u_hw_%s";
 +              noq_fmt = "rx_hw_%s";
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_BASIC) {
 +                      desc = &virtnet_stats_rx_basic_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_rx_basic_desc);
 +
 +                      virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_CSUM) {
 +                      desc = &virtnet_stats_rx_csum_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_rx_csum_desc);
 +
 +                      virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_SPEED) {
 +                      desc = &virtnet_stats_rx_speed_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_rx_speed_desc);
 +
 +                      virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +              }
 +      }
 +
 +      if (type == VIRTNET_Q_TYPE_TX) {
 +              fmt = "tx%u_%s";
 +              noq_fmt = "tx_%s";
 +
 +              desc = &virtnet_sq_stats_desc[0];
 +              num = ARRAY_SIZE(virtnet_sq_stats_desc);
 +
 +              virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +
 +              fmt = "tx%u_hw_%s";
 +              noq_fmt = "tx_hw_%s";
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_BASIC) {
 +                      desc = &virtnet_stats_tx_basic_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_tx_basic_desc);
 +
 +                      virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_GSO) {
 +                      desc = &virtnet_stats_tx_gso_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_tx_gso_desc);
 +
 +                      virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_SPEED) {
 +                      desc = &virtnet_stats_tx_speed_desc[0];
 +                      num = ARRAY_SIZE(virtnet_stats_tx_speed_desc);
 +
 +                      virtnet_stats_sprintf(&p, fmt, noq_fmt, num, qid, desc);
 +              }
 +      }
 +
 +      *data = p;
 +}
 +
 +struct virtnet_stats_ctx {
 +      /* The stats are write to qstats or ethtool -S */
 +      bool to_qstat;
 +
 +      /* Used to calculate the offset inside the output buffer. */
 +      u32 desc_num[3];
 +
 +      /* The actual supported stat types. */
 +      u32 bitmap[3];
 +
 +      /* Used to calculate the reply buffer size. */
 +      u32 size[3];
 +
 +      /* Record the output buffer. */
 +      u64 *data;
 +};
 +
 +static void virtnet_stats_ctx_init(struct virtnet_info *vi,
 +                                 struct virtnet_stats_ctx *ctx,
 +                                 u64 *data, bool to_qstat)
 +{
 +      u32 queue_type;
 +
 +      ctx->data = data;
 +      ctx->to_qstat = to_qstat;
 +
 +      if (to_qstat) {
 +              ctx->desc_num[VIRTNET_Q_TYPE_RX] = ARRAY_SIZE(virtnet_rq_stats_desc_qstat);
 +              ctx->desc_num[VIRTNET_Q_TYPE_TX] = ARRAY_SIZE(virtnet_sq_stats_desc_qstat);
 +
 +              queue_type = VIRTNET_Q_TYPE_RX;
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_BASIC) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_BASIC;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_basic_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_basic);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_CSUM) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_CSUM;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_csum_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_csum);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_GSO) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_GSO;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_gso_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_gso);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_SPEED) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_SPEED;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_speed_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_speed);
 +              }
 +
 +              queue_type = VIRTNET_Q_TYPE_TX;
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_BASIC) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_BASIC;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_basic_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_basic);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_CSUM) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_CSUM;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_csum_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_csum);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_GSO) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_GSO;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_gso_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_gso);
 +              }
 +
 +              if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_SPEED) {
 +                      ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_SPEED;
 +                      ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_speed_desc_qstat);
 +                      ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_speed);
 +              }
 +
 +              return;
 +      }
 +
 +      ctx->desc_num[VIRTNET_Q_TYPE_RX] = ARRAY_SIZE(virtnet_rq_stats_desc);
 +      ctx->desc_num[VIRTNET_Q_TYPE_TX] = ARRAY_SIZE(virtnet_sq_stats_desc);
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_CVQ) {
 +              queue_type = VIRTNET_Q_TYPE_CQ;
 +
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_CVQ;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_cvq_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_cvq);
 +      }
 +
 +      queue_type = VIRTNET_Q_TYPE_RX;
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_BASIC) {
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_BASIC;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_basic_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_basic);
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_CSUM) {
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_CSUM;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_csum_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_csum);
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_SPEED) {
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_RX_SPEED;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_rx_speed_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_rx_speed);
 +      }
 +
 +      queue_type = VIRTNET_Q_TYPE_TX;
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_BASIC) {
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_BASIC;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_basic_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_basic);
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_GSO) {
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_GSO;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_gso_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_gso);
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_SPEED) {
 +              ctx->bitmap[queue_type]   |= VIRTIO_NET_STATS_TYPE_TX_SPEED;
 +              ctx->desc_num[queue_type] += ARRAY_SIZE(virtnet_stats_tx_speed_desc);
 +              ctx->size[queue_type]     += sizeof(struct virtio_net_stats_tx_speed);
 +      }
 +}
 +
 +/* stats_sum_queue - Calculate the sum of the same fields in sq or rq.
 + * @sum: the position to store the sum values
 + * @num: field num
 + * @q_value: the first queue fields
 + * @q_num: number of the queues
 + */
 +static void stats_sum_queue(u64 *sum, u32 num, u64 *q_value, u32 q_num)
 +{
 +      u32 step = num;
 +      int i, j;
 +      u64 *p;
 +
 +      for (i = 0; i < num; ++i) {
 +              p = sum + i;
 +              *p = 0;
 +
 +              for (j = 0; j < q_num; ++j)
 +                      *p += *(q_value + i + j * step);
 +      }
 +}
 +
 +static void virtnet_fill_total_fields(struct virtnet_info *vi,
 +                                    struct virtnet_stats_ctx *ctx)
 +{
 +      u64 *data, *first_rx_q, *first_tx_q;
 +      u32 num_cq, num_rx, num_tx;
 +
 +      num_cq = ctx->desc_num[VIRTNET_Q_TYPE_CQ];
 +      num_rx = ctx->desc_num[VIRTNET_Q_TYPE_RX];
 +      num_tx = ctx->desc_num[VIRTNET_Q_TYPE_TX];
 +
 +      first_rx_q = ctx->data + num_rx + num_tx + num_cq;
 +      first_tx_q = first_rx_q + vi->curr_queue_pairs * num_rx;
 +
 +      data = ctx->data;
 +
 +      stats_sum_queue(data, num_rx, first_rx_q, vi->curr_queue_pairs);
 +
 +      data = ctx->data + num_rx;
 +
 +      stats_sum_queue(data, num_tx, first_tx_q, vi->curr_queue_pairs);
 +}
 +
 +static void virtnet_fill_stats_qstat(struct virtnet_info *vi, u32 qid,
 +                                   struct virtnet_stats_ctx *ctx,
 +                                   const u8 *base, bool drv_stats, u8 reply_type)
 +{
 +      const struct virtnet_stat_desc *desc;
 +      const u64_stats_t *v_stat;
 +      u64 offset, bitmap;
 +      const __le64 *v;
 +      u32 queue_type;
 +      int i, num;
 +
 +      queue_type = vq_type(vi, qid);
 +      bitmap = ctx->bitmap[queue_type];
 +
 +      if (drv_stats) {
 +              if (queue_type == VIRTNET_Q_TYPE_RX) {
 +                      desc = &virtnet_rq_stats_desc_qstat[0];
 +                      num = ARRAY_SIZE(virtnet_rq_stats_desc_qstat);
 +              } else {
 +                      desc = &virtnet_sq_stats_desc_qstat[0];
 +                      num = ARRAY_SIZE(virtnet_sq_stats_desc_qstat);
 +              }
 +
 +              for (i = 0; i < num; ++i) {
 +                      offset = desc[i].qstat_offset / sizeof(*ctx->data);
 +                      v_stat = (const u64_stats_t *)(base + desc[i].offset);
 +                      ctx->data[offset] = u64_stats_read(v_stat);
 +              }
 +              return;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_BASIC) {
 +              desc = &virtnet_stats_rx_basic_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_basic_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_BASIC)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_CSUM) {
 +              desc = &virtnet_stats_rx_csum_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_csum_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_CSUM)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_GSO) {
 +              desc = &virtnet_stats_rx_gso_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_gso_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_GSO)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_SPEED) {
 +              desc = &virtnet_stats_rx_speed_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_speed_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_SPEED)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_BASIC) {
 +              desc = &virtnet_stats_tx_basic_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_basic_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_BASIC)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_CSUM) {
 +              desc = &virtnet_stats_tx_csum_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_csum_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_CSUM)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_GSO) {
 +              desc = &virtnet_stats_tx_gso_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_gso_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_GSO)
 +                      goto found;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_SPEED) {
 +              desc = &virtnet_stats_tx_speed_desc_qstat[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_speed_desc_qstat);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_SPEED)
 +                      goto found;
 +      }
 +
 +      return;
 +
 +found:
 +      for (i = 0; i < num; ++i) {
 +              offset = desc[i].qstat_offset / sizeof(*ctx->data);
 +              v = (const __le64 *)(base + desc[i].offset);
 +              ctx->data[offset] = le64_to_cpu(*v);
 +      }
 +}
 +
 +/* virtnet_fill_stats - copy the stats to qstats or ethtool -S
 + * The stats source is the device or the driver.
 + *
 + * @vi: virtio net info
 + * @qid: the vq id
 + * @ctx: stats ctx (initiated by virtnet_stats_ctx_init())
 + * @base: pointer to the device reply or the driver stats structure.
 + * @drv_stats: designate the base type (device reply, driver stats)
 + * @type: the type of the device reply (if drv_stats is true, this must be zero)
 + */
 +static void virtnet_fill_stats(struct virtnet_info *vi, u32 qid,
 +                             struct virtnet_stats_ctx *ctx,
 +                             const u8 *base, bool drv_stats, u8 reply_type)
 +{
 +      u32 queue_type, num_rx, num_tx, num_cq;
 +      const struct virtnet_stat_desc *desc;
 +      const u64_stats_t *v_stat;
 +      u64 offset, bitmap;
 +      const __le64 *v;
 +      int i, num;
 +
 +      if (ctx->to_qstat)
 +              return virtnet_fill_stats_qstat(vi, qid, ctx, base, drv_stats, reply_type);
 +
 +      num_cq = ctx->desc_num[VIRTNET_Q_TYPE_CQ];
 +      num_rx = ctx->desc_num[VIRTNET_Q_TYPE_RX];
 +      num_tx = ctx->desc_num[VIRTNET_Q_TYPE_TX];
 +
 +      queue_type = vq_type(vi, qid);
 +      bitmap = ctx->bitmap[queue_type];
 +
 +      /* skip the total fields of pairs */
 +      offset = num_rx + num_tx;
 +
 +      if (queue_type == VIRTNET_Q_TYPE_TX) {
 +              offset += num_cq + num_rx * vi->curr_queue_pairs + num_tx * (qid / 2);
 +
 +              num = ARRAY_SIZE(virtnet_sq_stats_desc);
 +              if (drv_stats) {
 +                      desc = &virtnet_sq_stats_desc[0];
 +                      goto drv_stats;
 +              }
 +
 +              offset += num;
 +
 +      } else if (queue_type == VIRTNET_Q_TYPE_RX) {
 +              offset += num_cq + num_rx * (qid / 2);
 +
 +              num = ARRAY_SIZE(virtnet_rq_stats_desc);
 +              if (drv_stats) {
 +                      desc = &virtnet_rq_stats_desc[0];
 +                      goto drv_stats;
 +              }
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_CVQ) {
 +              desc = &virtnet_stats_cvq_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_cvq_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_CVQ)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_BASIC) {
 +              desc = &virtnet_stats_rx_basic_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_basic_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_BASIC)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_CSUM) {
 +              desc = &virtnet_stats_rx_csum_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_csum_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_CSUM)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_RX_SPEED) {
 +              desc = &virtnet_stats_rx_speed_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_rx_speed_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_RX_SPEED)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_BASIC) {
 +              desc = &virtnet_stats_tx_basic_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_basic_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_BASIC)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_GSO) {
 +              desc = &virtnet_stats_tx_gso_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_gso_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_GSO)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      if (bitmap & VIRTIO_NET_STATS_TYPE_TX_SPEED) {
 +              desc = &virtnet_stats_tx_speed_desc[0];
 +              num = ARRAY_SIZE(virtnet_stats_tx_speed_desc);
 +              if (reply_type == VIRTIO_NET_STATS_TYPE_REPLY_TX_SPEED)
 +                      goto found;
 +
 +              offset += num;
 +      }
 +
 +      return;
 +
 +found:
 +      for (i = 0; i < num; ++i) {
 +              v = (const __le64 *)(base + desc[i].offset);
 +              ctx->data[offset + i] = le64_to_cpu(*v);
 +      }
 +
 +      return;
 +
 +drv_stats:
 +      for (i = 0; i < num; ++i) {
 +              v_stat = (const u64_stats_t *)(base + desc[i].offset);
 +              ctx->data[offset + i] = u64_stats_read(v_stat);
 +      }
 +}
 +
 +static int __virtnet_get_hw_stats(struct virtnet_info *vi,
 +                                struct virtnet_stats_ctx *ctx,
 +                                struct virtio_net_ctrl_queue_stats *req,
 +                                int req_size, void *reply, int res_size)
 +{
 +      struct virtio_net_stats_reply_hdr *hdr;
 +      struct scatterlist sgs_in, sgs_out;
 +      void *p;
 +      u32 qid;
 +      int ok;
 +
 +      sg_init_one(&sgs_out, req, req_size);
 +      sg_init_one(&sgs_in, reply, res_size);
 +
 +      ok = virtnet_send_command_reply(vi, VIRTIO_NET_CTRL_STATS,
 +                                      VIRTIO_NET_CTRL_STATS_GET,
 +                                      &sgs_out, &sgs_in);
 +
 +      if (!ok)
 +              return ok;
 +
 +      for (p = reply; p - reply < res_size; p += le16_to_cpu(hdr->size)) {
 +              hdr = p;
 +              qid = le16_to_cpu(hdr->vq_index);
 +              virtnet_fill_stats(vi, qid, ctx, p, false, hdr->type);
 +      }
 +
 +      return 0;
 +}
 +
 +static void virtnet_make_stat_req(struct virtnet_info *vi,
 +                                struct virtnet_stats_ctx *ctx,
 +                                struct virtio_net_ctrl_queue_stats *req,
 +                                int qid, int *idx)
 +{
 +      int qtype = vq_type(vi, qid);
 +      u64 bitmap = ctx->bitmap[qtype];
 +
 +      if (!bitmap)
 +              return;
 +
 +      req->stats[*idx].vq_index = cpu_to_le16(qid);
 +      req->stats[*idx].types_bitmap[0] = cpu_to_le64(bitmap);
 +      *idx += 1;
 +}
 +
 +/* qid: -1: get stats of all vq.
 + *     > 0: get the stats for the special vq. This must not be cvq.
 + */
 +static int virtnet_get_hw_stats(struct virtnet_info *vi,
 +                              struct virtnet_stats_ctx *ctx, int qid)
 +{
 +      int qnum, i, j, res_size, qtype, last_vq, first_vq;
 +      struct virtio_net_ctrl_queue_stats *req;
 +      bool enable_cvq;
 +      void *reply;
 +      int ok;
 +
 +      if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_DEVICE_STATS))
 +              return 0;
 +
 +      if (qid == -1) {
 +              last_vq = vi->curr_queue_pairs * 2 - 1;
 +              first_vq = 0;
 +              enable_cvq = true;
 +      } else {
 +              last_vq = qid;
 +              first_vq = qid;
 +              enable_cvq = false;
 +      }
 +
 +      qnum = 0;
 +      res_size = 0;
 +      for (i = first_vq; i <= last_vq ; ++i) {
 +              qtype = vq_type(vi, i);
 +              if (ctx->bitmap[qtype]) {
 +                      ++qnum;
 +                      res_size += ctx->size[qtype];
 +              }
 +      }
 +
 +      if (enable_cvq && ctx->bitmap[VIRTNET_Q_TYPE_CQ]) {
 +              res_size += ctx->size[VIRTNET_Q_TYPE_CQ];
 +              qnum += 1;
 +      }
 +
 +      req = kcalloc(qnum, sizeof(*req), GFP_KERNEL);
 +      if (!req)
 +              return -ENOMEM;
 +
 +      reply = kmalloc(res_size, GFP_KERNEL);
 +      if (!reply) {
 +              kfree(req);
 +              return -ENOMEM;
 +      }
 +
 +      j = 0;
 +      for (i = first_vq; i <= last_vq ; ++i)
 +              virtnet_make_stat_req(vi, ctx, req, i, &j);
 +
 +      if (enable_cvq)
 +              virtnet_make_stat_req(vi, ctx, req, vi->max_queue_pairs * 2, &j);
 +
 +      ok = __virtnet_get_hw_stats(vi, ctx, req, sizeof(*req) * j, reply, res_size);
 +
 +      kfree(req);
 +      kfree(reply);
 +
 +      return ok;
 +}
 +
  static void virtnet_get_strings(struct net_device *dev, u32 stringset, u8 *data)
  {
        struct virtnet_info *vi = netdev_priv(dev);
 -      unsigned int i, j;
 +      unsigned int i;
        u8 *p = data;
  
        switch (stringset) {
        case ETH_SS_STATS:
 -              for (i = 0; i < vi->curr_queue_pairs; i++) {
 -                      for (j = 0; j < VIRTNET_RQ_STATS_LEN; j++)
 -                              ethtool_sprintf(&p, "rx_queue_%u_%s", i,
 -                                              virtnet_rq_stats_desc[j].desc);
 -              }
 +              /* Generate the total field names. */
 +              virtnet_get_stats_string(vi, VIRTNET_Q_TYPE_RX, -1, &p);
 +              virtnet_get_stats_string(vi, VIRTNET_Q_TYPE_TX, -1, &p);
  
 -              for (i = 0; i < vi->curr_queue_pairs; i++) {
 -                      for (j = 0; j < VIRTNET_SQ_STATS_LEN; j++)
 -                              ethtool_sprintf(&p, "tx_queue_%u_%s", i,
 -                                              virtnet_sq_stats_desc[j].desc);
 -              }
 +              virtnet_get_stats_string(vi, VIRTNET_Q_TYPE_CQ, 0, &p);
 +
 +              for (i = 0; i < vi->curr_queue_pairs; ++i)
 +                      virtnet_get_stats_string(vi, VIRTNET_Q_TYPE_RX, i, &p);
 +
 +              for (i = 0; i < vi->curr_queue_pairs; ++i)
 +                      virtnet_get_stats_string(vi, VIRTNET_Q_TYPE_TX, i, &p);
                break;
        }
  }
  static int virtnet_get_sset_count(struct net_device *dev, int sset)
  {
        struct virtnet_info *vi = netdev_priv(dev);
 +      struct virtnet_stats_ctx ctx = {0};
 +      u32 pair_count;
  
        switch (sset) {
        case ETH_SS_STATS:
 -              return vi->curr_queue_pairs * (VIRTNET_RQ_STATS_LEN +
 -                                             VIRTNET_SQ_STATS_LEN);
 +              virtnet_stats_ctx_init(vi, &ctx, NULL, false);
 +
 +              pair_count = ctx.desc_num[VIRTNET_Q_TYPE_RX] + ctx.desc_num[VIRTNET_Q_TYPE_TX];
 +
 +              return pair_count + ctx.desc_num[VIRTNET_Q_TYPE_CQ] +
 +                      vi->curr_queue_pairs * pair_count;
        default:
                return -EOPNOTSUPP;
        }
@@@ -4159,32 -3337,40 +4159,32 @@@ static void virtnet_get_ethtool_stats(s
                                      struct ethtool_stats *stats, u64 *data)
  {
        struct virtnet_info *vi = netdev_priv(dev);
 -      unsigned int idx = 0, start, i, j;
 +      struct virtnet_stats_ctx ctx = {0};
 +      unsigned int start, i;
        const u8 *stats_base;
 -      const u64_stats_t *p;
 -      size_t offset;
 +
 +      virtnet_stats_ctx_init(vi, &ctx, data, false);
 +      if (virtnet_get_hw_stats(vi, &ctx, -1))
 +              dev_warn(&vi->dev->dev, "Failed to get hw stats.\n");
  
        for (i = 0; i < vi->curr_queue_pairs; i++) {
                struct receive_queue *rq = &vi->rq[i];
 +              struct send_queue *sq = &vi->sq[i];
  
                stats_base = (const u8 *)&rq->stats;
                do {
                        start = u64_stats_fetch_begin(&rq->stats.syncp);
 -                      for (j = 0; j < VIRTNET_RQ_STATS_LEN; j++) {
 -                              offset = virtnet_rq_stats_desc[j].offset;
 -                              p = (const u64_stats_t *)(stats_base + offset);
 -                              data[idx + j] = u64_stats_read(p);
 -                      }
 +                      virtnet_fill_stats(vi, i * 2, &ctx, stats_base, true, 0);
                } while (u64_stats_fetch_retry(&rq->stats.syncp, start));
 -              idx += VIRTNET_RQ_STATS_LEN;
 -      }
 -
 -      for (i = 0; i < vi->curr_queue_pairs; i++) {
 -              struct send_queue *sq = &vi->sq[i];
  
                stats_base = (const u8 *)&sq->stats;
                do {
                        start = u64_stats_fetch_begin(&sq->stats.syncp);
 -                      for (j = 0; j < VIRTNET_SQ_STATS_LEN; j++) {
 -                              offset = virtnet_sq_stats_desc[j].offset;
 -                              p = (const u64_stats_t *)(stats_base + offset);
 -                              data[idx + j] = u64_stats_read(p);
 -                      }
 +                      virtnet_fill_stats(vi, i * 2 + 1, &ctx, stats_base, true, 0);
                } while (u64_stats_fetch_retry(&sq->stats.syncp, start));
 -              idx += VIRTNET_SQ_STATS_LEN;
        }
 +
 +      virtnet_fill_total_fields(vi, &ctx);
  }
  
  static void virtnet_get_channels(struct net_device *dev,
@@@ -4224,17 -3410,12 +4224,17 @@@ static int virtnet_get_link_ksettings(s
  static int virtnet_send_tx_notf_coal_cmds(struct virtnet_info *vi,
                                          struct ethtool_coalesce *ec)
  {
 +      struct virtio_net_ctrl_coal_tx *coal_tx __free(kfree) = NULL;
        struct scatterlist sgs_tx;
        int i;
  
 -      vi->ctrl->coal_tx.tx_usecs = cpu_to_le32(ec->tx_coalesce_usecs);
 -      vi->ctrl->coal_tx.tx_max_packets = cpu_to_le32(ec->tx_max_coalesced_frames);
 -      sg_init_one(&sgs_tx, &vi->ctrl->coal_tx, sizeof(vi->ctrl->coal_tx));
 +      coal_tx = kzalloc(sizeof(*coal_tx), GFP_KERNEL);
 +      if (!coal_tx)
 +              return -ENOMEM;
 +
 +      coal_tx->tx_usecs = cpu_to_le32(ec->tx_coalesce_usecs);
 +      coal_tx->tx_max_packets = cpu_to_le32(ec->tx_max_coalesced_frames);
 +      sg_init_one(&sgs_tx, coal_tx, sizeof(*coal_tx));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_NOTF_COAL,
                                  VIRTIO_NET_CTRL_NOTF_COAL_TX_SET,
  static int virtnet_send_rx_notf_coal_cmds(struct virtnet_info *vi,
                                          struct ethtool_coalesce *ec)
  {
 +      struct virtio_net_ctrl_coal_rx *coal_rx __free(kfree) = NULL;
        bool rx_ctrl_dim_on = !!ec->use_adaptive_rx_coalesce;
        struct scatterlist sgs_rx;
 +      int ret = 0;
        int i;
  
        if (rx_ctrl_dim_on && !virtio_has_feature(vi->vdev, VIRTIO_NET_F_VQ_NOTF_COAL))
                               ec->rx_max_coalesced_frames != vi->intr_coal_rx.max_packets))
                return -EINVAL;
  
 +      /* Acquire all queues dim_locks */
 +      for (i = 0; i < vi->max_queue_pairs; i++)
 +              mutex_lock(&vi->rq[i].dim_lock);
 +
        if (rx_ctrl_dim_on && !vi->rx_dim_enabled) {
                vi->rx_dim_enabled = true;
                for (i = 0; i < vi->max_queue_pairs; i++)
                        vi->rq[i].dim_enabled = true;
 -              return 0;
 +              goto unlock;
 +      }
 +
 +      coal_rx = kzalloc(sizeof(*coal_rx), GFP_KERNEL);
 +      if (!coal_rx) {
 +              ret = -ENOMEM;
 +              goto unlock;
        }
  
        if (!rx_ctrl_dim_on && vi->rx_dim_enabled) {
         * we need apply the global new params even if they
         * are not updated.
         */
 -      vi->ctrl->coal_rx.rx_usecs = cpu_to_le32(ec->rx_coalesce_usecs);
 -      vi->ctrl->coal_rx.rx_max_packets = cpu_to_le32(ec->rx_max_coalesced_frames);
 -      sg_init_one(&sgs_rx, &vi->ctrl->coal_rx, sizeof(vi->ctrl->coal_rx));
 +      coal_rx->rx_usecs = cpu_to_le32(ec->rx_coalesce_usecs);
 +      coal_rx->rx_max_packets = cpu_to_le32(ec->rx_max_coalesced_frames);
 +      sg_init_one(&sgs_rx, coal_rx, sizeof(*coal_rx));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_NOTF_COAL,
                                  VIRTIO_NET_CTRL_NOTF_COAL_RX_SET,
 -                                &sgs_rx))
 -              return -EINVAL;
 +                                &sgs_rx)) {
 +              ret = -EINVAL;
 +              goto unlock;
 +      }
  
        vi->intr_coal_rx.max_usecs = ec->rx_coalesce_usecs;
        vi->intr_coal_rx.max_packets = ec->rx_max_coalesced_frames;
                vi->rq[i].intr_coal.max_usecs = ec->rx_coalesce_usecs;
                vi->rq[i].intr_coal.max_packets = ec->rx_max_coalesced_frames;
        }
 +unlock:
 +      for (i = vi->max_queue_pairs - 1; i >= 0; i--)
 +              mutex_unlock(&vi->rq[i].dim_lock);
  
 -      return 0;
 +      return ret;
  }
  
  static int virtnet_send_notf_coal_cmds(struct virtnet_info *vi,
@@@ -4339,24 -3503,19 +4339,24 @@@ static int virtnet_send_rx_notf_coal_vq
                                             u16 queue)
  {
        bool rx_ctrl_dim_on = !!ec->use_adaptive_rx_coalesce;
 -      bool cur_rx_dim = vi->rq[queue].dim_enabled;
        u32 max_usecs, max_packets;
 +      bool cur_rx_dim;
        int err;
  
 +      mutex_lock(&vi->rq[queue].dim_lock);
 +      cur_rx_dim = vi->rq[queue].dim_enabled;
        max_usecs = vi->rq[queue].intr_coal.max_usecs;
        max_packets = vi->rq[queue].intr_coal.max_packets;
  
        if (rx_ctrl_dim_on && (ec->rx_coalesce_usecs != max_usecs ||
 -                             ec->rx_max_coalesced_frames != max_packets))
 +                             ec->rx_max_coalesced_frames != max_packets)) {
 +              mutex_unlock(&vi->rq[queue].dim_lock);
                return -EINVAL;
 +      }
  
        if (rx_ctrl_dim_on && !cur_rx_dim) {
                vi->rq[queue].dim_enabled = true;
 +              mutex_unlock(&vi->rq[queue].dim_lock);
                return 0;
        }
  
        err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, queue,
                                               ec->rx_coalesce_usecs,
                                               ec->rx_max_coalesced_frames);
 -      if (err)
 -              return err;
 -
 -      return 0;
 +      mutex_unlock(&vi->rq[queue].dim_lock);
 +      return err;
  }
  
  static int virtnet_send_notf_coal_vq_cmds(struct virtnet_info *vi,
@@@ -4400,27 -3561,39 +4400,27 @@@ static void virtnet_rx_dim_work(struct 
        struct virtnet_info *vi = rq->vq->vdev->priv;
        struct net_device *dev = vi->dev;
        struct dim_cq_moder update_moder;
 -      int i, qnum, err;
 +      int qnum, err;
  
 -      if (!rtnl_trylock())
 -              return;
 +      qnum = rq - vi->rq;
  
 -      /* Each rxq's work is queued by "net_dim()->schedule_work()"
 -       * in response to NAPI traffic changes. Note that dim->profile_ix
 -       * for each rxq is updated prior to the queuing action.
 -       * So we only need to traverse and update profiles for all rxqs
 -       * in the work which is holding rtnl_lock.
 -       */
 -      for (i = 0; i < vi->curr_queue_pairs; i++) {
 -              rq = &vi->rq[i];
 -              dim = &rq->dim;
 -              qnum = rq - vi->rq;
 -
 -              if (!rq->dim_enabled)
 -                      continue;
 -
 -              update_moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix);
 -              if (update_moder.usec != rq->intr_coal.max_usecs ||
 -                  update_moder.pkts != rq->intr_coal.max_packets) {
 -                      err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, qnum,
 -                                                             update_moder.usec,
 -                                                             update_moder.pkts);
 -                      if (err)
 -                              pr_debug("%s: Failed to send dim parameters on rxq%d\n",
 -                                       dev->name, qnum);
 -                      dim->state = DIM_START_MEASURE;
 -              }
 -      }
 +      mutex_lock(&rq->dim_lock);
 +      if (!rq->dim_enabled)
 +              goto out;
  
 -      rtnl_unlock();
 +      update_moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix);
 +      if (update_moder.usec != rq->intr_coal.max_usecs ||
 +          update_moder.pkts != rq->intr_coal.max_packets) {
 +              err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, qnum,
 +                                                     update_moder.usec,
 +                                                     update_moder.pkts);
 +              if (err)
 +                      pr_debug("%s: Failed to send dim parameters on rxq%d\n",
 +                               dev->name, qnum);
 +              dim->state = DIM_START_MEASURE;
 +      }
 +out:
 +      mutex_unlock(&rq->dim_lock);
  }
  
  static int virtnet_coal_params_supported(struct ethtool_coalesce *ec)
@@@ -4558,13 -3731,11 +4558,13 @@@ static int virtnet_get_per_queue_coales
                return -EINVAL;
  
        if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_VQ_NOTF_COAL)) {
 +              mutex_lock(&vi->rq[queue].dim_lock);
                ec->rx_coalesce_usecs = vi->rq[queue].intr_coal.max_usecs;
                ec->tx_coalesce_usecs = vi->sq[queue].intr_coal.max_usecs;
                ec->tx_max_coalesced_frames = vi->sq[queue].intr_coal.max_packets;
                ec->rx_max_coalesced_frames = vi->rq[queue].intr_coal.max_packets;
                ec->use_adaptive_rx_coalesce = vi->rq[queue].dim_enabled;
 +              mutex_unlock(&vi->rq[queue].dim_lock);
        } else {
                ec->rx_max_coalesced_frames = 1;
  
@@@ -4620,11 -3791,11 +4620,11 @@@ static int virtnet_get_rxfh(struct net_
  
        if (rxfh->indir) {
                for (i = 0; i < vi->rss_indir_table_size; ++i)
 -                      rxfh->indir[i] = vi->ctrl->rss.indirection_table[i];
 +                      rxfh->indir[i] = vi->rss.indirection_table[i];
        }
  
        if (rxfh->key)
 -              memcpy(rxfh->key, vi->ctrl->rss.key, vi->rss_key_size);
 +              memcpy(rxfh->key, vi->rss.key, vi->rss_key_size);
  
        rxfh->hfunc = ETH_RSS_HASH_TOP;
  
@@@ -4648,7 -3819,7 +4648,7 @@@ static int virtnet_set_rxfh(struct net_
                        return -EOPNOTSUPP;
  
                for (i = 0; i < vi->rss_indir_table_size; ++i)
 -                      vi->ctrl->rss.indirection_table[i] = rxfh->indir[i];
 +                      vi->rss.indirection_table[i] = rxfh->indir[i];
                update = true;
        }
  
                if (!vi->has_rss && !vi->has_rss_hash_report)
                        return -EOPNOTSUPP;
  
 -              memcpy(vi->ctrl->rss.key, rxfh->key, vi->rss_key_size);
 +              memcpy(vi->rss.key, rxfh->key, vi->rss_key_size);
                update = true;
        }
  
@@@ -4734,97 -3905,6 +4734,97 @@@ static const struct ethtool_ops virtnet
        .set_rxnfc = virtnet_set_rxnfc,
  };
  
 +static void virtnet_get_queue_stats_rx(struct net_device *dev, int i,
 +                                     struct netdev_queue_stats_rx *stats)
 +{
 +      struct virtnet_info *vi = netdev_priv(dev);
 +      struct receive_queue *rq = &vi->rq[i];
 +      struct virtnet_stats_ctx ctx = {0};
 +
 +      virtnet_stats_ctx_init(vi, &ctx, (void *)stats, true);
 +
 +      virtnet_get_hw_stats(vi, &ctx, i * 2);
 +      virtnet_fill_stats(vi, i * 2, &ctx, (void *)&rq->stats, true, 0);
 +}
 +
 +static void virtnet_get_queue_stats_tx(struct net_device *dev, int i,
 +                                     struct netdev_queue_stats_tx *stats)
 +{
 +      struct virtnet_info *vi = netdev_priv(dev);
 +      struct send_queue *sq = &vi->sq[i];
 +      struct virtnet_stats_ctx ctx = {0};
 +
 +      virtnet_stats_ctx_init(vi, &ctx, (void *)stats, true);
 +
 +      virtnet_get_hw_stats(vi, &ctx, i * 2 + 1);
 +      virtnet_fill_stats(vi, i * 2 + 1, &ctx, (void *)&sq->stats, true, 0);
 +}
 +
 +static void virtnet_get_base_stats(struct net_device *dev,
 +                                 struct netdev_queue_stats_rx *rx,
 +                                 struct netdev_queue_stats_tx *tx)
 +{
 +      struct virtnet_info *vi = netdev_priv(dev);
 +
 +      /* The queue stats of the virtio-net will not be reset. So here we
 +       * return 0.
 +       */
 +      rx->bytes = 0;
 +      rx->packets = 0;
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_BASIC) {
 +              rx->hw_drops = 0;
 +              rx->hw_drop_overruns = 0;
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_CSUM) {
 +              rx->csum_unnecessary = 0;
 +              rx->csum_none = 0;
 +              rx->csum_bad = 0;
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_GSO) {
 +              rx->hw_gro_packets = 0;
 +              rx->hw_gro_bytes = 0;
 +              rx->hw_gro_wire_packets = 0;
 +              rx->hw_gro_wire_bytes = 0;
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_RX_SPEED)
 +              rx->hw_drop_ratelimits = 0;
 +
 +      tx->bytes = 0;
 +      tx->packets = 0;
 +      tx->stop = 0;
 +      tx->wake = 0;
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_BASIC) {
 +              tx->hw_drops = 0;
 +              tx->hw_drop_errors = 0;
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_CSUM) {
 +              tx->csum_none = 0;
 +              tx->needs_csum = 0;
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_GSO) {
 +              tx->hw_gso_packets = 0;
 +              tx->hw_gso_bytes = 0;
 +              tx->hw_gso_wire_packets = 0;
 +              tx->hw_gso_wire_bytes = 0;
 +      }
 +
 +      if (vi->device_stats_cap & VIRTIO_NET_STATS_TYPE_TX_SPEED)
 +              tx->hw_drop_ratelimits = 0;
 +}
 +
 +static const struct netdev_stat_ops virtnet_stat_ops = {
 +      .get_queue_stats_rx     = virtnet_get_queue_stats_rx,
 +      .get_queue_stats_tx     = virtnet_get_queue_stats_tx,
 +      .get_base_stats         = virtnet_get_base_stats,
 +};
 +
  static void virtnet_freeze_down(struct virtio_device *vdev)
  {
        struct virtnet_info *vi = vdev->priv;
@@@ -4871,16 -3951,10 +4871,16 @@@ static int virtnet_restore_up(struct vi
  
  static int virtnet_set_guest_offloads(struct virtnet_info *vi, u64 offloads)
  {
 +      __virtio64 *_offloads __free(kfree) = NULL;
        struct scatterlist sg;
 -      vi->ctrl->offloads = cpu_to_virtio64(vi->vdev, offloads);
  
 -      sg_init_one(&sg, &vi->ctrl->offloads, sizeof(vi->ctrl->offloads));
 +      _offloads = kzalloc(sizeof(*_offloads), GFP_KERNEL);
 +      if (!_offloads)
 +              return -ENOMEM;
 +
 +      *_offloads = cpu_to_virtio64(vi->vdev, offloads);
 +
 +      sg_init_one(&sg, _offloads, sizeof(*_offloads));
  
        if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_GUEST_OFFLOADS,
                                  VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET, &sg)) {
@@@ -4980,7 -4054,7 +4980,7 @@@ static int virtnet_xdp_set(struct net_d
                synchronize_net();
        }
  
 -      err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
 +      err = virtnet_set_queues(vi, curr_qp + xdp_qp);
        if (err)
                goto err;
        netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
@@@ -5082,9 -4156,9 +5082,9 @@@ static int virtnet_set_features(struct 
  
        if ((dev->features ^ features) & NETIF_F_RXHASH) {
                if (features & NETIF_F_RXHASH)
 -                      vi->ctrl->rss.hash_types = vi->rss_hash_types_saved;
 +                      vi->rss.hash_types = vi->rss_hash_types_saved;
                else
 -                      vi->ctrl->rss.hash_types = VIRTIO_NET_HASH_REPORT_NONE;
 +                      vi->rss.hash_types = VIRTIO_NET_HASH_REPORT_NONE;
  
                if (!virtnet_commit_rss_command(vi))
                        return -EINVAL;
@@@ -5213,7 -4287,7 +5213,7 @@@ static void free_receive_page_frags(str
        int i;
        for (i = 0; i < vi->max_queue_pairs; i++)
                if (vi->rq[i].alloc_frag.page) {
 -                      if (vi->rq[i].do_dma && vi->rq[i].last_dma)
 +                      if (vi->rq[i].last_dma)
                                virtnet_rq_unmap(&vi->rq[i], vi->rq[i].last_dma, 0);
                        put_page(vi->rq[i].alloc_frag.page);
                }
@@@ -5396,7 -4470,6 +5396,7 @@@ static int virtnet_alloc_queues(struct 
  
                u64_stats_init(&vi->rq[i].stats.syncp);
                u64_stats_init(&vi->sq[i].stats.syncp);
 +              mutex_init(&vi->rq[i].dim_lock);
        }
  
        return 0;
@@@ -5564,48 -4637,6 +5564,48 @@@ static void virtnet_set_big_packets(str
        }
  }
  
 +#define VIRTIO_NET_HASH_REPORT_MAX_TABLE      10
 +static enum xdp_rss_hash_type
 +virtnet_xdp_rss_type[VIRTIO_NET_HASH_REPORT_MAX_TABLE] = {
 +      [VIRTIO_NET_HASH_REPORT_NONE] = XDP_RSS_TYPE_NONE,
 +      [VIRTIO_NET_HASH_REPORT_IPv4] = XDP_RSS_TYPE_L3_IPV4,
 +      [VIRTIO_NET_HASH_REPORT_TCPv4] = XDP_RSS_TYPE_L4_IPV4_TCP,
 +      [VIRTIO_NET_HASH_REPORT_UDPv4] = XDP_RSS_TYPE_L4_IPV4_UDP,
 +      [VIRTIO_NET_HASH_REPORT_IPv6] = XDP_RSS_TYPE_L3_IPV6,
 +      [VIRTIO_NET_HASH_REPORT_TCPv6] = XDP_RSS_TYPE_L4_IPV6_TCP,
 +      [VIRTIO_NET_HASH_REPORT_UDPv6] = XDP_RSS_TYPE_L4_IPV6_UDP,
 +      [VIRTIO_NET_HASH_REPORT_IPv6_EX] = XDP_RSS_TYPE_L3_IPV6_EX,
 +      [VIRTIO_NET_HASH_REPORT_TCPv6_EX] = XDP_RSS_TYPE_L4_IPV6_TCP_EX,
 +      [VIRTIO_NET_HASH_REPORT_UDPv6_EX] = XDP_RSS_TYPE_L4_IPV6_UDP_EX
 +};
 +
 +static int virtnet_xdp_rx_hash(const struct xdp_md *_ctx, u32 *hash,
 +                             enum xdp_rss_hash_type *rss_type)
 +{
 +      const struct xdp_buff *xdp = (void *)_ctx;
 +      struct virtio_net_hdr_v1_hash *hdr_hash;
 +      struct virtnet_info *vi;
 +      u16 hash_report;
 +
 +      if (!(xdp->rxq->dev->features & NETIF_F_RXHASH))
 +              return -ENODATA;
 +
 +      vi = netdev_priv(xdp->rxq->dev);
 +      hdr_hash = (struct virtio_net_hdr_v1_hash *)(xdp->data - vi->hdr_len);
 +      hash_report = __le16_to_cpu(hdr_hash->hash_report);
 +
 +      if (hash_report >= VIRTIO_NET_HASH_REPORT_MAX_TABLE)
 +              hash_report = VIRTIO_NET_HASH_REPORT_NONE;
 +
 +      *rss_type = virtnet_xdp_rss_type[hash_report];
 +      *hash = __le32_to_cpu(hdr_hash->hash_value);
 +      return 0;
 +}
 +
 +static const struct xdp_metadata_ops virtnet_xdp_metadata_ops = {
 +      .xmo_rx_hash                    = virtnet_xdp_rx_hash,
 +};
 +
  static int virtnet_probe(struct virtio_device *vdev)
  {
        int i, err = -ENOMEM;
        dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE |
                           IFF_TX_SKB_NO_LINEAR;
        dev->netdev_ops = &virtnet_netdev;
 +      dev->stat_ops = &virtnet_stat_ops;
        dev->features = NETIF_F_HIGHDMA;
  
        dev->ethtool_ops = &virtnet_ethtool_ops;
                                  VIRTIO_NET_RSS_HASH_TYPE_UDP_EX);
  
                dev->hw_features |= NETIF_F_RXHASH;
 +              dev->xdp_metadata_ops = &virtnet_xdp_metadata_ops;
        }
  
        if (vi->has_rss_hash_report)
        if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
                vi->has_cvq = true;
  
 +      mutex_init(&vi->cvq_lock);
 +
        if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
                mtu = virtio_cread16(vdev,
                                     offsetof(struct virtio_net_config,
  
        virtio_device_ready(vdev);
  
 -      _virtnet_set_queues(vi, vi->curr_queue_pairs);
 +      virtnet_set_queues(vi, vi->curr_queue_pairs);
  
        /* a random MAC address has been assigned, notify the device.
         * We don't fail probe if VIRTIO_NET_F_CTRL_MAC_ADDR is not there
                }
        }
  
 +      if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_DEVICE_STATS)) {
 +              struct virtio_net_stats_capabilities *stats_cap  __free(kfree) = NULL;
 +              struct scatterlist sg;
 +              __le64 v;
 +
 +              stats_cap = kzalloc(sizeof(*stats_cap), GFP_KERNEL);
 +              if (!stats_cap) {
 +                      rtnl_unlock();
 +                      err = -ENOMEM;
 +                      goto free_unregister_netdev;
 +              }
 +
 +              sg_init_one(&sg, stats_cap, sizeof(*stats_cap));
 +
 +              if (!virtnet_send_command_reply(vi, VIRTIO_NET_CTRL_STATS,
 +                                              VIRTIO_NET_CTRL_STATS_QUERY,
 +                                              NULL, &sg)) {
 +                      pr_debug("virtio_net: fail to get stats capability\n");
 +                      rtnl_unlock();
 +                      err = -EINVAL;
 +                      goto free_unregister_netdev;
 +              }
 +
 +              v = stats_cap->supported_stats_types[0];
 +              vi->device_stats_cap = le64_to_cpu(v);
 +      }
 +
        rtnl_unlock();
  
        err = virtnet_cpu_notif_add(vi);
@@@ -6021,7 -5021,7 +6021,7 @@@ static struct virtio_device_id id_table
        VIRTIO_NET_F_SPEED_DUPLEX, VIRTIO_NET_F_STANDBY, \
        VIRTIO_NET_F_RSS, VIRTIO_NET_F_HASH_REPORT, VIRTIO_NET_F_NOTF_COAL, \
        VIRTIO_NET_F_VQ_NOTF_COAL, \
 -      VIRTIO_NET_F_GUEST_HDRLEN
 +      VIRTIO_NET_F_GUEST_HDRLEN, VIRTIO_NET_F_DEVICE_STATS
  
  static unsigned int features[] = {
        VIRTNET_FEATURES,
@@@ -6039,7 -5039,6 +6039,6 @@@ static struct virtio_driver virtio_net_
        .feature_table_legacy = features_legacy,
        .feature_table_size_legacy = ARRAY_SIZE(features_legacy),
        .driver.name =  KBUILD_MODNAME,
-       .driver.owner = THIS_MODULE,
        .id_table =     id_table,
        .validate =     virtnet_validate,
        .probe =        virtnet_probe,
index b5afaec61827326167af35cc10b6d77149a07c5f,20fa21bb4d1cbefd738eb72586b34ab4c6b0515c..c5d896994e709a0187065d48b435a2cb6de192b5
@@@ -216,7 -216,7 +216,7 @@@ static const struct ieee80211_regdomai
  
  struct hwsim_vif_priv {
        u32 magic;
 -      u32 skip_beacons;
 +      u32 skip_beacons[IEEE80211_MLD_MAX_NUM_LINKS];
        u8 bssid[ETH_ALEN];
        bool assoc;
        bool bcn_en;
@@@ -1721,9 -1721,6 +1721,9 @@@ static void mac80211_hwsim_rx(struct ma
                                sp->active_links_rx &= ~BIT(link_id);
                        else
                                sp->active_links_rx |= BIT(link_id);
 +
 +                      rx_status->link_valid = true;
 +                      rx_status->link_id = link_id;
                }
                rcu_read_unlock();
        }
@@@ -2136,16 -2133,13 +2136,16 @@@ static int mac80211_hwsim_add_interface
  }
  
  #ifdef CONFIG_MAC80211_DEBUGFS
 -static void mac80211_hwsim_vif_add_debugfs(struct ieee80211_hw *hw,
 -                                         struct ieee80211_vif *vif)
 +static void
 +mac80211_hwsim_link_add_debugfs(struct ieee80211_hw *hw,
 +                              struct ieee80211_vif *vif,
 +                              struct ieee80211_bss_conf *link_conf,
 +                              struct dentry *dir)
  {
        struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
  
 -      debugfs_create_u32("skip_beacons", 0600, vif->debugfs_dir,
 -                         &vp->skip_beacons);
 +      debugfs_create_u32("skip_beacons", 0600, dir,
 +                         &vp->skip_beacons[link_conf->link_id]);
  }
  #endif
  
@@@ -2220,8 -2214,8 +2220,8 @@@ static void __mac80211_hwsim_beacon_tx(
        /* TODO: get MCS */
        int bitrate = 100;
  
 -      if (vp->skip_beacons) {
 -              vp->skip_beacons--;
 +      if (vp->skip_beacons[link_conf->link_id]) {
 +              vp->skip_beacons[link_conf->link_id]--;
                dev_kfree_skb(skb);
                return;
        }
@@@ -2313,10 -2307,6 +2313,10 @@@ static void mac80211_hwsim_beacon_tx(vo
  
        if (link_conf->csa_active && ieee80211_beacon_cntdwn_is_complete(vif, link_id))
                ieee80211_csa_finish(vif, link_id);
 +
 +      if (link_conf->color_change_active &&
 +          ieee80211_beacon_cntdwn_is_complete(vif, link_id))
 +              ieee80211_color_change_finish(vif, link_id);
  }
  
  static enum hrtimer_restart
@@@ -3932,7 -3922,7 +3932,7 @@@ out
  
  #ifdef CONFIG_MAC80211_DEBUGFS
  #define HWSIM_DEBUGFS_OPS                                     \
 -      .vif_add_debugfs = mac80211_hwsim_vif_add_debugfs,
 +      .link_add_debugfs = mac80211_hwsim_link_add_debugfs,
  #else
  #define HWSIM_DEBUGFS_OPS
  #endif
@@@ -4132,8 -4122,7 +4132,8 @@@ out_err
  
  static const struct ieee80211_sband_iftype_data sband_capa_2ghz[] = {
        {
 -              .types_mask = BIT(NL80211_IFTYPE_STATION),
 +              .types_mask = BIT(NL80211_IFTYPE_STATION) |
 +                            BIT(NL80211_IFTYPE_P2P_CLIENT),
                .he_cap = {
                        .has_he = true,
                        .he_cap_elem = {
                },
        },
        {
 -              .types_mask = BIT(NL80211_IFTYPE_AP),
 +              .types_mask = BIT(NL80211_IFTYPE_AP) |
 +                            BIT(NL80211_IFTYPE_P2P_GO),
                .he_cap = {
                        .has_he = true,
                        .he_cap_elem = {
  
  static const struct ieee80211_sband_iftype_data sband_capa_5ghz[] = {
        {
 -              /* TODO: should we support other types, e.g., P2P? */
 -              .types_mask = BIT(NL80211_IFTYPE_STATION),
 +              .types_mask = BIT(NL80211_IFTYPE_STATION) |
 +                            BIT(NL80211_IFTYPE_P2P_CLIENT),
                .he_cap = {
                        .has_he = true,
                        .he_cap_elem = {
                },
        },
        {
 -              .types_mask = BIT(NL80211_IFTYPE_AP),
 +              .types_mask = BIT(NL80211_IFTYPE_AP) |
 +                            BIT(NL80211_IFTYPE_P2P_GO),
                .he_cap = {
                        .has_he = true,
                        .he_cap_elem = {
  
  static const struct ieee80211_sband_iftype_data sband_capa_6ghz[] = {
        {
 -              /* TODO: should we support other types, e.g., P2P? */
 -              .types_mask = BIT(NL80211_IFTYPE_STATION),
 +              .types_mask = BIT(NL80211_IFTYPE_STATION) |
 +                            BIT(NL80211_IFTYPE_P2P_CLIENT),
                .he_6ghz_capa = {
                        .capa = cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
                                            IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
                },
        },
        {
 -              .types_mask = BIT(NL80211_IFTYPE_AP),
 +              .types_mask = BIT(NL80211_IFTYPE_AP) |
 +                            BIT(NL80211_IFTYPE_P2P_GO),
                .he_6ghz_capa = {
                        .capa = cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
                                            IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
@@@ -5327,8 -5313,6 +5327,8 @@@ static int mac80211_hwsim_new_radio(str
  
        wiphy_ext_feature_set(hw->wiphy,
                              NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT);
 +      wiphy_ext_feature_set(hw->wiphy,
 +                            NL80211_EXT_FEATURE_BSS_COLOR);
  
        hw->wiphy->interface_modes = param->iftypes;
  
@@@ -6678,7 -6662,6 +6678,6 @@@ MODULE_DEVICE_TABLE(virtio, id_table)
  
  static struct virtio_driver virtio_hwsim = {
        .driver.name = KBUILD_MODNAME,
-       .driver.owner = THIS_MODULE,
        .id_table = id_table,
        .probe = hwsim_virtio_probe,
        .remove = hwsim_virtio_remove,
@@@ -6767,11 -6750,11 +6766,11 @@@ static int __init init_mac80211_hwsim(v
                                param.regd = &hwsim_world_regdom_custom_01;
                        break;
                case HWSIM_REGTEST_CUSTOM_WORLD:
 -                      param.regd = &hwsim_world_regdom_custom_01;
 +                      param.regd = &hwsim_world_regdom_custom_03;
                        break;
                case HWSIM_REGTEST_CUSTOM_WORLD_2:
                        if (i == 0)
 -                              param.regd = &hwsim_world_regdom_custom_01;
 +                              param.regd = &hwsim_world_regdom_custom_03;
                        else if (i == 1)
                                param.regd = &hwsim_world_regdom_custom_02;
                        break;
index e8355f55a8f7e8a8ddf4025514c5d171559d8d51,6d4dfbc53a6617d85d472e31687cdec3a2bc8d76..a3857bacc84465eb955aabc451b696f9ec446b79
@@@ -21,7 -21,7 +21,8 @@@
  #include <linux/bitmap.h>
  #include <linux/lockdep.h>
  #include <linux/log2.h>
 +#include <linux/vmalloc.h>
+ #include <linux/suspend.h>
  
  #include <acpi/acpi_numa.h>
  
@@@ -253,6 -253,9 +254,9 @@@ struct virtio_mem 
        /* Memory notifier (online/offline events). */
        struct notifier_block memory_notifier;
  
+       /* Notifier to block hibernation image storing/reloading. */
+       struct notifier_block pm_notifier;
  #ifdef CONFIG_PROC_VMCORE
        /* vmcore callback for /proc/vmcore handling in kdump mode */
        struct vmcore_cb vmcore_cb;
@@@ -1112,6 -1115,25 +1116,25 @@@ static int virtio_mem_memory_notifier_c
        return rc;
  }
  
+ static int virtio_mem_pm_notifier_cb(struct notifier_block *nb,
+                                    unsigned long action, void *arg)
+ {
+       struct virtio_mem *vm = container_of(nb, struct virtio_mem,
+                                            pm_notifier);
+       switch (action) {
+       case PM_HIBERNATION_PREPARE:
+       case PM_RESTORE_PREPARE:
+               /*
+                * When restarting the VM, all memory is unplugged. Don't
+                * allow to hibernate and restore from an image.
+                */
+               dev_err(&vm->vdev->dev, "hibernation is not supported.\n");
+               return NOTIFY_BAD;
+       default:
+               return NOTIFY_OK;
+       }
+ }
  /*
   * Set a range of pages PG_offline. Remember pages that were never onlined
   * (via generic_online_page()) using PageDirty().
@@@ -2616,11 -2638,19 +2639,19 @@@ static int virtio_mem_init_hotplug(stru
        rc = register_memory_notifier(&vm->memory_notifier);
        if (rc)
                goto out_unreg_group;
-       rc = register_virtio_mem_device(vm);
+       /* Block hibernation as early as possible. */
+       vm->pm_notifier.priority = INT_MAX;
+       vm->pm_notifier.notifier_call = virtio_mem_pm_notifier_cb;
+       rc = register_pm_notifier(&vm->pm_notifier);
        if (rc)
                goto out_unreg_mem;
+       rc = register_virtio_mem_device(vm);
+       if (rc)
+               goto out_unreg_pm;
  
        return 0;
+ out_unreg_pm:
+       unregister_pm_notifier(&vm->pm_notifier);
  out_unreg_mem:
        unregister_memory_notifier(&vm->memory_notifier);
  out_unreg_group:
@@@ -2898,6 -2928,7 +2929,7 @@@ static void virtio_mem_deinit_hotplug(s
  
        /* unregister callbacks */
        unregister_virtio_mem_device(vm);
+       unregister_pm_notifier(&vm->pm_notifier);
        unregister_memory_notifier(&vm->memory_notifier);
  
        /*
@@@ -2961,17 -2992,40 +2993,40 @@@ static void virtio_mem_config_changed(s
  #ifdef CONFIG_PM_SLEEP
  static int virtio_mem_freeze(struct virtio_device *vdev)
  {
+       struct virtio_mem *vm = vdev->priv;
        /*
-        * When restarting the VM, all memory is usually unplugged. Don't
-        * allow to suspend/hibernate.
+        * We block hibernation using the PM notifier completely. The workqueue
+        * is already frozen by the PM core at this point, so we simply
+        * reset the device and cleanup the queues.
         */
-       dev_err(&vdev->dev, "save/restore not supported.\n");
-       return -EPERM;
+       if (pm_suspend_target_state != PM_SUSPEND_TO_IDLE &&
+           vm->plugged_size &&
+           !virtio_has_feature(vm->vdev, VIRTIO_MEM_F_PERSISTENT_SUSPEND)) {
+               dev_err(&vm->vdev->dev,
+                       "suspending with plugged memory is not supported\n");
+               return -EPERM;
+       }
+       virtio_reset_device(vdev);
+       vdev->config->del_vqs(vdev);
+       vm->vq = NULL;
+       return 0;
  }
  
  static int virtio_mem_restore(struct virtio_device *vdev)
  {
-       return -EPERM;
+       struct virtio_mem *vm = vdev->priv;
+       int ret;
+       ret = virtio_mem_init_vq(vm);
+       if (ret)
+               return ret;
+       virtio_device_ready(vdev);
+       /* Let's check if anything changed. */
+       virtio_mem_config_changed(vdev);
+       return 0;
  }
  #endif
  
@@@ -2980,6 -3034,7 +3035,7 @@@ static unsigned int virtio_mem_features
        VIRTIO_MEM_F_ACPI_PXM,
  #endif
        VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE,
+       VIRTIO_MEM_F_PERSISTENT_SUSPEND,
  };
  
  static const struct virtio_device_id virtio_mem_id_table[] = {
@@@ -2991,7 -3046,6 +3047,6 @@@ static struct virtio_driver virtio_mem_
        .feature_table = virtio_mem_features,
        .feature_table_size = ARRAY_SIZE(virtio_mem_features),
        .driver.name = KBUILD_MODNAME,
-       .driver.owner = THIS_MODULE,
        .id_table = virtio_mem_id_table,
        .probe = virtio_mem_probe,
        .remove = virtio_mem_remove,
diff --combined fs/coredump.c
index 317065e3eb9bb0969ea73fbef46fd8d345ccfe2c,8eae24afb3cb911ac564d9e29e9a1494e1082b92..a57a06b80f571b9676d19517e0b644dd1db344d7
  static bool dump_vma_snapshot(struct coredump_params *cprm);
  static void free_vma_snapshot(struct coredump_params *cprm);
  
 +#define CORE_FILE_NOTE_SIZE_DEFAULT (4*1024*1024)
 +/* Define a reasonable max cap */
 +#define CORE_FILE_NOTE_SIZE_MAX (16*1024*1024)
 +
  static int core_uses_pid;
  static unsigned int core_pipe_limit;
  static char core_pattern[CORENAME_MAX_SIZE] = "core";
  static int core_name_size = CORENAME_MAX_SIZE;
 +unsigned int core_file_note_size_limit = CORE_FILE_NOTE_SIZE_DEFAULT;
  
  struct core_name {
        char *corename;
@@@ -376,9 -371,7 +376,7 @@@ static int zap_process(struct task_stru
                if (t != current && !(t->flags & PF_POSTCOREDUMP)) {
                        sigaddset(&t->pending.signal, SIGKILL);
                        signal_wake_up(t, 1);
-                       /* The vhost_worker does not particpate in coredumps */
-                       if ((t->flags & (PF_USER_WORKER | PF_IO_WORKER)) != PF_USER_WORKER)
-                               nr++;
+                       nr++;
                }
        }
  
@@@ -1003,9 -996,6 +1001,9 @@@ static int proc_dostring_coredump(struc
        return error;
  }
  
 +static const unsigned int core_file_note_size_min = CORE_FILE_NOTE_SIZE_DEFAULT;
 +static const unsigned int core_file_note_size_max = CORE_FILE_NOTE_SIZE_MAX;
 +
  static struct ctl_table coredump_sysctls[] = {
        {
                .procname       = "core_uses_pid",
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
 +      {
 +              .procname       = "core_file_note_size_limit",
 +              .data           = &core_file_note_size_limit,
 +              .maxlen         = sizeof(unsigned int),
 +              .mode           = 0644,
 +              .proc_handler   = proc_douintvec_minmax,
 +              .extra1         = (unsigned int *)&core_file_note_size_min,
 +              .extra2         = (unsigned int *)&core_file_note_size_max,
 +      },
  };
  
  static int __init init_fs_coredump_sysctls(void)
diff --combined fs/fuse/virtio_fs.c
index 8ffa4f063a37b710b6ae9c0d8dd16c6f51c7608a,ca7b64f9c3c74401d50b5c80ca876cf2fb43ca27..1a52a51b6b07cc11ef8ba246bbd75266f55854a9
@@@ -7,8 -7,6 +7,8 @@@
  #include <linux/fs.h>
  #include <linux/dax.h>
  #include <linux/pci.h>
 +#include <linux/interrupt.h>
 +#include <linux/group_cpus.h>
  #include <linux/pfn_t.h>
  #include <linux/memremap.h>
  #include <linux/module.h>
@@@ -69,8 -67,6 +69,8 @@@ struct virtio_fs 
        unsigned int num_request_queues; /* number of request queues */
        struct dax_device *dax_dev;
  
 +      unsigned int *mq_map; /* index = cpu id, value = request vq id */
 +
        /* DAX memory window where file contents are mapped */
        void *window_kaddr;
        phys_addr_t window_phys_addr;
@@@ -174,7 -170,7 +174,7 @@@ static ssize_t tag_show(struct kobject 
  {
        struct virtio_fs *fs = container_of(kobj, struct virtio_fs, kobj);
  
 -      return sysfs_emit(buf, fs->tag);
 +      return sysfs_emit(buf, "%s\n", fs->tag);
  }
  
  static struct kobj_attribute virtio_fs_tag_attr = __ATTR_RO(tag);
@@@ -189,7 -185,6 +189,7 @@@ static void virtio_fs_ktype_release(str
  {
        struct virtio_fs *vfs = container_of(kobj, struct virtio_fs, kobj);
  
 +      kfree(vfs->mq_map);
        kfree(vfs->vqs);
        kfree(vfs);
  }
@@@ -711,44 -706,6 +711,44 @@@ static void virtio_fs_requests_done_wor
        }
  }
  
 +static void virtio_fs_map_queues(struct virtio_device *vdev, struct virtio_fs *fs)
 +{
 +      const struct cpumask *mask, *masks;
 +      unsigned int q, cpu;
 +
 +      /* First attempt to map using existing transport layer affinities
 +       * e.g. PCIe MSI-X
 +       */
 +      if (!vdev->config->get_vq_affinity)
 +              goto fallback;
 +
 +      for (q = 0; q < fs->num_request_queues; q++) {
 +              mask = vdev->config->get_vq_affinity(vdev, VQ_REQUEST + q);
 +              if (!mask)
 +                      goto fallback;
 +
 +              for_each_cpu(cpu, mask)
 +                      fs->mq_map[cpu] = q;
 +      }
 +
 +      return;
 +fallback:
 +      /* Attempt to map evenly in groups over the CPUs */
 +      masks = group_cpus_evenly(fs->num_request_queues);
 +      /* If even this fails we default to all CPUs use queue zero */
 +      if (!masks) {
 +              for_each_possible_cpu(cpu)
 +                      fs->mq_map[cpu] = 0;
 +              return;
 +      }
 +
 +      for (q = 0; q < fs->num_request_queues; q++) {
 +              for_each_cpu(cpu, &masks[q])
 +                      fs->mq_map[cpu] = q;
 +      }
 +      kfree(masks);
 +}
 +
  /* Virtqueue interrupt handler */
  static void virtio_fs_vq_done(struct virtqueue *vq)
  {
@@@ -785,11 -742,6 +785,11 @@@ static int virtio_fs_setup_vqs(struct v
  {
        struct virtqueue **vqs;
        vq_callback_t **callbacks;
 +      /* Specify pre_vectors to ensure that the queues before the
 +       * request queues (e.g. hiprio) don't claim any of the CPUs in
 +       * the multi-queue mapping and interrupt affinities
 +       */
 +      struct irq_affinity desc = { .pre_vectors = VQ_REQUEST };
        const char **names;
        unsigned int i;
        int ret = 0;
        if (fs->num_request_queues == 0)
                return -EINVAL;
  
 +      /* Truncate nr of request queues to nr_cpu_id */
 +      fs->num_request_queues = min_t(unsigned int, fs->num_request_queues,
 +                                      nr_cpu_ids);
        fs->nvqs = VQ_REQUEST + fs->num_request_queues;
        fs->vqs = kcalloc(fs->nvqs, sizeof(fs->vqs[VQ_HIPRIO]), GFP_KERNEL);
        if (!fs->vqs)
        callbacks = kmalloc_array(fs->nvqs, sizeof(callbacks[VQ_HIPRIO]),
                                        GFP_KERNEL);
        names = kmalloc_array(fs->nvqs, sizeof(names[VQ_HIPRIO]), GFP_KERNEL);
 -      if (!vqs || !callbacks || !names) {
 +      fs->mq_map = kcalloc_node(nr_cpu_ids, sizeof(*fs->mq_map), GFP_KERNEL,
 +                                      dev_to_node(&vdev->dev));
 +      if (!vqs || !callbacks || !names || !fs->mq_map) {
                ret = -ENOMEM;
                goto out;
        }
                names[i] = fs->vqs[i].name;
        }
  
 -      ret = virtio_find_vqs(vdev, fs->nvqs, vqs, callbacks, names, NULL);
 +      ret = virtio_find_vqs(vdev, fs->nvqs, vqs, callbacks, names, &desc);
        if (ret < 0)
                goto out;
  
@@@ -845,10 -792,8 +845,10 @@@ out
        kfree(names);
        kfree(callbacks);
        kfree(vqs);
 -      if (ret)
 +      if (ret) {
                kfree(fs->vqs);
 +              kfree(fs->mq_map);
 +      }
        return ret;
  }
  
@@@ -994,7 -939,7 +994,7 @@@ static int virtio_fs_probe(struct virti
        if (ret < 0)
                goto out;
  
 -      /* TODO vq affinity */
 +      virtio_fs_map_queues(vdev, fs);
  
        ret = virtio_fs_setup_dax(vdev, fs);
        if (ret < 0)
@@@ -1078,7 -1023,6 +1078,6 @@@ static const unsigned int feature_table
  
  static struct virtio_driver virtio_fs_driver = {
        .driver.name            = KBUILD_MODNAME,
-       .driver.owner           = THIS_MODULE,
        .id_table               = id_table,
        .feature_table          = feature_table,
        .feature_table_size     = ARRAY_SIZE(feature_table),
@@@ -1343,7 -1287,7 +1342,7 @@@ out
  static void virtio_fs_wake_pending_and_unlock(struct fuse_iqueue *fiq)
  __releases(fiq->lock)
  {
 -      unsigned int queue_id = VQ_REQUEST; /* TODO multiqueue */
 +      unsigned int queue_id;
        struct virtio_fs *fs;
        struct fuse_req *req;
        struct virtio_fs_vq *fsvq;
        spin_unlock(&fiq->lock);
  
        fs = fiq->priv;
 +      queue_id = VQ_REQUEST + fs->mq_map[raw_smp_processor_id()];
  
 -      pr_debug("%s: opcode %u unique %#llx nodeid %#llx in.len %u out.len %u\n",
 -                __func__, req->in.h.opcode, req->in.h.unique,
 +      pr_debug("%s: opcode %u unique %#llx nodeid %#llx in.len %u out.len %u queue_id %u\n",
 +               __func__, req->in.h.opcode, req->in.h.unique,
                 req->in.h.nodeid, req->in.h.len,
 -               fuse_len_args(req->args->out_numargs, req->args->out_args));
 +               fuse_len_args(req->args->out_numargs, req->args->out_args),
 +               queue_id);
  
        fsvq = &fs->vqs[queue_id];
        ret = virtio_fs_enqueue_req(fsvq, req, false);
diff --combined kernel/exit.c
index cd3aa9042f1a115a521a68156f8447a7e211bf37,fca3a32349541c4c722cb44c6eb869f4b1abbee5..f95a2c1338a8588904857296d5e6ffe908269633
@@@ -94,6 -94,7 +94,6 @@@ static struct ctl_table kern_exit_table
                .mode           = 0644,
                .proc_handler   = proc_douintvec,
        },
 -      { }
  };
  
  static __init int kernel_exit_sysctls_init(void)
@@@ -413,10 -414,7 +413,7 @@@ static void coredump_task_exit(struct t
        tsk->flags |= PF_POSTCOREDUMP;
        core_state = tsk->signal->core_state;
        spin_unlock_irq(&tsk->sighand->siglock);
-       /* The vhost_worker does not particpate in coredumps */
-       if (core_state &&
-           ((tsk->flags & (PF_IO_WORKER | PF_USER_WORKER)) != PF_USER_WORKER)) {
+       if (core_state) {
                struct core_thread self;
  
                self.task = current;
diff --combined kernel/signal.c
index 01c4c46a51a82b87c6d70eaf43a4baded87e567b,41d5cbccab2aa0bda22657014b5a696b7278a9a3..1f9dd41c04be2202309acbd00c051651e739daf1
@@@ -1375,9 -1375,7 +1375,7 @@@ int zap_other_threads(struct task_struc
  
        for_other_threads(p, t) {
                task_clear_jobctl_pending(t, JOBCTL_PENDING_MASK);
-               /* Don't require de_thread to wait for the vhost_worker */
-               if ((t->flags & (PF_IO_WORKER | PF_USER_WORKER)) != PF_USER_WORKER)
-                       count++;
+               count++;
  
                /* Don't bother with already dead threads */
                if (t->exit_state)
@@@ -4840,6 -4838,7 +4838,6 @@@ static struct ctl_table signal_debug_ta
                .proc_handler   = proc_dointvec
        },
  #endif
 -      { }
  };
  
  static int __init init_signal_sysctls(void)
This page took 0.391494 seconds and 4 git commands to generate.